共用方式為


驗證驅動程式的工具

Windows 驅動程式套件(WDK)提供驅動程式驗證工具,協助你在開發過程中偵測並修正錯誤。 這些工具包括像 CodeQL 這樣的靜態分析工具,以及能在部署前發現關鍵錯誤的動態工具如 Driver Verifier。 在開發初期使用這些驗證工具,能節省時間並避免生產環境中嚴重的驅動程式問題。

WDK 文件描述了這些驗證工具,並建議使用它們,因為每種工具以不同方式偵測不同類型的驅動錯誤。 這些工具比手動檢查更有效率。 他們能偵測標準驅動程式測試中罕見的錯誤,並融合了資深驅動程式開發者與 Windows 驅動介面設計師的專業。

為了達到最佳效果,請使用所有能在驅動程式上執行的工具。 如果你省略了這些工具,可能會錯過驅動程式中的嚴重錯誤。

靜態與動態驗證工具

驗證工具有兩種基本類型:

  • 靜態驗證工具 會檢查驅動程式程式代碼,而不執行驅動程式。 因為這些工具不依賴測試來執行程式碼,因此可以非常徹底。 理論上,靜態驗證工具可以檢查所有驅動程式程式代碼,包括實務上很少執行的程式代碼路徑。 然而,由於驅動程式實際上並未運行,這些工具可能會產生誤報結果。 也就是說,他們可能會在某條程式碼路徑中報告錯誤,但實際未發生。

    CodeQL 是驅動程式的主要靜態分析工具。 CodeQL 提供一種強大的查詢語言,將程式碼視為可供查詢的資料庫,使撰寫特定行為與模式查詢變得簡單。 Windows 硬體相容性計畫要求 CodeQL 以進行我們的客戶端與伺服器作業系統上的靜態工具標誌(STL)測試。 如需詳細資訊,請參閱 CodeQL 和靜態工具標誌測試

  • 動態驗證工具 會在驅動程式執行時檢查驅動程式程式代碼,通常是攔截常用驅動程序支援例程的呼叫,並取代對相同例程本身錯誤檢查版本的呼叫。 因為驅動程序實際上是在動態工具執行驗證時執行,因此誤判結果很少見。 然而,由於動態工具只偵測監控驅動程式時發生的動作,若驅動測試覆蓋不足,工具可能會漏掉某些驅動缺陷。 同時,透過使用執行時可用的資訊——例如較難靜態從原始碼中擷取的資訊——動態驗證工具能偵測到某些較難用靜態分析工具偵測的驅動錯誤類別。

請結合靜態與動態驗證工具。 靜態工具可讓您檢查在實務上難以練習的程式代碼路徑,而動態工具則發現驅動程式中發生的嚴重錯誤。

驗證工具概述

重要

靜態驅動驗證器(SDV)工具已不再支援。 在 WDK 26017 之後的新版本中,包括 Windows 24H2 RTM WDK,都無法使用。 不建議使用 SDV 進行分析。

WDK 描述了以下驗證工具,並建議驅動程式開發者與測試人員使用。 它們會依照你通常使用的順序列出。

程式碼編譯後

  • CodeQL 是一個強大的語意程式碼分析引擎。 結合了大量高價值的安全查詢套件與強大的平台,使其成為保護驅動程式碼的無價工具。 如需詳細資訊,請參閱 CodeQL 和靜態工具標誌測試

驅動程式執行時

一旦建置驅動程式且正在執行且沒有明顯錯誤,請使用下列動態驗證工具。

  • 驅動程式驗證器 是專為 Windows 驅動程式撰寫的動態驗證工具。 它包含多個測試,可以同時對多個驅動程式執行。 驅動驗證器在發現驅動程式嚴重錯誤方面非常有效,以致經驗豐富的驅動開發者和測試人員會將其設定為只要驅動程式在開發或測試環境中執行時就能執行。 驅動程式驗證器包含在 Windows 中。 當您為驅動程式啟用驅動程式驗證器時,您也必須在驅動程式上執行多個測試。 驅動程式驗證器可以單獨使用靜態驗證工具來偵測難以偵測的特定驅動程序錯誤。 這些 Bug 類型的範例包括下列各項:

    • 核心集區緩衝區滿溢。 當驗證驅動程式分配池式記憶體緩衝區時,驅動驗證器會使用不可存取的記憶體頁面來保護它們。 若驅動程式嘗試使用緩衝區末端以外的記憶體,驅動驗證器會啟動錯誤檢查。

    • 釋放記憶體之後使用記憶體。 特殊池記憶體區塊使用專用的記憶體頁面,且不與其他分配共用記憶體頁面。 當驅動程式釋放池區塊時,對應的記憶體頁面將變得不可存取。 如果驅動程式在釋放記憶體後嘗試使用該記憶體,驅動程式會立即當機。

    • 在提升許可權的 IRQL 執行時,使用可分頁記憶體。 當已驗證的驅動程式在 DISPATCH_LEVEL 或更高版本引發 IRQL 時,驅動程式驗證器會從系統工作集修剪所有可分頁記憶體,並在記憶體壓力下模擬系統。 如果驅動程式嘗試使用其中一個可分頁的虛擬位址,驅動程式就會當機。

    • 低資源模擬。 為了模擬系統在資源不足的條件下,驅動程式驗證器可能會失敗驅動程式呼叫的各種作業系統核心 API。

    • 記憶體流失。 驅動程式驗證器會追蹤驅動程式所分配的記憶體,並確保驅動程式在記憶體卸載前釋放了記憶體。

    • 需要太多時間才能完成或取消的 I/O 作業。 驅動程式驗證器可以測試驅動程式對 STATUS_PENDING 回傳值的回應邏輯

    • DDI 合規性檢查。 (從 Windows 8 開始提供)驅動程式驗證器會套用一組設備驅動器介面 (DDI) 規則,以檢查驅動程式與作業系統核心介面之間的適當互動。

  • 核心 位址清理程式 (KASAN) 是 Windows 驅動程式上支援的 Bug 偵測技術,可讓您偵測數種不合法的記憶體存取類別,例如緩衝區溢位和使用後無事件。

  • Application Verifier 是一款用於使用者模式應用程式與驅動程式的動態驗證工具,採用 C 或 C++ 撰寫。 它不會驗證受管理程式碼。