Windows 内核开发环境搭建指南:从VS 2015到双机调试
Windows 内核开发环境搭建指南:从VS 2015到双机调试
本文详细介绍了在Windows环境下搭建内核开发环境的具体步骤,包括Windows 10和Windows 7的环境配置、VS 2015的安装、驱动模板的创建、Windbg的设置以及双机调试的实现。对于从事或学习Windows内核开发的技术人员具有较高的参考价值。
1. 本节目标
- Windows 10 + VS 2015
- 能够创建diver模板,并编译成功
- Windows 7 32位 + VS 2008
- 实现双机调试
本节双机调试为Windows10 虚拟机使用Windbg调试Windows 7虚拟机
1.1. 所需资源下载
- Windows镜像 + VS安装包
建议Windows 7 sp3、vs 2015 update 3 - WDK
2. Windows 10 调试机
Windows10只是习惯,也可用Windows 7,目的是搭建能够开发driver的环境
2.1. 安装VS 2015
注意WDK版本对应即可
安装VS 2015 所勾选项如下
- Visual C++
- SDK
注意SDK版本号为14393。若没有14393,请检查网络。
微软官方下载WDK,注意版本对应
14393版本对应Windows 10 版本 1607
如上图找到相应版本下载后运行,一路默认next finish安装成功。
建议完成后重启电脑 Window 10
2.2. Driver模板
- 新建项目
WDK版本安装对应后,出现Windows Driver选项栏,此处如图选择新建模板即可 - 创建DriverMain.c
注意是
.c
而不是
.cpp
,不然可能出现LNK2019错误
#include <ntifs.h>
VOID DriverUnload(PDRIVER_OBJECT pDriver)
{
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pReg)
{
pDriver->DriverUnload = DriverUnload;
return STATUS_SUCCESS;
}
- 更改设置
此时直接编译生成,会因为存在“警告”而报错无法编译通过
打开“调试 -> 属性”,更改release 和 debug的相关设置,如下图:
最后直接重新生成即可
如果能编译通过,但是代码片段依旧提示错误
第一行红色的标记,是VS的bug,虽然显示命令行错误,但是能够编译生成成功,同时代码没有颜色标注了,全是黑色默认字体。如下图,可以看看最后一节
2.3.(可选)添加自定义代码段
本小节目的是便于生成常用代码片段,完成本小节后可键入dirver后加Tab键,自动生成所需初始代码
- 本地创建
dirver.snippt
文件
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title>driver</Title>
<Shortcut>driver</Shortcut>
<Description>driver init</Description>
</Header>
<Snippet>
<Code Language="cpp"><![CDATA[#include<ntifs.h>
VOID DriverUnload(PDRIVER_OBJECT pDriver)
{
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pReg)
{
pDriver->DriverUnload = DriverUnload;
return STATUS_SUCCESS;
}]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>
- 导入
快捷键Ctrl+k,Ctrl+b(按住Ctrl,依次按k和b)打开代码片段管理器或者通过“工具 -> 代码片段管理器”打开。如下图,选择Visual C++语言并点击导入上步骤创建的snippet文件即可。
导入成功会在My code Snippet内显示。重启VS后,尝试键入driver并Tab补全代码如下图:
Tab后自动生成上小节代码片段
2.4. windbg
编辑虚拟机设置,删除打印机,添加串口,命名如下,并将该端设置为服务器
下载安装VS后将自带windbg
找到windbg文件目录,右键发送到桌面快捷方式,并右键快捷方式打开属性
在属性窗口,将目标改为如下:
"C:\Program Files (x86)\Windows Kits\10\Debuggers\u0086\windbg.exe" -y SRV*C:\Users\Hello\Desktop\symbols*http://msdl.microsoft.com/download/symbols -b -k com:port=//./com_1,baud=115200,resets=0
双击运行windbg,等待Windows 7连接即可。
4. Windows 7 被调试机
选择32位,和windbg相对应
4.1. 设置引导
管理员模式打开命令行,依次输入:
bcdedit /copy {current} /d debug
# 已将该项成功复制到 {af6621e5-ed96-11ef-bc97-879316f77421}
bcdedit /displayorder {af6621e5-ed96-11ef-bc97-879316f77421} /addlast
bcdedit /dbgsettings SERIAL DEBUGPORT:1 BAUDRATE:115200
bcdedit /bootdebug {af6621e5-ed96-11ef-bc97-879316f77421} ON
bcdedit /debug {af6621e5-ed96-11ef-bc97-879316f77421} ON
bcdedit /timeout 30
命令行执行结果如下:
(因为复制错误,输出不好看,只能先用记事本修改后展示)
命令执行完毕后,Crtl+R键入msconfig打开系统配置,将显示新创建的debug项,如图:
最后点击虚拟机内桌面左下角Windows选择重启
若没添加串口,此时还是能够正常进入系统的。关机后,编辑虚拟机设置,添加串行端口,使用命名的管道
//./pipe/com_1
本帖采用双虚拟机调试,故需要将命名管道中改为“该端是客户端”,如图所示:
如果上图界面设备中存在打印机,应将打印机移除,否则会占用一个管道。
此时再次重启Windows7虚拟机,选择debug模式,将成功可以在黑屏处中断。
4.2. 双机调试
先启动windbg再启动Windows 7被调试器即可
最终效果如下
5. 杂项
5.1. VS 2015 相关
解决 vs 2015,cpp与c报错混乱的问题
本质上就是更新,使用最新版本
命令行错误:只有在编译C++驱动程序时才能使用异常处理选项——参考链接
因为这个又重新创建了一个Windows 10虚拟机,下载安装了VS 2015 update 3版本 : (
也算是成功解决,如下:
没有奇怪的报错,代码着色正常。
5.2. Windows 7 VM tools相关
解决vm tools 安装问题
本质上仍是更新
因为新建的cn_windows_7_home_basic_x86_dvd_x15-65975版本,没有sp1和sha1签名,导致无法之间安装vm tools,需要依次下载更新KB976932、KB4474419两个补丁
IE浏览器太过原始,无法直接访问上述网站。先在主机上下载了适用于windows xp的Chrome,并借助
python -m http.server 9000
传输到Windows 7上安装。也可借助虚拟机共享文件夹传输。
5.3. 参考
如果调试机为宿主机,则默认为“该端为服务端”,宿主机使用
"C:\Program Files (x86)\Windows Kits\10\Debuggers\u0086\windbg.exe" -y SRVC:\Users\Hello\Desktop\symbolshttp://msdl.microsoft.com/download/symbols -b -k com:port=//.pipe/com_1,baud=115200,pipe
即可成功连接
网上大多都是宿主机调试虚拟机,双虚拟机较少。该贴主要参考以下链接才得以成功实现双虚拟机调试。
- 双机调试