Fungsi IoBuildPartialMdl (wdm.h)

Rutinitas IoBuildPartialMdl membangun daftar deskriptor memori baru (MDL) yang mewakili bagian dari buffer yang dijelaskan oleh MDL yang ada.

Sintaks

void IoBuildPartialMdl(
  [in]      PMDL  SourceMdl,
  [in, out] PMDL  TargetMdl,
  [in]      PVOID VirtualAddress,
  [in]      ULONG Length
);

Parameter

[in] SourceMdl

Penunjuk ke MDL yang menjelaskan buffer asli, di mana subrange akan dipetakan.

[in, out] TargetMdl

Penunjuk ke MDL yang dialokasikan penelepon. MDL ini harus cukup besar untuk menjelaskan halaman dalam subrange yang ditentukan oleh VirtualAddress dan Length.

[in] VirtualAddress

Penunjuk ke alamat virtual dasar untuk subrange yang akan dijelaskan oleh TargetMdl.

[in] Length

Menentukan panjang, dalam byte, yang akan dipetakan oleh TargetMdl. Nilai ini, dalam kombinasi dengan VirtualAddress, harus menentukan buffer yang merupakan subrange buffer yang tepat yang dijelaskan oleh SourceMdl. Jika Panjang adalah nol, subrange yang akan dipetakan dimulai di VirtualAddress dan menyertakan rentang yang tersisa yang dijelaskan oleh SourceMdl.

Nilai kembali

Tidak ada

Keterangan

Rutinitas ini membangun MDL target yang menjelaskan subrange buffer yang dijelaskan oleh MDL sumber. Subrange ini ditentukan oleh parameter VirtualAddress dan Length . Parameter SourceMdl dan TargetMdl menunjuk ke MDL sumber dan MDL target.

Driver dapat menggunakan IoBuildPartialMdl untuk membagi permintaan transfer besar menjadi permintaan transfer yang lebih kecil. Halaman fisik yang dijelaskan MDL sumber harus dikunci sebelum driver memanggil IoBuildPartialMdl. Biasanya, MDL sumber menjelaskan buffer di ruang alamat pengguna, dan driver memanggil rutinitas MmProbeAndLockPages untuk mengunci halaman dalam buffer ini. Namun, driver dapat membangun MDL sumber dari memori yang tidak di-patah dengan memanggil rutinitas MmBuildMdlForNonPagedPool, MmAllocatePagesForMdlEx, atau MmAllocatePagesForMdl .

Saat membuat MDL parsial:

  • Jika MDL asli sudah dipetakan di ruang sistem, MDL parsial berbagi pemetaan tersebut dan tidak perlu memetakannya lagi.
  • Jika MDL asli tidak dipetakan di ruang sistem, MDL parsial juga tidak. Jika Anda memerlukan alamat mode sistem, panggil MmGetSystemAddressForMdlSafe pada MDL parsial.
  • Jika Anda tidak tahu mana dari hal di atas yang berlaku, aman untuk memanggil MmGetSystemAddressForMdlSafe terlepas dari itu. Jika MDL parsial dibangun dari MDL sumber yang sudah dipetakan ke ruang alamat sistem, MmGetSystemAddressForMdlSafe menggunakan pemetaan sumber yang ada. Jika tidak, MmGetSystemAddressForMdlSafe membuat pemetaan baru.

Untuk mencegah pemetaan baru ini bocor, driver harus memanggil MmPrepareMdlForReuse sebelum menggunakan kembali MDL parsial. Selain itu, rutinitas IoFreeMdl merilis pemetaan ruang alamat sistem untuk MDL parsial, jika ada pemetaan seperti itu.

Untuk informasi selengkapnya tentang MDL, lihat Menggunakan MDL.

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Tersedia dimulai dengan Windows 2000.
Target Platform Universal
Header wdm.h (termasuk Wdm.h, Ntddk.h, Ntifs.h)
Pustaka NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <=DISPATCH_LEVEL
Aturan kepatuhan DDI MdlAfterReqCompletedIntIoctlA(kmdf), MdlAfterReqCompletedIoctlA(kmdf), MdlAfterReqCompletedReadA(kmdf), MdlAfterReqCompletedWriteA(kmdf)

Lihat juga

IoFreeMdl

MmAllocatePagesForMdl

MmAllocatePagesForMdlEx

MmBuildMdlForNonPagedPool

MmGetSystemAddressForMdlSafe

MmPrepareMdlForReuse

MmProbeAndLockPages