Usando o verificador de driver estático para encontrar defeitos em Windows drivers

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 Windows operacional. O SDV localiza defeitos no código do driver que podem apontar para possíveis bugs em drivers.

O SDV pode analisar drivers de 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 driver ou à biblioteca. Além disso, o SDV fornece suporte limitado (um conjunto de regras gravemente restrito voltado para 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 de função

    O SDV requer que as funções sejam declaradas usando declarações de tipo de função 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 forma:

    /
    // 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 do driver e rotinas de expedição. Esses tipos de função de função são declarados nos arquivos de título do WDK. Por exemplo, aqui está o protótipo de função para o tipo DRIVER_INITIALIZE função 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 título do WDK, você só precisa declarar suas funções de retorno de chamada para serem desse tipo. Nesse caso, você declara DriverEntry como do tipo DRIVER_INITIALIZE. Para ver uma lista completa dos tipos de função para os modelos de driver, consulte Usando declarações de tipo de função de função.

  2. Executar Code Analysis para C/C++

    Para ajudá-lo a determinar se o código-fonte está preparado, execute Code Analysis ferramenta de Visual Studio. A Code Analysis ferramenta verifica se há declarações de tipo de função de função, que o SDV requer. A Code Analysis pode ajudar a identificar qualquer declaração de função que possa ter sido perdida 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 Visual Studio.
    • No menu Build, clique em Executar Code Analysis na Solução.

    Os resultados são exibidos na janela Code Analysis dados. Corrige as declarações de função que você possa ter perdido. Você também pode configurar a ferramenta Code Analysis para que ela seja executado sempre que você criar sua solução.

    A tabela a seguir mostra alguns avisos que a Code Analysis pode encontrar no código do driver. Para executar o Verificador de Driver Estático, o driver precisa estar livre desses defeitos.

    Aviso de análise de código para 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 nessa função não corresponderão às classes de função no typedef usado para defini-la.
    C28023 A função que está sendo atribuída ou passada deve ter uma _Function_class_ anotação para pelo menos uma das classes
    C28024 O ponteiro de função que está sendo atribuído a é anotado com a classe de função , que não está contida na lista de classes de função.
    C28169 A função dispatch <function> não tem nenhuma _Dispatch_type_ anotações
    C28208 A assinatura da função não é igual às declarações de função

Executando o Verificador de Driver Estático

  1. Abra o arquivo de 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 seu driver inclui. As bibliotecas devem ser adicionadas antes que o SDV analise o 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.

    Project configuração A Project configuração mostra as definições de configuração e plataforma selecionadas Visual Studio.

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

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

    Observação

    ]Verifique o plano de gerenciamento de energia do computador para garantir que o computador não entre em um estado de sleep durante a análise.

  4. Clique na guia Regras para selecionar quais regras de uso da API do 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 em seu 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 que você saiba que a análise estática está agendada e que a análise pode levar muito tempo para ser executado. 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 continua, o SDV relata o status da análise. Quando a análise for concluída, o SDV relata os resultados e as estatísticas. Se o driver não atender a uma regra de uso de API, o resultado será relatado como um defeito.

Se algum problema tiver sido encontrado, o SDV os exibirá 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 os recursos do driver para qualificar ainda mais a análise. Você pode usar os resultados de Propriedades do Driver para confirmar as propriedades esperadas e os recursos com suporte do driver.

Para exibir defeitos específicos no Relatório de Verificador de Driver Estático, clique em 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 relata que nenhum defeito foi encontrado, marque 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 encontrar defeitos no código do driver. Para obter mais informações, consulte Usando declarações de tipo de função de função.

Se o SDV relata tempos-finais ou não retorna resultados úteis, talvez seja necessário alterar algumas opções de configuração do SDV. Para obter mais informações sobre como solucionar problemas de SDV, consulte Recomendações solução de 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 de função

Regras de verificador de driver estático

ferramenta de Code Analysis