Partilhar via


Verificação de E/S

Driver Verifier tem disponível 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 de E/S aprimorada No Windows 7 e em versões posteriores do sistema operacional Windows, a Verificação de E/S aprimorada é ativada automaticamente quando você seleciona 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á ativada, todos os IRPs obtidos através do IoAllocateIrp são alocados a partir de um pool especial e seu uso é rastreado.

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

  • Tentativas de libertar um IRP cujo tipo não é IO_TYPE_IRP

  • Passes de objetos de dispositivo inválidos para IoCallDriver

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

  • Alterações no IRQL em uma chamada para a rotina de despacho do motorista

  • Tentativas de liberar um IRP que permanece associado a um thread

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

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

  • Passagem de um bloco de estado de I/O para um IRP, quando este bloco de estado de I/O é alocado numa stack que foi desemaranhada em excesso.

  • Passagem de um objeto de evento para um IRP, quando esse objeto de evento é alocado em uma pilha que foi desenrolada além do limite

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

Falhas de nível 1 de verificação de E/S causam a emissão do código de verificação de bugs 0xC9. O primeiro parâmetro desta verificação de bug indica qual violação ocorreu. Consulte Bug Check 0xC9 (DRIVER_VERIFIER_IOMANAGER_VIOLATION) para obter uma lista completa de parâmetros.

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

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

Na tela azul, esses erros são observados pela mensagem IO SYSTEM VERIFICATION ERROR 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 são observados pela mensagem BugCheck 0xC9 (DRIVER_VERIFIER_IOMANAGER_VIOLATION), juntamente com o código de erro de E/S. Nesse caso, o código de erro de E/S aparece como o primeiro parâmetro na verificação de bug 0xC9. O restante é indicado pela mensagem Bug Check 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 na verificação de erros 0xC4.

Em um depurador do kernel (KD ou WinDbg), esses erros são observados pela mensagem WDM DRIVER ERROR e uma cadeia de texto descritiva. Quando o depurador do 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 outras verificações de bugs.)

A tela azul, o arquivo de despejo de memória e o depurador do 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 de Nível 2, consulte Verificação de erros 0xC9. Para o restante, consulte Verificação de bugs 0xC4.

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

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

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

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

  • Chamando IoCallDriver com interrupções desativadas.

  • Chamando IoCallDriver a um IRQL superior ao DISPATCH_LEVEL.

  • Retornar de uma rotina de despacho de motorista com interrupções desativadas.

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

  • Retornando de uma rotina de despacho de driver com APCs desativados. Nesse caso, o driver pode ter chamado KeEnterCriticalRegion mais vezes do que KeLeaveCriticalRegion, que é a principal causa para Bug Check 0x20 (KERNEL_APC_PENDING_DURING_EXIT) e Bug Check 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 detetar outro bug de driver comum — reinicializar bloqueios de remoção. Remova bloqueios, estruturas de dados devem ser alocadas dentro das extensões de dispositivo. Isso garante que o gerenciador de E/S libere a memória que mantém a estrutura IO_REMOVE_LOCK somente quando o objeto do dispositivo for 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 mantenha uma referência a Device1:

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

É possível que, após a etapa 2, um aplicativo ou driver ainda mantenha uma referência a Device1. O aplicativo ou driver ainda pode enviar solicitações para Device1, mesmo que este dispositivo tenha sido removido. Portanto, não é seguro reutilizar a mesma memória como um novo bloqueio de remoção até que o gestor de E/S elimine o 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 Verificação de E/S.

Ativando esta opção

Você pode ativar o recurso de verificação de E/S para um ou mais drivers usando o Gerenciador de Verificadores de Driver ou a linha de comando Verifier.exe. Para obter detalhes, consulte Selecionando Opções do Verificador de Controladores.

  • 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 entra em vigor imediatamente, mas é perdida quando você desliga ou reinicia o computador. Para obter detalhes, consulte Usando Configuração Volátil.

    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 Gestor do Verificador de Drivers

    1. Selecione Criar configurações personalizadas (para desenvolvedores de código) e clique em Avançar.
    2. Selecione configurações individuais de uma lista completa.
    3. Selecione (verifique) a 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 de Verificadores de Driver, clique em Criar Configurações Padrão.