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 的系統地址空間對應。
如需 MDL 的詳細資訊,請參閱 使用 MDLs。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | 從 Windows 2000 開始提供。 |
目標平台 | Universal |
標頭 | 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) |