将平台扩展与操作系统版本相结合

INF 文件的 INF 制造商部分中 ,可以提供特定于各种 Windows 操作系统版本的 INF 模型 部分 。 这些特定于版本的 模型 部分使用 TargetOSVersion 修饰进行标识。

在同一 INF 文件中,可以为不同版本的操作系统指定不同的 INF 模型 部分 。 指定的版本指示将使用 INF 模型 部分的目标操作系统版本。 如果未指定任何版本,则 Windows 对所有操作系统的所有版本使用没有 TargetOSVersion 修饰的“模型”部分。

TargetOSVersion 修饰格式

以下示例显示了 Windows XP 通过 Windows 10 版本 1511 的 TargetOSVersion 修饰的正确格式:

nt[Architecture][.[OSMajorVersion][.[OSMinorVersion][.[ProductType][.[SuiteMask]]]]]

从 Windows 10 版本 1607 (内部版本 14310 及更高版本) 开始,TargetOSVersion 修饰的正确格式包括 BuildNumber

nt[Architecture][.[OSMajorVersion][.[OSMinorVersion][.[ProductType][.[SuiteMask]][.[BuildNumber]]]]]

每个字段的定义如下:

Nt
指定目标操作系统是基于 NT 的。 Windows 2000 及更高版本的 Windows 都是基于 NT 的。

体系结构
标识硬件平台。 有关 模型 部分的体系结构平台修饰的详细信息,请参阅 为多个平台和操作系统创建 INF 文件

OSMajorVersion
一个数字,表示操作系统的主版本号。 有关列出 Windows 操作系统主要版本的表,请参阅 INF 制造商中的 OSMajorVersion 部分。

OSMinorVersion
表示操作系统的次要版本号的数字。 有关列出 Windows 操作系统次要版本的表,请参阅 INF 制造商中的 OSMinorVersion 部分。

ProductType
一个数字,表示 Winnt.h 中定义的 VER_NT_xxxx 标志之一,如下所示:

0x0000001 (VER_NT_WORKSTATION)

0x0000002 (VER_NT_DOMAIN_CONTROLLER)

0x0000003 (VER_NT_SERVER)

如果指定了产品类型,则仅当操作系统与指定的产品类型匹配时,才会使用 INF 文件。 如果 INF 文件支持单个操作系统版本的多个产品类型,则需要多个 TargetOSVersion 条目。

SuiteMask
一个数字,表示 Winnt.h 中定义的一个或多个 VER_SUITE_xxxx 标志的组合。 这些标志包括以下内容:

0x00000001 (VER_SUITE_SMALLBUSINESS)

0x00000002 (VER_SUITE_ENTERPRISE)

0x00000004 (VER_SUITE_BACKOFFICE)

0x00000008 (VER_SUITE_COMMUNICATIONS)

0x00000010 (VER_SUITE_TERMINAL)

0x00000020 (VER_SUITE_SMALLBUSINESS_RESTRICTED)

0x00000040 (VER_SUITE_EMBEDDEDNT)

0x00000080 (VER_SUITE_DATACENTER)

0x00000100 (VER_SUITE_SINGLEUSERTS)

0x00000200 (VER_SUITE_PERSONAL)

0x00000400 (VER_SUITE_SERVERAPPLIANCE)

如果指定了一个或多个套件掩码值,则仅当操作系统匹配所有指定的产品套件时,才会使用 INF 文件。 如果 INF 文件支持单个操作系统版本的多个产品套件组合,则需要多个 TargetOSVersion 条目。

BuildNumber
指定从内部版本 14310 或更高版本开始应用该部分的Windows 10版本的最小 OS 内部版本号。 有关列出 Windows 操作系统内部版本号的表,请参阅 INF 制造商中的 BuildNumber 部分。

假定内部版本号仅相对于某些特定的 OS 主版本/次要版本,并且可能会针对将来的 OS 主版本/次要版本重置。

仅当 TargetOSVersion 的 OS 主/次要版本与当前操作系统 (或 AltPlatformInfo 完全匹配) 版本时,才会计算 TargetOSVersion 修饰指定的任何内部版本号。  如果当前 OS 版本大于 TargetOSVersion 修饰 (OSMajorVersion,OSMinorVersion) 指定的 OS 版本,则无论指定的内部版本号如何,该部分都被视为适用。 同样,如果当前 OS 版本小于 TargetOSVersion 修饰指定的 OS 版本,则部分不适用。

如果提供了内部版本号,则 TargetOSVersion 修饰的 OS 版本和 BuildNumber 必须都大于首次引入此修饰的Windows 10内部版本 14310 的 OS 版本和内部版本号。 例如,没有这些更改的早期版本的操作系统 (Windows 10内部版本 10240) 不会分析未知的修饰,因此尝试以这些早期版本为目标实际上会阻止操作系统认为修饰有效。

