WINDOWS内核编程(一)Hello Drv的实现
我们开始编写第一个驱动程序,首先我们需要进行项目的创建,在以前的随笔中,我们已经学会了如何去建立双机调试环境。
我们打开VS2017,建立如图所示的项目,取名为:MyFirstDriver.点击确定
由于,我写这个都是写.C的文件,因此我尝试使用.CPP文件,实现一下第一个FirstDriver.
建立一个.cpp文件。
然后输入我们的代码
#ifdef __cplusplus extern "C" { void DriverUnload(PDRIVER_OBJECT); NTSTATUS DriverEntry(PDRIVER_OBJECT, PUNICODE_STRING); } #else void DriverUnload(PDRIVER_OBJECT); NTSTATUS DriverEntry(PDRIVER_OBJECT, PUNICODE_STRING); #endif
解释一下__cplusplus这个宏,我们可以通过这个宏定义判断我们的文件是.CPP还是.C后缀的文件,
另外,我们都知道C++中有函数重载的机制,但是在驱动中一般都是C语言编写,我们要避免名称粉碎机制,
就要使用extern"C"。
然后就是DriverEntry 这个函数,这是两个参数就是固定的参数,规定是这样写的,记住就行了,
另外就是DriverUnload 这个函数,这个参数就是固定的参数,是驱动的卸载函数,记住就行了,
然后我们来看一下这个两个函数的实现,在编译一下这个项目
完整代码如下:
1 #include<ntifs.h> 2 3 //为了避免名称粉碎机制 4 5 #ifdef __cplusplus 6 7 extern "C" 8 { 9 void DriverUnload(PDRIVER_OBJECT); 10 NTSTATUS DriverEntry(PDRIVER_OBJECT, PUNICODE_STRING); 11 12 } 13 #else 14 void DriverUnload(PDRIVER_OBJECT); 15 NTSTATUS DriverEntry(PDRIVER_OBJECT, PUNICODE_STRING); 16 #endif 17 18 void DriverUnload(PDRIVER_OBJECT pDriver) 19 { 20 UNREFERENCED_PARAMETER(pDriver); 21 return; 22 } 23 NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver_object, PUNICODE_STRING pPath) 24 { 25 DbgPrint("Hello Drv!\n"); 26 pDriver_object->DriverUnload = DriverUnload; 27 return STATUS_SUCCESS; 28 }
编译以上代码,我们可能会遇到
error C2220: 警告被视为错误 - 没有生成“object”文件
warning C4100: “pPath”: 未引用的形参
这样的报错,我们要如何解决这个问题呢?
UNREFERENCED_PARAMETER(pPath);
这样就可以解决这个问题了,也可以通过VS项目的设置来降低对VS项目的警告等级解决这个问题,
我们还需要进行项目的一些其他的设置。
然后编译生成将我们生成的驱动文件,放到我们的虚拟机中,并使用驱动加载工具进行加载。
至此我们的第一个驱动程序就完成了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)