WINDOWS内核编程(一)Hello Drv的实现

本文详细介绍在VS2017中创建并编写首个驱动程序的过程,包括项目创建、使用.CPP文件编写驱动代码、解决编译错误及项目设置,最后完成驱动的编译与加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们开始编写第一个驱动程序,首先我们需要进行项目的创建,在以前的随笔中,我们已经学会了如何去建立双机调试环境。

我们打开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项目的警告等级解决这个问题,

我们还需要进行项目的一些其他的设置。

 

然后编译生成将我们生成的驱动文件,放到我们的虚拟机中,并使用驱动加载工具进行加载。

至此我们的第一个驱动程序就完成了

转载于:https://www.cnblogs.com/wenlong-4613615/p/10724924.html

编写Windows内核程序,就意味着这个程序可以执行任意指令,可以访问计算机所有的软件、硬件资源。因此,稍有不慎就有可能将系统变得不稳定。Windows的设计者设计了各种驱动模型或者框架,如NT式内核驱动模型、WDM框架和新推出的WDF框架。在这些模型框架下编程,就使内核编程变得简单,同样也降低了内核程序崩溃的机会。其实,Windows驱动程序员和黑客都在写内核程序,唯不同的是驱动程序员按照微软设计的模型写程序,而黑客可以不按照这些框架写。Windows设计的这些框架,可以将操作系统的原理隐藏起来,只暴露些接口,驱动程序员只要把这些接口写好就可以了。从这个角度看,驱动开发并不难,尤其是读完本书后,更会觉得不难了。但是想完成些特殊的功能,如内核级隐藏进程等,Windows的这些框架就没什么用处了,程序员就需要对Windows内核有全面的了解,通过直接修改Windows内核实现这些目的。往往黑客对这种技术乐此不疲,通过修改Windows内核,你会发现你的程序几乎无所不能。   编写内核程序是件很痛苦的事情,回想起这些年学习内核程序开发的经历,真是感慨万千。就如同谭文所说:编写内核程序的人从某种程度讲是孤独的。当个经验并不丰富的小程序员面对庞大复杂的并且不开源的Windows框架时,那是种怎样的无助感啊!谭文是我比较钦佩的程序员之,他对技术非常执着,并且精力充沛。内核程序的知识涉及面非常广,不同类别的内核程序差别也特别大,他几乎都有所涉猎。相信读者在读完这本书后,能对Windows内核开发有比较详细的了解,同时也能结合书中的实例写出很优秀的内核程序了 本书从Windows内核编程出发,全面系统地介绍了串口、键盘、磁盘、文件系统、网络等相关的Windows内核模块的编程技术,以及基于这些技术实现的输入密码保护、防毒引擎、文件加密、网络嗅探、网络防火墙等信息安全软件的核心组件的具体编程。主要知识重点包括:Windows串口与键盘过滤驱动、Windows虚拟存储设备与存储设备过滤驱动、Windows文件系统过滤驱动、文件系统透明加密/解密驱动、Windows各类网络驱动(包括TDI过滤驱动及3类NDIS驱动),以及最新的WDF驱动开发模型。有助于读者熟悉Windows内核驱动的体系结构,并精通信息安全类的内核编程技术。本书的大部分代码具有广泛的兼容性,适合从Windows 2000直到目前最新的Windows 7 Beta版。  本书则基本上介绍的是正统的内核编程技术,是微软在内核编程中给信息安全软件开发者提供的相关接口的大集合,是名门正派的技术,不沾邪气。个好的内核程序员,“正邪兼修”是有必要的。   本书既适合于有志于成为软件程序员的学生使用,也适合于希望加强自己的技术实力的Windows程序员阅读,同时更适合于从事信息安全行业的Windows软件的开发者作为手头参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值