针对多个 Windows 版本生成 WDF 驱动程序
WDF 始终允许你生成一次驱动程序并在多个版本的 Windows 上使用生成的二进制文件,但在Windows 10版本 1803 (Redstone 4) 之前,这仅限于“在较旧版本上生成,在较新版本上运行”。从 Windows 10 版本 1803 开始,WDF 添加了“在较新版本上生成,在较旧版本上运行”,以及条件执行的额外优势。 总结:
- 现有:使用较旧版本的框架生成的二进制文件在包含较新版本的框架的 Windows 版本上运行,前提是主要版本匹配。 例如,使用 KMDF 1.9 (Windows 7 生成的驱动程序) 在 Windows 8 系统 (KMDF 1.11) 上运行。 在此示例中,驱动程序仅限于 KMDF 1.9 的功能。
- 已添加:从 Windows 10 版本 1803 上的 KMDF 版本 1.25 和 UMDF 版本 2.25 开始,可以使用较新的框架版本生成驱动程序,生成的驱动程序二进制文件在早期版本的 Windows (上运行,最低Windows 10版本 1803) 。 此外,驱动程序可以有条件地使用仅在较新的框架版本中可用的功能。
这意味着,你的驱动程序不仅会像往常一样在 Windows 的未来版本上运行,而且还会在以前的版本上运行,Windows 10版本 1803。
执行此操作有两个步骤:在 Visual Studio 中指定生成设置,在调用 API 或访问可能存在或不存在的结构或字段之前执行运行时检查。
注意:此功能是可选的,驱动程序应仅允许它生成使用最新 WDF 功能的驱动程序,同时在没有最新 WDF 功能的早期版本的 Windows 上保持可加载性。
如果未设置 次要版本 (目标版本) 或 版本次要版本 (最低要求) ,版本控制将保持与之前相同。
指定所需的最小值
Visual Studio 中的新配置设置包括:
- KMDF 版本次要 (最低要求)
- UMDF 版本次要 (最低要求)
根据此更改,更新了两个现有设置的名称:
- KMDF 版本次要 ->KMDF 版本次要 (目标版本)
- UMDF 版本次要版本 ->UMDF 版本次要 (目标版本)
如果未设置 最低要求,Visual Studio 将针对 目标版本 和更新版本进行生成,并且不提供下层支持。 这与旧 版本次要 属性的行为匹配。
如果确实设置了 “最低要求”,则以下要求适用:
- 25 <= 最低要求 <= 目标版本
- 在 “配置属性->驱动程序设置->常规”中,将 设置为
_NT_TARGET_VERSION
0x0A000005
(RS4) 或更高版本。
检查功能是否存在
在每次使用 API、结构或成员之前,必须调用 WdfFuncEnum.h 中定义的以下宏之一:
BOOLEAN
WDF_IS_FUNCTION_AVAILABLE (
FunctionName
);
BOOLEAN
WDF_IS_STRUCTURE_AVAILABLE (
StructName
);
BOOLEAN
WDF_IS_FIELD_AVAILABLE (
StructName,
FieldName
);
请看下面的示例。 发布 WDF v29 后,会添加一个新的 API: WdfSomeNewFeature。 如果将“目标版本”设置为 29,将“最低要求”设置为 25,则只要主版本不更改) ,调用版本 25 API(如之前一样),并在每次调用任何 v29 API 之前进行以下检查,生成的驱动程序将加载到 25 到 29 (及更高版本的任何框架版本:
if (WDF_IS_FUNCTION_AVAILABLE(WdfSomeNewFeature)) {
WdfSomeNewFeature();
}
如果不执行条件检查,可能会看到以下内容:
- 如果 API 返回 NTSTATUS,则调用将返回失败代码。
- 如果 API 返回 NTSTATUS 以外的任何内容:
- KMDF:计算机 bug 检查。
- UMDF:WudfHost 进程崩溃,出现 DriverStop 错误。
- 如果启用了驱动程序验证程序,驱动程序也会崩溃。 这有助于识别测试环境中的问题。
- 访问结构或字段) 时,无提示内存损坏 (。
驱动程序崩溃包含失败的驱动程序名称、框架名称和失败的 API 索引。 可以通过在 WdfFuncEnum.h 中查找 WDFFUNCENUM 的值来检索 API 的名称。
有关 WDF 的 Visual Studio 属性的详细信息,请参阅 驱动程序项目的驱动程序模型设置属性。