Usando o Verificador de Driver Estático para localizar defeitos em drivers do Windows

O SDV (Verificador de Driver Estático) usa um conjunto de regras de interface e um modelo do sistema operacional para determinar se o driver interage corretamente com o sistema operacional Windows. O SDV localiza defeitos no código do driver que podem apontar para possíveis bugs em drivers.

O SDV pode analisar drivers no modo kernel que estão em conformidade com um dos seguintes modelos de driver: WDM, KMDF, NDIS ou Storport. Para obter mais informações, consulte Drivers com suporte e Determinando se o Verificador de Driver Estático dá suporte ao seu driver ou biblioteca. Além disso, o SDV fornece suporte limitado (um conjunto de regras severamente restrito focado em erros gerais, como desreferências nulas) para drivers que não seguem os modelos de driver acima.

Preparando seu código-fonte

Use as etapas a seguir para preparar seu código para análise.

  1. Declarar funções fornecidas pelo driver usando tipos de função

    O SDV requer que as funções sejam declaradas usando declarações de tipo de função. Por exemplo, uma rotina DriverEntry deve ser declarada usando o tipo de função DRIVER_INITIALIZE função:

    DRIVER_INITIALIZE DriverEntry;
    

    Após a declaração, você implementa (ou define) sua rotina de retorno de chamada da seguinte maneira:

    /
    // Driver initialization routine
    //
    NTSTATUS
      DriverEntry(
        _In_ struct _DRIVER_OBJECT  *DriverObject,
        _In_ PUNICODE_STRING  RegistryPath
        )
      {
          // Function body
      }
    

    Cada modelo de driver com suporte tem um conjunto de tipos de função para as funções de retorno de chamada de driver e rotinas de expedição. Esses tipos de função são declarados nos arquivos de cabeçalho do WDK. Por exemplo, aqui está o protótipo de função para o tipo de função DRIVER_INITIALIZE como ele aparece em Wdm.h.

    /
    // Define driver initialization routine type.
    //
    _Function_class_(DRIVER_INITIALIZE)
    _IRQL_requires_same_
    typedef
    NTSTATUS
    DRIVER_INITIALIZE (
        _In_ struct _DRIVER_OBJECT *DriverObject,
        _In_ PUNICODE_STRING RegistryPath
        );
    
    typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE;
    

    Como os tipos de função de função já estão definidos nos arquivos de cabeçalho do WDK, você só precisa declarar suas funções de retorno de chamada como desse tipo. Nesse caso, você declara DriverEntry como do tipo DRIVER_INITIALIZE. Para obter uma lista completa dos tipos de função para os modelos de driver, consulte Usando declarações de tipo de função.

  2. Executar análise de código para C/C++

    Para ajudá-lo a determinar se o código-fonte está preparado, execute a ferramenta análise de código no Visual Studio. A ferramenta Análise de Código verifica se há declarações de tipo de função, o que o SDV requer. A ferramenta Análise de Código pode ajudar a identificar quaisquer declarações de função que possam ter sido perdidas ou avisar quando os parâmetros da definição de função não corresponderem àqueles no tipo de função de função.

    • Abra seu projeto de driver no Visual Studio.
    • No menu Compilar , clique em Executar Análise de Código na Solução.

    Os resultados são exibidos na janela Análise de Código . Corrija as declarações de função que você pode ter perdido. Você também pode configurar a ferramenta análise de código para que ela seja executada sempre que você compilar sua solução.

    A tabela a seguir mostra alguns avisos que a ferramenta análise de código pode encontrar em seu código de driver. Para executar o Verificador de Driver Estático, o driver precisa estar livre desses defeitos.

    Análise de código para aviso de C/C++ Descrição
    C28101 O módulo Drivers inferiu que a função atual é uma <função de tipo> de função
    C28022 As classes de função desta função não coincidem com as classes de função no typedef utilizado para defini-las.
    C28023 A função que está sendo atribuída ou passada deve ter uma anotação _Function_class para pelo menos uma das classes
    C28024 O ponteiro de função que está sendo atribuído é anotado com a classe de função que não está contida nas classes de função.
    C28169 A função <> dispatch não tem nenhuma anotação _Dispatch_type_
    C28208 A assinatura de função não corresponde às declarações de função

