驱动开发:WinDBG 配置内核双机调试
WinDBG 是在windows
平台下,强大的用户态和内核态调试工具,相比较于Visual Studio
它是一个轻量级的调试工具,所谓轻量级指的是它的安装文件大小较小,但是其调试功能却比VS更为强大,WinDBG由于是微软的产品所以能够调试Windows
系统的内核,另外一个用途是可以用来分析dump
数据,本笔记用于记录如何开启Windows
系统内核调试功能,并使用WinDBG
调试驱动。
1.首先需要安装VmWare
虚拟机,并自行安装好Windows 10
系统,虚拟机关闭状态下添加一个管道虚拟串口
,此处需要删除打印机,否则串口之间冲突。
操作步骤:编辑虚拟机设置
-> 添加
-> 串行端口
-> 完成
参数配置:使用命名管道
-> \\.\pipe\com_1
-> 该端是服务器,另一端是应用程序
-> 轮询时主动放弃CPU
->确定
2.开启虚拟机中的Windows
系统,然后以管理员身份运行CMD命令行,输入bcdedit
命令,可以查看到系统的当前启动项,如果是新的系统,则只会有{current}
启动项以及一个{bootmgr}
项。
连续执行下方的三条命令,依次建立启动项,并激活调试模式。
C:\LyShark > bcdedit /set testsigning on
C:\LyShark > bcdedit -debug on
C:\LyShark > bcdedit /bootdebug on
C:\LyShark > bcdedit /set "{current}" bootmenupolicy Legacy // 修改启动方式为Legacy
C:\LyShark > bcdedit /dbgsettings SERIAL DEBUGPORT:1 BAUDRATE:115200 // 设置串口1为调试端口波特率为115200
C:\LyShark > bcdedit /copy "{current}" /d "Debug" // 将当前配置复制到Debug启动配置
C:\LyShark > bcdedit /debug "{<新建的启动配置的标识符>}" on // 打开调试开关
一气呵成,但需要注意{<新建的启动配置的标识符>}
需替换成{bdb0b3b6-3f21-11ed-9931-d46011246f28}
标志,如下所示。
3.最后查看一下当前调试配置选项,执行命令 bcdedit /dbgsettings
,显示出使用的第一个串口,波特率为115200bps
,保持默认不需要修改。
4.配置完成后,重新启动系统,在开机的时候选择Windows10 [启用调试程序]
则系统会黑屏,说明已经正常进入调试模式了。
5.回到物理机上面,我们在命令行中切换到WinDBG
的根目录下,并执行以下命令,即可连接虚拟机串口进行调试了。
- 执行命令
windbg.exe -b -k com:port=\\.\pipe\com_1,baud=115200,pipe
如下图
6.至此我们还需要加载符号,在命令行下依次执行以下命令,配置好符号加载并启动系统。
kd> .sympath SRV*c:\mySymbols*http://msdl.microsoft.com/download/symbols
kd> .reload
kd> g
kd> g
kd> ed nt!Kd_SXS_Mask 0
kd> ed nt!Kd_FUSION_Mask 0
kd> u KiSystemServiceUser
这样即可完成配置操作。
7.最后我们配置测试一下调试功能,首先编写以下代码,代码中使用DbgBreakPoint()
设置断点,将会在入口处中断。
#include <ntifs.h>
NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
NTSTATUS status = STATUS_SUCCESS;
pIrp->IoStatus.Status = status;
pIrp->IoStatus.Information = 0;
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
return status;
}
VOID UnDriver(PDRIVER_OBJECT driver)
{
DbgPrint("驱动已卸载 \n");
}
// By: LyShark
NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath)
{
// 初始化默认派遣函数
NTSTATUS status = STATUS_SUCCESS;
Driver->DriverUnload = UnDriver;
for (ULONG i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
{
Driver->MajorFunction[i] = DriverDefaultHandle;
}
// 设置断点
DbgBreakPoint();
// KdBreakPoint();
// __debugbreak();
DbgPrint("驱动已加载 \n");
Driver->DriverUnload = UnDriver;
return STATUS_SUCCESS;
}
当Windows
系统加载完成以后,拖入我们的驱动文件WinDDK.sys
,并通过驱动加载工具加载运行,此时Windows
系统会卡死,回到WinDBG
中发现已经可以进行调试了。
相关文章
- PyCharm安装配置谷歌浏览器驱动[通俗易懂]
- eclipse+selenium谷歌浏览器驱动配置
- 驱动开发:内核枚举Minifilter微过滤驱动
- PowerBI 驱动行业解决方案 - 从餐饮业终极问题,到全行业用户体验驱动数字化方案
- ubuntu 20.04为mcx353a-fcbt安装驱动并配置IPoIB
- 测试之路 pytest接口自动化框架-yaml数据驱动
- Sliverwave四旋翼固件分析.三(蜂鸣器驱动)
- Linux系统挂载点 驱动存储世界(linux系统挂载点)
- 基因屏障有效控制基因驱动物种无节制繁衍
- Linux加载USB驱动的注意事项(linux加载usb驱动)
- Think-LMI驱动更新在即:联想将支持在Linux系统中配置BIOS
- 优化c3p0配置数据MySQL驱动优化实践(c3p0对mysql配置)
- 驱动配置Linux挂载:网卡驱动安装与配置(linux挂载网卡)
- Linux编译驱动程序指南(编译驱动linux)
- Linux下配置串口驱动程序:必要步骤.(linux添加串口驱动)
- Linux设备驱动程序模型研究(linux设备驱动模型)
- SQL Server驱动类:管理数据中的首选方案(sqlserver驱动类)
- MySQL驱动程序的配置指南(mysql 驱动配置)
- Linux 6.4网卡驱动安装和配置指南(linux6.4网卡)
- Oracle中的库存Oracle中元数据存储库构建信息驱动的逻辑(oracle元数据存储在)