Mdl用于把一段用户区内存映射到系统地址上
typedef struct _MDL {
struct _MDL *Next; Irp->MdlAddress的链表
CSHORT Size;
CSHORT MdlFlags;
struct _EPROCESS *Process; 原内存所属进程
PVOID MappedSystemVa; 映射后地址
PVOID StartVa; 原地址(页面对齐后)
ULONG ByteCount; 缓冲区大小
ULONG ByteOffset; 缓冲区相对于StartVa的偏移
} MDL, *PMDL;
typedef MDL *PMDLX;
后面跟的是pfn number
IoAllocateMdl初始化这个结构
MmProbeAndLockPages将内存锁住,并且把页面pfnnumber赋值给mdl
MmMapLockedPagesSpecifyCache 对内存进行真正映射