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函数
版权声明:本文标题:Windows7下VS2013+WDK8.1开发WDF驱动程序全过程 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1716176439h669565.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论