IoBuildPartialMdl 函式 (wdm.h)
IoBuildPartialMdl 例程會建置新的記憶體描述元清單 (MDL),代表現有 MDL 所描述之緩衝區的一部分。
語法
void IoBuildPartialMdl(
[in] PMDL SourceMdl,
[in, out] PMDL TargetMdl,
[in] PVOID VirtualAddress,
[in] ULONG Length
);
參數
[in] SourceMdl
描述原始緩衝區之 MDL 的指標,其中子範圍要對應。
[in, out] TargetMdl
呼叫端配置的 MDL 指標。 此 MDL 必須夠大,才能描述 VirtualAddress 和 Length所指定的子範圍中的頁面。
[in] VirtualAddress
TargetMdl所描述之子範圍的基底虛擬位址指標。
[in] Length
指定 TargetMdl所對應的長度,以位元組為單位。 這個值與 VirtualAddress結合,必須指定緩衝區,該緩衝區是 SourceMdl所描述之緩衝區的適當子範圍。 如果 Length 為零,則要對應的子範圍會從 virtualAddress 開始,並包含 sourceMdl 所描述的其餘範圍。
傳回值
沒有
言論
此例程會建置目標 MDL,描述來源 MDL 所描述之緩衝區的子範圍。 這個子範圍是由 VirtualAddress 和 Length 參數所指定。 SourceMdl 和 TargetMdl 參數指向來源 MDL 和目標 MDL。
驅動程式可以使用 IoBuildPartialMdl,將大型傳輸要求分割成較小的傳輸要求。 來源 MDL 描述的實體頁面必須先鎖定,驅動程式才能呼叫 ioBuildPartialMdl 。 一般而言,來源 MDL 描述使用者位址空間中的緩衝區,而驅動程式會呼叫 MmProbeAndLockPages 例程來鎖定此緩衝區中的頁面。 不過,驅動程式可以呼叫 MmBuildMdlForNonPagedPool、MmAllocatePagesForMdlEx或 MmAllocatePagesForMdl 例程,從非分頁記憶體建置來源 MDL。
建立部分 MDL 時:
- 如果原始 MDL 已在系統空間中對應,部分 MDL 會共用該對應,而且不需要再次對應它。
- 如果原始 MDL 未在系統空間中對應,部分 MDL 也不是。 如果您需要系統模式位址,請在部分 MDL 上呼叫 MmGetSystemAddressForMdlSafe。
- 如果您不知道上述哪一項適用,則不論怎樣,都能安全地呼叫 MmGetSystemAddressForMdlSafe。 如果部分 MDL 是從已經對應到系統地址空間的來源 MDL 所建置,MmGetSystemAddressForMdlSafe 會使用現有的來源對應。 否則,MmGetSystemAddressForMdlSafe 會建立新的對應。
若要防止外洩此新對應,驅動程式必須先呼叫 MmPrepareMdlForReuse,才能重複使用部分 MDL。 此外,如果這類對應存在,IoFreeMdl 例程會釋放部分 MDL 的系統地址空間對應。
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | 從 Windows 2000 開始提供。 |
目標平臺 | 普遍 |
標頭 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |
連結庫 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <=DISPATCH_LEVEL |
DDI 合規性規則 | MdlAfterReqCompletedIntIoctlA(kmdf),MdlAfterReqCompletedIoctlA(kmdf),MdlAfterReqCompletedReadA(kmdf),MdlAfterReqCompletedWriteA(kmdf) |