Executando o Verificador de Driver Estático

  1. Abra o arquivo do projeto de driver (.vcxProj) no Visual Studio. No menu Driver , clique em Iniciar Verificador de Driver Estático....

    Isso abre o aplicativo Verificador de Driver Estático, no qual você pode controlar, configurar e agendar quando o Verificador de Driver Estático executa uma análise.

  2. Se o driver incluir uma biblioteca, clique na guia Bibliotecas e clique em Adicionar Biblioteca para adicionar a biblioteca.

    Navegue até o diretório do código-fonte da biblioteca e selecione o arquivo de projeto (.vcxProj). Adicione todas as bibliotecas que o driver inclui. As bibliotecas devem ser adicionadas antes que o SDV analise seu driver. Quando você inicia uma análise do driver, o SDV também analisa as bibliotecas que não foram processadas. Depois que uma biblioteca é processada, ela é armazenada no cache SDV global. Para obter mais informações, consulte Processamento de biblioteca no verificador de driver estático

  3. Verifique as definições de configuração do Verificador de Driver Estático. Clique na guia Configurar.

    Configuração do Projeto A Configuração do Projeto mostra as definições de configuração e plataforma selecionadas no Visual Studio.

    Recursos Na maioria dos casos, você pode usar as configurações padrão. Se o SDV relatar Timeout, GiveUp ou Spaceout, você poderá tentar ajustar essas configurações. Para obter mais informações, consulte Recomendações para solucionar problemas do verificador de driver estático.

    Agenda Selecione uma hora de início para o início da verificação. A configuração padrão é iniciar a análise imediatamente depois de clicar em Iniciar na guia Principal . Dependendo do tamanho do driver e de sua complexidade, a análise estática pode levar muito tempo para ser executada. Talvez você queira agendar a análise para começar quando for mais conveniente para você; por exemplo, no final do dia.

    Observação

    ]Certifique-se de marcar o plano de gerenciamento de energia do computador para garantir que o computador não entre em estado de suspensão durante a análise.

  4. Clique na guia Regras para selecionar quais regras de uso da API de driver verificar ao iniciar a análise.

    O Verificador de Driver Estático detecta o tipo de driver que você está analisando (WDF, WDM, NDIS ou Storport) e seleciona o conjunto padrão de regras para o tipo de driver. Se esta for a primeira vez que você estiver executando o SDV no driver, deverá executar o conjunto de regras padrão.

    Para obter informações sobre as regras, consulte Regras de conformidade de DDI.

  5. Inicie a análise estática. Clique na guia Principal e clique em Iniciar. Quando você clica em Iniciar, uma mensagem é exibida para informar que a análise estática está agendada e que a análise pode levar muito tempo para ser executada. Clique em OK para continuar. A análise começa no momento em que você agendou.

Exibindo e analisando os resultados

À medida que a análise estática prossegue, o SDV relata o status da análise. Quando a análise for concluída, o SDV relatará os resultados e as estatísticas. Se o driver não atender a uma regra de uso da API, o resultado será relatado como um defeito.

Se algum problema tiver sido encontrado, o SDV exibirá aqueles nas páginas Avisos e Erros . A página Propriedades do Driver exibe os resultados dos testes para determinadas propriedades do driver. Os testes de propriedades do driver são usados para identificar recursos de driver para qualificar ainda mais a análise. Você pode usar os resultados das Propriedades do Driver para confirmar as propriedades esperadas e os recursos com suporte do driver.

Para exibir defeitos específicos no Relatório do Verificador de Driver Estático, clique no Defeito no painel Resultados . Isso abre o Visualizador de Rastreamento, que exibe um rastreamento do caminho do código para a violação de regra. Para obter mais informações, consulte Interpretando resultados do verificador de driver estático.

Observação

O Verificador de Driver Estático retém os resultados e as configurações da análise. Para limpar os resultados, clique em Limpar.

Solução de problemas de resultados do verificador de driver estático

Se o SDV relatar que nenhum defeito foi encontrado, marcar a guia Principal para garantir que os pontos de entrada sejam detectados. Se o driver não declarar funções usando os tipos de função, o SDV não poderá analisar e localizar defeitos no código do driver. Para obter mais informações, consulte Usando declarações de tipo de função.

Se o SDV relatar tempos limite ou não retornar resultados úteis, talvez seja necessário alterar algumas opções de configuração de SDV. Para obter mais informações sobre como solucionar problemas de SDV, consulte Recomendações para solucionar problemas do verificador de driver estático.

Determinar se o Verificador de Driver Estático dá suporte ao driver ou à biblioteca

Usando declarações de tipo de função

Regras do verificador de driver estático

Ferramenta análise de código