Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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:
- Tenta liberar IRPs chamando ExFreePool. Os IRPs devem ser liberados com IoFreeIrp.
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.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 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.sysUsando o Gestor do Verificador de Drivers
- Selecione Criar configurações personalizadas (para desenvolvedores de código) e clique em Avançar.
- Selecione configurações individuais de uma lista completa.
- 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.