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

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

 

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章