Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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:
- Tenta liberar IRPs chamando ExFreePool. Os IRPs devem ser liberados com IoFreeIrp.
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.sysO 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.sysEssa 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.sysUsando o Gerenciador de Verificador de Driver
- Selecione Criar configurações personalizadas (para desenvolvedores de código) e clique em Avançar.
- Selecione Selecionar configurações individuais em uma lista completa.
- 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.