Usar o Verificador de Driver para identificar problemas com drivers do Windows para usuários avançados

A ferramenta Verificador de Driver está incluída em todas as versões do Windows desde o Windows 2000. É usado para detectar e solucionar problemas de driver que são conhecidos por causar corrupção no sistema, falhas ou outro comportamento imprevisível. Este artigo descreve como usar o Verificador de Driver para isolar e solucionar problemas de um driver no sistema.

Aplica-se a: Windows Server 2012 Foundation, Windows Server 2012 Essentials, Windows Server 2012 Standard, Windows Server 2012 Datacenter
Número de KB original: 244617

Funcionalidades do Verificador de Driver

Para usar o Verificador de Driver, execute Verifier.exe e reinicie o computador. Você não precisa fazer nenhuma outra alteração para começar a analisar drivers no sistema. Sua conta de usuário requer privilégios de administrador para executar Verifier.exe.

O Verificador de Driver pode marcar muitos aspectos diferentes do comportamento de um driver. Esses recursos são agrupados em opções ou configurações habilitadas pelo uso de sinalizadores. (As opções de termos, configurações e sinalizadores normalmente são intercambiáveis na documentação do Verificador de Driver. Eles representam conceitos semelhantes.)

Para obter informações detalhadas sobre cada sinalizador, consulte Opções do Verificador de Driver e classes de regra.

Opções Padrão

As opções a seguir representam as regras que todos os drivers do sistema não devem violar. Essas opções são habilitadas quando você escolhe habilitar as configurações padrão na GUI do Verificador de Driver ou especifica a opção /standard ao configurar o Verificador de Driver usando a linha de comando.

Verificações automáticas

Essas verificações são sempre feitas em um driver que está sendo verificado, não importa quais opções tenham sido selecionadas.

Exemplos de Verificações Automáticas:

  • Verificações IRQL
    • Um IRQL gerado (o que significa que o IRQL atual é menor que o IRQL de destino).
    • Um IRQL reduzido (o que significa que o IRQL atual é mais do que o IRQL de destino).
  • SpinLocks:
    • Versão dupla de um bloqueio de rotação.
    • Aquisições/versões de bloqueio de rotação são feitas no IRQL apropriado.
  • Alocações de memória:
    • Alocações/liberações de pool de páginas são feitas no IRQL correto (APC_LEVEL ou abaixo).
    • Alocações/liberdades de pool não páginadas são feitas no IRQL correto (DISPATCH_LEVEL ou abaixo).
    • Nenhum valor aleatório (não diferenciado) é especificado para essas APIs (interfaces de programação de aplicativo).
    • Alocações liberadas não estão apontando para objetos temporizadores ativos.
  • Verificação de descarregamento do driver:
    • Verifica se o driver não tem operações pendentes durante o descarregamento, como DPCs pendentes ou threads de trabalho.
  • Outros comportamentos do Driver:
    • Alternar pilhas de thread incorretamente.
    • Tentando chamar KeWaitXxx no IRQL >= DISPATCH_LEVEL.
    • Desreferenciando um objeto que já tem uma contagem de referência de 0.

Pool Especial

Quando essa opção está ativa, o Verificador de Driver aloca a maioria das solicitações de memória do driver de um pool especial. Esse pool especial é monitorado por excessos de memória, subexame de memória e memória acessadas após a liberação.

Forçar a verificação do IRQL

Quando essa opção está ativa, o Verificador de Driver coloca uma pressão de memória extrema no driver invalidando o código pageable. Se o driver tentar acessar a memória paged no IRQL errado ou ao segurar um bloqueio de rotação, o Verificador de Driver detectará esse comportamento.

Rastreamento de Pool

Quando essa opção estiver ativa, o Verificador de Driver verifica se o driver liberou todas as alocações de memória quando ele é descarregado. Ele revela vazamentos de memória.

Verificação de E/S

Quando essa opção está ativa, o Verificador de Driver aloca os IRPs do driver de um pool especial e monitora o tratamento de E/S do driver. Ele detecta o uso ilegal ou inconsistente de rotinas de E/S.

Quando o Verificador de E/S estiver habilitado:

  • Todos os IRPs alocados por meio do IoAllocateIrp são alocados no pool especial, se estiverem disponíveis.
  • Verificações são feitas em IoCallDriver, IoCompleteRequest e IoFreeIrp para capturar mensagens de erro do driver.
  • Todas as falhas do Verificador de E/S marcar com o DRIVER_VERIFIER_IOMANAGER_VIOLATION de código (0xC9).

