ioAllocateMdl 函数 (wdm.h)
给定缓冲区的起始地址和长度, IoAllocateMdl 例程分配内存描述符列表 (MDL) 足以映射缓冲区。 (可选)此例程将 MDL 与 IRP 相关联。
语法
PMDL IoAllocateMdl(
[in, optional] __drv_aliasesMem PVOID VirtualAddress,
[in] ULONG Length,
[in] BOOLEAN SecondaryBuffer,
[in] BOOLEAN ChargeQuota,
[in, out, optional] PIRP Irp
);
参数
[in, optional] VirtualAddress
指向 MDL 要描述的缓冲区的基虚拟地址的指针。
[in] Length
指定 MDL 要描述的缓冲区的长度(以字节为单位)。 有关更多信息,请参见下面的“备注”部分。
[in] SecondaryBuffer
指示缓冲区是主缓冲区还是辅助缓冲区。 此参数确定如何将 MDL 链接到 IRP。 除 IRP 中的 MDL 描述的第一个缓冲区外,所有缓冲区都被视为辅助缓冲区。 如果没有与 MDL 关联的 IRP,则此字段必须为 FALSE 。 有关更多信息,请参见下面的“备注”部分。
[in] ChargeQuota
预留给系统使用。 驱动程序必须将此参数设置为 FALSE。
[in, out, optional] Irp
指向要与 MDL 关联的 IRP 的指针。 如果 Irp 指针为非 NULL,则根据 SecondaryBuffer 的值,分配的 MDL 与指定的 IRP 的 MDL 列表相关联。
返回值
IoAllocateMdl 返回指向 MDL 的指针,或者,如果无法分配 MDL,则返回 NULL。
注解
IoAllocateMdl 可由需要将缓冲区拆分为多个片段的驱动程序使用,每个片段由单独的 MDL 映射,或用于映射驱动程序分配的缓冲区。 驱动程序应使用此调用分配的 MDL 调用 MmBuildMdlForNonPagedPool ,以设置描述非分页池中驱动程序分配的缓冲区的 MDL。
Length 参数指定要由 MDL 描述的缓冲区的大小。 在 Windows Server 2003、Windows XP 和 Windows 2000 中,此例程可以分配的最大缓冲区大小(以字节为单位)PAGE_SIZE * (65535 - sizeof (MDL) ) / sizeof (ULONG_PTR) 。 在 Windows Vista 和 Windows Server 2008 中,最大缓冲区大小为 (2 GB - PAGE_SIZE) 。 从 Windows 7 和 Windows Server 2008 R2 开始,最大缓冲区大小为 (4 GB -PAGE_SIZE) 。
如果 SecondaryBuffer 参数为 FALSE,则例程更新 Irp-MdlAddress> 以指向新的 MDL。 如果 SecondaryBuffer 为 TRUE,则例程会将 MDL 添加到 Irp-MdlAddress > 指向的 MDL 链的末尾。
有关 MDL 的详细信息,请参阅使用 MDL。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | 从 Windows 2000 开始可用。 |
目标平台 | 通用 |
标头 | wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h) |
Library | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL |