Windows7驱动调试小Tips
0x01
在Windows7以下(包含Win7的64位系统)调试驱动时会发现DbgPrint(DbgPrint用法參考[1])打印的内容并没有在DbgView里面显示出来,可是你可能有若干证据表明。相关代码肯定已经执行过了。使用Windbg进行双击调试时也没有内容打印在调试器里面。事实上文档[2]里面已经有说明了:
In Microsoft Windows Server 2003 andearlier versions of Windows, the DbgPrint and KdPrint routines send messages to the kernel debuggerunconditionally. In Windows Vista and later versions of Windows, these routinessend messages conditionally, like DbgPrintEx and KdPrintEx. Whichever version of Windows you are using, youshould use DbgPrintEx, vDbgPrintEx,vDbgPrintExWithPrefix, and KdPrintEx,because these routines enable you to control the conditions under which themessage is sent.
简言之,就是系统对这样的调试信息的输出设置了限制。
要解除这样的限制(当然主要是开发者为了调试的方便),更改(添加)例如以下的注冊表信息就可以解决。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Debug PrintFilter]
"DEFAULT"=dword:0000000f
使用注冊表导入的方式,可能导入失败,建议查看下是否在相应的注冊表位置是否已经建立了相关的键值,或者干脆手工输入。也非常easy。
0x02
从Vista開始(当然我们主要关注Windows7),系统要求驱动程序都必须有数字签名,否则无法正常使用,普通文件夹下的驱动假设没有签名。直接载入失败。而boot型的驱动,假设之前是有签名的。你替换成无签名的,那么重新启动之后直接会进入系统文件修复给你修复成原来的文件。这对于开发者来说非常不方便。有两个解决方式:
a、进去系统时,按下F8进入Window7的启动选择模式。选择“禁用驱动程序签名强制”或者“调试模式启动”,本次有效。
b、使用windbg双机联调模式时,“驱动程序签名强制”是禁用的。
c、网上的方案。把驱动签名强制要求直接关闭,通过管理员权限启动CMD,然后输入命令:bcdedit.exe -set loadoptionsDDISABLE_INTEGRITY_CHECKS 使用这样的方式之后是一直生效的,,系统安全性会打折扣,虚拟机就无所谓。假设是真机,建议适当的时候再打开。
能够简单删除就可以,执行命令:bcdedit -deletevalue loadoptions。事实上能够EasyBCD工具来改动(原理一样)。
只是须要注意的是我在win7 x64 sp1系统用这样的方式来測试,从来没成功过,后来查了下是由于装了SP1(或者某些补丁)之后。会导致该方法失效。
d、bcdedit.exe -setTESTSIGNING ON,该方法有副作用,会在桌面留水印。同一时候还有和c方案相同的问题。
0x03
设置虚拟机下的Win7或者Win8系统(包含他们的x64位系统)双机调试时,要加入一个串口设备,由于虚拟机硬件配置里面的打印机设备占用了第一个串口设备,因此你新加入的串口设备实际上用的是COM2port了,这个时候用windbg去连接,会提示无法打开连接port,这个与WMWare的版本号有关系,说说怎么解决吧。至少有两个解决方式。