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

另请参阅

IoBuildPartialMdl

IoFreeMdl

mmBuildMdlForNonPagedPool