Share via


0xD1 de Verificação de Bugs: DRIVER_IRQL_NOT_LESS_OR_EQUAL

O marcar de bugs DRIVER_IRQL_NOT_LESS_OR_EQUAL tem um valor de 0x000000D1. Isso indica que um driver de modo kernel tentou acessar a memória paginável enquanto o IRQL do processo era muito alto.

Importante

Este artigo é para programadores. Se você for um cliente que recebeu um código de erro de tela azul ao usar o computador, consulte Solucionar erros de tela azul.

parâmetros de DRIVER_IRQL_NOT_LESS_OR_EQUAL

Parâmetro Descrição

1

Memória referenciada.

2

IRQL no momento da referência.

3

  • 0 – Leitura
  • 1 – Gravar
  • 2 – Executar
  • 8 – Executar

4

Endereço que referenciava memória. Use ln (listar símbolos mais próximos) neste endereço para ver o nome da função.

Causa

Para determinar a causa, é necessário o depurador do Windows, a experiência de programação e o acesso ao código-fonte do módulo de falha.

Normalmente, quando esse erro ocorre, um driver tentou acessar um endereço que é paginável (ou que é completamente inválido) enquanto o nível de solicitação de interrupção (IRQL) era muito alto. Isso pode ser causado por:

  • Desreferenciar um ponteiro inválido (como um ponteiro NULO ou liberado) durante a execução no DISPATCH_LEVEL ou acima.

  • Acessar dados paginável no DISPATCH_LEVEL ou acima.

  • Executar um código paginável no DISPATCH_LEVEL ou acima.

Se um driver responsável pelo erro puder ser identificado, seu nome será impresso na tela azul e armazenado na memória no local (PUNICODE_STRING) KiBugCheckDriver. Você pode usar dx (exibir expressão de modelo de objeto do depurador), um comando de depurador, para exibir isso: dx KiBugCheckDriver.

Esse bug marcar geralmente é causado por drivers que usaram endereços de memória inadequados.

As possíveis causas para a falha de página incluem os seguintes eventos:

  • A função foi marcada como paginável e estava em execução em um IRQL elevado (que inclui a obtenção de um bloqueio).

  • A chamada de função foi feita para uma função em outro driver e esse driver foi descarregado.

  • A função foi chamada usando um ponteiro de função que era um ponteiro inválido.

Para obter mais informações sobre o Windows IRQLs, consulte Windows Internals 7th Edition Parte 1 de Pavel Yosifovich, Mark E. Russinovich, David A. Solomon e Alex Ionescu.

Resolução

Se o problema for causado pelo driver que você está desenvolvendo, verifique se a função que estava sendo executada no momento do bug marcar é:

  • Não marcado como paginável
  • Não chama nenhuma outra função embutida que possa ser paginada.

A extensão do depurador !analyze exibe informações sobre o bug marcar e pode ser útil para determinar a causa raiz. O exemplo a seguir é a saída de !analyze.

DRIVER_IRQL_NOT_LESS_OR_EQUAL (d1)
An attempt was made to access a pageable (or completely invalid) address at an
interrupt request level (IRQL) that is too high.  This is usually
caused by drivers using improper addresses.
If kernel debugger is available get stack backtrace.
Arguments:
Arg1: fffff808add27150, memory referenced
Arg2: 0000000000000002, IRQL
Arg3: 0000000000000000, value 0 = read operation, 1 = write operation
Arg4: fffff808adc386a6, address which referenced memory

Se um driver responsável pelo erro puder ser identificado, seu nome será impresso na tela azul e armazenado na memória no local (PUNICODE_STRING) KiBugCheckDriver. Você pode usar dx (exibir expressão de modelo de objeto do depurador), um comando de depurador, para exibir este: dx KiBugCheckDriver.

0: kd> dx KiBugCheckDriver
KiBugCheckDriver                 : 0xffffc6092de892c8 : "Wdf01000.sys" [Type: _UNICODE_STRING *]

Se um quadro de interceptação estiver disponível no arquivo de despejo, use o comando .trap para definir o contexto para o endereço fornecido.

Para começar a depurar esse tipo de bug marcar, examine o rastreamento de pilha usando os comandos k, kb, kc, kd, kp, kP, kv (display stack backtrace).

No depurador, execute o comando !irql para exibir informações sobre o IRQL de um processador no computador de destino antes da quebra do depurador. Por exemplo:

0: kd> !irql
Debugger saved IRQL for processor 0x0 -- 2 (DISPATCH_LEVEL)

Na maioria dos casos desse tipo de bug marcar, o problema não é o nível IRQL, mas sim a memória que está sendo acessada.

Como esse bug marcar geralmente é causado por drivers que usaram endereços de memória inadequados, use os parâmetros 1, 3 e 4 para investigar mais.

Use ln (listar símbolos mais próximos) com o parâmetro 4 para ver o nome da função que foi chamada. Examine também a saída !analyze para ver se o código com falha está identificado.

Use !pool no endereço do parâmetro 1 para ver se ele é um pool de páginas. Use !address e o comando ! pte avançado para saber mais sobre essa área de memória.

Use os comandos de memória de exibição para examinar a memória referenciada no comando no parâmetro 1.

Use os comandos u, ub, uu (unassemble) para examinar o código no endereço que referenciou a memória no parâmetro 4.

Use o comando lm t n para listar módulos carregados na memória. Use !memusage e para examinar o estado geral da memória do sistema.

Driver Verifier

O Verificador de Driver é uma ferramenta executada em tempo real para examinar o comportamento dos drivers. Por exemplo, o Verificador de Driver verifica o uso de recursos de memória, como pools de memória. Se ele identificar erros na execução do código do driver, ele criará proativamente uma exceção para permitir que essa parte do código do driver seja examinada ainda mais. O Gerenciador de Verificador de Driver é integrado ao Windows e está disponível em todos os computadores Windows.

Para iniciar o Gerenciador de Verificador de Driver, digite verificador em um prompt de comando. Você pode configurar quais drivers verificar. O código que verifica os drivers adiciona sobrecarga à medida que é executado, portanto, tente verificar o menor número de drivers possível. Para obter mais informações, consulte Verificador de Driver.

Comentários

Se você não estiver equipado para usar o depurador do Windows para trabalhar nesse problema, poderá usar algumas técnicas básicas de solução de problemas.

  • Verifique a Visualizador de Eventos de Logon do Sistema para obter mensagens de erro adicionais que possam ajudar a identificar o dispositivo ou driver que está causando esse bug marcar.

  • Se um driver for identificado na mensagem de verificação de bug, desative o driver ou verifique com o fabricante as atualizações de driver.

  • Confirme se qualquer novo hardware instalado é compatível com a versão instalada do Windows. Por exemplo, você pode obter informações sobre o hardware necessário em Especificações de Windows 10.

Para obter informações adicionais de solução de problemas gerais, consulte Dados de tela azul.