Observação

No Windows 7 e versões posteriores do sistema operacional Windows, todos os recursos da Verificação avançada de E/S são incluídos como parte da Verificação de E/S e não estão mais disponíveis nem necessários para selecionar a opção Verificação avançada de E/S no Driver Verifier Manager ou na linha de comando.

Detecção de impasse

Quando essa opção está ativa, o Verificador de Driver monitora o uso do driver de bloqueios de rotação, mutexes e mutexes rápidos. Ele detecta se o código do driver tem o potencial de causar um impasse em algum momento.

Verificação de E/S aprimorada

Quando essa opção está ativa, o Verificador de Driver monitora as chamadas de várias rotinas do Gerenciador de E/S e executa testes de estresse de IRPs PnP, IRPs de energia e IRPs WMI.

Observação

No Windows 7 e versões posteriores, todos os recursos de Verificação avançada de E/S são incluídos como parte da Verificação de E/S. Essa opção não está mais disponível ou necessária no Driver Verifier Manager ou em uma linha de comando.

Verificação de DMA

Quando essa opção está ativa, o Verificador de Driver monitora o uso de rotinas de DMA pelo driver. Ele detecta o uso inadequado de buffers de DMA, adaptadores e registros de mapa.

Verificações de segurança

Quando essa opção está ativa, o Verificador de Driver procura erros comuns que podem resultar em vulnerabilidades de segurança, como uma referência a endereços do modo de usuário por rotinas do modo kernel.

Verificações diversas

Quando essa opção está ativa, o Verificador de Driver procura as causas comuns de falhas no driver, como o mau tratamento da memória liberada.

Verificação de conformidade do DDI

Quando essa opção está ativa, o Verificador de Driver aplica um conjunto de regras de DDI (interface do driver de dispositivo) que marcar para a interação adequada entre um driver e a interface do kernel do sistema operacional.

A opção de verificação de conformidade DDI é implementada usando uma biblioteca do modo Kernel, chamada VerifierExt.sys. Se uma violação de uma das regras de Verificação de Conformidade do DDI for encontrada, VerifierExt.sys será o módulo que pediu que o bug do sistema marcar ocorra.

Opções adicionais

Essas opções são projetadas para testes de cenário específicos ou são opções que injetarão falhas ou atrasos em determinadas rotinas de DDI para simular condições extremas de estresse.

Requisitos do Verificador de Driver

O único requisito é instalar Windows Server 2012. Você pode habilitar o Verificador de Driver em versões de varejo e marcadas do Windows. Se o Norton Antivírus estiver instalado, não habilite a Detecção de Impasse do Verificador de Driver.

Habilitar verificador de driver

Você pode habilitar o Verificador de Driver usando Verifier.exe. Verifier.exe está incluído em todas as cópias do Windows. Ele é instalado automaticamente na pasta System32. Verifier.exe tem interfaces GUI (linha de comando) e interface gráfica do usuário (GUI), para que você possa especificar drivers e níveis apropriados de verificação. Você também pode ver estatísticas do Verificador de Driver em tempo real. Para obter mais informações, consulte a seção Driver Verifier Manager (Verifier.exe).

Depurar violações do Verificador de Driver

Caso o Verificador de Driver detecte uma violação, o comportamento padrão é bug marcar sistema a fim de fornecer o máximo de informações possíveis sobre a depuração do problema. Um sistema conectado a um depurador será interrompido depois que um bug marcar ocorrer.

Todas as violações do Verificador de Driver resultam em verificações de bugs, as mais comuns (embora não necessariamente todas elas) são:

  • 0xC1: SPECIAL_POOL_DETECTED_MEMORY_CORRUPTION
  • 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION
  • 0xC6: DRIVER_CAUGHT_MODIFYING_FREED_POOL
  • 0xC9: DRIVER_VERIFIER_IOMANAGER_VIOLATION
  • 0xD6: DRIVER_PAGE_FAULT_BEYOND_END_OF_ALLOCATION
  • 0xE6: DRIVER_VERIFIER_DMA_VIOLATION

!analyze -v é o melhor comando a ser usado ao iniciar uma nova sessão de depuração. Esse comando retornará informações úteis e tentará identificar o driver com falha.

