共用方式為


支援的驅動程式

若要讓 SDV 驗證驅動程式,它必須能夠解譯驅動程式程式代碼,特別是驅動程式的進入點,以及支援所需驅動程式功能的函式和例程中的程式碼。

下列各節說明驅動程式的基本需求,以及 SDV 預期其驗證驅動程式的特定語法。 SDV 不會驗證驅動程式是否符合這些需求,但如果驅動程式不符合規範,SDV 可能無法執行,而且,在罕見的情況下,會報告誤判或誤判結果。

重要

不再支援 SDV,且 Windows 24H2 WDK 或 EWDK 版本無法使用 SDV。 它不適用於比組建 26017 還新的 WDK,而且不包含在 Windows 24H2 RTM WDK 中。 從下載 Windows 驅動程式套件 (WDK) 下載 Windows 11 版本 22H2 EWDK(2023 年 10 月 24 日發行)與 Visual Studio 組建工具 17.1.5,仍然可以使用 SDV。 建議只使用企業 WDK 來執行 SDV。 不建議使用舊版的標準 WDK 搭配最新版的 Visual Studio,因為這可能會導致分析失敗。
接下來,CodeQL 將是驅動程式的主要靜態分析工具。 CodeQL 提供功能強大的查詢語言,會將程式代碼視為要查詢的資料庫,讓您輕鬆地撰寫查詢特定行為、模式等等。 如需使用 CodeQL 的詳細資訊,請參閱 CodeQL 和靜態工具標誌測試

基本驅動程式特性

SDV 只能驗證具有下列特性的驅動程式:

  • SDV 會驗證以 C 和 C++撰寫的驅動程式和連結庫。

  • SDV 只會在符合 KMDF 規範和 WDM 相容的設備驅動器上執行完整驗證(函式驅動程式、篩選驅動程式和總線驅動程式)、NDIS 驅動程式(篩選、迷你埠和通訊協定驅動程式),以及 Storport 驅動程式。

  • SDV 嘗試在不符合上述類別的驅動程式上,對泛型屬性 (例如 NullCheck) 進行有限的驗證。

  • SDV 可以使用 WDM 函式角色類型來驗證宣告其驅動程式回呼函式的 WDM 驅動程式。 如需如何宣告函式的資訊,請參閱 使用WDM驅動程式的函式角色類型來宣告函式

  • SDV 可以驗證從 內核模式驅動程式架構產生的驅動程式,前提是您使用 SDV-KMDF 回呼函式角色類型來宣告每個回呼函式。 如需詳細資訊,請參閱 使用 KMDF 驅動程式的函式角色類型來宣告函式

  • SDV 可以驗證 NDIS 驅動程式,前提是您使用 SDV-NDIS 回呼函式類型來標註每個回呼函式與函式宣告。 如需詳細資訊,請參閱 使用 NDIS 驅動程式的函式角色類型宣告函式

  • SDV 可以驗證 Storport 驅動程式,前提是您使用函式宣告來標註每個回呼函式。 您可以使用 SDV-Storport 回呼函式類型來執行此動作。 如需詳細資訊,請參閱 使用 Storport 驅動程式的函式角色類型宣告函式

基本驅動程式需求

若要讓 SDV 驗證 WDM 驅動程式,驅動程式必須:

若要讓 SDV 驗證 KMDF 驅動程式,驅動程式必須:

若要讓 SDV 驗證 NDIS 驅動程式,驅動程式必須:

  • 包含 Ndis.h 和 Ntddk.h。

  • 遵循網路設計指南中的指導方針來建立 NDIS 驅動程式。

  • 使用 SDV-NDIS 回呼函式角色類型來標註每個回呼函式,如使用函式角色類型宣告中所述。 如需支援的角色類型清單,請參閱 靜態驅動程序驗證器 NDIS 函式宣告。

此外,SDV 可以驗證支援下列驅動程式:

保留函式名稱

當驅動程式或連結庫程式代碼使用 SDV 內部所使用的相同函式名稱模式時,SDV 驗證引擎 無法正常運作。

具體來說,如果:

  • 程式代碼包含以 __init 開頭的函式名稱,後面接著一或多個整數,例如__init123。

  • 程式代碼包含開頭為sdv_的函式名稱,例如sdv_Func,或包含字串 _sdv_,例如Func_sdv_或Func_sdv_foo。

  • 連結庫會使用 .def 檔案來重新命名導出的函式,而外部名稱與連結庫中另一個靜態函式的名稱相同。

如果驅動程式程式代碼或連結庫程式代碼包含這些元素,SDV 會嘗試驗證驅動程式或處理連結庫,但結果為不支援的功能 (NSF)。 如需 SDV 結果的詳細資訊,請參閱 解譯靜態驅動程式驗證器結果