MM_BAD_POINTER
Hinweis
Diese Seite enthielt zuvor eine Liste von Kernelmakros, nicht nur MM_BAD_POINTER. Diese Makros wurden nun in ihre eigenen einzelnen Seiten unterteilt. Verwenden Sie für Links unten den Abschnitt Siehe auch, oder durchsuchen Sie das Web.
Definiert in: Wdm.h
Ihr Treiber kann das makro MM_BAD_POINTER als ungültigen Zeigerwert verwenden, um einer Zeigervariable zuzuweisen, die nicht initialisiert oder nicht mehr gültig ist. Ein Versuch, auf den Speicherort zuzugreifen, auf den diese ungültige Zeigervariable verweist, führt zu einer Fehlerüberprüfung.
Auf vielen Hardwareplattformen ist Adresse 0 (häufig als benannte Konstante NULL dargestellt) eine ungültige Adresse, aber Treiberentwickler sollten nicht davon ausgehen, dass Adresse 0 auf allen Plattformen universell ungültig ist. Das Festlegen nicht initialisierter oder ungültiger Zeigervariablen auf "0" garantiert möglicherweise nicht immer, dass unangemessene Zugriffe über diese Zeiger erkannt werden.
Im Gegensatz dazu ist der Wert MM_BAD_POINTER garantiert eine ungültige Adresse auf jeder Plattform, auf der ein Treiber ausgeführt wird.
Auf Plattformen, auf denen Adresse 0 eine ungültige Adresse ist, verursacht ein Treiber, der auf Adresse 0 am IRQL-DISPATCH_LEVEL < zugreift, eine Ausnahme (Zugriffsverletzung), die versehentlich von einer try/except
Anweisung abgefangen werden kann. Daher kann der Ausnahmebehandlungscode des Treibers den ungültigen Zugriff maskieren und verhindern, dass er während des Debuggens erkannt wird. Ein Zugriff auf die MM_BAD_POINTER-Adresse führt jedoch garantiert zu einer Fehlerüberprüfung, die von einem Ausnahmehandler nicht maskiert werden kann.
Im folgenden Codebeispiel wird gezeigt, wie der Wert MM_BAD_POINTER einer Zeigervariable namens zugewiesen wird ptr
. Die Ntdef.h-Headerdatei definiert den PUCHAR-Typ als Zeiger auf eine unsigned char
.
PUCHAR ptr = (PUCHAR)MM_BAD_POINTER; // Now _ptr is guaranteed to fault._
Nachdem ptr
auf MM_BAD_POINTER festgelegt ist, führt ein Versuch, auf den Speicherspeicherort zuzugreifen, auf den verwiesen wird, zu ptr
einer Fehlerüberprüfung.
Tatsächlich ist MM_BAD_POINTER die Basisadresse einer ganzen Seite ungültiger Adressen. Daher führt jeder Zugriff auf eine Adresse im Bereich MM_BAD_POINTER zu (MM_BAD_POINTER + PAGE_SIZE - 1) zu einer Fehlerüberprüfung.
Ab Windows 8.1 wird das makro MM_BAD_POINTER in der Wdm.h-Headerdatei definiert. Treibercode, der diese Makrodefinition verwendet, kann jedoch in früheren Versionen von Windows ab Windows Vista ausgeführt werden.
Ab Windows Vista ist die globale MmBadPointer-Variable als Zeiger auf einen Zeigerwert verfügbar, der garantiert eine ungültige Adresse ist. Ab Windows 8.1 ist die Verwendung von MmBadPointer jedoch veraltet, und Sie sollten Ihre Treiber aktualisieren, um stattdessen das Makro MM_BAD_POINTER zu verwenden.
Verfügbar ab Windows 8.1. Kompatibel mit früheren Versionen von Windows ab Windows Vista.
Weitere Informationen
- 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
- RtlStoreUlonglonglong
- RtlStoreUlongPtr
- RtlStoreUshort
- WRITE_REGISTER_BUFFER_ULONG64
- WRITE_REGISTER_ULONG64
- ZwCurrentProcess
- ZwCurrentThread