Extensões de depurador específicas do Verificador de Driver:

  • !verifier despejará as estatísticas capturadas do Verificador de Driver. !verifier -? mostrará todas as opções disponíveis.
  • !deadlock despeja informações relacionadas a bloqueios ou objetos rastreados pela detecção de Deadlock. !deadlock -? mostrará todas as opções disponíveis.
  • !iovirp [address] despejará informações relacionadas a um IRP rastreado pelo Verificador de E/S.
  • !ruleinfo [RuleID]despejará informações relacionadas à regra de Verificação de Conformidade do DDI que foi violada (RuleID é sempre o primeiro argumento para o bug marcar, todas as IDs de regra de Verificação de Conformidade DDI estão no formulário 0x200nn).

Driver Verifier e drivers gráficos

Os drivers gráficos do modo kernel do Windows, como DLLs do driver de impressora e de exibição, são impedidos de chamar o ponto de entrada do pool diretamente. As alocações de pool são executadas indiretamente usando retornos de chamada DDI (interface do driver de dispositivo gráfico) para Win32k.sys. Por exemplo, EngAllocMem é o retorno de chamada que um driver gráfico chama para alocar explicitamente a memória do pool. Outros retornos de chamada especializados, como EngCreatePalette e EngCreateBitmap, também retornam memória do pool.

Para fornecer o mesmo teste automatizado para os drivers gráficos, o suporte para algumas das funções verificador de driver é incorporado ao Win32k.sys. Como os drivers gráficos são mais restritos do que outros drivers do modo kernel, eles exigem apenas um subconjunto da funcionalidade verificador de driver. Especificamente, a verificação de IRQL e a verificação de E/S não são necessárias. A outra funcionalidade, ou seja, usando pool especial, falha aleatória de alocações de pool e acompanhamento de pool, tem suporte para diferentes graus nos diferentes retornos de chamada DDI gráficos.

Há suporte para falhas aleatórias para as seguintes funções de retorno de chamada DDI gráficos:

  • EngAllocMem
  • EngAllocUserMem
  • EngCreateBitmap
  • EngCreateDeviceSurface
  • EngCreateDeviceBitmap
  • EngCreatePalette
  • EngCreateClip
  • EngCreatePath
  • EngCreateWnd
  • EngCreateDriverObj
  • BRUSHOBJ_pvAllocRbrush
  • CLIPOBJ_ppoGetPath

Além disso, há suporte para o uso do pool especial e do rastreamento de pool para EngAllocMem.

Habilitar o Verificador de Driver para os drivers gráficos é idêntico aos outros drivers. Para obter mais informações, consulte a seção Habilitar Verificador de Driver . Sinalizadores sem suporte, como a verificação IRQL, são ignorados. Além disso, você pode usar o comando kernel-depurador para examinar o !gdikdx.verifier estado atual do Verificador de Driver e os rastreamentos de pool para drivers gráficos.

Observação

Você só deve usar a configuração de falha de alocação aleatória para testes de robustez. O uso dessa configuração pode causar mensagens de erro de renderização, portanto, você não deve usar essa configuração com testes de verificação para marcar a correção da implementação do driver gráfico (por exemplo, comparando a saída do driver gráfico com uma imagem de referência).

Driver Verifier Manager (Verifier.exe)

A ferramenta Driver Verifier Manager (Verifier.exe) é a maneira preferida de criar e modificar as configurações do Verificador de Driver e coletar estatísticas do Verificador de Driver. Verifier.exe está localizada na pasta %WinDir%\System32 para cada instalação do Windows.

Driver Verifier Manager é a GUI incluída no Windows para configurar o Verificador de Driver. Inicie o Driver Verifier Manager usando verifier.exe sem outros comutadores de linha de comando. Sempre que os comutadores são incluídos, a versão baseada em linha de comando do utilitário é usada.

Para obter ajuda com a configuração do Verificador de Driver, execute verifier.exe /? a partir de uma janela CMD do administrador.

Driver status

A página de propriedade Status do Driver fornece uma imagem do status atual do Verificador de Driver. Você pode ver quais drivers o verificador detecta. O status pode ser um dos seguintes valores:

  • Carregado: o driver está carregado e verificado no momento.
  • Descarregado: o driver não está carregado no momento, mas foi carregado pelo menos uma vez desde que você reiniciou o computador.
  • Nunca carregado: o driver nunca foi carregado. Esse status pode indicar que o arquivo de imagem do driver está corrompido ou que você especificou um nome de driver ausente do sistema.

