admin 管理员组

文章数量: 887021

1. 安装软件

下载安装VS2013+WDK8.1软件,安装完成后两个软件会自动整合到一起,不需要额外的配置。

2. 开发WDF驱动

打开VS2013,“文件”-“新建“- ”项目“,在左边选择Visual C++下的Windows Driver,选择WDF,然后选择Kernel Mode Driver(KMDF) Visual C++,输入你要创建的驱动的名称,点击“确定”就创建了一个KMDF驱动模板,模板中有自动生成的inf文件,后期需要进行适当的修改。接下来往框架里面填写代码进行开发工作。

3. 编写好驱动后,CTRL+F5就可以生成我们需要的驱动文件,即xxx.sys文件

4. 调试环境的搭建

由于需要两台计算机,我们分别称为主计算机和目标计算机

主计算机:windows7系统,VS2013,WDK8.1(含windbg)(这两个上面应该已经安装了)

目标计算机:windows7系统

由于我们是为实际的硬件设备开发驱动,所以我们需要用两台机器来搭建调试环境,如果不是为实际的硬件开发驱动,其实是可以用一台实体机+虚拟机来搭建调试环境的,下面只介绍用两台实体机来搭建调试环境的方法。

硬件准备:两台实体机之间要用交叉串口线连接起来,具体的制作方法如下:

 

 

制作完成后,将两台计算机的串口用这根线连接起来。

 

软件准备:

在WDK的安装目录下,为Debugging tools for Windows下的windbg在桌面上创建快捷方式,windbg将作为我们调试的主要工具。

使用Windbg第一步要做的,就是设置符号文件的位置,就是pdb文件。

符号路径设置:
Ctrl+S在弹出的窗口中输入你的符号路径(Symbol Search Path),路径的格式只要符合Windows操作系统路径格式即可,路径可以多个,中间以分号间隔,d:\symbols\win2k3_en;
Windbg可以自动到Microsoft的服务器上下载符号表文件(.dbg或.pdb,有时DLL和EXE也会下载),只要在符合表路径里做如下设置:srv*d:\symbolslocal*http://msdl.microsoft/download/symbols,这样如果相关符号表在d:\symbolslocal目录没有找到的话,Windbg会自动在Microsoft的Symbol Servers上下载。
如果你是调试自己的应用程序的话,建议你将自己应用程序的*.pdb文件的路径放在前面这样对Windbg来说查找起来比较快。如:在windbg的file/symbol file path对话框里输入以下文字,以便自动加载和下载符号C:\Users\jason\Desktop\PCIdriver\PCIdriver\Win7Debug;
SRV*D:\MyLocalSymbols2*http://msdl.microsoft/download/symbols

其中,C:\Users\jason\Desktop\PCIdriver\PCIdriver\Win7Debug是我的驱动程序编译生成的sys和pdb文件所在路径。

源文件路径设置:
Ctrl+P在弹出的窗口里指定你的源代码文件的路径Source File Path,路径格式只要符合Windows操作系统的格式即可,可以指定多个,中间以分号间隔,我的设置为:C:\Users\jason\Desktop\PCIdriver\PCIdriver\PCIdriver

可以将你的设置进行保存,File->Save Workspace。

系统变量设置:
My Computer -> Properties-> Advanced Tab-> Enviroment Variables-> Add.

_NT_DEBUG_BAUD_RATE=115200

_NT_SYMBOL_PATH=SRV*D:\MyLocalSymbols2*http://msdl.microsoft/download/symbols

_NT_ALT_SYMBOL_PATH = C:\Users\jason\Desktop\PCIdriver\PCIdriver\Win7Debug//驱动生成的pdb文件目录
_NT_SOURCE_PATH = C:\Users\jason\Desktop\PCIdriver\PCIdriver\PCIdriver//驱动源码目录


启动目标机,将主机目录D:\MyLocalSymbols2下的拷贝到虚拟机的相同位置。
同时请驱动编译后生成在C:\Users\jason\Desktop\PCIdriver\PCIdriver\Win7Debug目录下的*.pdb、*.sys、*.map、*.exp、*.lib文件一并拷贝到两个系统的D:\MyLocalSymbols2目录中。(实践表明,红色部分其实是不需要做的)

右键桌面的windbg快捷方式,在“目标”栏的后面添加: -b -k com:port=com1,baud=115200

目标机的设置方法(windows7):

Windows7和XP不同, 没有boot.ini文件, 需要用bcdedit进行启动设置,如果是XP,请修改boot.ini文件,在这个文件的后面添加如下内容:

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional - debug" /fastdetect /debug /debugport=com1 /baudrate=115200 

我们这里是windows7系统,所以按如下方式设置打开目标机的调试模式

1. 在administrator权限下, 进入command line模式,  键入bcdedit命令, 会出现以下界面:

 

2. 然后, 设置端口COM1, baudrate为115200 (除COM1外, 也可以用1394或USB. 1394用起来比COM口快多了, 当然前提是你需要有1394卡及其驱动. 很恶心的是Vista不再支持1394的文件传输协议, 但是用windbg双机调试还是可以的)
命令为:
bcdedit /dbgsettings {serial [baudrate:value][debugport:value] | 1394 [channel:value] | usb }

 

