Compartilhar via


Ferramentas para verificar controladores

O WDK (Windows Driver Kit) fornece ferramentas de verificação de driver que ajudam você a detectar e corrigir erros durante o desenvolvimento. Essas ferramentas incluem ferramentas de análise estática, como CodeQL e ferramentas dinâmicas, como o Verificador de Driver, que podem encontrar bugs críticos antes da implantação. O uso dessas ferramentas de verificação no início do desenvolvimento economiza tempo e impede sérios problemas de driver na produção.

A documentação do WDK descreve essas ferramentas de verificação e recomenda seu uso porque cada ferramenta detecta diferentes tipos de erros de driver de diferentes maneiras. Essas ferramentas são muito mais eficientes do que as verificações manuais. Eles podem detectar erros que normalmente não são encontrados em testes de driver padrão e incorporam a experiência de desenvolvedores de driver experientes e designers de interface de driver do Windows.

Para obter melhores resultados, use todas as ferramentas que podem ser executadas no driver. Se você omitir qualquer uma dessas ferramentas, poderá perder um bug sério em seu driver.

Ferramentas de verificação estáticas e dinâmicas

Existem dois tipos básicos de ferramentas de verificação:

  • As ferramentas de verificação estática examinam o código do driver sem executar o driver. Como essas ferramentas não dependem de testes que exercem o código, elas podem ser extremamente completas. Teoricamente, as ferramentas de verificação estática podem examinar todo o código do driver, incluindo caminhos de código que raramente são executados na prática. No entanto, como o driver não está realmente em execução, essas ferramentas podem gerar resultados falsos positivos. Ou seja, eles podem relatar um erro em um caminho de código que não ocorre na prática.

    CodeQL é a principal ferramenta de análise estática para drivers. O CodeQL fornece uma linguagem de consulta poderosa que trata o código como um banco de dados a ser consultado, simplificando a gravação de consultas para comportamentos e padrões específicos. O Programa de Compatibilidade de Hardware do Windows requer o CodeQL para testes de STL (Logotipo da Ferramenta Estática) em nossos sistemas operacionais cliente e servidor. Para obter mais informações, consulte CodeQL e o teste de logotipo de ferramentas estáticas.

  • As ferramentas de verificação dinâmica examinam o código do driver enquanto o driver está em execução, normalmente interceptando chamadas para rotinas de suporte ao driver comumente usadas e substituindo chamadas por suas próprias versões de verificação de erros das mesmas rotinas. Como o driver está realmente em execução enquanto as ferramentas dinâmicas estão fazendo a verificação, os resultados falso-positivos são raros. No entanto, como as ferramentas dinâmicas detectam apenas as ações que ocorrem durante o monitoramento do driver, elas podem não identificar certos defeitos se a cobertura do teste do driver não for adequada. Ao mesmo tempo, usando informações disponíveis em tempo de execução - por exemplo, informações mais difíceis de extrair estaticamente do código-fonte - as ferramentas de verificação dinâmica podem detectar determinadas classes de erros de driver que são mais difíceis de detectar com ferramentas de análise estática.

Use uma combinação de ferramentas de verificação estáticas e dinâmicas. As ferramentas estáticas permitem que você verifique caminhos de código que são difíceis de exercitar na prática, enquanto as ferramentas dinâmicas encontram erros graves que estão ocorrendo no driver.

Visão geral das ferramentas de verificação

Importante

A ferramenta SDV (Verificador de Driver Estático) não tem mais suporte. Ele não está disponível em WDKs mais recentes do que o build 26017, incluindo o WDK de RTM do Windows 24H2. Não é recomendável usar o SDV para análise.

O WDK descreve as seguintes ferramentas de verificação e recomenda seu uso por desenvolvedores e testadores de driver. Eles são listados na ordem em que você normalmente os usa.

Depois que o código for compilado

  • CodeQL é um poderoso mecanismo de análise semântica de código. A combinação de um amplo conjunto de consultas de segurança de alto valor e uma plataforma robusta torna-a uma ferramenta inestimável para proteger o código do driver. Para obter mais informações, consulte CodeQL e o teste de logotipo de ferramentas estáticas.

Quando o driver é executado

Use as seguintes ferramentas de verificação dinâmica assim que o driver for criado e estiver em execução sem erros óbvios.

  • O Verificador de Driver é uma ferramenta de verificação dinâmica escrita especialmente para drivers do Windows. Ele inclui vários testes que você pode executar em vários drivers simultaneamente. O Verificador de Driver é tão eficaz em encontrar bugs graves em drivers que desenvolvedores e testadores experientes o configuram para execução sempre que o driver é executado em um ambiente de desenvolvimento ou teste. O Driver Verifier é fornecido com o Windows. Ao habilitar o Verificador de Driver para um driver, você também deve executar vários testes no driver. O Verificador de Driver pode detectar determinados bugs de driver que são difíceis de detectar usando apenas ferramentas de verificação estática. Exemplos desses tipos de bugs incluem o seguinte:

    • Saturações de buffer do pool de kernels. Quando o driver verificado aloca buffers de memória do pool, o Verificador de Driver os protege usando uma página de memória não acessível. Se o driver tentar usar memória após o final do buffer, o Verificador de Driver iniciará uma verificação de bugs.

    • Usando memória depois de liberá-la. Blocos de memória de pool especiais usam sua própria página de memória e não compartilham páginas de memória com outras alocações. Quando o driver libera o bloco de memória do pool, a página de memória correspondente se torna não acessível. Se o driver tentar usar essa memória depois de liberá-la, o driver falhará instantaneamente.

    • Usando memória paginável durante a execução em IRQL elevado. Quando um driver verificado aumenta o IRQL em DISPATCH_LEVEL ou superior, o Verificador de Driver corta toda a memória paginável do conjunto de trabalho do sistema, simulando um sistema sob pressão de memória. O driver falha se tentar usar um desses endereços virtuais pagináveis.

    • Simulação de Baixos Recursos. Para simular um sistema em condições de recursos baixos, o Verificador de Driver pode falhar em várias APIs de kernel do sistema operacional que os drivers chamam.

    • Vazamentos de memória. O Verificador de Driver rastreia as alocações de memória feitas por um driver e garante que o driver libere a memória antes de ser descarregado.

    • Operações de E/S que levam muito tempo para serem concluídas ou canceladas. O Verificador de Driver pode testar a lógica do driver para responder aos STATUS_PENDING valores retornados do IoCallDriver.

    • Verificação de conformidade com DDI. (Disponível a partir do Windows 8) O Verificador de Driver aplica um conjunto de regras de DDI (interface de driver de dispositivo) que verificam a interação adequada entre um driver e a interface do kernel do sistema operacional.

  • O Kasaner (Kernel Address Sanitizer ) é uma tecnologia de detecção de bugs com suporte em drivers Windows que permite detectar várias classes de acessos ilegais à memória, como estouros de buffer e eventos de uso após liberação.

  • O Verificador de Aplicativos é uma ferramenta de verificação dinâmica para aplicativos de modo de usuário e drivers gravados em C ou C++. Ele não verifica o código gerenciado.