MM_BAD_POINTER
Observação
Esta página continha anteriormente uma lista de macros de kernel, não apenas MM_BAD_POINTER. Essas macros agora foram divididas em suas próprias páginas individuais. Para links, use a seção Veja também abaixo ou pesquise na Web.
Definido em: Wdm.h
O driver pode usar a macro MM_BAD_POINTER como um valor de ponteiro inválido para atribuir a uma variável de ponteiro que não é inicializada ou não é mais válida. Uma tentativa de acessar o local de memória apontado por essa variável de ponteiro inválida causará um bug marcar.
Em muitas plataformas de hardware, o endereço 0 (frequentemente representado como constante nomeada NULL) é um endereço inválido, mas os desenvolvedores de driver não devem assumir que o endereço 0 é universalmente inválido em todas as plataformas. Definir variáveis de ponteiro não inicializadas ou inválidas para o endereço 0 pode nem sempre garantir que acessos inadequados por meio desses ponteiros serão detectados.
Por outro lado, o valor MM_BAD_POINTER é garantido como um endereço inválido em todas as plataformas em que um driver é executado.
Em plataformas em que o endereço 0 é um endereço inválido, um driver que acessa o endereço 0 no IRQL < DISPATCH_LEVEL causa uma exceção (violação de acesso) que pode ser capturada inadvertidamente por uma try/except
instrução . Portanto, o código de tratamento de exceção do driver pode mascarar o acesso inválido e impedir que ele seja detectado durante a depuração. No entanto, é garantido que um acesso do endereço MM_BAD_POINTER cause uma marcar de bugs, que não pode ser mascarada por um manipulador de exceção.
O exemplo de código a seguir mostra como atribuir o valor MM_BAD_POINTER a uma variável de ponteiro chamada ptr
. O arquivo de cabeçalho Ntdef.h define o tipo PUCHAR como um ponteiro para um unsigned char
.
PUCHAR ptr = (PUCHAR)MM_BAD_POINTER; // Now _ptr is guaranteed to fault._
Depois de ptr
ser definido como MM_BAD_POINTER, uma tentativa de acessar o local de memória apontado por ptr
causará um bug marcar.
Na verdade, MM_BAD_POINTER é o endereço base de uma página inteira de endereços inválidos. Portanto, qualquer acesso de um endereço no intervalo MM_BAD_POINTER a (MM_BAD_POINTER + PAGE_SIZE - 1) causará um bug marcar.
Começando com Windows 8.1, a macro MM_BAD_POINTER é definida no arquivo de cabeçalho Wdm.h. No entanto, o código do driver que usa essa definição de macro pode ser executado em versões anteriores do Windows começando com o Windows Vista.
A partir do Windows Vista, a variável global MmBadPointer está disponível como um ponteiro para um valor de ponteiro que é garantido como um endereço inválido. No entanto, começando com Windows 8.1, o uso de MmBadPointer foi preterido e você deve atualizar seus drivers para usar a macro MM_BAD_POINTER.
Disponível a partir do Windows 8.1. Compatível com versões anteriores do Windows começando com o Windows Vista.
Confira também
- 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