Selecione o cabeçalho da lista para classificar a lista por nomes de driver ou status. Na área superior direita da caixa de diálogo, você pode exibir os tipos atuais da verificação que estão em vigor. O status dos drivers é atualizado automaticamente se você não mudar para o modo de atualização manual. Você pode modificar a taxa de atualização usando os botões de rádio na área inferior esquerda da caixa de diálogo. Para forçar uma atualização do status, selecione Atualizar Agora.

Se você habilitar o sinalizador do Pool Especial e menos de 95% das alocações do pool forem para o pool especial, uma mensagem de aviso será exibida nesta página. Isso significa que você precisa selecionar um conjunto menor de drivers para verificar ou adicionar mais memória física ao computador para obter uma melhor cobertura da verificação de alocações do pool.

Contadores Globais

Esta página de propriedade mostra o valor atual de alguns contadores mantidos pelo Verificador de Driver. Um valor zero para um contador pode indicar que o sinalizador verificador de driver associado não está habilitado. Por exemplo, um valor de 0 para o contador Outros/Falhas indica que o sinalizador de simulação de recurso baixo não está habilitado. Você pode monitorar a atividade do verificador porque os valores dos contadores são atualizados automaticamente por padrão. Você pode alterar a taxa de atualização, alternar para atualização manual ou forçar uma atualização usando o grupo de controles na área inferior esquerda da caixa de diálogo.

Rastreamento de Pool

Esta página de propriedade mostra mais estatísticas coletadas do Verificador de Driver. Todos os contadores mostrados nesta página estão relacionados ao sinalizador de rastreamento de pool do verificador. A maioria deles são contadores por driver, como alocações atuais, bytes alocados atualmente e assim por diante. Você deve selecionar um nome de driver na caixa de combinação superior para exibir os contadores para esse driver específico.

Configurações

Você pode usar esta página para criar e modificar as configurações do Verificador de Driver. As configurações são salvas no registro e você deve reiniciar o computador para que as configurações entrem em vigor. Você pode usar a lista para exibir os drivers instalados no momento. Cada driver pode estar em um dos seguintes estados:

  • Verificar Habilitado: o driver está verificado no momento.
  • Verificar Desabilitado: o driver não está verificado no momento.
  • Verificar Habilitado (Reinicialização Necessária): o driver só é verificado após a próxima reinicialização.
  • Verificar desabilitado (Reinicialização Necessária): o driver está verificado no momento, mas não é verificado após a próxima reinicialização.

Você pode selecionar um ou vários drivers da lista e alternar o status usando os dois botões na lista. Você também pode clicar com o botão direito do mouse em um nome do driver para exibir o menu de contexto, que permite executar a agregação de estado.

Na parte inferior da caixa de diálogo, você pode especificar mais drivers (separados por espaços) que deseja verificar após a próxima reinicialização. Normalmente, você usa esse controle de edição quando deseja instalar um novo driver que ainda não está carregado.

Se o grupo de botões de rádio na parte superior da lista estiver definido como Verificar todos os drivers, a lista e os botões Verificar e Não Verificar e o controle de edição não estiverem disponíveis. Isso significa que, após a próxima reinicialização, todos os drivers do sistema são verificados.

Você pode definir o tipo de verificação usando as caixas de marcar na área superior direita da caixa de diálogo. Você pode habilitar a Verificação de E/S no nível 1 ou no nível 2. A verificação de nível 2 é mais forte que o nível 1.

Salve qualquer modificação nas configurações selecionando Aplicar. Há mais dois botões nesta página:

  • Configurações preferenciais: ele seleciona algumas configurações comumente usadas (com todos os drivers verificados).
  • Redefinir Tudo: ele limpa todas as configurações do Verificador de Driver para que nenhum drivers seja verificado.

Depois de selecionar Aplicar, você deve reiniciar o computador para que as alterações entrem em vigor.

Configurações voláteis

Você pode usar essa página de propriedade para alterar os sinalizadores do Verificador de Driver imediatamente. Você só pode alternar o estado de alguns dos sinalizadores do Verificador de Driver. E você não pode alterar a lista de drivers que estão sendo verificados. Depois de alterar o status de algumas caixas de marcar, selecione Aplicar para que as alterações entrem em vigor. As alterações entrarão em vigor imediatamente. E elas duram até que você faça alterações adicionais ou até reiniciar o computador.

A interface de linha de comando

Você também pode executar Verifier.exe de uma linha de comando (para obter mais informações, digiteverifier.exe /? em um prompt de comando). Vários comutadores podem ser usados na linha de comando, por exemplo:

