IoAllocateMdl
IoAllocateMdl 函数分配足够映射一块缓存的MDL,给定缓存的起始地址和长度.
PMDL
IoAllocateMdl(
__in_opt PVOID VirtualAddress,
__in ULONG Length,
__in BOOLEAN SecondaryBuffer,
__in BOOLEAN ChargeQuota,
__inout_opt PIRP Irp OPTIONAL
);
驱动可以使用IoAllocateMdl 函数实现大缓存分片的目的,通过一个独立的MDL来映射缓存的一小部分,或者映射驱动分配的内存.驱动会调用MmBuildMdlForNonPagedPool 来设置MDL的内存,使得MDL描述驱动分配的缓存处于不可置换的内存中。
Length参数指明了MDL指向的缓存的大小。在Windows Server 2003, Windows XP, 和Windows 2000, 能够分配的最大缓存字节数为PAGE_SIZE * (65535 - sizeof(MDL)) / sizeof(ULONG_PTR)。在Windows Vista和Windows Server 2008, 最大缓存字节数是(2GB - PAGE_SIZE).在Windows 7和Windows Server 2008 R2中, 最大缓存字节数是(4GB - PAGE_SIZE).
如果SecondaryBuffer参数是FALSE, 这个函数会更新Irp->MdlAddress ,让它指向一个新的MDL, 也就是说让它支持大缓存分片吧。 如果SecondaryBuffer为TRUE, 这个函数把MDL添加到Irp->MdlAddress指向的链之后。