Windows 驱动程序工具包(WDK)提供驱动程序验证工具,可帮助你检测和更正开发过程中的错误。 这些工具包括静态分析工具(如 CodeQL)和驱动程序验证程序等动态工具,可在部署前查找关键 bug。 在开发初期使用这些验证工具可以节省时间,并防止生产中出现严重的驱动程序问题。
WDK 文档介绍了这些验证工具,并建议使用它们,因为每个工具都以不同的方式检测不同类型的驱动程序错误。 这些工具比手动检查更高效。 他们可以检测标准驱动程序测试中通常找不到的错误,并体现了经验丰富的驱动程序开发人员和 Windows 驱动程序接口设计器的专业知识。
为了获得最佳结果,请使用可在驱动程序上运行的所有工具。 如果遗漏这些工具中的任何一个,您可能会错过驱动程序中的严重错误。
静态和动态验证工具
有两种基本类型的验证工具:
静态验证工具 在不运行驱动程序的情况下检查驱动程序代码。 由于这些工具不依赖于测试执行代码,因此它们可能非常彻底。 从理论上讲,静态验证工具可以检查所有驱动程序代码,包括在实践中很少执行的代码路径。 但是,由于驱动程序实际上未运行,这些工具可能会生成假阳性结果。 也就是说,它们可能会报告实际未发生的代码路径中的错误。
CodeQL 是驱动程序的主要静态分析工具。 CodeQL 提供了一种功能强大的查询语言,可将代码视为要查询的数据库,以便为特定行为和模式编写查询。 Windows 硬件兼容性计划要求在我们的客户端和服务器操作系统上使用 CodeQL 进行静态工具徽标 (STL) 测试。 有关详细信息,请参阅 CodeQL 和静态工具徽标测试。
动态验证工具 在驱动程序运行时检查驱动程序代码,通常通过截获对常用驱动程序支持的例程的调用,并将调用替换为同一例程自己的错误检查版本。 由于驱动程序实际上是在动态工具执行验证时运行的,因此很少出现误报结果。 但是,由于动态工具仅检测监视驱动程序时发生的操作,如果驱动程序测试覆盖率不足,这些工具可能会遗漏某些驱动程序缺陷。 同时,通过使用运行时可用的信息(例如,从源代码中静态提取更难的信息)动态验证工具可以检测某些驱动程序错误类,而使用静态分析工具更难检测到这些错误。
使用静态和动态验证工具的组合。 静态工具允许你检查在实践中难以练习的代码路径,而动态工具则发现驱动程序中发生的严重错误。
验证工具概述
重要
不再支持静态驱动程序验证程序(SDV)工具。 它在版本 26017 之后的 WDK 中不可用,包括 Windows 24H2 RTM WDK。 不建议使用 SDV 进行分析。
WDK 介绍了以下验证工具,并建议驱动程序开发人员和测试人员使用它们。 它们按通常使用的顺序列出。
代码编译后
- CodeQL 是一个功能强大的语义代码分析引擎。 广泛的高价值安全查询套件与可靠的平台相结合,使其成为保护驱动程序代码的宝贵工具。 有关详细信息,请参阅 CodeQL 和静态工具徽标测试。
驱动程序运行时
在生成驱动程序并运行时立即使用以下动态验证工具,而不会出现明显的错误。
驱动程序验证程序 是专为 Windows 驱动程序编写的动态验证工具。 它包含多个可以同时在多个驱动程序上运行的测试。 驱动程序验证器在发现驱动程序中的严重 bug 时非常有效,有经验的驱动程序开发人员和测试人员会将其配置为在开发或测试环境中他们的驱动程序运行时启动。 驱动程序验证程序包含在 Windows 中。 为驱动程序启用驱动程序验证程序时,还必须对驱动程序运行多个测试。 驱动程序验证程序可以仅使用静态验证工具检测难以检测的某些驱动程序 bug。 这些类型的 bug 的示例包括:
内核池缓冲区溢出。 当验证的驱动程序分配池内存缓冲区时,驱动程序验证程序会使用不可访问的内存页来保护它们。 如果驱动程序尝试使用缓冲区末尾的内存,驱动程序验证程序将启动 bug 检查。
释放内存后使用内存。 特殊池内存块使用独立的内存页,并且不与其他分配共享内存页。 当驱动程序释放池内存块时,相应的内存页将变为不可访问。 如果驱动程序在释放内存后尝试使用该内存,驱动程序会立即崩溃。
在提升的 IRQL 运行时使用可分页内存。 当验证的驱动程序在DISPATCH_LEVEL或更高时引发 IRQL 时,驱动程序验证程序会从系统工作集中剪裁所有可分页内存,从而模拟内存压力下的系统。 如果驱动程序尝试使用这些可分页的虚拟地址之一,驱动程序会崩溃。
资源模拟不足。 若要在系统资源不足的情况下模拟系统,驱动程序验证程序可能会使驱动程序调用的各种操作系统内核 API 失败。
内存泄漏。 驱动程序验证程序跟踪驱动程序进行的内存分配,并确保驱动程序在卸载内存之前释放内存。
需要太多时间才能完成或取消的 I/O 操作。 驱动程序验证器可以测试驱动程序响应
STATUS_PENDINGIoCallDriver返回值的逻辑。DDI 符合性检查。 (从 Windows 8 开始可用)驱动程序验证程序应用一组设备驱动程序接口(DDI)规则,这些规则检查驱动程序与操作系统的内核接口之间的正确交互。
内核地址清理器(KASAN)是 Windows 驱动程序支持的 bug 检测技术,可用于检测多个非法内存访问类,例如缓冲区溢出和使用无后事件。
应用程序验证程序 是一种动态验证工具,适用于使用 C 或C++编写的用户模式应用程序和驱动程序。 它不验证托管代码。