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,则分配的 MDL 与指定的 IRP 的 MDL 列表相关联,根据 secondaryBuffer的值。
返回值
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的 MDL 链的末尾,>MdlAddress 指向。
有关 MDL 的详细信息,请参阅 使用 MDL。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | 从 Windows 2000 开始可用。 |
目标平台 | 普遍 |
标头 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
库 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL |