Fungsi MmGetSystemAddressForMdlSafe (wdm.h)

Makro MmGetSystemAddressForMdlSafe mengembalikan alamat virtual ruang sistem yang tidak di-patah untuk buffer yang dijelaskan MDL yang ditentukan.

Sintaks

PVOID MmGetSystemAddressForMdlSafe(
  [in] PMDL  Mdl,
  [in] ULONG Priority
);

Parameter

[in] Mdl

Penunjuk ke buffer yang alamat virtual dasarnya sesuai akan dipetakan.

[in] Priority

Menentukan nilai MM_PAGE_PRIORITY yang menunjukkan pentingnya keberhasilan dalam kondisi PTE yang tersedia rendah. Tentukan nilai prioritas LowPagePriority, NormalPagePriority, atau HighPagePriority. Dimulai dengan Windows 8, nilai prioritas yang ditentukan dapat menjadi bitwise-ORed dengan bendera MdlMappingNoWrite atau MdlMappingNoExecute.

  • LowPagePriority menunjukkan bahwa permintaan pemetaan dapat gagal jika sistem cukup rendah pada sumber daya. Contoh situasi ini adalah koneksi jaringan nonkritis di mana driver dapat menangani kegagalan pemetaan.

  • NormalPagePriority menunjukkan bahwa permintaan pemetaan dapat gagal jika sistem sangat rendah pada sumber daya. Contoh situasi ini adalah permintaan sistem file lokal nonkritis.

  • HighPagePriority menunjukkan bahwa permintaan pemetaan tidak boleh gagal kecuali sistem benar-benar kehabisan sumber daya. Contoh situasi ini adalah jalur file halaman dalam driver.

  • MdlMappingNoWrite menunjukkan bahwa halaman fisik yang dipetakan akan dikonfigurasi sebagai memori tanpa tulis (baca saja). Dimulai dengan Windows 8, bit bendera ini dapat bitwise-ORed dengan nilai MM_PAGE_PRIORITY untuk menentukan memori di mana penulisan dinonaktifkan.

  • MdlMappingNoExecute menunjukkan bahwa halaman fisik yang dipetakan akan dikonfigurasi sebagai memori tanpa eksekusi. Dimulai dengan Windows 8, bit bendera ini dapat bitwise-ORed dengan nilai MM_PAGE_PRIORITY untuk menentukan memori di mana eksekusi instruksi dinonaktifkan. Sebagai praktik terbaik, driver yang ditulis untuk Windows 8 dan versi Windows yang lebih baru harus selalu menentukan memori tanpa eksekusi kecuali memori yang dapat dieksekusi diperlukan secara eksplisit.

Mengembalikan nilai

MmGetSystemAddressForMdlSafe mengembalikan alamat virtual ruang sistem dasar yang memetakan halaman fisik yang dijelaskan MDL yang ditentukan. Jika halaman belum dipetakan ke ruang alamat sistem dan upaya untuk memetakannya gagal, NULL dikembalikan.

Keterangan

Rutinitas ini memetakan halaman fisik yang dijelaskan oleh MDL yang ditentukan ke dalam ruang alamat sistem, jika belum dipetakan ke ruang alamat sistem.

Driver perangkat programmed-I/O (PIO) memanggil rutinitas ini untuk memetakan buffer mode pengguna, yang dijelaskan oleh MDL di Irp-MdlAddress> dan yang sudah dipetakan ke rentang alamat virtual mode pengguna, ke rentang dalam ruang alamat sistem.

Pada entri ke rutinitas ini, MDL yang ditentukan harus menjelaskan halaman fisik yang dikunci. MDL yang terkunci dapat dibangun dengan menggunakan mmProbeAndLockPages, MmBuildMdlForNonPagedPool, IoBuildPartialMdl, atau rutinitas MmAllocatePagesForMdlEx .

