MM_BAD_POINTER
Catatan
Halaman ini sebelumnya berisi daftar makro kernel, bukan hanya MM_BAD_POINTER. Makro tersebut sekarang telah dipecah menjadi halaman individual mereka sendiri. Untuk tautan, gunakan bagian Lihat Juga di bawah ini, atau cari di web.
Ditentukan dalam: Wdm.h
Driver Anda dapat menggunakan makro MM_BAD_POINTER sebagai nilai penunjuk yang buruk untuk ditetapkan ke variabel penunjuk yang tidak diinisialisasi atau tidak lagi valid. Upaya untuk mengakses lokasi memori yang ditujukkan oleh variabel penunjuk yang tidak valid ini akan menyebabkan pemeriksaan bug.
Pada banyak platform perangkat keras, alamat 0 (sering direpresentasikan sebagai bernama konstanta NULL) adalah alamat yang tidak valid, tetapi pengembang driver tidak boleh berasumsi bahwa alamat 0 secara universal tidak valid di semua platform. Mengatur variabel pointer yang tidak diinisialisasi atau tidak valid ke alamat 0 mungkin tidak selalu menjamin bahwa akses yang tidak pantas melalui pointer ini akan terdeteksi.
Sebaliknya, nilai MM_BAD_POINTER dijamin menjadi alamat yang tidak valid pada setiap platform tempat driver berjalan.
Pada platform di mana alamat 0 adalah alamat yang tidak valid, driver yang mengakses alamat 0 di IRQL < DISPATCH_LEVEL menyebabkan pengecualian (pelanggaran akses) yang secara tidak sengaja dapat ditangkap oleh try/except
pernyataan. Dengan demikian, kode penanganan pengecualian driver mungkin menutupi akses yang tidak valid dan mencegahnya terdeteksi selama penelusuran kesalahan. Namun, akses alamat MM_BAD_POINTER dijamin menyebabkan pemeriksaan bug, yang tidak dapat ditutupi oleh handler pengecualian.
Contoh kode berikut menunjukkan cara menetapkan nilai MM_BAD_POINTER ke variabel penunjuk bernama ptr
. File header Ntdef.h menentukan jenis PUCHAR menjadi penunjuk ke unsigned char
.
PUCHAR ptr = (PUCHAR)MM_BAD_POINTER; // Now _ptr is guaranteed to fault._
Setelah ptr
diatur ke MM_BAD_POINTER, upaya untuk mengakses lokasi memori yang ditujukkan oleh ptr
akan menyebabkan pemeriksaan bug.
Bahkan, MM_BAD_POINTER adalah alamat dasar dari seluruh halaman alamat yang tidak valid. Oleh karena itu, setiap akses alamat dalam rentang MM_BAD_POINTER ke (MM_BAD_POINTER + PAGE_SIZE - 1) akan menyebabkan pemeriksaan bug.
Dimulai dengan Windows 8.1, makro MM_BAD_POINTER ditentukan dalam file header Wdm.h. Namun, kode driver yang menggunakan definisi makro ini dapat berjalan di versi Windows sebelumnya yang dimulai dengan Windows Vista.
Dimulai dengan Windows Vista, variabel global MmBadPointer tersedia sebagai penunjuk ke nilai penunjuk yang dijamin sebagai alamat yang tidak valid. Namun, dimulai dengan Windows 8.1, penggunaan MmBadPointer tidak digunakan lagi, dan Anda harus memperbarui driver Anda untuk menggunakan makro MM_BAD_POINTER sebagai gantinya.
Tersedia dimulai dengan Windows 8.1. Kompatibel dengan versi Windows sebelumnya yang dimulai dengan Windows Vista.
Lihat juga
- ADDRESS_AND_SIZE_TO_SPAN_PAGES
- BYTE_OFFSET
- BYTES_TO_PAGES
- CONTAINING_RECORD
- IoSkipCurrentIrpStackLocation
- KeInitializeCallbackRecord
- MmGetMdlByteCount
- MmGetMdlByteOffset
- MmGetMdlPfnArray
- MmGetMdlVirtualAddress
- MmGetSystemAddressForMdlSafe
- MmInitializeMdl
- MmPrepareMdlForReuse
- PAGE_ALIGN
- PAGED_CODE
- PAGED_CODE_LOCKED
- PoSetDeviceBusy
- PsGetCurrentProcess
- READ_REGISTER_BUFFER_ULONG64
- READ_REGISTER_ULONG64
- ROUND_TO_PAGES
- RtlEqualLuid
- RtlInitEmptyAnsiString
- RtlInitEmptyUnicodeString
- RtlIsZeroLuid
- RtlRetrieveUlong
- RtlRetrieveUshort
- RtlStoreUlong
- RtlStoreUlonglong
- RtlStoreUlongPtr
- RtlStoreUshort
- WRITE_REGISTER_BUFFER_ULONG64
- WRITE_REGISTER_ULONG64
- ZwCurrentProcess
- ZwCurrentThread