windows内核驱动开发

news/2024/11/16 7:18:59/

友链

hellodriver

使用VS2019

项目地址

代码

// I don't like NTSTATUS, it like shit
typedef NTSTATUS _nt;/*
your driver must implement two basic event callback fucnions at least
which is:- DRIVER_INITIALIZE DriverEntry- EVT_WDF_DRIVER_DEVICE_ADD KmdfHelloWorldEvtDeviceAdd
*/// these two head files must be included in your driver code
// contains win kernel definitions for all drivers
#include <ntddk.h>	
// contains win kernel definitions for drivers those who are based on WDF
#include <wdf.h>// both DRIVER_INITIALIZE and EVT_WDF_DRIVER_DEVICE_ADD are function type with parameter and return value declared, see this:  https://blog.csdn.net/ma_de_hao_mei_le/article/details/126246225
DRIVER_INITIALIZE DriverEntry;
EVT_WDF_DRIVER_DEVICE_ADD KmdfHelloWorldEvtDeviceAdd;// then DriverEntry function
// this is the main function in user mode code
// everytime we want to analyse a drvier, we need to check this function to know how does it work
_nt DriverEntry(_In_ PDRIVER_OBJECT		DriverObject,_In_ PUNICODE_STRING	RegistryPath
)
{// this is the return value// well STATUS_SUCCESS macro sucks, it is too long, I prefer to use 0_nt status = 0;// idk what the fuck is this// the document from MS says it is driver configuration object, which indeed is a structWDF_DRIVER_CONFIG config;// let's print some thing, only visible for debugger// idk what is the usage of commentid and levelKdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "KmdfHelloWorld: DriverEntry\n"));// initialize driver configuration object to register entry point for one of the call back function we mentioned at the beginning// the other call back is EntryPoint// it doesn't need to be registered// it will be called automatically if certain event comesWDF_DRIVER_CONFIG_INIT(&config,KmdfHelloWorldEvtDeviceAdd);// at last, we create driver objectstatus = WdfDriverCreate(DriverObject,RegistryPath,WDF_NO_OBJECT_ATTRIBUTES,&config,WDF_NO_HANDLE);return status;
}// now we need to implement our KmdfHelloWorldEvtDeviceAdd callback function
// EvtDeviceAdd will be invoked by system when your device has arrived
// what does the doc mean when it say "your device"?
// what the fuck is "your device"? 
// idk what is my device and how it arrives
// this function will initialize structures and resources that this device will use, and create device object for it
// MS doc recommends to name this EvtDeviceAdd function with a prefix, and the driver name should be this prefix
// now I understand, device arriving when you click enable in devmanager
_nt KmdfHelloWorldEvtDeviceAdd(_In_	WDFDRIVER			Driver,_Inout_ PWDFDEVICE_INIT		DeviceInit
)
{// the first parameter is useless because we're not going to use it// so we need to mark it as unreferenced// I'm not sure what is the point to do this// because I've never seen this in user mode C codeUNREFERENCED_PARAMETER(Driver);// allocate device object// here is how WDFDEVICE is declared https://blog.csdn.net/ma_de_hao_mei_le/article/details/126247434WDFDEVICE hDevice;// print some thing in debugger so we know that this function is executedKdPrintEx((DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "KmdfHelloWorld: KmdfHelloWorldEvtDeviceAdd\n"));_nt status = WdfDeviceCreate(&DeviceInit,WDF_NO_OBJECT_ATTRIBUTES,&hDevice);return status;
}

构建完成后在项目目录下可以找到以下几个文件
在这里插入图片描述
sys是驱动文件,inf是安装驱动的时候用的文件,cat是installer用于验证驱动的测试签名的文件

部署驱动

本来VS是有自动化部署的功能的,但是我玩不明白,所以只能用笨方法,手动部署

把签名给禁了先

bcdedit /set testsigning on

然后重启

把vs生成的三个文件全拖到测试机上,然后把开发机上的devcon.exe拷到测试机,注意devcon.exe的位数,要和测试机一样

然后执行如下命令进行安装即可

devcon install hellodriver.inf root\hellodriver

在这里插入图片描述
在这里插入图片描述

调试驱动程序

微软官方给了例子

https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/debug-universal-drivers—step-by-step-lab–echo-kernel-mode-#connectto

例子的代码可以在这里下载

这个项目会生成两个驱动程序,echo和echo_2,我们只需要看echo就行了,echo_2不用管

