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 de E/S aprimorada No Windows 7 e 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 ou não é 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 é rastreado.
Além disso, o Verificador de Driver verifica se há chamadas de E/S inválidas, incluindo:
Tentativas de liberar um IRP cujo tipo não é IO_TYPE_IRP
Passagens 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 expedição do driver
Tentativas de liberar um IRP que permanece associado a um thread
Passa de um objeto de dispositivo para IoInitializeTimer que já contém um temporizador inicializado
Passagens de um buffer inválido para IoBuildAsynchronousFsdRequest ou IoBuildDeviceIoControlRequest
Passa de um bloco de status de E/S para um IRP, quando esse bloco de status de E/S é alocado em uma pilha que foi desenrolada muito
Passa de um objeto de evento para um IRP, quando esse objeto de evento é alocado em uma pilha que foi desenrolada muito longe
Como o pool IRP especial é de tamanho limitado, a verificação de E/S é mais eficaz quando é usada apenas em um driver por vez.
Falhas de nível 1 de verificação de E/S fazem com que 0xC9 de verificação de bugs sejam emitidas. O primeiro parâmetro dessa verificação de bug indica qual violação ocorreu. Consulte Verificação de Bugs 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 de kernel.
Na tela azul, esses erros são anotados pela mensagem ERRO DE VERIFICAÇÃO DO SISTEMA DE E/S e pela string ERRODE DRIVER WDM XXX, em que XXX é um código de erro de E/S.
Em um arquivo de despejo de memória, a maioria desses erros é observada 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 da 0xC9 de verificação de bugs. O restante é anotado 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 da verificação de bugs 0xC4.
Em um depurador de kernel (KD ou WinDbg), esses erros são anotados 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 memória e o depurador de kernel também exibem informações adicionais. Para obter uma descrição completa da maioria das mensagens de erro de nível 2 de verificação de E/S, consulte Verificação de bugs 0xC9. Para o restante, consulte Verificação de Bugs 0xC4.
A partir do Windows Vista, a opção Verificação de E/S verifica os seguintes erros de driver:
Demorando muito para concluir e cancelar IRPs originados em aplicativos de modo de usuário.
Liberando um bloqueio de remoção que ainda não foi adquirido.
Chamar IoReleaseRemoveLock ou IoReleaseRemoveLockAndWait com um parâmetro de marca diferente do parâmetro de marca usado na chamada IoAcquireRemoveLock correspondente.
Chamando IoCallDriver com interrupções desabilitadas.
Chamar IoCallDriver em IRQL maior que DISPATCH_LEVEL.
Retornando de uma rotina de expedição de driver com interrupções desabilitadas.
Retornando de uma rotina de expedição de driver com um IRQL alterado.
Retornando de uma rotina de despacho de motorista com APCs desabilitados. Nesse caso, o driver pode ter chamado KeEnterCriticalRegion mais vezes do que KeLeaveCriticalRegion, que é a principal causa do 0x20 de Verificação de Bugs (KERNEL_APC_PENDING_DURING_EXIT) e do 0x1 de Verificação de Bugs (APC_INDEX_MISMATCH).
A partir do Windows 7, a opção Verificação de E/S verifica 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, reinicializando bloqueios de remoção. As estruturas de dados de remoção de bloqueios 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 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 faz a alocação fora da extensão de Device1.
- Chama IoReleaseRemoveLockAndWait quando Device1 está sendo 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 o Device1, mesmo que esse dispositivo tenha sido removido. Portanto, não é seguro reutilizar a mesma memória que um novo bloqueio de remoção até que o gerenciador de E/S exclua 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 de E/S aprimorada é 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 Verificação de Driver ou a linha de comando Verifier.exe. Para obter detalhes, consulte Selecionando 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 entra em vigor imediatamente, mas é perdida quando você desliga ou reinicializa o computador. Para obter detalhes, consulte Usando 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 Verificação 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 (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 Verificação de Driver, clique em Criar Configurações Padrão.