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

来源:互联网 发布:手机隐藏软件下载 编辑:程序博客网 时间:2024/06/04 16:47

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

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

0: kd> .reload /f wdf01000.sys0: kd> !lmi wdf01000.sysLoaded 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.pdb0: kd> lsa Wdf01000!FxDevice::DispatchWithLockNo 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> .srcpathSource 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> kbRetAddr           : Args to Child                                                           : Call Sitefffff803`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 101 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_HANDLEkd> .frame 000 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







阅读全文
0 0
原创粉丝点击