MM_BAD_POINTER
Nota
Questa pagina contiene in precedenza un elenco di macro del kernel, non solo MM_BAD_POINTER. Queste macro sono state ora suddivise in singole pagine. Per i collegamenti, usare la sezione Vedere anche sotto o cercare il Web.
Definito in: Wdm.h
Il driver può usare la macro MM_BAD_POINTER come valore puntatore non valido per assegnare a una variabile puntatore non inizializzata o non più valida. Un tentativo di accedere alla posizione di memoria puntata da questa variabile puntatore non valida causerà un controllo di bug.
In molte piattaforme hardware, indirizzo 0 (spesso rappresentato come costante NULL denominata) è un indirizzo non valido, ma gli sviluppatori di driver non devono presupporre che l'indirizzo 0 sia universalmente non valido in tutte le piattaforme. L'impostazione di variabili di puntatore non inizializzate o non valide per l'indirizzo 0 potrebbe non garantire sempre che vengano rilevati accessi inappropriati tramite questi puntatori.
Al contrario, il valore MM_BAD_POINTER è garantito essere un indirizzo non valido in ogni piattaforma in cui viene eseguito un driver.
Nelle piattaforme in cui l'indirizzo 0 è un indirizzo non valido, un driver che accede all'indirizzo 0 in IRQL < DISPATCH_LEVEL causa un'eccezione (violazione di accesso) che può essere rilevata inavvertitamente da un'istruzione try/except
. Pertanto, il codice di gestione delle eccezioni del driver potrebbe mascherare l'accesso non valido e impedire che venga rilevato durante il debug. Tuttavia, un accesso dell'indirizzo MM_BAD_POINTER è garantito per causare un controllo di bug, che non può essere mascherato da un gestore di eccezioni.
Nell'esempio di codice seguente viene illustrato come assegnare il valore MM_BAD_POINTER a una variabile puntatore denominata ptr
. Il file di intestazione Ntdef.h definisce il tipo PUCHAR come puntatore a un unsigned char
oggetto .
PUCHAR ptr = (PUCHAR)MM_BAD_POINTER; // Now _ptr is guaranteed to fault._
Dopo ptr
essere impostato su MM_BAD_POINTER, un tentativo di accedere alla posizione di memoria puntata ptr
da causerà un controllo di bug.
Infatti, MM_BAD_POINTER è l'indirizzo di base di un'intera pagina di indirizzi non validi. Pertanto, qualsiasi accesso di un indirizzo nell'intervallo MM_BAD_POINTER a (MM_BAD_POINTER PAGE_SIZE + - 1) causerà un controllo di bug.
A partire da Windows 8.1, la macro MM_BAD_POINTER viene definita nel file di intestazione Wdm.h. Tuttavia, il codice driver che usa questa definizione di macro può essere eseguito nelle versioni precedenti di Windows a partire da Windows Vista.
A partire da Windows Vista, la variabile globale MmBadPointer è disponibile come puntatore a un valore puntatore garantito come indirizzo non valido. Tuttavia, a partire da Windows 8.1, l'uso di MmBadPointer è deprecato e è consigliabile aggiornare i driver per usare la macro MM_BAD_POINTER.
Disponibile a partire da Windows 8.1. Compatibile con le versioni precedenti di Windows a partire da Windows Vista.
Vedi anche
- 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