Fungsi MmProbeAndLockPages (wdm.h)

MmProbeAndLockPages rutin memeriksa halaman memori virtual yang ditentukan, menjadikannya residen, dan menguncinya dalam memori (misalnya untuk transfer DMA). Ini memastikan halaman tidak dapat dibebaskan dan dialokasikan kembali saat driver perangkat (atau perangkat keras) masih menggunakannya.

Sintaks

void MmProbeAndLockPages(
  [in, out] PMDL            MemoryDescriptorList,
  [in]      KPROCESSOR_MODE AccessMode,
  [in]      LOCK_OPERATION  Operation
);

Parameter

[in, out] MemoryDescriptorList

Penunjuk ke MDL yang menentukan buffer memori virtual. Jika rutinitas berhasil mengunci halaman dalam memori, MDL diperbarui untuk menjelaskan halaman fisik yang mendasar.

[in] AccessMode

Mode akses untuk memeriksa argumen, baik KernelMode atau UserMode.

[in] Operation

Jenis operasi yang peneleponnya ingin hak akses diselimuti dan halaman dikunci. Atur parameter ini ke IoReadAccess, IoWriteAccess, atau IoModifyAccess. IoReadAccess menunjukkan bahwa driver dapat memeriksa konten buffer tetapi tidak dapat mengubah konten. IoWriteAccess dan IoModifyAccess, yang setara, menunjukkan bahwa driver memiliki akses baca dan tulis ke buffer.

Nilai kembali

Tidak ada

Keterangan

Driver tingkat tertinggi dalam rantai driver berlapis yang menggunakan I/O langsung memanggil rutinitas ini. Driver yang menggunakan I/O buffer tidak pernah memanggil MmProbeAndLockPages.

MmProbeAndLockPages melakukan operasi berikut:

  1. Jika rentang memori yang ditentukan di-page ke penyimpanan backing (disk, jaringan, dan sebagainya), MmProbeAndLockPages menjadikannya residen.
  2. Rutinitas kemudian mengonfirmasi bahwa halaman mengizinkan operasi yang ditentukan oleh parameter Operasi .
  3. Jika rentang memori mengizinkan operasi yang ditentukan, rutin mengunci halaman dalam memori sehingga tidak dapat di-page out. Gunakan rutinitas MmUnlockPages untuk membuka kunci halaman.
  4. Terakhir, rutin memperbarui array nomor bingkai halaman (PFN) di MDL untuk menjelaskan halaman fisik yang terkunci.
Panggilan yang berhasil ke MmProbeAndLockPages mengunci halaman dalam MDL dan mengatur struktur MDL ke status terkunci. Setiap panggilan tersebut harus dicocokkan dengan panggilan yang sesuai dengan MmUnlockPages yang membuka kunci halaman dan mengatur MDL ke status tidak terkunci. Setelah panggilan MmProbeAndLockPages mengatur MDL ke status terkunci, panggilan kedua ke MmProbeAndLockPages untuk mengunci MDL yang sama tidak diizinkan sampai MmUnlockPages pertama kali dipanggil untuk membuka kunci MDL.

Jika dua atau beberapa MDL menggambarkan halaman fisik yang sama, halaman dapat dikunci beberapa kali—sekali untuk setiap MDL. Halaman tidak terkunci ketika MDL terakhir diatur ke status tidak terkunci.

Rutinitas seperti MmBuildMdlForNonPagedPool atau IoBuildPartialMdl memperbarui MDL untuk menjelaskan halaman yang tidak dapat di-halaman atau sudah dikunci. Panggilan ke MmProbeAndLockPages atau MmUnlockPages untuk mengunci atau membuka kunci MDL seperti itu tidak diizinkan.

Panggilan ke MmProbeAndLockPages harus diapit dalam blok coba/kecuali . Jika halaman tidak mendukung operasi yang ditentukan, rutinitas akan menaikkan STATUS_ACCESS_VIOLATION atau pengecualian lainnya. Untuk informasi selengkapnya, lihat Menangani Pengecualian.

Pemanggil MmProbeAndLockPages harus berjalan di IRQL <= APC_LEVEL untuk alamat yang dapat dipaginasi, atau di IRQL <= DISPATCH_LEVEL untuk alamat yang tidak dapat di-halaman.

Rutinitas ini tidak memberikan jaminan apa pun tentang alamat virtual yang menjelaskan halaman-halaman ini (yaitu, alamat virtual mungkin tidak dipetakan, digunakan kembali, dan sebagainya). Namun, halaman fisik dijamin akan dikunci pada pengembalian yang berhasil.

Untuk menghindari kesalahan halaman, gunakan VirtualLock untuk mengunci alamat virtual sehingga tidak akan dipangkas kecuali aplikasi membuka kuncinya atau secara eksplisit membebaskannya dengan memanggil VirtualFree atau UnmapViewOfFile.

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 Lihat bagian Keterangan.
Aturan kepatuhan DDI HwStorPortProhibitedDDIs(storport)

Lihat juga

IoBuildPartialMdl

MmBuildMdlForNonPagedPool

MmUnlockPages