23. Windows 驱动开发环境搭建与内核调试入门

1.前言

windows驱动开发,最难的部分大概就是环境搭建了,只要熟悉win api的编写、理解了各种windows的核心概念,驱动实际上也差不太多,只是换了一批api而已。

驱动环境搭建是真的麻烦,因为驱动本身是运行在内核层的,称为r0,我们平时编写的程序都是用户层,称为r3。

用户层的应用程序中代码如果出现了问题,顶多只是程序崩溃,可一旦内核层代码出现问题,整个电脑估计就直接卡死、蓝屏了。

因此内核开发往往需要两台电脑,一台电脑进行开发,另一台电脑则用来进行调试。

但这样又使得驱动开发成本太高了,所以更多时候,我们采用的是用虚拟机作为调试电脑,主机作为开发电脑。

因此第一步我们就需要安装虚拟机,并在虚拟机中安装好windows系统。

如果不会安装虚拟机的,可以参考另一篇文章:VMware安装

win11系统镜像可以去官方网站下载:下载 Windows 11

本文所使用的主机与虚拟机环境都是win11,如果需要提高驱动程序最终的兼容性,那么最好在虚拟机中安装win10、乃至win7系统。

2.虚拟机配置

使用VMware安装好windows系统后,我们第一步是为该虚拟机添加一个串行端口:

image.png

这个串行端口的目的是让我们可以在宿主机与虚拟机进行通信,后面使用windbg程序对该虚拟机进行内核调试时就需要用到这个管道。

如果你的硬件设施中存在打印机,那么可能需要先将打印机给删除掉,因为打印机的默认管道也是我们这里的\\.\pipe\com_1

这里管道的名称,前部分是固定的写法:\\.\pipe\,最后的com_1可以自行命令,一旦你更改了这个命令,那么后面的相关命令你也需要修改。

完成了管道添加后,下面我们需要让windows系统允许被调试,方法就是为系统添加进入调试模式的引导。

首先用管理员启动好终端,运行下面这条命令:

bcdedit /copy “{current}” /d debug_mode

这条命令的意思是,复制当前的启动项目创建一个新的启动项,新启动项的名称为后面的:debug_mode,你也可以自行更改为其它名字。

然后是设置调试端口:

bcdedit /dbgsettings serial debugport:1 baudrate:115200

其它基本是固定的,注意debugport后面的数字1是进行调试的串行端口,这可以在虚拟机中的设备管理器中看到:

image.png

由于我们前面只添加了一个串行端口,所以这里只有COM1,后面的数字1就是这条命令所需要的端口号。

最后,我们还需要给新添加的启动项启用调试功能:

bcdedit /debug "{a36abf93-c4ce-11ef-b476-ebbc36a9ac81}" on

注意中间这串数字,是前面添加引导后返回的,不要使用我这里的:

image.png

完成以上步骤后,重启虚拟机,就会看到我们新添加的调试模式:

image.png

此时只要选中该模式进行启动,就可以进行windows系统的内核调试了,但由于我们还没有安装调试器,所以这里先不选该启动项。

3.WDK下载安装

想要进行驱动开发,我们需要去下载相应的WDK,它和windows的SDK差不多,是windows提供的专门用于驱动开发的环境包。

唯一麻烦的点在于,我们需要确保自己安装的WDK版本与SDK版本是对应的,也就是版本号必须要一样,否则就会出问题。

官方文档为:下载 Windows 驱动程序工具包 (WDK) - Windows drivers | Microsoft Learn

由于vs默认安装的并不是最新的SDK,而这里官方提供的页面默认是最新的WDK,这就会直接导致两者版本不匹配。

因此可以参考官方文档的说明,首先安装最新版的SDK,然后再安装最新版的WDK就可以了:

image.png

所以版本相同,指的是前面的三段版本数字完全相同,最后一段数字版本只是该版本的热更新版本号,可以不同。

两者的安装过程都很简单,直接一直默认安装即可,不用管其它内容。

安装完成后,可以在设置->应用->安装的应用,搜索“windows”关键字,找到安装好的sdk与wdk:

image.png

然后来到wdk的安装目录下,默认安装目录为:

C:\Program Files (x86)\Windows Kits\10\Debuggers\x64
作者:余识
全部文章:0
会员文章:0
总阅读量:0
c/c++pythonrustJavaScriptwindowslinux