Compartilhar via


Verificação de E/S

O Verificador de Driver tem dois níveis de verificação de E/S:

  • A Verificação de E/S de Nível 1 está sempre ativa sempre que a Verificação de E/S é selecionada.

  • A Verificação de E/S de Nível 2 está sempre ativa sempre que a Verificação de E/S é selecionada no Windows XP e posterior.

Consulte Também:Verificação avançada de E/S no Windows 7 e versões posteriores do sistema operacional Windows, a Verificação avançada de E/S é ativada automaticamente quando você seleciona a Verificação de E/S. Não está disponível nem é necessário selecioná-lo como uma opção separada.

Verificação de E/S de Nível 1

Quando a Verificação de E/S de Nível 1 está habilitada, todos os IRPs obtidos por meio de IoAllocateIrp são alocados de um pool especial e seu uso é acompanhado.

Além disso, o Verificador de Driver verifica se há chamadas de E/S inválidas, incluindo:

  • Tenta liberar um IRP cujo tipo não é IO_TYPE_IRP

  • Passagem de objetos de dispositivos inválidos para IoCallDriver

  • Envios de um IRP para IoCompleteRequest que contém status inválido ou que ainda tem uma rotina de cancelamento definida

  • Alterações no IRQL durante uma chamada para a rotina de despacho do driver

  • Tenta liberar um IRP que permanece associado a um thread

  • Passa de um objeto de dispositivo para IoInitializeTimer que já contém um temporizador inicializado

  • Passa de um buffer inválido para IoBuildAsynchronousFsdRequest ou IoBuildDeviceIoControlRequest

  • Transferência de um bloco de status de E/S para um IRP, quando esse bloco de status de E/S é alocado em uma pilha que desenrolou demais

  • Passagem de um objeto de evento para um IRP, quando esse objeto de evento é alocado em uma pilha que foi desenrolada excessivamente.

Como o pool de IRP especial é de tamanho limitado, a Verificação de E/S é mais eficaz quando usada apenas em um driver de cada vez.

Falhas no Nível 1 de Verificação de E/S fazem com que a verificação de bugs 0xC9 seja emitida. O primeiro parâmetro dessa verificação de bug indica qual violação ocorreu. Consulte Verificação de Erros 0xC9 (DRIVER_VERIFIER_IOMANAGER_VIOLATION) para obter uma listagem completa de parâmetros.

Verificação de E/S de Nível 2

Os erros de Verificação de E/S Nível 2 são exibidos de maneiras diferentes: na tela azul, em um arquivo de despejo de memória e em um depurador de kernel.

Na tela azul, esses erros são indicados pela mensagem de ERRO DE VERIFICAÇÃO DO SISTEMA de E/S e pela string WDM DRIVER ERRORXXX, onde XXX é um código de erro de E/S.

Em um arquivo de despejo de falha, a maioria desses erros é anotada pela mensagem BugCheck 0xC9 (DRIVER_VERIFIER_IOMANAGER_VIOLATION), juntamente com o código de erro de I/O. Nesse caso, o código de erro de E/S aparece como o primeiro parâmetro da verificação de bug 0xC9. O restante é indicado pela mensagem Verificação de Erro 0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION), juntamente com um código de erro do Verificador de Driver. Nesse caso, o código de erro do Verificador de Driver aparece como o primeiro parâmetro da checagem de erro 0xC4.

Em um depurador de kernel (KD ou WinDbg), esses erros são observados pela mensagem WDM DRIVER ERROR e uma cadeia de caracteres de texto descritiva. Quando o depurador de kernel está ativo, é possível ignorar os erros de Nível 2 e retomar a operação do sistema. (Isso não é possível com nenhuma outra verificação de bug.)

A tela azul, o arquivo de despejo de falha e o depurador de kernel também exibem informações adicionais. Para obter uma descrição completa da maioria das mensagens de erro de Verificação de E/S Nível 2, consulte Verificação de Bug 0xC9. Para o restante, consulte Verificação de Bug 0xC4.

