Compartilhar via


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