MM_BAD_POINTER
Notes
Cette page contenait auparavant une liste de macros de noyau, pas seulement MM_BAD_POINTER. Ces macros ont maintenant été divisées en leurs propres pages individuelles. Pour obtenir des liens, utilisez la section Voir aussi ci-dessous ou effectuez une recherche sur le web.
Défini dans : Wdm.h
Votre pilote peut utiliser la macro MM_BAD_POINTER comme valeur de pointeur incorrecte à affecter à une variable de pointeur non initialisée ou non valide. Une tentative d’accès à l’emplacement de mémoire pointé par cette variable de pointeur non valide entraîne un bogue case activée.
Sur de nombreuses plateformes matérielles, l’adresse 0 (souvent représentée sous la forme d’une constante NULL nommée) est une adresse non valide, mais les développeurs de pilotes ne doivent pas supposer que l’adresse 0 est universellement non valide sur toutes les plateformes. La définition de variables de pointeur non initialisées ou non valides pour traiter 0 peut ne pas toujours garantir que des accès inappropriés via ces pointeurs seront détectés.
En revanche, la valeur MM_BAD_POINTER est garantie comme une adresse non valide sur chaque plateforme sur laquelle un pilote s’exécute.
Sur les plateformes sur lesquelles l’adresse 0 est une adresse non valide, un pilote qui accède à l’adresse 0 à l’IRQL < DISPATCH_LEVEL provoque une exception (violation d’accès) qui peut être interceptée par inadvertance par une try/except
instruction. Ainsi, le code de gestion des exceptions du pilote peut masquer l’accès non valide et l’empêcher d’être détecté pendant le débogage. Toutefois, un accès à l’adresse MM_BAD_POINTER est garanti pour provoquer un bogue case activée, qui ne peut pas être masqué par un gestionnaire d’exceptions.
L’exemple de code suivant montre comment affecter la valeur MM_BAD_POINTER à une variable de pointeur nommée ptr
. Le fichier d’en-tête Ntdef.h définit le type PUCHAR comme pointeur vers un unsigned char
.
PUCHAR ptr = (PUCHAR)MM_BAD_POINTER; // Now _ptr is guaranteed to fault._
Une fois ptr
que est défini sur MM_BAD_POINTER, une tentative d’accès à l’emplacement de mémoire pointé par ptr
entraîne un bogue case activée.
En fait, MM_BAD_POINTER est l’adresse de base d’une page entière d’adresses non valides. Par conséquent, tout accès d’une adresse dans la plage MM_BAD_POINTER à (MM_BAD_POINTER + PAGE_SIZE - 1) entraîne un bogue case activée.
À compter de Windows 8.1, la macro MM_BAD_POINTER est définie dans le fichier d’en-tête Wdm.h. Toutefois, le code de pilote qui utilise cette définition de macro peut s’exécuter dans les versions précédentes de Windows, à partir de Windows Vista.
À compter de Windows Vista, la variable globale MmBadPointer est disponible en tant que pointeur vers une valeur de pointeur qui est garantie comme une adresse non valide. Toutefois, à compter de Windows 8.1, l’utilisation de MmBadPointer est déconseillée et vous devez mettre à jour vos pilotes pour utiliser la macro MM_BAD_POINTER à la place.
Disponible à partir de Windows 8.1. Compatible avec les versions précédentes de Windows à partir de Windows Vista.
Voir aussi
- 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