Oharra
Orrialde honetara sartzeak baimena behar du. Saioa hasteko edo direktorioak aldatzen saia zaitezke.
Orrialde honetara sartzeak baimena behar du. Direktorioak aldatzen saia zaitezke.
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