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 對應,或對應驅動程式配置的緩衝區。 驅動程式應該呼叫 MmBuildMdlForNonPagedPool,並使用此呼叫所配置的 MDL 來設定描述非分頁集區中驅動程式配置的緩衝區的 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 鏈結結尾。
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | 從 Windows 2000 開始提供。 |
目標平臺 | 普遍 |
標頭 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
連結庫 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL |