WINDOWS內核編程(一)Hello Drv的實現

咱們開始編寫第一個驅動程序,首先咱們須要進行項目的建立,在之前的隨筆中,咱們已經學會了如何去創建雙機調試環境。html

咱們打開VS2017,創建如圖所示的項目,取名爲:MyFirstDriver.點擊肯定函數

因爲,我寫這個都是寫.C的文件,所以我嘗試使用.CPP文件,實現一下第一個FirstDriver.工具

創建一個.cpp文件。spa

而後輸入咱們的代碼調試

#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後綴的文件,code

另外,咱們都知道C++中有函數重載的機制,可是在驅動中通常都是C語言編寫,咱們要避免名稱粉碎機制,htm

就要使用extern"C"。blog

而後就是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

相關文章
相關標籤/搜索