内核API之IoAllocateMdl

来源:互联网 发布:送货单打印软件系统 编辑:程序博客网 时间:2024/04/30 02:08

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指向的链之后。


原创粉丝点击