首页 > 其他分享 >开发调试驱动helloworld

开发调试驱动helloworld

时间:2024-08-03 08:57:21浏览次数:6  
标签:MyDriver1 Driver helloworld 勾选 https 驱动 com 调试

开发调试驱动helloworld

https://learn.microsoft.com/zh-cn/windows-hardware/drivers

配置开发环境

https://learn.microsoft.com/zh-cn/windows-hardware/drivers/download-the-wdk
按照步骤依次安装Visual Studio Community、SDK、WDK

这里的windbg界面更现代一点
https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/
遇到"解析应用包时出错"可参考该链接解决
https://github.com/microsoftfeedback/WinDbg-Feedback/issues/159

编译驱动

最简单代码如下:

#include <ntddk.h>

VOID UnloadDriver(PDRIVER_OBJECT DriverObject) {
    DbgPrint("Hello World Driver Unloaded\n");
}

NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) {
    DriverObject->DriverUnload = UnloadDriver;
    DbgPrint("Hello World Driver Loaded\n");
    return STATUS_SUCCESS;
}

打开Visual Studio,创建新项目,可以搜索"Empty WDM Driver",WDM是Windows Driver Model的意思
解决方案窗口的项目名上,鼠标右键,添加->新建项,创建文件Test.c,把上面的代码粘进去
架构选择"x64",菜单项选择 生成 -> 生成解决方案,会报如下错误:

严重性	代码	说明	项目	文件	行	禁止显示状态	详细信息
错误	1297	Device driver does not install on any devices, use primitive driver if this is intended.	MyDriver1	C:\Users\alice\source\repos\MyDriver1\MyDriver1\MyDriver1.inf	1		

在解决方案窗口找到 Driver Files -> MyDriver1.inf, 删除该文件重新编译即可
解决方法来自: https://www.youtube.com/watch?v=Nc-uh8O989I&list=PLZ4EgN7ZCzJx2DRXTRUXRrB2njWnx1kA2&index=3

另一个报错:

严重性	代码	说明	项目	文件	行	禁止显示状态	详细信息
错误	C2220	以下警告被视为错误	TestGenerate	C:\Users\alice\source\repos\MyDriver1\MyDriver1\Test.c	3		
警告	C4100	“RegistryPath”: 未引用的形参	MyDriver1	C:\Users\alice\source\repos\MyDriver1\MyDriver1\Test.c	7		
警告	C4100	“DriverObject”: 未引用的形参	MyDriver1	C:\Users\alice\source\repos\MyDriver1\MyDriver1\Test.c	3		

解决方法:
项目 -> MyDriver1 项目 -> 配置属性 -> C/C++ -> 常规 -> 将警告视为错误,选择"否"

配置调试环境

使用真机加虚拟机的模式,真机通过串口连接虚拟机。

物理机上windbg设置

管理员权限启动
文件 -> Attach to kernel,切换到"COM"选项卡
勾选"Pipe"、"Reconnect"
Resets设为 0
Baud Rate设为 115200
Port设为 \\.\pipe\my_com "my_com"可以随便取,后面保持一致即可
点击右下"OK",这样之后windbg就会输出两行内容等待连接
    Opened \\.\pipe\my_com
    Waiting to reconnect...

VirtualBox虚拟机设置

关机状态
控制->设置->串口->端口1
勾选"启用串口"
端口模式选择"主机管道"
取消勾选"连接至现有通道或套接字"
路径/地址填"\\.\pipe\my_com"

开机
cmd管理员模式下执行两条命令,这里的debugport对应上面的"端口1":
bcdedit /debug on
bcdedit /dbgsettings serial debugport:1 baudrate:115200

重启,如果调试器连接成功,虚机右下角会出现"测试模式",调试器内会输出"Connected to"之类的信息

VMWare虚拟机设置

关机状态
虚拟机->设置->硬件->添加->串行端口->完成
选择新添加的串行端口
"设备状态"勾选"启动时连接"
"连接"选择"使用命名的管道"
    第1个空填写"\\.\pipe\my_com"
    第2个空选择"该端是服务器"
    第3个空选择"另一端是应用程序"
"I/O模式"勾选"轮询时主动放弃CPU"
点击"确定"

开机
cmd管理员模式下执行两条命令,这里的debugport对应上面的"端口1":
bcdedit /debug on
bcdedit /dbgsettings serial debugport:1 baudrate:115200

重启,如果调试器连接成功,虚机右下角会出现"测试模式",调试器内会输出"Connected to"之类的信息

win11虚机安全引导报错和解决方法

win11执行"bcdedit /debug on"报错:
尝试修改调试程序设置时出错。
该值受安全引导策略保护,无法进行修改或删除。

解决方法:
设置->Windows更新->更多选项->高级选项->其他选项->恢复->恢复选项->高级启动,点击"立即重新启动"
疑难解答->高级选项->UEFI固件设置,点击"重启"
Device Manager -> Secure Boot Configuration -> Attempt Secure Boot, 取消勾选,按F10保存
ESC两次选择Continue,回车即可

下载解压OSRLOADER供注册启动驱动使用
https://www.osronline.com/article.cfm^article=157.htm
我用的是 WNET/AMD64/FRE 文件夹下的程序

调试

查看调试输出

在虚机里设置如下注册表项(可以保存到.reg文件双击执行)并重启系统:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter]
"DEFAULT"=dword:0000000f

使用OSRLOADER注册并启动、停止驱动,可以在windbg里看到相应输出日志:

Hello World Driver Loaded
Hello World Driver Unloaded

参考链接: https://www.jianshu.com/p/74b6bb4bd2ed

入口断点

在启动驱动前,暂停调试

如果有pdb文件

