寫在前面
此系列是本人一個字一個字碼出來的,包括示例和實驗截圖。由於系統內核的復雜性,故可能有錯誤或者不全面的地方,如有錯誤,歡迎批評指正,本教程將會長期更新。 如有好的建議,歡迎反饋。碼字不易,如果本篇文章有幫助你的,如有閑錢,可以打賞支持我的創作。如想轉載,請把我的轉載信息附在文章后面,並聲明我的個人信息和本人博客地址即可,但必須事先通知我。
你如果是從中間插過來看的,請仔細閱讀 羽夏看Win系統內核——簡述 ,方便學習本教程。
看此教程之前,問一個問題,你明確學驅動的目的了嗎? 沒有的話就不要繼續了,請重新學習 羽夏看Win系統內核——驅動篇 里面的內容。
🔒 華麗的分割線 🔒
開發環境配置
Microsoft
官方提供了指導,點擊 該鏈接 轉到官方指導頁面。
怎么裝VS
和Windows 11 SDK
我就不贅述了。注意,如果你沒有裝Windows 11 SDK
,直接安裝Windows 11 WDK
,驅動的關鍵頭文件你會沒有。
接下來說一下怎么裝Windows 11 WDK
,下載好后運行,你會看到如下情況:
選擇好安裝目錄,點擊繼續,然后會到下圖所示情況,選中否,它會收集你的一些信息:
最后按照正常操作就行了,最后會彈出安裝插件的窗體(忘了截圖了,和正常安裝VS
插件一樣的窗體),點擊Modify
。這個插件會提供一些編寫驅動的模板,這東西至關重要,幫我們減少了大量的配置人力。
安裝好之后,我們進行一個測試。開啟VS
,選擇新建項目,如果編寫在XP
下面的驅動的話,注意選擇Empty WDM Driver
,如下圖所示:
后面就像正常新建項目一樣起個名字新建就行,你就會得到一個新的空項目。然后添加一個源文件,如下圖所示:
為什么要用C
,而不用C++
呢?C++
雖然更加強大,提供類的功能。但C
更加簡單,對於我們來說就足夠了,除非你用其開發大型驅動程序。
新建完畢后,我們用下面的代碼:
#include <ntddk.h> //驅動程序必備頭文件
NTSTATUS UnloadDriver(PDRIVER_OBJECT DriverObject)
{
DbgPrint("Chapter Driver By WingSummer,Unloaded Successfully!");
}
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
DbgPrint("Chapter Driver By WingSummer,Loaded Successfully!");
DriverObject->DriverUnload = UnloadDriver;
return STATUS_SUCCESS;
}
DbgPrint
意思是輸出調試信息,那我為什么要用英文而不用中文呢?因為中文在WinDbg
進行源碼調試的時候,中文會亂碼,所以用英文更好些,但調試信息輸出的中文並不會亂碼。DriverEntry
是驅動程序的入口,和正常的C語言程序的main
函數是一樣的,只是入口的參數不一樣。其它的細節將會在下一篇進行講解,就把代碼復制到VS
就行了。
代碼寫好了,我們需要對工程進行配置,否則驅動XP
用不了:
🚀 更改目標平台,否則XP報無效驅動程序 🚀
🚀 用不到,關掉它 🚀
🚀 用不到,關掉它 🚀
設置好后,我們就可以編譯了。然而理想很美好,現實很殘酷。編譯失敗了:
報錯說明需要緩解了Spectre漏洞的庫
這個東西,不知道是干啥的。但我們必須安裝上,否則驅動編譯不了啊。好,啟動Visual Studio Installer
,修改它,安裝如下圖所示文件:
安裝好,重啟VS
,打開原先我們建好的項目,繼續編譯,結果又報錯,不過錯誤不是原來的了:
對於這個錯誤,我們只需要設置一個就可以解決,如下圖所示:
設置完畢后,再編譯一下,編譯通過,成功生成了驅動文件。然后我們把它拖到虛擬機中,利用驅動加載工具來試一試驅動是否可用:
發現DebugView
正常顯示我們想要輸出的調試字符串,證明驅動正常工作。以上的配置過程也就完成了一半。
調試環境配置
調試是十分重要的一個環節。那么我們如何進行調試呢?打開WinDbg
的設置,需要添加你開發驅動的工程目錄,如下圖所示:
這個添加的符號目錄因自己的開發驅動的位置而異,不要盲目把我的目錄給添加上。然后點擊確定。注意,更改需要調試器處於空閑非調試狀態才能設置。
然后我們在上面的源代碼中,添加一個手動斷點,如下所示:
#include <ntddk.h>
NTSTATUS UnloadDriver(PDRIVER_OBJECT DriverObject)
{
DbgPrint("Chapter Driver By WingSummer,Unloaded Successfully!");
}
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
{
DbgPrint("Chapter Driver By WingSummer,Loaded Successfully!");
DriverObject->DriverUnload = UnloadDriver;
_asm
{
int 3;
}
return STATUS_SUCCESS;
}
再重新編譯,拖到虛擬機中進行注冊和運行,就會觸發這個斷點,WinDbg
就會接管並自動彈出一個窗體用來顯示調試源代碼:
幫助文檔
網上有最新版的WDK
文檔,但文檔主要是針對Win10
開發驅動的,有很多API
是XP
沒有的。請到 羽夏看Win系統內核——簡述 下載WDK
幫助文檔。然后下載成功解壓,並運行Docs.msi
安裝程序進行安裝即可。最后的幫助文檔效果如下圖所示:
綜上,環境就配置完畢了,本文結束。