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 Verificação de E/S. Não está disponível ou é 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
Passagens de objetos de dispositivo inválidos para IoCallDriver
Passa de um IRP para IoCompleteRequest que contém status inválidos ou que ainda tem um conjunto de rotina de cancelamento
Alterações no IRQL em uma chamada para a rotina de expedição 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
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 descompactou muito
Passa de um objeto de evento para um IRP, quando esse objeto de evento é alocado em uma pilha que descompactou muito
Como o pool de IRP especial é de tamanho limitado, a Verificação de E/S é mais eficaz quando é usada apenas em um driver por vez.
Falhas no Nível de Verificação de E/S 1 fazem com que marcar 0xC9 de bugs sejam emitidos. O primeiro parâmetro desse bug marcar indica qual violação ocorreu. Consulte 0xC9 de Verificação de Bugs (DRIVER_VERIFIER_IOMANAGER_VIOLATION) para obter uma listagem completa de parâmetros.
Verificação de E/S de Nível 2
Os erros de Nível de Verificação de E/S 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 observados pela mensagem ERRO DE VERIFICAÇÃO DO SISTEMA de E /S e pela cadeia de caracteres ERRO DE DRIVER WDMXXX, em que XXX é um código de erro de E/S.
Em um arquivo de despejo de memória, a maioria desses erros é indicada 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 do bug marcar 0xC9. O restante é observado pela mensagem 0xC4 de Verificação de Bugs (DRIVER_VERIFIER_DETECTED_VIOLATION), juntamente com um código de erro do Verificador de Driver. Nesse caso, o código de erro verificador de driver aparece como o primeiro parâmetro do bug marcar 0xC4.
Em um depurador de kernel (KD ou WinDbg), esses erros são observados pela mensagem ERRO DE DRIVER do WDM 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 de Verificação de E/S 2, consulte Verificação de bugs 0xC9. Para obter o restante, consulte 0xC4 de Verificação de Bugs.
A partir do Window 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.
Liberando um bloqueio de remoção que ainda não foi adquirido.
Chamar IoReleaseRemoveLock ou IoReleaseRemoveLockAndWait com um parâmetro de marca que difere do parâmetro de marca usado na chamada IoAcquireRemoveLock correspondente.
Chamar 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 expedição de driver com APCs desabilitadas. Nesse caso, o driver pode ter chamado KeEnterCriticalRegion mais vezes do que KeLeaveCriticalRegion, que é a principal causa para 0x20 de Verificação de Bugs (KERNEL_APC_PENDING_DURING_EXIT) e 0x1 de Verificação de Bugs (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 os bloqueios de remoção. A remoção de estruturas de dados de bloqueios deve ser alocada dentro de extensões de 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 mantenha uma referência a Device1:
- Aloca a estrutura de IO_REMOVE_LOCK que corresponde ao Device1, mas faz a alocação fora da extensão do 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 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 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 essa opção
Você pode ativar o recurso verificação de E/S para um ou mais drivers usando o Gerenciador de Verificador 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 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
- 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 (marcar) Verificação de E/S.
O recurso verificação de E/S também está incluído nas configurações padrão. Para usar esse recurso, no Gerenciador de Verificador de Driver, clique em Criar Configurações Padrão.
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de