天天看点

MDL结构

//
// I/O system definitions.
//
// 定义一个内存描述符列表(MDL)
//
// 一个MDL通过一系列物理页面描述在虚拟缓冲中的页面。
// 通过一个PFN_NUMBER队列描述与缓冲区相关的页面,这个PFN_NUMBER队列的内存位置紧跟着MDL头结构之后。
// 
// 一个简单的计算队列的地址的方法是在这个MDL的地址上加一:
//
//      Pages = (PPFN_NUMBER) (Mdl + 1);
//
// 注意在一个线程的上下文中,MDL映射的虚拟地址的首地址可以使用一下方式引用:
//
//      Mdl->StartVa | Mdl->ByteOffset
//

typedef struct _MDL {
    struct _MDL *Next;			//用于挂入到一个队列中,如插入到驱动程序的IRP的MDL队列中。
    CSHORT Size;				//指定这个MDL所占的空间大小 = MDL结构体的大小 + sizeof(PFN_NUMBER)*映射需要的页面数。
    CSHORT MdlFlags;			//指明MDL的映射方式
    struct _EPROCESS *Process;	//指明此MDL属于哪个进程。
    PVOID MappedSystemVa;		//所描述的内存如果有映射到系统空间并锁定。那么这个成员指定了MDL在系统空间内的地址
    PVOID StartVa;				//所描述的内存映射后的虚拟地址的开始页面地址,这个地址总是页面对齐的地址
    ULONG ByteCount;			//此MDL所描述的内存块有多少个字节
    ULONG ByteOffset;			//MDL映射的虚拟地址的首地址在StartVa页面中的偏移值。
} MDL, *PMDL;