A partir do Window Vista, a opção Verificação de E/S verifica se há os seguintes erros de driver:

  • Levando muito tempo para concluir e cancelar IRPs originados em aplicativos em modo de usuário.

  • Liberando um bloqueio de remoção que ainda não foi adquirido.

  • Chamando IoReleaseRemoveLock ou IoReleaseRemoveLockAndWait com um parâmetro de marca que difere do parâmetro de marca usado na chamada IoAcquireRemoveLock correspondente.

  • Chamando IoCallDriver com interrupções desabilitadas.

  • Chamando IoCallDriver em um IRQL superior ao DISPATCH_LEVEL.

  • Retornando de uma rotina de despacho de driver com interrupções desativadas.

  • Retornando de uma rotina de despacho de driver com um IRQL alterado.

  • Retornando de uma rotina de despacho de controlador com APCs desabilitadas. Nesse caso, o driver talvez tenha chamado KeEnterCriticalRegion mais vezes do que KeLeaveCriticalRegion, que é a principal causa para Verificação de Bug 0x20 (KERNEL_APC_PENDING_DURING_EXIT) e Verificação de Bug 0x1 (APC_INDEX_MISMATCH).

A partir do Windows 7, a opção Verificação de E/S verifica se há os seguintes erros de driver:

Além disso, você pode usar essa opção para detectar outro bug de driver comum: reinicializar a remoção de bloqueios. Remova as estruturas de dados de bloqueios que devem ser alocadas dentro das extensões do dispositivo. Isso garante que o gerenciador de E/S libere a memória que contém a estrutura IO_REMOVE_LOCK somente quando o objeto do dispositivo é excluído. Se o driver executar as três etapas a seguir, é possível que, após a etapa 2, um aplicativo ou driver ainda tenha uma referência ao Device1:

  • Aloca a estrutura de IO_REMOVE_LOCK que corresponde ao Device1, mas faz a alocação fora da extensão do Device1.
  • Invoca IoReleaseRemoveLockAndWait quando o Device1 está sendo removido.
  • Chama IoInitializeRemoveLock para o mesmo bloqueio a fim de reutilizá-lo como um bloqueio de remoção para Dispositivo2.

É possível que, após a etapa 2, um aplicativo ou driver ainda tenha uma referência ao Device1. O aplicativo ou driver ainda pode enviar solicitações ao Device1, mesmo que esse dispositivo tenha sido removido. Portanto, não é seguro reutilizar a mesma memória para um novo lock de remoção até que o gerenciador de E/S exclua Device1. Reinicializar o mesmo bloqueio enquanto outro thread está tentando adquiri-lo pode resultar na corrupção do bloqueio, com resultados imprevisíveis para o driver e todo o sistema.

No Windows 7 e versões posteriores do sistema operacional Windows, a Verificação avançada de E/S é ativada automaticamente quando você seleciona a Verificação de E/S.

Ativando essa opção

Você pode ativar o recurso de Verificação de E/S para um ou mais drivers usando o Driver Verifier Manager ou a linha de comando Verifier.exe. Para obter detalhes, consulte Selecionar opções do Verificador de Driver.

  • Na linha de comando.

    Na linha de comando, a opção verificação de E/S é representada pelo Bit 4 (0x10). Para ativar a Verificação de E/S, use um valor de sinalizador de 0x10 ou adicione 0x10 ao valor do sinalizador. Por exemplo:

    verifier /flags 0x10 /driver MyDriver.sys
    

    O recurso estará ativo após a próxima inicialização.

    Você também pode ativar e desativar a Verificação de E/S sem reinicializar o computador adicionando o parâmetro /volatile ao comando. Por exemplo:

    verifier /volatile /flags 0x10 /adddriver MyDriver.sys
    

    Essa configuração é efetivada imediatamente, mas é perdida quando você desliga ou reinicializa o computador. Para obter detalhes, consulte Como usar configurações voláteis.

    O recurso de Verificação de E/S também está incluído nas configurações padrão. Por exemplo:

    verifier /standard /driver MyDriver.sys
    
  • Usando o Gerenciador de Verificador de Driver

    1. Selecione Criar configurações personalizadas (para desenvolvedores de código) e clique em Avançar.
    2. Selecione Selecionar configurações individuais em uma lista completa.
    3. Selecione (verificar) verificação de E/S.

    O recurso de Verificação de E/S também está incluído nas configurações padrão. Para usar esse recurso, no Gerenciador do Verificador de Driver, clique em Criar Configurações Padrão.