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
目标实现~
参考: