c语言windows内核驱动,WINDOWS内核编程(一)Hello Drv的实现

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

我们打开VS2017,建立如图所示的项目,取名为:MyFirstDriver.点击确定

3aff2fe2ec136c1bd2946911d149b83b.png

由于,我写这个都是写.C的文件,因此我尝试使用.CPP文件,实现一下第一个FirstDriver.

建立一个.cpp文件。

8d420d3f37fba4193fc7627d00277afd.png

然后输入我们的代码

#ifdef __cplusplusextern "C"{voidDriverUnload(PDRIVER_OBJECT);

NTSTATUS DriverEntry(PDRIVER_OBJECT, PUNICODE_STRING);

}#else

voidDriverUnload(PDRIVER_OBJECT);

NTSTATUS DriverEntry(PDRIVER_OBJECT, PUNICODE_STRING);#endif

解释一下__cplusplus这个宏,我们可以通过这个宏定义判断我们的文件是.CPP还是.C后缀的文件,

另外,我们都知道C++中有函数重载的机制,但是在驱动中一般都是C语言编写,我们要避免名称粉碎机制,

就要使用extern"C"。

然后就是DriverEntry 这个函数,这是两个参数就是固定的参数,规定是这样写的,记住就行了,

另外就是DriverUnload 这个函数,这个参数就是固定的参数,是驱动的卸载函数,记住就行了,

然后我们来看一下这个两个函数的实现,在编译一下这个项目

完整代码如下:

1 #include

2

3 //为了避免名称粉碎机制

4

5 #ifdef __cplusplus6

7 extern "C"

8 {9 voidDriverUnload(PDRIVER_OBJECT);10 NTSTATUS DriverEntry(PDRIVER_OBJECT, PUNICODE_STRING);11

12 }13 #else

14 voidDriverUnload(PDRIVER_OBJECT);15 NTSTATUS DriverEntry(PDRIVER_OBJECT, PUNICODE_STRING);16 #endif

17

18 voidDriverUnload(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 returnSTATUS_SUCCESS;28 }

编译以上代码,我们可能会遇到

error C2220: 警告被视为错误 - 没有生成“object”文件

warning C4100: “pPath”: 未引用的形参

这样的报错,我们要如何解决这个问题呢?

UNREFERENCED_PARAMETER(pPath);

这样就可以解决这个问题了,也可以通过VS项目的设置来降低对VS项目的警告等级解决这个问题,

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

56eb18769d6aeb1ebeef658c99ae9192.png

c1455fe60e670f394b658544c6f6d8ff.png

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

fdfcfcb8e15b32b5c02c5d5269edaccc.png

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

原文出处:https://www.cnblogs.com/wenlong-4613615/p/10724924.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值