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相关推荐

  1. RK3308(3)---串口调试

    串口调试 选购适配器 网店上有许多USB转串口的适配器,按芯片来分,有以下几种: [CP2104] PL2303 CH340 一般来说,采用 CH340 芯片的适配器,性能比较稳定,价格上贵一些. 硬 ...

  2. win7 x64驱动开发经验(三)windbg 双机调试配置 、问题及解决办法

    win7 x64驱动开发经验(三)windbg 双机调试配置 .问题及解决办法 http://www.cnblogs.com/witty/archive/2012/04/23/2466024.html ...

  3. win7 x64 windbg 双机调试

    -------------------------------------------------------------- 转自http://yexin218.iteye.com/blog/5451 ...

  4. hp1015驱动64位_HP LaserJet1010 x64驱动下载|HP LaserJet1015 win7 x64驱动 - 驱动无忧

    HP LaserJet1010 LaserJet1015 win7 x64驱动添加说明: 按如下步骤执行即可解决问题: 1.正常安装HP官方驱动: 2.在设备管理器里带有"dot4" ...

  5. [转载] 关于Win7 x64下过TP保护的一些思路,内核层过保护,驱动过保护

    首先特别感谢梦老大,本人一直没搞懂异常处理机制,看了他的教程之后终于明白了. 在他的教程里我学到了不少东西. 第一次在论坛发帖,就说说Win7 x64位下怎么过TP保护.如果有讲错的地方,还望指出. ...

  6. 星岚技术 Win7 x64 装机版 V2021.4【带驱动包】

    一.系统说明: 1.基于原版微软Win7 x64旗舰版,精心优化制作 2.采用适当的精简与优化,全面提升运行速度,充分保留原版性能和兼容性 3.系统集成"驱动总裁"驱动包,部署中调 ...

  7. VS2012编译调试WDM驱动(KdPrint无调试信息 debugview win7无调试信息)

    对于WDM驱动 VS2012有向导可以新建WDM项目 如图 这点说明不用自己配置 文件目录 C/C++ 选项 LINK 选项 等一系列的参数 比以前方便了不少 新建以后是空项目 放入<windo ...

  8. 自制ST-Link V2.1教程(SWD调试+虚拟串口+虚拟U盘)

    文章目录 一. 关于ST-LINK 二. 自制ST-LINK硬件 1. 原理图 2. PCB图 3. BOM表 三. 固件烧录 四. 固件更新 五. 上电测试 六. 相关链接 一. 关于ST-LINK ...

  9. WIN7 X64下成功安装HP LASERJET 3015网络打印机驱动

    困扰多时的在WIN7 X64下成功装上了HP LASERJET 3015的网络打印机驱动终于搞掂. 打印机:HP LASERJET 3015 server:WINXP X86 client: WIN7 ...

  10. keil C51 中使用虚拟串口调试串口

    功能介绍: 在不使用51开发板下,使用keil C51中的软件仿真 和虚拟串口软件VSPD完成串口通信的过程. 类似的还有一篇关于STM32调试串口的 keil MDK 中使用虚拟串口调试串口 操作步 ...

最新文章

  1. komodo edit linux,Komodo Edit是什么
  2. 2020年6月18日 618感言
  3. PHP + Redis 实现一个简单的twitter
  4. LeetCode Search Insert Position (二分查找)
  5. [转]收集android上开源的酷炫的交互动画和视觉效果:Interactive-animation
  6. future.cancel不能关闭线程_多线程与高并发笔记
  7. Atitit 性能提升总结 流水线模式 FutureTask ForkJoinTask 1.1. 流水线工作方式pipeline 1 1.2. FutureTask模式使用异步 流水线 还有多
  8. [杂谈] 9. C语言中getch()函数
  9. 【机器人基础】标准D-H建模法(机器人建模与控制)
  10. Excel如何简单快速的建立二级下拉菜单?
  11. 浦发银行面试笔试经历
  12. 如何将PS中的图片字体变为黑色
  13. Git Bash 不能输入中文的简单解决办法
  14. 计算机操作系统之设备管理思维导图
  15. windows系统下Redis下载安装与配置(内附蓝奏云下载地址)
  16. Kafka中zookeeper的作用详解(7点)
  17. pycharm调试时显示图片
  18. 戴尔外星人Alienware Aurora R8原厂预装系统,带一键还原,F12 Support Assist OS Recovery恢复功能一键恢复出厂设置
  19. laravel结合workerman开发在线聊天应用
  20. 「数据密集型系统搭建」原理篇|数据类型不怕精挑细选

热门文章

  1. 自媒体必死 大家不要被马化腾忽悠了
  2. 用kodexplorer免费搭建一个协同办公平台
  3. 进程间通讯:共享内存和消息队列简述
  4. Java Web调用Matlab实现在线绘图
  5. 年长车友的单车游记:骑单车游崇明岛(转)
  6. 【译文】人工智能给伦敦带来了它的大脑和经济收益
  7. Node.js 静态web服务
  8. 微信支付V3微信公众号支付PHP教程(thinkPHP5公众号支付)/JSSDK的使用
  9. vue v-for循环表格 希望第四个<th>或<td>标签自动换到下一行应该怎么做?
  10. Beyong Compare过期