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)
程式庫 NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL

另請參閱

IoBuildPartialMdl

IoFreeMdl

MmBuildMdlForNonPagedPool