根据系列上一篇的内容,已经基本作好了驱动调试环境的配置,现在着手开始试一下怎么用WinDBG调试。每一位新手在开始学习驱动开发的时候相信总会看大量的资料,如我第一篇提到的几本书的确是不错的,但名著总有一个问题就是,开篇一开始总是会铺陈太多的基本理论,这会让我们觉得手足无措,更不知如何下手。个人的经验是,直接从例程入手,理论要逐步了解——我说这话的主要原因是:我对驱动开发的理论一点也不清楚。反正,先从调试第一个驱动程序开始吧,这其中涉及驱动的安装、windbg的使用相关知识,慢慢来吧。

(1)驱动程序的安装

先不管什么HelloWorld吧,反正个人觉得做那种例程也就是Ctrl+C、Ctrl+V,意义不大。大家先从http://down.51cto.com/data/457277这里下载本篇涉及到的驱动程序,其中CharSample文件里是要用到的驱动程序,里面包含源文件与编译好的sys驱动文件,这是个KMDF驱动,那个UMDFSample的文件夹里的是UMDF驱动的源文件,暂时不用到,因为相关所以一并放在一起,至于KMDF与UMDF的概念大家尽量度娘吧。CharSample驱动是从武安河老师的书里拷出来的,其主要用途是将输入0~9的CHAR字符转成零~玖的CHAR[2]中文字符,本来武老师一并有应用程序来调用驱动的,但由于鄙人对控制台程序极度不感冒,而且用起来有问题,于是自己修改出了一个对话框应用程序用于测试,就是那个CharSampleWin.exe,编译环境是VS2010(都什么年代了,还是放弃VC6吧)。

先将CharSample文件夹拷到虚拟机的XP系统下,打开控制面板,选择“添加硬件”——选“我已经连接此硬件”——选“添加新的硬件设备”——手动安装,最后定位到CharSample\sys\objchk_wxp_x86\i386目录,选指定的inf文件,然后就可以安装成功了,你可以进入设备管理器,里面会添加一项CharSample的驱动,表明安装驱动成功。(注:如果提示缺少WdfCoInstaller01007.dll,请诸位自行Google加到目录下,在Win7下好像要用WdfCoInstaller01009.dll的)

(2)测试驱动是否正常工作

将CharSampleWin.exe拷到虚拟机中,双击打开,先点击“开启驱动KMDf”,提示驱动开启OK后,再点“随机转换KMDF”,如果如下图将数字成功转成中文,那表示驱动工作状态很好,如下图。这里的随机数我用的是伪随机数,测试而已就不需要太纠结了。

 

图1

(3)WinDBG的相关设置

打开上一篇已经配置好的WinDBG的快捷方式,如果成功与虚拟机连接成功,会在Waiting to reconnect...的文字后面列出一大串的东西,如下图所示,我是已经配置好的,所以可能与大家呈现出来的东西不一样。在File的标题栏中,设置Symbol Serch Path的内容为“E:\CharSample\sys\objchk_wxp_x86\i386;”,设置Source Serch Path的内容为“E:\CharSample\sys;”,注意路径与要大家自己放的目录一致。Symbol File是所谓的符号文件,具体作用我还真一知半解,大概是驱动与源代码之间的一个桥梁关系,否则,Soure File自然是用来断点调试的啦。(此处的路径是指本机的,并非目标虚拟机里的)

 图2

(4)进行断点

好了,当WinDBG与虚拟机连接成功之后,估计虚拟机就死在那里不动了,在命令窗口的命令行中敲入“g”,按回车,命令窗口底下提示Debuggee is running...,目标系统正常运作了,你再在WinDBG的标题栏选Debug--Break,系统又挂了,这大概是进入了调试模式,这两个操作蛮有趣的,也最常用。

在Break后,在命令行敲入:.reload,加载内核的符号,提示如下:

 

图3

键入:lm l,显示系统的驱动符号文件列表(大概这样表述吧),如下图所示,其中有一行显示的是驱动CharSample的符号是本地,这已经是成功的一大半了。

 

图4

键入:ld charsample,将CharSample驱动进程附加到WinDBG中,表示我们可针对其作我们自己想作的调试,如下图所示:

 

图5

在File--Open Source File,打开E:\CharSample\sys下的queue.c文件,这是驱动的主要工作代码,数字的转换就在这里进行操作的。将光标移至源代码的可断点的某处,键入:bp,则该处红色高亮显示,表示在此处设置好断点。

这时回到目标系统,点击“随机转换KMDF”,则目标系统死机,WinDBG代码断点处紫色高亮显示,就是驱动程序运行到此处停止了,断点成功,如下图显示。剩下怎么看变量的状态,要么看下一篇,要么自行寻找WinDBG的相关教程呗。

 

图6