支持的驱动程序
若要验证驱动程序,SDV 必须能够解释驱动程序代码,特别是驱动程序的入口点,以及支持所需驱动程序功能的函数和例程中的代码。
以下部分介绍驱动程序的基本要求,以及 SDV 对它所验证的驱动程序所期望的特定语法。 SDV 不会验证驱动程序是否符合这些要求,但如果驱动程序不符合,则 SDV 可能无法运行,在极少数情况下,它会报告误报或误报结果。
基本驱动程序特征
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 例程,该例程按照 编写 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 结果的详细信息,请参阅 解释静态驱动程序验证程序结果。
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