我們開始編寫第一個驅動程序,首先我們需要進行項目的創建,在以前的隨筆中,我們已經學會了如何去建立雙機調試環境。
我們打開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項目的警告等級解決這個問題,
我們還需要進行項目的一些其他的設置。
然后編譯生成將我們生成的驅動文件,放到我們的虛擬機中,並使用驅動加載工具進行加載。
至此我們的第一個驅動程序就完成了