针对多个 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_VERSION0x0A000005 (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 属性的详细信息,请参阅 驱动程序项目的驱动程序模型设置属性