使用devcon把echo装上去之后,在debugger机器上把内核调试弄好,然后把echo.pdb文件的路径加到符号路径即可

.symfix
.sympath+ /path/to/echo.pdb
!sym noisy
.reload /flmvm echo

如果可以查看到如下信息,说明就成功了

在这里插入图片描述
可以使用!devnode 0 1命令来显示设备节点树,如果你的设备没有出现在里面,那说明你安装失败了

可以看到我们的设备是可以显示在这里面的
在这里插入图片描述
上面输出中的PDO是一个地址,我们可以使用!devobj PDO来查看与该驱动关联的即插即用设备信息

在这里插入图片描述
pdo地址是和驱动运行实例相关联的,使用!devstack pdo可以查看一驱动栈信息

在这里插入图片描述

源码调试

.srcpath+ 驱动程序的源代码所在路径。

在evtdeviceadd函数下断点
然后在debugee中禁用设备,然后再启用设备即可触发该断点


http://www.ppmy.cn/news/734957.html

相关文章

数据标注:数字病理学中的人工智能

在数字病理学中&#xff0c;组织样本的显微图像被传输到计算机&#xff0c;并使用先进的图像处理技术和计算机视觉对其进行分析。 医学图像和诊断的数字化为病理学中的人工智能开辟了途径。病理学家可以使用机器学习模型来进行增强分析并提高结果准确性。此外&#xff0c;病理学…

基于FreeRTOS的嵌入式设备管理关键技术研究及实现(学习二)

嵌入式操作系统FreeRTOS FreeRTOS是一个专门为轻量级嵌入式应用设计的迷你操作系统&#xff0c;它的主要功能由IPC、时钟管理、内存管理、任务通知以及任务调度等部分构成。 FreeRTOS的代码可以分解为三个主要区块&#xff1a;任务调度、通讯、硬件库。 任务调度&#xff1a;F…

蒲公英枸杞菊花可以一起泡茶喝吗?

这两年花草茶、花果茶甚是流行和风靡&#xff0c;加上人们对健康养生越来越重视&#xff0c;像蒲公英、菊花和枸杞这样组合在一起&#xff0c;人们也不陌生&#xff0c;三者不但都是传统的中药&#xff0c;更是一种食材&#xff0c;不管是泡水、煎汤、煮粥&#xff0c;都能起到…

常使用电脑的人可使用的护眼软件

我不是从事IT行业&#xff0c;是做计算模拟相关的。 因为公司网络限制先前使用电脑管家的健康小助手的一些小功能&#xff0c;但有天不能使用了&#xff0c;卸载不能自己安装。 试着找了找其他可代替的软件&#xff0c;发现了更多有用的。 定时休息 win7可以设置每隔1小时让电…

ubuntu各种实践笔记

一、精选命令 CtrlAltT&#xff1a;运行终端 CTRL Shift T&#xff1a;新建标签页。 CtrlShiftC/V&#xff1a;在终端上复制/粘贴 CtrlL&#xff1a;显示当前文件夹的地址栏&#xff0c;按ESC恢复 Tab&#xff1a;终端上自动补全命令名或文件名 CtrlH&#xff1a;单次显示当…

简化电脑操作,不让多余操作浪费你的生命

一、桌面管理 1、简单美化 以高效为宗旨&#xff0c;我向来是反对使用桌面美化软件的&#xff0c;类似于动态壁纸&#xff0c;活动小窗口&#xff0c;花哨的Dock栏&#xff0c;这些分散注意力的软件一概不用&#xff0c;我们需要高效&#xff0c;就不应该把注意力放在桌面上。…

简单聊聊程序员的健康问题

起因 为什么想聊这个话题呢&#xff0c;最近一段时间&#xff0c;加班比较严重&#xff0c;我想应该有很多朋友的状态和我差不多&#xff0c;昨天头晕眼胀的&#xff0c;而且坐久了腰还疼。 所以我们关注一下自己的健康&#xff0c;是很有必要的。但我知道的实在有限&#xff0…

600度近视眼恢复方法_近视孩子的家长看看:600度以上近视可致盲,不花钱恢复视力法...

现在孩子近视早已经不是什么新鲜事了&#xff0c;一个班级里面有3分之一的孩子都近视&#xff0c;数据显示&#xff1a;目前中国学生近视发病率接近60%&#xff0c;居世界首位&#xff01;中小学生近视率已达34.6%&#xff0c;高中近视率已达70%。患者人数超过六千万&#xff0…