驅動篇——開發環境配置

寂靜的羽夏發表於2021-10-31

寫在前面

  此係列是本人一個字一個字碼出來的,包括示例和實驗截圖。由於系統核心的複雜性,故可能有錯誤或者不全面的地方,如有錯誤,歡迎批評指正,本教程將會長期更新。 如有好的建議,歡迎反饋。碼字不易,如果本篇文章有幫助你的,如有閒錢,可以打賞支援我的創作。如想轉載,請把我的轉載資訊附在文章後面,並宣告我的個人資訊和本人部落格地址即可,但必須事先通知我

你如果是從中間插過來看的,請仔細閱讀 羽夏看Win系統核心——簡述 ,方便學習本教程。

  看此教程之前,問一個問題,你明確學驅動的目的了嗎? 沒有的話就不要繼續了,請重新學習 羽夏看Win系統核心——環境搭建 裡面的內容。


? 華麗的分割線 ?


開發環境配置

  Microsoft官方提供了指導,點選 該連結 轉到官方指導頁面。
  怎麼裝VSWindows 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就會接管並自動彈出一個窗體用來顯示除錯原始碼:

驅動篇——開發環境配置

  綜上,環境就配置完畢了,本文結束。

下一篇

  驅動篇——核心程式設計基礎

相關文章