win7 x64部署和串口调试虚拟驱动toaster
WDK7600自带的toaster驱动是个很好的学习驱动的案例,从总线驱动到App层,Class-install/Co-install都有涉及。本文主要涉及驱动部署和调试。
1.先说说调试的准备工作。一般调试驱动都是在虚拟机中进行的,这里也不例外,用windbg+vmware双击联调。通常开发阶段,Wdm驱动以inf形式安装并加载,加载后依次执行DriverEntry,AddDevice并响应IRP_MJ_PNP&IRP_MN_START事件。安装的同时,pnp管理器会复制文件及改写注册表,待下次重启,驱动在系统重启阶段会加载运行驱动。因此,在DriverEntry时加入断点尤为重要,要不然将错过这些函数的调试时机。在x86时代,加入口断点无非是代码中插入 asm int 3.但是,这么美好的时代已经过去了,x64驱动不支持嵌入汇编。取而代之,必须通过编写一个asm文件,在源码中以调用外部函数的形式,共5步来实现。
1.1第一步实现int 3的汇编代码形如:
.code
asm_int3 procint 3ret
asm_int3 endp
end
1.2将这段代码保存为softbp.asm。然后用wdk自带的ml64编译,注意仅编译生成obj文件:
ml64 /c softbp.asm
1.3接着是在C文件中调用这个函数,如在wdm/bus/busenum.c的DriverEntry处加入断点
extern void asm_int3(); //<-------------外部函数声明NTSTATUS
DriverEntry (__in PDRIVER_OBJECT DriverObject,__in PUNICODE_STRING RegistryPath)
/*++
Routine Description:Initialize the driver dispatch table.Arguments:DriverObject - pointer to the driver objectRegistryPath - pointer to a unicode string representing the path,to driver-specific key in the registry.Return Value:NT Status Code--*/
{asm_int3(); //<--------------外部函数调用Bus_KdPrint_Def (BUS_DBG_SS_TRACE, ("Driver Entry \n"));//// Save the RegistryPath for WMI.
1.4修改sources文件,添加对softbp.obj的链接:
原本sources文件中TARGETLIBS的值为
TARGETLIBS= $(DDK_LIB_PATH)\wdmsec.lib \$(DDK_LIB_PATH)\ntstrsafe.lib
修改为:
TARGETLIBS= $(DDK_LIB_PATH)\wdmsec.lib \$(DDK_LIB_PATH)\ntstrsafe.lib \softbp.obj
1.5运行build -ceZ编译链接整个toaster工程。
2.得到驱动文件后就是部署阶段。win7 x64的部署也是够磨人的:bcdedit增加启动项(再次怀念xp的好,修改boot.ini就够了),禁用驱动签名,最后安装驱动。以下的步骤都在虚拟机中进行
2.1增加启动项:
2.1.1 以administrator权限下进入cmd,运行bcdedit命令设置端口COM1为调试端口, baudrate为115200(我已将虚拟机的打印机移除,打印机可耻的占用着COM1,并将串口的名字改为COM1)
bcdedit /dbgsettings serial baudrate:115200 debugport:1
2.1.2 复制一个开机选项, 以进入OS的debug模式
bcdedit /copy {current} /d DebugEnty
2.1.3 接着增加一个新的选项到引导菜单
bcdedit /displayorder {current} {6426f429-17fc-11e6-bf64-ad656b9740aa}
{6426f429-17fc-11e6-bf64-ad656b9740aa}是2.1.2运行结束后生成的id值
2.1.4 激活前面生成的debug项
bcdedit /debug {6426f429-17fc-11e6-bf64-ad656b9740aa} on
最后上一张效果图,然后重启机器准备调试:
3.windbg链接。
开始串口连接前,要设置调试符号和windbg启动参数,我直接写了个脚本setenv.bat完成这两步,以后双击运行即可:
;set _NT_SYMBOL_PATH=SRV*C:\sym;用于设置调试符号的路径
set _NT_SYMBOL_PATH=SRV*C:\sym;
;我的winbdg装在下列位置,后面的参数是串口调试参数
"D:\WinDDK\7600.16385.1\Debuggers\windbg.exe" -b -k com:pipe,port=\\.\pipe\com_1,baud=115200,pipe
系统重启后双击setenv.bat,在虚拟机中选择DebugEntry 按F8进入高级启动项,然后选择Disable Driver Signature Enforcement
(注,在等待虚拟机启动期间,经常出现windbg闪退,这时再双击setenv.bat即可。)
4.部署toaster
进入win7后,在控制面板中没有硬件向导的一席之地!需要通过在开始菜单-运行中输入hdwwiz.exe来打开。真是何其不易。ms出于安全目的,希望我们通过driver store安装受信得驱动,倒给开发驱动的找了一堆破事。安装toaster的步骤不再叙述,参照wdk中xp下安装方式在hdwwiz.exe中设置即可。
安装的末尾,也就是进入DriverEntry,由于我们在代码中设置了int3断点,因此windbg会获得执行权。这时可以追加并验证toaster的调试符号,因为此时驱动已经加载到内存中,因此设置断点不会报类似code not set之类的错误,而且符号也能正确加载。
追加toaster调试符号
kd> .sympath+ C:\toaster\wdm\bus\objchk_win7_amd64\amd64
Symbol search path is: SRV*C:\sym;C:\toaster\wdm\bus\objchk_win7_amd64\amd64
检验符号是否加载
kd> lm m busenum*
start end module name
fffff880`0392e000 fffff880`0393e000 busenum (private pdb symbols) c:\toaster\wdm\bus\objchk_win7_amd64\amd64\BusEnum.pdb
验证符号是否和sys版本一致
kd> !itoldyouso busenum c:\toaster\wdm\bus\objchk_win7_amd64\amd64\busenum.sysbusenum.sysTimestamp: 57333596SizeOfImage: 10000pdb: c:\toaster\wdm\bus\objchk_win7_amd64\amd64\BusEnum.pdbpdb sig: A8748D1B-8C93-4855-BBC7-4D773CADC3B0age: 1Loaded pdb is c:\toaster\wdm\bus\objchk_win7_amd64\amd64\BusEnum.pdbBusEnum.pdbpdb sig: A8748D1B-8C93-4855-BBC7-4D773CADC3B0age: 1MATCH: BusEnum.pdb and busenum.sys
验证当前执行的位置是不是在busenum中
kd> ln $ip
(fffff880`039301a0) busenum!asm_int3 | (fffff880`039301c0) busenum!__security_check_cookie
Exact matches:
待一切验证完毕,就可以在AddDevice 等函数入口下断点。等下次系统在启动阶段时,会在这些断点处停下。
如果想多次进入DriverEntry/AddDevice函数,可以在设备管理器中找到toaster设备,然后右键disable/enable设备,就能多次进入这些函数
win7 x64部署和串口调试虚拟驱动toaster相关推荐
- RK3308(3)---串口调试
串口调试 选购适配器 网店上有许多USB转串口的适配器,按芯片来分,有以下几种: [CP2104] PL2303 CH340 一般来说,采用 CH340 芯片的适配器,性能比较稳定,价格上贵一些. 硬 ...
- win7 x64驱动开发经验(三)windbg 双机调试配置 、问题及解决办法
win7 x64驱动开发经验(三)windbg 双机调试配置 .问题及解决办法 http://www.cnblogs.com/witty/archive/2012/04/23/2466024.html ...
- win7 x64 windbg 双机调试
-------------------------------------------------------------- 转自http://yexin218.iteye.com/blog/5451 ...
- hp1015驱动64位_HP LaserJet1010 x64驱动下载|HP LaserJet1015 win7 x64驱动 - 驱动无忧
HP LaserJet1010 LaserJet1015 win7 x64驱动添加说明: 按如下步骤执行即可解决问题: 1.正常安装HP官方驱动: 2.在设备管理器里带有"dot4" ...
- [转载] 关于Win7 x64下过TP保护的一些思路,内核层过保护,驱动过保护
首先特别感谢梦老大,本人一直没搞懂异常处理机制,看了他的教程之后终于明白了. 在他的教程里我学到了不少东西. 第一次在论坛发帖,就说说Win7 x64位下怎么过TP保护.如果有讲错的地方,还望指出. ...
- 星岚技术 Win7 x64 装机版 V2021.4【带驱动包】
一.系统说明: 1.基于原版微软Win7 x64旗舰版,精心优化制作 2.采用适当的精简与优化,全面提升运行速度,充分保留原版性能和兼容性 3.系统集成"驱动总裁"驱动包,部署中调 ...
- VS2012编译调试WDM驱动(KdPrint无调试信息 debugview win7无调试信息)
对于WDM驱动 VS2012有向导可以新建WDM项目 如图 这点说明不用自己配置 文件目录 C/C++ 选项 LINK 选项 等一系列的参数 比以前方便了不少 新建以后是空项目 放入<windo ...
- 自制ST-Link V2.1教程(SWD调试+虚拟串口+虚拟U盘)
文章目录 一. 关于ST-LINK 二. 自制ST-LINK硬件 1. 原理图 2. PCB图 3. BOM表 三. 固件烧录 四. 固件更新 五. 上电测试 六. 相关链接 一. 关于ST-LINK ...
- WIN7 X64下成功安装HP LASERJET 3015网络打印机驱动
困扰多时的在WIN7 X64下成功装上了HP LASERJET 3015的网络打印机驱动终于搞掂. 打印机:HP LASERJET 3015 server:WINXP X86 client: WIN7 ...
- keil C51 中使用虚拟串口调试串口
功能介绍: 在不使用51开发板下,使用keil C51中的软件仿真 和虚拟串口软件VSPD完成串口通信的过程. 类似的还有一篇关于STM32调试串口的 keil MDK 中使用虚拟串口调试串口 操作步 ...
最新文章
- komodo edit linux,Komodo Edit是什么
- 2020年6月18日 618感言
- PHP + Redis 实现一个简单的twitter
- LeetCode Search Insert Position (二分查找)
- [转]收集android上开源的酷炫的交互动画和视觉效果:Interactive-animation
- future.cancel不能关闭线程_多线程与高并发笔记
- Atitit 性能提升总结 流水线模式 FutureTask ForkJoinTask 1.1. 流水线工作方式pipeline	1 1.2. FutureTask模式使用异步 流水线 还有多
- [杂谈] 9. C语言中getch()函数
- 【机器人基础】标准D-H建模法(机器人建模与控制)
- Excel如何简单快速的建立二级下拉菜单?
- 浦发银行面试笔试经历
- 如何将PS中的图片字体变为黑色
- Git Bash 不能输入中文的简单解决办法
- 计算机操作系统之设备管理思维导图
- windows系统下Redis下载安装与配置(内附蓝奏云下载地址)
- Kafka中zookeeper的作用详解(7点)
- pycharm调试时显示图片
- 戴尔外星人Alienware Aurora R8原厂预装系统,带一键还原,F12 Support Assist OS Recovery恢复功能一键恢复出厂设置
- laravel结合workerman开发在线聊天应用
- 「数据密集型系统搭建」原理篇|数据类型不怕精挑细选