本地环境
- 本地开发环境: win 10, visual studio installer(2022版), visual studio 2022, VMware player
- 目的:本地环境作为开发环境,VM作为测试和调试环境
- 用debug view查看内核调试输出请直接看最后 debug view查看内核打印信息 部分
开发环境搭建
- 通过 visual studio installer 下载安装 visual studio 2019
- 通过 visual studio installer 下载安装win10 SDK
- 下载安装WDK(windows 10 版本)
- 安装WDK.vsix
WDK.vsix路径在C:\Program Files (x86)\Windows Kits\10\Vsix\VS2019 或者 C:\Program Files (x86)\Windows Kits\10\Vsix。
这个插件的版本和visual studio的版本要对应,最新的WDK(windows 10 版本)的插件对应的只能安装在visual studio 2019
调试/测试环境搭建
- VMware player 创建WIN 10 虚拟机。添加串口参考
需要设置网络连接方式为桥接
需要删除打印机(如果有的的话)
需要添加一个串行端口,并设置命名管道属性和开启CPU轮询
注意:
VMware player创建命名端口后,启动虚拟机可能会提示 serial0: Unable to create the server-side instance of the "***" named pipe: The filename, directory name, or volume label syntax is incorrect.
这可能因为管道的名称格式不对,我试了下设置成\\.\pipe\com<数字>的格式(比如 \\.\pipe\com1)成功了,网上有人设置成.\pipe\com<数字>也成功了
- VM安装上面下载的WDK
- 安装驱动开发平台对应的目标安装MSI,详细参考
如果构建的driver是基于x64平台,则msi路径如下:
C:\Program Files (x86)\Windows Kits\10\Remote\x64\WDK Test Target Setup x64-x64_en-us.msi
安装这个msi是后面visual studio部署要用,不安装的话用visual studio部署会失败
- VM添加debug启动项, 参考,设置完成后windows搜索栏输入msconfig找到System Configuration应用,进入应用后点Boot项查看修改的结果
以管理员身份打开CMD, 依次输入以下命令
bcdedit
bcdedit /dbgsettings serial baudrate:115200 debugport:1
bcdedit /copy {current} /d DebugEntry
这个命令会生成一串GUID,保存这个GUID,后面的ID用此GUID替换
bcdedit /displayorder {current} {ID}
bcdedit /debug {ID} ON
- 设置VM的内核dbg信息输出级别
打开windows Registry editor, 修改注册信息:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter
如果没有这个key就添加这个key
在这个key下添加或修改 “DEFAULT" (是DWORD 类型,32位或64位应该无关),值为 0xffffffff
开发driver并部署到VM
- windows 提供的driver开发hello world教程,教程有详细的代码和开发部署调试步骤,但有些步骤不详细(比如调试)
- 按照教程创建工程写代码
- 按照教程构建
- 按照教程部署。 添加device参考
首次部署target device列表是空的需要添加device,添加device时,display name可以随便写,Network host name填VM的ip地址。
填完后一直点next,等visual studio自动准备好target(也就是VM)的环境,然后点finish完成设备添加,回到部署对话框。
部署对话框中要添加hardware ID, 这个id在生成inf文件中,我的文件中内容是:
[Standard.NTamd64]
%hello_driver.DeviceDesc%=hello_driver_Device, Root\hello_driver ; TODO: edit hw-id
其中amd64表示开发平台因为我构建设置的平台是x64,Root\hello_driver就是hardware ID
- VM安装driver
VM上以管理员身份运行CMD,输入以下命令:
C:\Program Files (x86)\Windows Kits\10\Tools\x64\devcon.exe <INF file path> <hardware ID>
INF文件 一般在C:\DriverTest\Drivers, hardware ID就是上面提到的hardware ID。这种安装方式是hello world教程里提供的,不同的driver有不同的安装方式。
如果INF文件提供了DefaultInstall属性,可以直接右键点击INF文件然后点击安装。
- 启动driver
启动方式和INF文件里StartType的配置有关,此项配置在Services Section里配置。
如果配置的是SERVICE_DEMAND_START,则需要手动启动driver。以filter driver为例,启动命令是:FLTMC load [ driverName ]
windg连接VM进行调试
- 按照上述步骤VM环境搭建完成并安装了driver
- 本地主机执行命令
windbg.exe -y <pdb file path> -k com:pipe,port=\\.\pipe\com1,resets=0,reconnect
执行成功windgb会显示等待连接
- 重启VM,windbg就可以成功连接了,至此就可以看到内核打印的信息了。
debug view查看内核打印信息
debug view 查看debug信息是更简单方便的信息,用搜狗或者百度去查找debug view下载地址结果都是华军软件软之类的下载站。
直到一次用Bing搜索才发现微软提供了debug view下载。唉,国内的搜索引擎真的毁人青春。
- 设置VM的内核dbg信息输出级别,参考上面 调试/测试环境搭建
- 在VM上以admin权限运行debug view,然后点顶部menu里的capture kernel(快捷键 Ctrl + k)就能看到内核 debug 打印信息了