增加符号:
文件 -> Settings -> Debugging settings -> Debugging paths -> Symbol path -> Browse... 选择pdb所在文件夹路径
然后可以这样下断点:

# bu: breakpoint unresolved
bu MyDriver1!DriverEntry

继续调试,启动驱动即可断在DriverEntry

如果没有pdb文件

设置启动驱动时暂停:

# Set Exception Break Enabled, load
sxe ld MyDriver1

暂停后,查看目标驱动的基址:

# List Loaded Modules, module name
lm m MyDriver1
# 假设基址是 fffff807`0a400000, 注意每次启动可能不同
# 通过IDA或Ghidra等工具确定DriverEntry偏移为0x1000,则可以下断点
# breakpoints
bp fffff807`0a400000+1000

继续调试,即可断在DriverEntry

来源: 文心一言

参考链接补充

  1. https://www.youtube.com/watch?v=XUlbYRFFYf0&list=PLZ4EgN7ZCzJx2DRXTRUXRrB2njWnx1kA2
  2. https://www.youtube.com/watch?v=T5VtaP-wtkk&list=PLZ4EgN7ZCzJyUT-FmgHsW4e9BxfP-VMuo
  3. chatgpt

2024/1/18

标签:MyDriver1,Driver,helloworld,勾选,https,驱动,com,调试
From: https://www.cnblogs.com/-rvy-/p/18340009

相关文章

  • 嵌入式Linux中的LED驱动控制(使用Pinctrl和GPIO子系统)
    在前面驱动LED的所有案例中,都是在驱动程序中去设置每个引脚的复用功能,这会导致所编写的驱动程序移植困难,可重用性差,缺乏对引脚的统一管理,容易出现引脚的重复定义等等弊病。为此,Linux内核引入了pinctrl子系统和GPIO子系统的概念。pinctrl子系统主要用于芯片引脚功能的管理,它基本上......
  • 基于Java养老院管理系统设计和实现(源码+LW+调试文档+讲解等)
    详细视频演示:请联系我获取更详细的演示视频系统技术介绍:后端框架SpringBootSpringBoot内置了Tomcat、Jetty和Undertow等服务器,这意味着你可以直接使用它们而不需要额外的安装和配置。SpringBoot的一个主要优点是它的自动配置功能。它可以根据你的项目中的依赖关......
  • mfc用printf输出调试信息到终端cmd
    前言全局说明mfc用printf输出调试信息到终端cmd一、说明环境:Windows11家庭版23H222631.3737VS2013二、printf打印调试信息2.1设置启用控制台打印2.1.1打开解决方案(项目)--属性2.1.2配置属性->生成事件->后期生成事件->命令行->编辑在框里填入......
  • JDI 0.96寸屏幕驱动
    JDI0.96寸屏幕LPM009M360A在LS013B7DH06基础上修改地址即可,将原本的LSB地址修改为MSB地址。使用下述数组可快速进行地址索引转换。/**intreverse_bits_recursive(unsignedintnum,unsignedintnumBits){unsignedintreversedNum;;unsignedintmask=0;......
  • Win11不在C盘安装WSL2(Linux环境),安装Nvidia驱动和默认使用Win11的网络代理服务
    众所周知,WSL2为Windows用户提供了一个强大、高效且灵活的Linux环境,特别适合开发者使用。它结合了Windows和Linux的优点,为用户提供了更加全面和高效的工作环境。但缺点也很明显,那就是默认安装在本来空间就不富裕的C盘。本次我们在非C盘的盘符快速安装基于wsl2的linux开......
  • GD32使用PWM+DMA调试WS2812-RGB灯调试记录(附GD32中的TIMER定时器和DMA的踩坑记录)
    一、前言目的:对于使用STM32驱动WS2812-RGB灯,已经有很多大佬进行了分享,同时写得很好!但是对于GD32的调试WS2812确实偏少,刚好最近的项目有用到,顺便记录一下踩过的坑。开源不易,谢谢大家!感谢:特别感谢三位大佬的的博文贡献;1.GD32F470通过DMA输出PWM_gd32pwmdma-CSDN博客2.基于G......
  • DDD领域驱动设计
    DomainDrivenDesign核心方法论:领域通过领域模型驱动软件设计具体方法面向对象分析设计:用例分析,对象职责分解,通用建模四色建模:特定于商业场景建模方式CQRS:只对命令类问题领域模型建模,降低建模难度事件风暴:从事件出发建模四层架构:独立的领域层六边形架构:领域模块成为架构......
  • BLDC无刷电机驱动器技术及应用
    直流无刷电机较有刷电机具备有明显的优势:高效,寿命长,污染小等,目前市场还主要以交流电机和有刷电机为主导。无刷电机具备的特点也逐步取代有刷电机,但无刷直流电机需要电子器件替代换向器,电机旋转的过程中会产生复杂的工况,如转矩控制,脉动控制,电流控制,转速控制等,就需要一套较复杂的运......
  • 视频驱动数字人形象,LivePortrait最新模型分享
    LivePortrait是一个由快手可灵团队开发的高级人工智能肖像动画框架,其主要功能是使静态照片中的面部能够模仿动态视频中的表情变化,从而让照片看起来像是活生生的人在做表情。LivePortrait采用了基于隐式关键点的方法,而不是传统的扩散方法,来从单一的源图像生成高质量且生动的视......
  • 使用chrome浏览器驱动自动打开浏览器
    查看自己google浏览器的版本下载与之对应的google浏览器驱动将驱动配置到系统的环境变量开始自动化调用importtimefromseleniumimportwebdriver#创建Chrome浏览器驱动driver=webdriver.Chrome()#打开网页url='https://www.zhihu.com/search?type=content......