Fungsi MmSecureVirtualMemory (ntddk.h)
Rutinitas MmSecureVirtualMemory mengamankan rentang alamat memori ruang pengguna sehingga tidak dapat dibebaskan dan perlindungan halamannya tidak dapat dibuat lebih ketat.
Sintaks
HANDLE MmSecureVirtualMemory(
[in] PVOID Address,
[in] SIZE_T Size,
[in] ULONG ProbeMode
);
Parameter
[in] Address
Awal rentang alamat virtual pengguna untuk mengamankan.
[in] Size
Ukuran, dalam byte, dari rentang alamat virtual untuk diamankan.
[in] ProbeMode
Menentukan perlindungan halaman paling ketat yang diizinkan. Gunakan PAGE_READWRITE untuk menentukan bahwa rentang alamat harus tetap dapat dibaca dan dapat ditulis, atau gunakan PAGE_READONLY untuk menentukan bahwa rentang alamat hanya boleh tetap dapat dibaca.
ProbeMode | Makna |
---|---|
PAGE_READWRITE | Perlindungan tidak dapat diubah ke PAGE_NOACCESS atau PAGE_READONLY. Semua perubahan perlindungan lainnya diperbolehkan. |
PAGE_READONLY | Perlindungan tidak dapat diubah ke PAGE_NOACCESS. Semua perubahan perlindungan lainnya diperbolehkan. |
Nilai kembali
Setelah berhasil, MmSecureVirtualMemory mengembalikan nilai pointer buram yang diteruskan driver ke rutinitas MmUnsecureVirtualMemory untuk tidak aman dari rentang alamat memori. Jika rutinitas tidak dapat mengamankan rentang alamat memori, maka akan mengembalikan NULL.
Keterangan
MmSecureVirtualMemory dapat digunakan untuk menghindari kondisi balapan tertentu pada buffer mode pengguna. Misalnya, jika driver memeriksa untuk melihat apakah buffer dapat ditulis, tetapi kemudian proses mode pengguna asal mengubah buffer menjadi baca-saja sebelum driver dapat menulis ke buffer, maka kondisi balapan dapat mengakibatkan. Driver dapat menggunakan MmSecureVirtualMemory dengan mode pemeriksaan PAGE_READWRITE untuk menjamin bahwa buffer akan tetap dapat ditulis sampai driver memanggil MmUnsecureVirtualMemory. Rutinitas ini juga melindungi dari proses mode pengguna asal yang membebaskan buffer. Berikut adalah beberapa panduan tentang memanggil rutinitas ini:
Memanggil MmSecureVirtualMemory dengan PAGE_READONLY tidak menjamin bahwa buffer akan tetap baca-saja. Mode pemeriksaan baca-saja mencegah pengguna mengubah perlindungan buffer menjadi PAGE_NOACCESS. Ini tidak mencegah perubahan perlindungan ke PAGE_READWRITE (atau PAGE_WRITECOPY, untuk tampilan yang dipetakan).
Jika driver memanggil MmSecureVirtualMemory dan tidak memanggil MmUnsecureVirtualMemory, memori secara otomatis tidak aman ketika proses berakhir.
Jika driver memanggil MmUnsecureVirtualMemory, driver harus memanggilnya dalam konteks proses di mana memori awalnya diamankan, dan sebelum proses tersebut berakhir.
Biasanya driver perlu mereferensikan proses ketika mereka mengamankan memori, kemudian memanggil KeStackAttachProcess untuk beralih ke konteks proses tersebut sebelum memanggil MmUnsecureVirtualMemory.
Untuk mendeteksi driver penghentian proses dapat menggunakan PsSetCreateProcessNotifyRoutine. Atau, prosesnya dapat mengirimkan IRP dengan rutinitas pembatalan yang dipanggil oleh manajer I/O saat proses keluar. Dalam rutinitas pembatalan, driver dapat melampirkan ke proses dan memanggil MmUnsecureVirtualMemory.
Meskipun MmSecureVirtualMemory dapat digunakan untuk menjamin bahwa membaca atau menulis memori pengguna tidak akan menimbulkan pengecualian karena izin halaman yang tidak memadai, itu tidak melindungi dari jenis pengecualian lain. Misalnya, ini tidak melindungi dari pengecualian yang dimunculkan ketika sistem menemukan blok disk yang buruk dalam file halaman. Oleh karena itu, driver masih harus membungkus semua akses memori pengguna dalam blok try/except . Karena itu, kami menyarankan agar driver tidak menggunakan fungsi ini. Untuk informasi selengkapnya, lihat Menangani Pengecualian.
Persyaratan
Persyaratan | Nilai |
---|---|
Target Platform | Universal |
Header | ntddk.h (termasuk Ntddk.h) |
Pustaka | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <=APC_LEVEL |
Aturan kepatuhan DDI | HwStorPortProhibitedDDIs(storport), IrqlMmApcLte(wdm) |