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:
- Jika rentang memori yang ditentukan di-page ke penyimpanan backing (disk, jaringan, dan sebagainya), MmProbeAndLockPages menjadikannya residen.
- Rutinitas kemudian mengonfirmasi bahwa halaman mengizinkan operasi yang ditentukan oleh parameter Operasi .
- 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.
- Terakhir, rutin memperbarui array nomor bingkai halaman (PFN) di MDL untuk menjelaskan halaman fisik yang terkunci.
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) |