若要讓 SDV 驗證驅動程式,它必須能夠解譯驅動程式程式代碼,特別是驅動程式的進入點,以及支援必要驅動程式功能的函式和常式中的程式代碼。
下列各節描述驅動程式的基本需求,以及 SDV 檢驗時所期望的驅動程式的特定語法。 SDV 不會驗證驅動程式是否符合這些需求,但如果驅動程式不符合規範,SDV 可能會無法執行,而且在極少數情況下,它會因為誤解而報告誤判或誤判結果。
這很重要
不再支援 SDV,且 Windows 24H2 WDK 或 EWDK 版本無法使用 SDV。 它不適用於比組建 26017 還新的 WDK,而且不包含在 Windows 24H2 RTM WDK 中。
從 下載 Windows 驅動程式套件 (WDK),並下載含有 Visual Studio 組建工具 17.1.5 的 Windows 11 版本 22H2 EWDK(2023 年 10 月 24 日發行),即可繼續使用 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 可以驗證從 Kernel-Mode 驅動程式架構產生的驅動程式,前提是您使用 SDV-KMDF 回呼函式角色類型來宣告每個回呼函式。 如需詳細資訊,請參閱 使用 KMDF 驅動程式的函式角色類型來宣告函式。
SDV 可以驗證 NDIS 驅動程式,前提是您使用 SDV-NDIS 回呼函式類型,以函式宣告批註每個回呼函式。 如需詳細資訊,請參閱 使用 NDIS 驅動程式的函式角色類型來宣告函式。
SDV 可以驗證 Storport 驅動程式,前提是您使用函式宣告來批註每個回呼函式。 您可以使用 SDV-Storport 回呼函式類型來執行此動作。 如需詳細資訊,請參閱 使用 Storport 驅動程式的函式角色類型來宣告函式。
基本驅動程序要求
若要讓 SDV 驗證 WDM 驅動程式,驅動程式必須:
包括 Wdm.h 或 Ntddk.h (Wdm.h 是 Ntddk.h 的子集)。
使用 裝置物件簡介 和下列內容中所述的方法來建立裝置物件。
具有一個依據撰寫卸載常式中的建議撰寫的卸載常式。
使用函式角色類型宣告來宣告每個分派函式,如 使用函式角色類型宣告中所述。 如需了解 WDM 角色類型和_Dispatch_type_(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 驗證引擎 無法正常運作。
具體而言,如果出現以下情況,SDV 不會正確解譯程式碼:
程式碼包含以__init開頭並後面接著一或多個整數的函數名稱,例如 __init123。
程式碼包含以 sdv_ 開頭的函式名稱,例如 sdv_Func,或包含字串 _sdv_,例如 Func_sdv_ 或 Func_sdv_foo。
程式庫使用檔案
.def來重新命名匯出的函數,外部名稱與程式庫中另一個靜態函數的名稱相同。
如果驅動程式代碼或程式庫程式代碼包含這些元素,SDV 會嘗試驗證驅動程式或處理程式庫,但結果是 不支援的功能 (NSF) 。 如需 SDV 結果的詳細資訊,請參閱 解譯靜態驅動程式驗證器結果。