1. WinDbg扩展有哪些用处?

在使用WinDbg进行设备驱动调试时,有时候如果存在某些特定的工具那么会让我们的调试过程变得更加的顺畅。比如对于PCI设备,我们想去读取设备物理地址某一段的值然后把它保存下来。我们当然可以使用!dd这个命令来做,读取少量的数据当然也还没啥问题,如果读取的内容很多那么这就变得非常的慢,而且我们还要把Windbg上输出的信息手动保存到文件(当然也可以使用.logopen这个命令来帮我们将输出保存到文件,但这种办法还是避免不了很慢的问题)。试想如果有一条命令让我们输入要读取的物理地址和读取的长度,然后输入这个命令就帮我们把数据保存到文件里面,这样岂不是方便了许多!

另一个例子:对于显示驱动WDDM2.0之后的virual mode来说, 驱动程序中一般使用的都是GPU Virtual Addr, 对于这个GPU Virtual Addr,想要使用WinDbg直接读取显然是做不到的,因为WinDbg运行在CPU端,它所见的virtual address都是对于CPU来说的。想要读取的办法就是通过这个GPU Virtual Addr和GPU的Page Table来进行计算得到实际的CPU物理地址(对于CPU visible或者是共享显存),然后再使用!dd这个命令来读取。一般Page Table都是使用的三级表或四级表(这个完全取决于硬件厂商了),那么这个转化就比较麻烦,而且人工计算非常容易出错,如果我们有一条命令帮我们做这个也是极大的减少我们重复的工作。

上述的这些场合都可以使用WinDbg扩展来完成。WinDbg扩展可以直接读取物理地址,这个功能就像是给我们开了一双上帝之眼一样洞察整个CPU的地址空间。

2. WinDbg扩展是啥?

windbg中以”!“开始的命令就是所谓的扩展命令。这些扩展命令都是以Dll导出函数的形式提供给windbg加载。一般跟在”!“后面的字符串就是dll中导出的函数。前面所说的!dd命令就是以一个扩展命令。这个扩展命令是由Kext.dll提供的,Kext.dll存在于WinDbg安装目录的winext路径下。如下图所示。

2022-01-06_220630

其实winext目录下的这些dll都是WinDbg扩展,这些都是WinDbg自带的。当然我们自己写的扩展也是可以放在这个目录下的。为了验证我们所说的!dd命令在这个dll导出函数中。我们可以看看这个dll的导出函数。如下图,我们可以看到dd这个导出函数就在里面。

image-20220106221814945

3. WinDbg扩展怎么写?

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\sdk\samples

以!htrace命令为例,查看windbg帮助文档,它提到这个命令依赖于kdexts.dll和ntsdexts.dll:

https://blog.csdn.net/lixiangminghate/article/details/77016374?spm=1001.2014.3001.5501

https://blog.csdn.net/lixiangminghate/article/details/77073245?spm=1001.2014.3001.5501

https://blog.csdn.net/lixiangminghate/article/details/77168545?spm=1001.2014.3001.5501

https://blog.csdn.net/lixiangminghate/article/details/77199399?spm=1001.2014.3001.5501