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項目的警告等級解決這個問題,

我們還需要進行項目的一些其他的設置。

 

然後編譯生成將我們生成的驅動文件,放到我們的虛擬機中,並使用驅動加載工具進行加載。

至此我們的第一個驅動程序就完成了

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