1 先是mdl的数据结构。
- 根据length和VirtualAddress算出这块buffer总共跨越了几个virtual page。
- 分配MDL的内存----包括上面介绍的struct _MDL(属于head部分),ULONG型body部分。
其中PFN_NUMBER 为ULONG, IOP_FIXED_SIZE_MDL_PFNS代表pte的个数。 -
申请完了后,对mdl进行初始化
从这个图中可以很明显得看书上面数据结构的含义:1 size---body + head部分的总大小。2 StartVa----代表buffer开头处所在page的开始地址。3 ByteOffset----代表buffer开头处相对于StartVa的偏移量。
然后使用MmBuildMdlForNonPagedPool将pte中的页表项都放入mdl中的body部分。
这里show一下关键性代码: