Compartir a través de


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