3.接着, 我们需要复制一个开机选项, 以进入OS的debug模式
命令为:
bcdedit /copy {current} /d DebugEnty
DebugPoint 为选项名称, 名字可以自己定义. 然后复制得到的ID号.

 

4. 接着增加一个新的选项到引导菜单
bcdedit /displayorder {current} {ID}
这里的{ID}的ID值是刚 生成的ID值.

 

5. 激活DEBUG : bcdedit /debug {ID} ON
这里的{ID} 的ID值还是刚才的ID值.

 

6. 命令执行成功后, 重新启动机器.或者更简单的图形界面设置:在msconfig界面中,选Boot,再选Advanced options,在选择Debug、Debug port、Baud rate都打上钩。

7. 重启目标机,会出现多系统选项,选择刚才添加的调试模式

注意:有可能这里没有出现多系统选择,那是因为下面的超时时间是0,所以系统自动为你选择了,必须要修改为一个非0的值。

 

当运行到选择系统时,我们先按一下上下,将倒计时停止。然后再到主机系统中运行刚才我们创建的WinDbg快捷方式。然后回到目标机点击Enter选择进入系统。此时回到真实系统,稍等一会就可以看到WinDbg输出信息告诉我们两个系统已经连接上了。可以看到类似如下的信息:

Microsoft (R) Windows Debugger Version 6.11.0001.404 X86
Copyright (c) Microsoft Corporation. All rights reserved.

Opened \\.\pipe\com_1
Waiting to reconnect…
Connected to Windows 7 7600 x86 compatible target at (Thu Dec 10 17:46:36.928 2009 (GMT+8)), ptr64 FALSE
Kernel Debugger connection established.  (Initial Breakpoint requested)
Symbol search path is: *** Invalid ***
****************************************************************************
* Symbol loading may be unreliable without a symbol search path.           *
* Use .symfix to have the debugger choose a symbol path.                   *
* After setting your symbol path, use .reload to refresh symbol locations. *
****************************************************************************
Executable search path is:
*********************************************************************
* Symbols can not be loaded because symbol path is not initialized. *
*                                                                   *
* The Symbol Path can be set by:                                    *
*   using the _NT_SYMBOL_PATH environment variable.                 *
*   using the -y <symbol_path> argument when starting the debugger. *
*   using .sympath and .sympath+                                    *
*********************************************************************
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for ntkrpamp.exe -
Windows 7 Kernel Version 7600 MP (1 procs) Free x86 compatible
Product: WinNt, suite: TerminalServer SingleUserTS
Built by: 7600.16385.x86fre.win7_rtm.090713-1255
Machine Name:
Kernel base = 0x83e0f000 PsLoadedModuleList = 0x83f57810
Debug session time: Thu Dec 10 17:46:32.658 2009 (GMT+8)
System Uptime: 0 days 0:06:18.429
Break instruction exception – code 80000003 (first chance)
*******************************************************************************
*                                                                             *
*   You are seeing this message because you pressed either                    *
*       CTRL+C (if you run kd.exe) or,                                        *
*       CTRL+BREAK (if you run WinDBG),                                       *
*   on your debugger machine’s keyboard.                                      *
*                                                                             *
*                   THIS IS NOT A BUG OR A SYSTEM CRASH                       *
*                                                                             *
* If you did not intend to break into the debugger, press the “g” key, then   *
* press the “Enter” key now.  This message might immediately reappear.  If it *
* does, press “g” and “Enter” again.                                          *
*                                                                             *
*******************************************************************************
nt!DbgBreakPointWithStatus+0×4:
83e7a394 cc              int     3

 

到这里,主计算机和目标计算机就已经连接上了,下面就可以开始调试了。

 

5. 调试过程

在目标机上安装驱动,就会执行sys文件,驱动程序运行到我设置的断点处,我的主计算机就会在对应的位置停下来。

将编译生成的INF文件,sys文件,pdb文件放在一起拷贝到目标机中,可以放在桌面上,并且要将sys文件拷贝到目标机的C:\Windows\system32\drivers目录下,电脑的驱动文件基本都放在这个目录,系统自动为硬件安装驱动的时候会默认查找这个目录。当然INF文件必须要经过修改,具体怎么修改,请参考我的INF文件。

现在已经打开了windbg,选择“file”,“open source file”,打开所有的驱动源码(只打开C文件就可以了)

接下来在驱动的入口DriverEntry处设置断点,设置方法如下:

Kd> bu PCIdriver!DriverEntry

这样当目标机安装启动驱动后,我的主计算机中的驱动源码就会停在这个入口位置。

安装驱动:在“设备管理器”中找到插在PCI槽上的设备,右键,更新驱动程序,找到放在桌面的驱动文件,就可以安装驱动了,这样就会在主计算机的入口DriverEntry处停下来,调试过程由此开始。

 

驱动会先执行DriverEntry函数

如果PCI插槽上插的设备,就会执行DeviceAdd函数

然后执行在DeviceAdd中注册的PrepareHardware函数

此时,如果应用程序中执行DeviceControl,驱动中也会执行DeviceControl

如果应用程序执行ReadFile,驱动中就会执行EvtIoRead

如果应用程序执行WriteFile,驱动中就会执行EvtIoWrite

当卸载驱动的时候

会先执行ReleaseHardware函数

然后执行DriverUnload函数

 

 

本文标签: 驱动程序 全过程 WDF