MM_BAD_POINTER
注意
此頁面先前包含核心宏的清單,而不只是 MM_BAD_POINTER。 這些宏現在已分成自己的個別頁面。 如需連結,請使用下方的 [另請參閱] 區段,或搜尋網頁。
定義於:Wdm.h
您的驅動程式可以使用 MM_BAD_POINTER 宏做為錯誤的指標值,指派給未初始化或不再有效的指標變數。 嘗試存取這個無效指標變數所指向的記憶體位置會導致錯誤檢查。
在許多硬體平臺上,位址 0 (經常以具名常數 NULL 表示) 是無效的位址,但驅動程式開發人員不應假設位址 0 在所有平臺上都通用無效。 將未初始化或無效的指標變數設定為位址 0 不一定會保證偵測到不適當的透過這些指標存取。
相反地 ,MM_BAD_POINTER值 保證在驅動程序執行的每個平臺上都是無效的位址。
在位址 0 是無效位址的平臺上,存取 IRQL < 位址 0 的驅動程式DISPATCH_LEVEL會導致例外狀況 (存取違規) ,而語句可能會意外攔截 try/except
。 因此,驅動程式的例外狀況處理程式代碼可能會遮罩無效的存取,並防止在偵錯期間偵測到。 不過,保證存取 MM_BAD_POINTER 位址會導致錯誤檢查,而例外狀況處理程式無法遮罩。
下列程式代碼範例示範如何將值 指派給 名為 ptr
的指標變數MM_BAD_POINTER。 Ntdef.h 頭檔會將 PUCHAR 類型定義為 的 unsigned char
指標。
PUCHAR ptr = (PUCHAR)MM_BAD_POINTER; // Now _ptr is guaranteed to fault._
設定為 MM_BAD_POINTER 之後ptr
,嘗試存取 所ptr
指向的記憶體位置會導致錯誤檢查。
事實上, MM_BAD_POINTER 是無效位址之整個頁面的基位址。 因此,範圍中位址的任何存取MM_BAD_POINTER (MM_BAD_POINTER + PAGE_SIZE - 1) 會導致錯誤檢查。
從 Windows 8.1 開始,MM_BAD_POINTER宏會定義在 Wdm.h 頭檔中。 不過,使用此宏定義的驅動程式程式代碼可以在舊版 Windows 中從 Windows Vista 開始執行。
從 Windows Vista 開始, MmBadPointer 全域變數可作為指標值的指標,保證為無效的位址。 不過,從 Windows 8.1 開始,MmBadPointer 的使用已被取代,您應該更新驅動程式以改用 MM_BAD_POINTER 宏。
從 Windows 8.1 開始提供。 與舊版 Windows 相容,從 Windows Vista 開始。
另請參閱
- 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