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。 如果 SecondaryBufferTRUE,则例程会将 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

另请参阅

IoBuildPartialMdl

IoFreeMdl

MmBuildMdlForNonPagedPool