Windows 如何处理 TargetOSVersion 修饰

在设备上安装驱动程序包时,Windows 会按照以下步骤处理 INF 文件中的 INF 模型 部分

  1. 如果一个或多个 INF 模型 具有 TargetOS 修饰,Windows 会选择最接近主机操作系统属性的 INF 模型 部分。

    例如,如果 INF 模型 部分 的 TargetOS 修饰为 ntx86.5.1,则如果主机操作系统在基于 x86 的系统上运行 Windows XP 或更高版本的 Windows,则 Windows 会选择该部分。

    同样,如果 INF 模型部分的 TargetOS 修饰为 nt.6.0,如果主机操作系统是 Windows Vista 或更高版本的 Windows,在任何支持的硬件平台上,Windows 会选择该部分。

    如果 INF 模型部分的 TargetOS 修饰为 nt.10.0...14393,如果主机操作系统在任何支持的硬件平台上运行的Windows 10版本等于或大于 14393,则 Windows 会选择该部分。

  2. 如果 INF 模型 部分 都没有与主机操作系统匹配 的 TargetOS 修饰,Windows 将选择具有匹配的平台扩展或没有平台扩展的 模型 部分。

    例如,如果 INF 模型 部分的平台扩展为 ntx86,则如果主机操作系统是基于 x86 的系统上的 Microsoft Windows 2000 或更高版本的 Windows,则 Windows 会选择该部分。

  3. 如果 Windows 找不到匹配的 INF 模型 部分,则不会在设备上安装该驱动程序包。

如何解析 TargetOsVersion 修饰

确定适用的 INF 模型 部分时,评估在 INF 制造商部分中按行执行,其中,对于给定的 OS 版本,每行最多可以有一个适用的部分。

下面的 INF 摘录显示了一个示例,其中 [ExampleModelsSection_1.NTamd64.10.0...将在等于或大于 17134 的 Windows 内部版本号上选择 17134 ],同时 选择 [ExampleModelsSection_1.NTamd64.10.0...17134] 和 [ExampleModelsSection_2.NTamd64.10.0...将在等于或大于 22000 的 Windows 内部版本号上选择 22000。

[Manufacturer]
%ManufacturerName% = ExampleModelsSection_1,NTamd64.10.0...17134
%ManufacturerName% = ExampleModelsSection_2,NTamd64.10.0...22000

下面的 INF 摘录显示了一个示例,其中 [ExampleModelsSection_1.NTamd64.10.0...将在 Windows 内部版本号等于或大于 17134 和 [ExampleModelsSection_1.NTamd64.10.0...将在等于或大于 22000 的 Windows 内部版本号上选择 22000。

[Manufacturer]
%ManufacturerName% = ExampleModelsSection_1,NTamd64.10.0...17134,NTamd64.10.0...22000

具有 TargetOSVersion 修饰的示例 INF 模型部分

适用于特定 OS 版本及更高版本

此 INF 摘录演示了如何指定驱动程序包仅适用于特定 OS 版本及更高版本。

[Manufacturer]
%ManufacturerName% = ExampleModelsSection,NTamd64.10.0...17134

; This driver package applies to Windows 10 1803 (build 17134) and later only

[ExampleModelsSection.NTamd64.10.0...17134]
%DeviceDesc%=ExampleInstallSection,ExampleHardwareId

[ExampleInstallSection]
...

仅适用于单个 OS 版本

此 INF 摘录演示了如何指定驱动程序包仅适用于单个 OS 版本。

[Manufacturer]
%ManufacturerName% = ExampleModelsSection,NTamd64.10.0...17134,NTamd64.10.0...17763

; This driver package applies to Windows 10 1803 (build 17134)

[ExampleModelsSection.NTamd64.10.0...17134]
%DeviceDesc%=ExampleInstallSection,ExampleHardwareId

; However, this driver package does nothing on Windows 10 1809 (build 17763) and later
[ExampleModelsSection.NTamd64.10.0...17763]
; intentionally left empty

[ExampleInstallSection]
...

适用于具有不同设置的多个 OS 版本

此 INF 摘录演示了如何指定驱动程序包应针对不同操作系统版本执行不同的安装说明。

[Manufacturer]
%ManufacturerName% = ExampleModelsSection,NTamd64.6.1,NTamd64.10.0

; This driver package applies to Windows 7 and later

[ExampleModelsSection.NTamd64.6.1]
%DeviceDesc%=ExampleInstallSection_Win7,ExampleHardwareId

; However, this driver package has different installation instructions on Windows 10 and later

[ExampleModelsSection.NTamd64.10.0]
%DeviceDesc%=ExampleInstallSection_Win10,ExampleHardwareId

[ExampleInstallSection_Win7]
...

[ExampleInstallSection_Win10]
...