Verifier.exe /flags 0x209BB /driver MyDriver1.sys MyFilterDriver1.sys

A lista a seguir mostra os sinalizadores de linha de comando mais usados:

Configurar opções (sinalizadores)

  • verifier.exe /flags value

    Valor é um número hex (um prefixo de 0x é necessário) que representa o valor coletivo dos sinalizadores a serem habilitados. O valor de cada sinalizador é mostrado na verifier /? saída.

    Sinalizadores Padrão:

    0x00000000: verificações automáticas
    0x00000001: Pool especial
    0x00000002: Forçar a verificação do IRQL
    0x00000008: rastreamento de pool
    0x00000010: verificação de E/S
    0x00000020: detecção de impasse
    0x00000080: verificação de DMA
    0x00000100: verificações de segurança
    0x00000800: verificações diversas
    0x00020000: verificação de conformidade do DDI

    Mais sinalizadores:

    0x00000004: simulação aleatória de recursos baixos
    0x00000040: verificação de E/S aprimorada (somente Vista)
    0x00000200: forçar solicitações de E/S pendentes
    0x00000400: Registro em log de IRP
    0x00002000: Verificação de MDL invariável para pilha
    0x00004000: Verificação invariável de MDL para driver0x00008000: falha na estrutura do power

    Por exemplo, para habilitar apenas o Pool Especial, a Verificação de E/S e as verificações diversas:

    verifier.exe /flags 0x811
    

    Para habilitar todas as configurações padrão (qualquer exemplo funciona):

    verifier.exe /standard
    
    verifier.exe /flags 0x209BB
    
  • Configurar drivers para verificar

    verifier.exe /driver driver1.sys [driver2.sys driver3.sys ...]
    

    Este comando especifica o driver ou drivers específicos a serem verificados. Forneça drivers adicionais em uma lista separada por espaço.

    verifier.exe /all
    

    Esse comando verifica todos os drivers no sistema.

  • Configurar usando o modo Volátil

    verifier.exe /volatile /flags *value /adddriver MyDriver1.sys*
    

    Esse comando altera os sinalizadores do verificador imediatamente e adiciona MyDriver1.sys para verificação.

  • Consultar estatísticas atuais do Verificador

    verifier /query
    

    Despeje o verificador de driver atual status e contadores para a saída padrão.

  • Consultar as configurações atuais do Verificador

    verifier /querysettings
    

    Despeje as configurações atuais do Verificador de Driver para a saída padrão.

  • Limpar configurações do Verificador

    verifier.exe /reset
    

    Esse comando apaga todas as configurações atuais do Verificador de Driver.

Informações adicionais para desenvolvedores do Driver

As seções a seguir descrevem mais detalhes sobre as configurações do verificador de driver que podem ser de interesse para desenvolvedores de driver. Essas configurações geralmente não são exigidas por profissionais de TI.

Importante

Esta seção, método ou tarefa contém etapas que descrevem como modificar o Registro. Entretanto, sérios problemas poderão ocorrer caso você modifique o Registro incorretamente. Portanto, siga essas etapas cuidadosamente. Para mais proteção, faça o backup do registro antes de modificá-lo. Em seguida, você poderá restaurar o registro se ocorrer um problema. Para saber mais sobre como fazer o backup e restaurar o registro, consulte Como fazer o backup e restaurar o registro no Windows.

Para habilitar o Verificador de Driver editando o registro, siga estas etapas:

  1. Iniciar Editor do Registro (Regedt32).

  2. Localize a seguinte chave do Registro:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\VerifyDrivers

  3. Edite a REG_SZ chave.

Defina a REG_SZ chave para os nomes insensíveis a casos dos drivers que você deseja testar. Você pode especificar vários drivers, mas usar apenas um driver. Ao fazer isso, você pode garantir que os recursos disponíveis do sistema não estejam esgotados prematuramente. O esgotamento prematuro de recursos não causa problemas de confiabilidade do sistema, mas pode fazer com que algumas verificações de driver sejam ignoradas.

A lista a seguir mostra exemplos de valores para a REG_SZ chave:

  • Ntfs.sys
  • Win32k.sys ftdisk.sys
  • *.sys

Você pode especificar o nível de verificação do driver na seguinte chave do registro:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\VerifyDriverLevel

O valor da chave é um DWORD que representa a coleção de todos os sinalizadores habilitados.