共用方式為


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 必須夠大,才能描述 VirtualAddressLength 所指定子範圍中的頁面。

[in] VirtualAddress

TargetMdl 描述之子範圍之基底虛擬位址的指標。

[in] Length

指定要由 TargetMdl 對應的長度,以位元組為單位。 這個值與 VirtualAddress 結合時,必須指定一個緩衝區,這是 SourceMdl 所描述之緩衝區的適當子範圍。 如果 Length 為零,要對應的子範圍會從 VirtualAddress 開始,並包含 SourceMdl 所描述的其餘範圍。

傳回值

備註

此例程會建置目標 MDL,描述來源 MDL 所描述之緩衝區的子範圍。 此子範圍是由 VirtualAddressLength 參數所指定。 SourceMdlTargetMdl 參數會指向來源 MDL 和目標 MDL。

驅動程式可以使用 IoBuildPartialMdl 將大型傳輸要求分割成較小的傳輸要求。 來源 MDL 描述的實體頁面必須在驅動程式呼叫 IoBuildPartialMdl 之前鎖定。 一般而言,來源 MDL 描述使用者位址空間中的緩衝區,而驅動程式會呼叫 MmProbeAndLockPages 例程來鎖定此緩衝區中的頁面。 不過,驅動程式可以呼叫 MmBuildMdlForNonPagedPoolMmAllocatePagesForMdlExMmAllocatePagesForMdl 例程,從非分頁記憶體建置來源 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)

另請參閱

IoFreeMdl

MmAllocatePagesForMdl

MmAllocatePagesForMdlEx

MmBuildMdlForNonPagedPool

MmGetSystemAddressForMdlSafe

MmPrepareMdlForReuse

MmProbeAndLockPages