MM_BAD_POINTER
Nota
Esta página contenía anteriormente una lista de macros de kernel, no solo MM_BAD_POINTER. Esas macros ahora se han dividido en sus propias páginas individuales. Para obtener vínculos, use la sección Vea también a continuación o busque en la web.
Definido en: Wdm.h
El controlador puede usar la macro MM_BAD_POINTER como un valor de puntero incorrecto para asignar a una variable de puntero que no está inicializada o que ya no es válida. Un intento de acceder a la ubicación de memoria a la que apunta esta variable de puntero no válida provocará una comprobación de errores.
En muchas plataformas de hardware, la dirección 0 (representada con frecuencia como constante con nombre NULL) es una dirección no válida, pero los desarrolladores de controladores no deben suponer que la dirección 0 no es universalmente no válida en todas las plataformas. Establecer variables de puntero no inicializadas o no válidas en la dirección 0 puede no garantizar siempre que se detecten accesos inadecuados a través de estos punteros.
En cambio, se garantiza que el valor MM_BAD_POINTER sea una dirección no válida en todas las plataformas en las que se ejecuta un controlador.
En las plataformas en las que la dirección 0 es una dirección no válida, un controlador que accede a la dirección 0 en IRQL < DISPATCH_LEVEL provoca una excepción (infracción de acceso) que una instrucción puede detectar try/except
accidentalmente. Por lo tanto, el código de control de excepciones del controlador podría enmascarar el acceso no válido e impedir que se detecte durante la depuración. Sin embargo, se garantiza un acceso a la dirección de MM_BAD_POINTER para provocar una comprobación de errores, que no se puede enmascarar mediante un controlador de excepciones.
En el ejemplo de código siguiente se muestra cómo asignar el valor MM_BAD_POINTER a una variable de puntero denominada ptr
. El archivo de encabezado Ntdef.h define el tipo PUCHAR para que sea un puntero a .unsigned char
PUCHAR ptr = (PUCHAR)MM_BAD_POINTER; // Now _ptr is guaranteed to fault._
Una vez ptr
establecido en MM_BAD_POINTER, un intento de acceder a la ubicación de memoria a ptr
la que apunta provocará una comprobación de errores.
De hecho, MM_BAD_POINTER es la dirección base de una página completa de direcciones no válidas. Por lo tanto, cualquier acceso de una dirección del intervalo MM_BAD_POINTER a (MM_BAD_POINTER PAGE_SIZE + - 1) provocará una comprobación de errores.
A partir de Windows 8.1, la macro MM_BAD_POINTER se define en el archivo de encabezado Wdm.h. Sin embargo, el código de controlador que usa esta definición de macro se puede ejecutar en versiones anteriores de Windows a partir de Windows Vista.
A partir de Windows Vista, la variable global MmBadPointer está disponible como puntero a un valor de puntero que se garantiza que es una dirección no válida. Sin embargo, a partir de Windows 8.1, el uso de MmBadPointer está en desuso y debe actualizar los controladores para que usen la macro MM_BAD_POINTER en su lugar.
Disponible a partir de Windows 8.1. Compatible con versiones anteriores de Windows a partir de Windows Vista.
Consulte también
- 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