准備
vs2015社區中文版
鏈接:https://pan.baidu.com/s/1gucO9NcymG1x8RRQetaNIw
提取碼:a4zj
WDK10.0.26639
鏈接:https://pan.baidu.com/s/140qjNUfo8TCNDqlmWmjuQw
提取碼:sng8
正文
安裝位置默認,選擇自定義安裝
選擇功能這里只勾3個部分:vs2015更新3,編程語言的Visual C++,通用windows應用開發工具的windows 10 SDK10.0.10240。
最后確認安裝,這里安裝的時間會相對較長,安裝完成后就可以確定並啟動了
安裝完vs2015后再安裝wdk10,運行安裝包后默認安裝C盤,這里直接next就行
隱私聲明這里,直接選擇yes和next就行
許可協議這里選擇Accept就行
最后就是等待Windows Driver Kit的安裝
安裝結束后close就行,learn more about復選框里勾或不勾都沒啥影響
重新打開vs2015,選擇新建一個項目,這個時候就可以在Visual C++下看到Windows Driver這個選項
打開Windows Driver->WDF選擇里面的Empty(KMDF),名稱和位置根據習慣修改
項目建好后首先添加一個新建項,我習慣是用C寫驅動代碼,所以新建文件后綴為.C,如果習慣用C++寫則文件后綴為.CPP
最后就是修改項目屬性,打開調試->項目屬性
由於我編譯為debug版本,所以這里要確認配置的是debug的屬性,如果是release則在配置這里選擇為release后再修改屬性
打開C/C++的常規設置,把警告等級改成警告等級3,其他不同的設置按照圖中進行修改即可
打開Driver Settings,這里的Target OS Version和Target Platform按照圖中設置就行,如果驅動在win10下運行就把Target OS Version改為windows10
Inf2Cat是用於簽名的,我們這里暫時不用管這個,在run inf2cat中選擇否就行
最后打開Driver Signing,這個也是驅動簽名的,這里在Sign Mode里選擇off就行。到此就完成了所有環境的配置,接下來就可以開始編寫程序了
用一段測試代碼編譯一下,成功后如圖,測試代碼在下面
測試代碼作用是打印打印ssdt函數地址,這個不用管,主要是加載驅動后會在
DebugView中看到我們的相關信息,到虛擬機中加載,在DebugView中查看結果如圖
測試代碼
1 #include <ntddk.h> 2 3 /*導出ssdt結構體*/ 4 typedef struct _ServiceDescriptorTable 5 { 6 PVOID ServiceTableBase; //System Service Dispatch Table 的基地址 7 PVOID ServiceCounterTable; //包含着 SSDT 中每個服務被調用次數的計數器。這個計數器一般由sysenter 更新。 8 unsigned int NumberOfServices; //由 ServiceTableBase 描述的服務的數目。 9 PVOID ParamTableBase; //包含每個系統服務參數字節數表的基地址-系統服務參數表 10 } *PServiceDescriptorTable; 11 extern PServiceDescriptorTable KeServiceDescriptorTable; 12 13 VOID DriverUnload(PDRIVER_OBJECT pDriverObject) 14 { 15 KdPrint(("驅動卸載成功!\n")); 16 } 17 18 NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING reg_path) 19 { 20 ULONG ssdtindex,ntaddress; 21 ULONG *ssdtbase; 22 KdPrint(("驅動成功加載!\n")); 23 24 ssdtbase = KeServiceDescriptorTable->ServiceTableBase; 25 for (ssdtindex = 0; ssdtindex < (ULONG)KeServiceDescriptorTable->NumberOfServices; ssdtindex++) 26 { 27 ntaddress = *ssdtbase; 28 KdPrint(("%0x\n", ntaddress)); 29 ssdtbase += 1; 30 } 31 32 33 pDriverObject->DriverUnload = DriverUnload; 34 return STATUS_SUCCESS; 35 }