Ketika pemetaan ruang alamat sistem yang dikembalikan oleh MmGetSystemAddressForMdlSafe tidak lagi diperlukan, pemetaan harus dirilis. Langkah-langkah yang diperlukan untuk merilis pemetaan tergantung pada bagaimana MDL dibangun. Ini adalah empat kemungkinan kasus:

  • Jika MDL dibangun oleh panggilan ke rutinitas MmProbeAndLockPages , tidak perlu melepaskan pemetaan ruang alamat sistem secara eksplisit. Sebagai gantinya, panggilan ke mmUnlockPages rutin merilis pemetaan, jika ada yang dialokasikan.

  • Jika MDL dibangun oleh panggilan ke rutinitas MmBuildMdlForNonPagedPool , MmGetSystemAddressForMdlSafe menggunakan kembali pemetaan ruang alamat sistem yang ada alih-alih membuat yang baru. Dalam hal ini, tidak diperlukan pembersihan (yaitu, membuka kunci dan tidak membongkar tidak diperlukan).

  • Jika MDL dibangun oleh panggilan ke rutinitas IoBuildPartialMdl , driver harus memanggil rutinitas MmPrepareMdlForReuse atau rutinitas IoFreeMdl untuk merilis pemetaan ruang alamat sistem.

  • Jika MDL dibangun oleh panggilan ke rutinitas MmAllocatePagesForMdlEx , driver harus memanggil rutinitas MmUnmapLockedPages untuk merilis pemetaan ruang alamat sistem. Jika MmGetSystemAddressForMdlSafe dipanggil lebih dari satu kali untuk MDL, panggilan MmGetSystemAddressForMdlSafe berikutnya hanya mengembalikan pemetaan yang dibuat oleh panggilan pertama. Satu panggilan ke MmUnmapLockedPages cukup untuk merilis pemetaan ini.

Dimulai dengan Windows 7 dan Windows Server 2008 R2, tidak perlu secara eksplisit memanggil MmUnmapLockedPages untuk MDL yang dibuat oleh MmAllocatePagesForMdlEx. Sebagai gantinya, panggilan ke rutinitas MmFreePagesFromMdl merilis pemetaan ruang alamat sistem, jika dialokasikan.

Untuk membuat pemetaan ruang alamat sistem baru, MmGetSystemAddressForMdlSafe memanggil MmMapLockedPagesSpecifyCache dengan parameter CacheType diatur ke MmCached. Driver yang memerlukan jenis cache selain MmCached harus memanggil MmMapLockedPagesSpecifyCache secara langsung alih-alih memanggil MmGetSystemAddressForMdlSafe. Untuk informasi selengkapnya tentang parameter CacheType , lihat MmMapLockedPagesSpecifyCache.

Dalam panggilan ke MmMapLockedPagesSpecifyCache, jenis cache yang ditentukan hanya digunakan jika halaman yang dijelaskan oleh MDL belum memiliki jenis cache yang terkait dengannya. Namun, dalam hampir semua kasus, halaman sudah memiliki jenis cache terkait, dan jenis cache ini digunakan oleh pemetaan baru. Pengecualian untuk aturan ini adalah untuk halaman yang dialokasikan oleh MmAllocatePagesForMdl, yang mengatur jenis cache ke MmCached terlepas dari jenis cache asli halaman.

Hanya satu utas pada satu waktu yang dapat dengan aman memanggil MmGetSystemAddressForMdlSafe untuk MDL tertentu karena rutinitas ini mengasumsikan bahwa utas panggilan memiliki MDL. Namun, MmGetSystemAddressForMdlSafe dapat dipanggil lebih dari satu kali untuk MDL yang sama baik dengan melakukan semua panggilan dari utas yang sama atau, jika panggilan berasal dari beberapa utas, dengan secara eksplisit menyinkronkan panggilan.

Jika driver harus membagi permintaan menjadi permintaan yang lebih kecil, driver dapat mengalokasikan MDL tambahan, atau driver dapat menggunakan rutinitas IoBuildPartialMdl .

Alamat dasar yang dikembalikan memiliki offset yang sama dengan alamat virtual di MDL.

Windows 98 tidak mendukung MmGetSystemAddressForMdlSafe. Gunakan MmGetSystemAddressForMdl sebagai gantinya.

Karena makro ini memanggil MmMapLockedPagesSpecifyCache, menggunakannya mungkin memerlukan penautan ke NtosKrnl.lib.

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows 2000
Header wdm.h
IRQL <= DISPATCH_LEVEL
Aturan kepatuhan DDI MdlAfterReqCompletedIntIoctlA(kmdf), MdlAfterReqCompletedIoctlA(kmdf), MdlAfterReqCompletedReadA(kmdf), MdlAfterReqCompletedWriteA(kmdf)