天天看点

对<源码级调试WDF框架>一文进行补充

MS 曾在他的Github站点上提出过​​《源码级调试WDF框架》​​的方法,文中提到通过.srcfix命令使windbg源码服务器路径指向MS的源码服务器。这样当调试到wdf框架代码时,windbg会去源码服务器下载对应的源码并加载显示在源码窗口。

我尝试过这种方法,然而结果并不像预计的那样:

0: kd> .reload /f wdf01000.sys
0: kd> !lmi wdf01000.sys
Loaded Module Info: [wdf01000.sys] 
...
       Compiler: C - front end [19.10 bld 25203] - back end [19.10 bld 25203]
    Load Report: private symbols & lines, source indexed 
                 C:\Users\q50292th\Desktop\devtools\windbg v10\x64\sym\Wdf01000.pdb\98BFF4E535208A77013A260DE4A248201\Wdf01000.pdb
0: kd> lsa Wdf01000!FxDevice::DispatchWithLock
No source found for 'minkernel\wdf\framework\shared\core\fxdevice.cpp'      

在显示源码过程中,windbg会启动一个功能类似svn客户端的程序,尝试去下载源文件并保存到windbg目录的src目录下。但是不知道是不是GWF的原因,源文件一直无法获得和显示。导致了上面lsa命令运行失败。

那么,是不是就不支持源码级调试WDF框架?倒也不是。办法还是有的。MS还是好心把Wdf框架的源码全部放在​​GitHub​​上,可以把源码下到本地,然后运行如下命令:

.srcfix C:\srcfix\Windows-Driver-Frameworks-master\src\framework  ;我将GitHub上的代码解压保存到C:\srcfix\Windows-Driver-Frame-master下      

这是我机器上.srcpath显示的结果:

kd> .srcpath
Source search path is: SRV*;C:\srcfix\Windows-Driver-Frameworks-master\src\framework;      

另外还需要安装Driver kit,因为调试过程中windbg会尝试去C:\Program Files (x86)\Windows Kits\目录下搜索头文件。如果搜索不到,还是不支持源码级调试。

经过以上设置,基本能实现源码级调试WDF框架~以MS toast(wdfsimple.sys)为例,进入WdfSimple!DriverEntry并调用WdfDriverCreate函数后的调用堆栈:

kd> kb
RetAddr           : Args to Child                                                           : Call Site
fffff803`aed21206 : 00000000`00000000 fffff803`aed211c4 00000000`00000010 00000000`00000344 : 
      Wdf01000!imp_WdfDriverCreate+0x44 [minkernel\wdf\framework\shared\core\fxdriverapi.cpp @ 105]

fffff803`aed26053 : ffff920f`b8929a00 ffff920f`b94be000 00000000`00000000 ffff8384`57c7d2d8 : 
      wdfsimple!WdfDriverCreate+0x56 [c:\program files (x86)\windows kits\10\include\wdf\kmdf\1.15\wdfdriver.h @ 239]

fffff803`aed21499 : ffff920f`b8929a00 ffff920f`b94be000 ffffb889`e5b548d0 ffff920f`b89d87c0 : 
      wdfsimple!DriverEntry+0x53 [f:\twl\general\toaster\toastdrv\kmdf\func\simple\toaster.c @ 93]

fffff801`856e257a : 00000000`00000000 ffff8384`57c7d440 ffff920f`b8929a00 ffffffff`80002328 : 
      wdfsimple!FxDriverEntryWorker+0xb9 [d:\th\minkernel\wdf\framework\kmdf\src\dynamic\stub\stub.cpp @ 325]      

以及对应的Wdf函数源码:

kd> .frame 1
01 ffff8384`57c7d260 fffff803`aed26053 
   wdfsimple!WdfDriverCreate+0x56 [c:\program files (x86)\windows kits\10\include\wdf\kmdf\1.15\wdfdriver.h @ 239]
kd> lsa fffff803`aed26053 
    89: 
    90:     //
    91:     // Create a framework driver object to represent our driver.
    92:     //
>   93:     status = WdfDriverCreate(
    94:         DriverObject,
    95:         RegistryPath,
    96:         WDF_NO_OBJECT_ATTRIBUTES, // Driver Attributes
    97:         &config,          // Driver Config Info
    98:         WDF_NO_HANDLE
kd> .frame 0
00 ffff8384`57c7d0d0 fffff803`aed21206 
   Wdf01000!imp_WdfDriverCreate+0x44 [minkernel\wdf\framework\shared\core\fxdriverapi.cpp @ 105]
kd> lsa fffff803`aed21206
   235:     WDFDRIVER* Driver
   236:     )
   237: {
   238:     return ((PFN_WDFDRIVERCREATE) WdfFunctions[WdfDriverCreateTableIndex])(WdfDriverGlobals, DriverObject, RegistryPath, DriverAttributes, DriverConfig, Driver);
>  239: }
   240: 
   241: //
   242: // WDF Function: WdfDriverGetRegistryPath
   243: //
   244: typedef      

目标实现~

参考:

​​Debugging with WDF Source​​

继续阅读