支持的驱动程序
若要验证驱动程序,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)的泛型属性(如 NullCheck)进行有限验证。
SDV 可以使用 WDM 函数角色类型验证声明其驱动程序回调函数的 WDM 驱动程序。 有关如何声明函数的信息,请参阅 使用 WDM 驱动程序的函数角色类型声明函数。
SDV 可以使用 SDV-KMDF 回调函数角色类型来验证从 内核模式驱动程序框架生成的驱动程序,前提是你使用 SDV-KMDF 回调函数类型声明每个回调函数。 有关详细信息,请参阅 使用 KMDF 驱动程序的函数角色类型声明函数。
SDV 可以使用 SDV-NDIS 回调函数类型来验证 NDIS 驱动程序,前提是使用 SDV-NDIS 回调函数类型对每个回调函数进行批注。 有关详细信息,请参阅 使用 NDIS 驱动程序的函数角色类型声明函数。
SDV 可以验证 Storport 驱动程序,前提是使用函数声明对每个回调函数进行批注。 为此,请使用 SDV-Storport 回调函数类型。 有关详细信息,请参阅 使用 Storport 驱动程序的函数角色类型声明函数。
基本驱动程序要求
若要使 SDV 验证 WDM 驱动程序,驱动程序必须:
包括 Wdm.h 或 Ntddk.h(Wdm.h 是 Ntddk.h 的子集)。
使用设备对象简介和 以下内容中所述的方法创建设备对象 。
具有一个 Unload 例程,该例程在写入 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 验证引擎 无法正常运行。
具体而言,如果存在,SDV 无法正确解释代码:
该代码包括以__init开头的函数名称,后跟一个或多个整数,例如__init123。
该代码包括以sdv_开头的函数名称,例如sdv_Func,或包括字符串 _sdv_,例如Func_sdv_或Func_sdv_foo。
库使用
.def
文件重命名导出的函数,外部名称与库中另一个静态函数的名称相同。
如果驱动程序代码或库代码包含这些元素,SDV 将尝试验证驱动程序或处理库,但结果不受支持的功能(NSF)。 有关 SDV 结果的详细信息,请参阅 解释静态驱动程序验证程序结果。