了解静态驱动程序验证程序

若要编写符合 Windows 驱动程序模型(WDM)或内核模式驱动程序框架(KMDF)、NDIS 或 Storport 的可靠驱动程序,必须具备专业知识并了解驱动程序与 I/O 管理器的交互方式。 测试这些驱动程序同样棘手。

开发坚实的驱动程序可能具有挑战性,原因如下:

  • 驱动程序是异步的,即使在单处理器计算机上也是如此。

  • 司机大规模重新进入。

  • 驱动程序使用许多模糊的规则。

  • 驱动程序模型随时间推移而进化和年龄。

测试设备驱动程序的原因如下:

  • 观察。 在驱动程序和操作系统之间的交互中无法观察到错误。 驱动程序可能会违反隐式使用规则,导致崩溃或行为不当,但在开发和测试驱动程序时很难检测错误的根本原因。

  • 控制性。 正常情况下正常工作的驱动程序可能会发生细微错误,这些错误仅在异常情况下发生,例如,当堆栈中的驱动程序发生故障时,IRP 将失败。 这种情况很难练习,因此传统测试无法通过驱动程序代码充分检测错误路径。

SDV 可增强测试驱动程序时的观察和控制。 通过定义规则以正确使用 WDM、KMDF、NDIS 和 Storport 函数并监视驱动程序对这些规则的符合性,SDV 可提高观察错误的能力。 例如,WDM 规则 LowerDriverReturn 指定在某些情况下,驱动程序的调度例程应始终返回堆栈中较低驱动程序返回的值。

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 和静态工具徽标测试