Vídeo: Depurando o driver com o código-fonte do WDF

Este tópico contém um tutorial em vídeo que mostra como depurar o driver WDF (Windows Driver Frameworks) com acesso completo ao código-fonte do WDF. Seguindo o vídeo está o procedimento passo a passo seguido no vídeo, para uma referência conveniente.

A depuração de origem do WDF permite que você entre livremente no código-estrutura sem a necessidade de baixar o código-fonte do WDF. O depurador baixa automaticamente a versão correta do WDF do GitHub.

Por exemplo, se você estiver usando o WinDbg para depurar o driver WDF em um computador Windows 10 e o depurador estiver dividido com o código da estrutura na pilha de chamadas, você poderá clicar duas vezes no quadro do WDF no modo de exibição Pilha de Chamadas e o WinDbg baixará automaticamente e abrirá o arquivo de origem do WDF relevante na linha correspondente. Em seguida, você pode percorrer o código e definir pontos de interrupção.

Esse recurso está disponível para sistemas de destino que executam versões públicas de Windows 10, Technical Preview build 10041 ou posterior. Esses builds têm arquivos de símbolo indexados de origem privada para KMDF (Wdf01000.sys) e UMDF (Wudfx02000.dll) disponíveis no Servidor de Símbolos Públicos da Microsoft. A depuração no nível do código-fonte do WDF só está disponível no WinDbg e não no depurador do Visual Studio.

Início Rápido

Inicie uma sessão de depuração do kernel do WinDbg no computador de destino, interrompa e siga estas etapas:

  1. Defina o caminho do símbolo padrão usando .symfix. Isso define o caminho do símbolo para apontar para o servidor de símbolos em https://msdl.microsoft.com/download/symbols.

    kd> .symfix

  2. Defina o caminho de origem padrão usando .srcfix. Isso define o caminho de origem como srv*, que informa ao depurador para recuperar arquivos de origem de locais especificados nos arquivos de símbolo dos módulos de destino.

    kd> .srcfix
    Source search path is: SRV*
    
  3. Recarregue símbolos usando .reload e confirme se os símbolos de Wdf01000.sys (ou Wudfx02000.dll para UMDF) são indexados pela origem. Conforme mostrado na saída de !lmi abaixo, o Wdf01000.sys PDB é indexado de origem. Se o seu não estiver, consulte a seção Configuração do WinDbg abaixo.

    kd> .reload
    ...
    
    kd> !lmi wdf01000.sys
    Loaded Module Info: [wdf01000.sys] 
    ...
    Load Report: private symbols & lines, source indexed 
    C:\...\Wdf01000.pdb\...\Wdf01000.pdb
    
  4. Está tudo pronto para você! Uma maneira fácil de percorrer o código-fonte do WDF é definir um ponto de interrupção na rotina de expedição do IRP da estrutura e, em seguida, percorrer o restante do código. Como um sistema Windows tem muitos drivers KMDF de caixa de entrada, o WDF é sempre carregado e em execução, portanto, esse ponto de interrupção será atingido imediatamente (sem a necessidade de carregar seu próprio driver).

    kd> bp Wdf01000!FxDevice::DispatchWithLock
    kd> g
    Breakpoint 0 hit
    Wdf01000!FxDevice::DispatchWithLock:
    87131670 8bff mov edi,edi 
    

Se isso não funcionar, marcar as etapas de Instalação do WinDbg abaixo.

Instalação do WinDbg

Se o exemplo acima não funcionou conforme o esperado, talvez seja necessário executar uma ou mais das instruções abaixo.

Habilitar depuração do modo de origem

Verifique se a depuração no Modo de Origem está habilitada. Abra o menu Depurar e confirme se o Modo de Origem está marcado.

Limpar cache de símbolos obsoletos

Se você depurou anteriormente drivers WDF para o mesmo destino do Windows, talvez esteja usando os símbolos WDF armazenados em cache localmente que não foram indexados de origem. Você pode marcar isso com o comando !lmi:

kd> !lmi Wdf01000.sys
Loaded Module Info: [wdf01000.sys]
...
Load Report: private symbols & lines, not source indexed
C:\...\Wdf01000.pdb\...\Wdf01000.pdb

De acordo com o Relatório de Carga acima, Wdf01000.pdb não é indexado de origem. Isso significa que o cache de símbolos WinDbg local está obsoleto. Para corrigir isso, descarregue o PDB do WinDbg, limpe o cache local (seu caminho pode diferir com base na saída !lmi acima) e recarregue o PDB:

kd> .reload /u Wdf01000.sys

CMD> del
C:\...\Wdf01000.pdb\...\Wdf01000.pdb

kd> .reload Wdf01000.sys

Agora, execute !lmi para marcar novamente: o PDB deve aparecer como origem indexada e uma janela de código-fonte deve aparecer.

kd> !lmi Wdf01000.sys
Loaded Module Info: [wdf01000.sys]
...
Load Report: private symbols & lines, source indexed
C:\...\Wdf01000.pdb\...\Wdf01000.pdb 

Você pode usar a depuração no nível de origem do WDF não apenas para depuração dinâmica e análise de despejos de memória, mas também para saber mais sobre os internos da estrutura definindo pontos de interrupção em funções principais como o dispatcher IRP e explorando os caminhos de código subsequentes.