支援的驅動程式
若要讓 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 驅動程式,驅動程式必須:
包含 Wdm.h 或 Ntddk.h (Wdm.h 是 Ntddk.h 的子集)。
使用裝置物件簡介和 下列說明的方法建立裝置物件 。
在撰寫卸除例程中,具有如撰寫卸除例程中所 建議撰寫的 Unload 例程。
使用函式角色類型宣告中所述 ,使用函式角色類型宣告來宣告每個分派函式。 如需 WDM 角色類型和 _Dispatch_type_(類型) 註釋的相關信息,請參閱 使用 WDM 驅動程式的函式角色類型來宣告函式。
若要讓 SDV 驗證 KMDF 驅動程式,驅動程式必須:
包含 Wdf.h 和 Ntddk.h。
建立使用架構開發驅動程式中所述的 KMDF 物件。
使用 SDV-KMDF 回呼函式角色類型標註每個回呼函式,如使用函式角色類型宣告中所述。 如需支援的角色類型清單,請參閱 靜態驅動程序驗證器 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 結果的詳細資訊,請參閱 解譯靜態驅動程式驗證器結果。