【驱动学习】2.1-INF文件解析

文章目录
概述

Windows 驱动开发 INF 文件解析

本文部分内容由 AI 生成,经人工修订。
相关参考

[toc]

INF(Installation Information)文件是 Windows 驱动程序安装过程中非常关键的文本配置文件,它采用特定的节(Section)和键值对格式,用于指导操作系统如何安装、配置和加载驱动程序。

以下是 INF 文件中 常见字段/节(Sections)及其说明,适用于大多数内核模式驱动(KMDF/UMDF/WDM):


一、标准节(Standard Sections)

1. [Version]

必需。定义 INF 文件版本、目标操作系统等。

1
2
3
4
5
6
7
[Version]
Signature="$WINDOWS NT$"
Class=Net ; 设备类(如 Net、Media、System 等)
ClassGuid={4d36e972-e325-11ce-bfc1-08002be10318}
Provider=%ManufacturerName%
DriverVer=12/14/2025,1.0.0.1
CatalogFile=mydriver.cat
  • Signature:必须为 "$WINDOWS NT$"(现代 Windows 驱动)。

  • Class / ClassGuid:设备安装类,决定设备在设备管理器中的分组。

    可以参考这篇文章中的类定义填写合适的类和GUID, 保留给系统使用的系统定义的设备安装程序类 - Windows drivers | Microsoft Learn,更完整的可以参考这篇文章:为供应商提供的系统定义的设备安装程序类 - Windows drivers | Microsoft Learn

    是否可以自定义 Class 和 ClassName

    因为 INF 只是告诉 Windows 如何在设备安装时注册和显示该设备的“安装类(setup class)”。Class 是类的名称,ClassGuid 是该类在注册表/设备管理器中用来区分不同类的唯一标识符。Windows 允许驱动包定义自己的安装类,所以你可以填写自定义的值,INF 在安装时会把相应的注册表项写入系统(见你的 ClassInstall32 / SampleClassReg 段),从而在设备管理器中显示自定义的类名、图标等。
    需要注意的要点:
    • 自定义 ClassGuid 必须是唯一的 GUID,否则会与已有安装类混淆或覆盖别人的类。
    • 如果不需要新的类语义,优先使用已有的系统类(以便与系统工具/驱动整理一致)。
    • 如果定义新类,要在 INF 中提供注册表信息(如你的 HKR,0,%ClassName%)以设置显示名/图标,并在发布/签名驱动包时保持 ClassGuid 一致。
    • 生成 GUID 可用 uuidgen / Visual Studio 的 Create GUID 等工具。

  • Provider:驱动提供商名称(通常用字符串宏)。

  • DriverVer:驱动版本和日期(格式:MM/DD/YYYY, major. minor. build. qfe)。

  • CatalogFile:数字签名目录文件(.cat),用于 WHQL 签名验证。


2. [Manufacturer]

列出支持的硬件制造商及其对应的设备安装节。

1
2
[Manufacturer]
%ManufacturerName%=MyDeviceModels, NTamd64
  • NTamd64 表示仅在 64 位 Windows 上使用此节(平台限定后缀)。
  • 支持多个平台:NTx86, NTarm64, NTia64 等。

3. [MyDeviceModels](自定义节名)

定义具体设备的 Hardware ID 与安装节的映射。

1
2
3
[MyDeviceModels.NTamd64]
%DeviceDesc%=MyDevice_Install, USB\VID_1234&PID_5678
%DeviceDesc%=MyDevice_Install, PCI\VEN_8086&DEV_1234
  • 左侧是安装节名(如 MyDevice_Install)。
  • 右侧是设备的 Hardware ID(由 PnP 管理器匹配)。
  • %DeviceDesc% 是字符串表中的描述(见 [Strings] 节)。

4. [MyDevice_Install](自定义安装节)

指定驱动文件、注册表设置、服务安装等。

1
2
3
4
5
[MyDevice_Install.NT]
CopyFiles=MyDriver_CopyFiles

[MyDevice_Install.NT.Services]
AddService=MyDriver,,MyDriver_Service_Inst
  • .NT 后缀表示适用于所有 NT 内核系统(Windows 2000 及以后)。
  • CopyFiles:指定要复制的文件列表(引用另一个节)。
  • AddService:添加 Windows 服务(驱动本质是内核服务)。

5. [MyDriver_CopyFiles]

列出需要复制到系统目录的驱动文件。

1
2
3
[MyDriver_CopyFiles]
mydriver.sys
myhelper.dll

默认复制到 %SystemRoot%\System32\drivers\(对于 .sys 文件)。


6. [MyDriver_Service_Inst]

定义驱动服务的属性。

1
2
3
4
5
6
7
[MyDriver_Service_Inst]
DisplayName = %ServiceName%
ServiceType = 1 ; FILE_SYSTEM_DRIVER (2) 或 KERNEL_DRIVER (1)
StartType = 3 ; DEMAND_START (3), AUTO_START (2), DISABLED (4)
ErrorControl = 1 ; NORMAL (1)
LoadOrderGroup =
ServiceBinary = %12%\mydriver.sys ; %12% = System32\drivers
  • ServiceType
    • 1 = SERVICE_KERNEL_DRIVER
    • 2 = SERVICE_FILE_SYSTEM_DRIVER
  • StartType
    • 0 = BOOT_START(启动早期加载)
    • 1 = SYSTEM_START
    • 2 = AUTO_START(系统启动时加载)
    • 3 = DEMAND_START(按需加载,如设备插入)
    • 4 = DISABLED

二、可选但常用节

7. [SourceDisksNames][SourceDisksFiles]

传统上用于指定源文件位置(现代驱动常省略,因 WDK 自动处理)。

1
2
3
4
5
[SourceDisksNames]
1 = %DiskName%

[SourceDisksFiles]
mydriver.sys = 1
  • 在 Plug and Play 驱动中通常不需要,除非涉及非标准安装。

8. [DestinationDirs]

指定 CopyFiles 的目标目录(可选,默认为 drivers 目录)。

1
2
[DestinationDirs]
MyDriver_CopyFiles = 12 ; 12 = \System32\drivers

常用目录编号(DIRIDs):

  • 10 = %SystemRoot%(如 C:\Windows
  • 11 = %SystemRoot%\System32
  • 12 = %SystemRoot%\System32\drivers
  • 13 = %SystemRoot%\Inf
  • 16422 = %ProgramFiles%

9. [Strings]

[Strings] 段的作用

  • 定义所有 %MacroName% 的实际文本值。
  • 支持本地化:不同语言版本的 INF 可以使用不同的 [Strings] 内容(通过 .inf + 语言代码,如 mydriver.inf + mydriver.inf.loc,或使用 MUI)。
  • 避免硬编码字符串,便于维护和国际化。

🔍 常见 [Strings] 字段及其用途说明

宏(%xxx%) 典型值示例 用途说明
ManufacturerNameMFG "Contoso Ltd." 驱动提供商名称,显示在设备管理器“制造商”列。
DeviceDesc "Contoso USB Adapter" 设备描述,显示在设备管理器中设备名称。
ServiceNameSvcDesc "ContosoNet" 驱动服务的显示名称(非内部服务名),用于服务控制面板或日志。
DiskName "Contoso Driver Disk" 安装源盘卷标(传统用途,现代驱动常省略)。
ClassName "Network adapters" 设备类的人可读名称(若 Class 未内置)。
ProviderString "© 2025 Contoso Inc." 可选版权/提供商标识(有时用于 UI 显示)。
CatalogFile(不推荐在此定义) ❌ 通常不应用宏定义 .cat 文件名,应直接写在 [Version] 中。 因为签名工具依赖固定文件名。
DriverPackageDisplayName "Contoso High-Speed USB Driver" 在“添加硬件向导”或更新驱动时显示的包名称(可选)。
InstallKey "MyDriver_Install_Key" 用于注册表路径或自定义安装逻辑中的键名(高级用法)。

🌐 多语言支持相关字段(MUI / Localization)

如果你要支持多语言,INF 可能配合 .mui.inf_loc 文件使用,此时 [Strings] 中的字段需与语言资源对应:

1
2
3
4
5
6
7
8
[Strings]
; en-US
DeviceDesc="My Device"
ServiceName="MyDriver Service"

; zh-CN (在 mydriver.inf.zh-cn 中)
DeviceDesc="我的设备"
ServiceName="我的驱动程序服务"

⚠️ 注意:Windows 要求本地化 INF 必须通过 MUI(Multilingual User Interface)机制单独的语言特定 INF 文件 实现,不能在一个 INF 中混合多语言。


🛠️ 高级/特殊用途字段(按需使用)

说明
CoInstaller_Name 如果使用了 Co-installer(辅助安装程序 DLL),可在此定义其显示名。
UpperFilterName, LowerFilterName 用于 Filter 驱动的注册表项名称(如 UpperFilters=MyUpperFlt)。
EventLogName 自定义事件日志源名称(较少用,通常由驱动自身注册)。
HardwareID, CompatibleIDs 虽然通常直接写在 [Models] 节中,但也可用宏定义(不推荐,降低可读性)。

示例:

1
2
3
4
5
6
7
8
[Strings]
UpperFilterName = "MyUpperFilter"
...
[MyDevice_Install.NT.HW]
AddReg = UpperFilter_AddReg

[UpperFilter_AddReg]
HKR, , "UpperFilters", 0x00010008, %UpperFilterName%

❗ 最佳实践建议

  1. 所有用户可见文本都应放入 [Strings]
    包括设备名、服务名、厂商名等,便于本地化。

  2. 避免在 [Strings] 中定义路径或文件名
    %DriverFile%=mydriver.sys —— 这样做无意义且易出错。

  3. 不要用 [Strings] 定义版本号或日期
    版本应通过 DriverVer= 和构建系统(如 .inx + stampinf)管理。

  4. 命名清晰一致
    如统一使用 MFG, DEVDESC, SVCNAME 等缩写,提高可读性。


三、其他重要说明

平台限定后缀(Platform Extensions)

  • .NT:通用 NT 平台
  • .NTx86:32 位 x 86
  • .NTamd64:64 位 AMD 64/Intel 64
  • .NTarm64:ARM 64
  • 示例:[MyDevice_Install.NTamd64.Services]

注释

  • 以分号 ; 开头的行是注释。

行续接

  • 用反斜杠 \ 实现长行续接:

    1
    2
    AddReg = MyReg_Add \
    MyReg_Add2

四、完整简化示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[Version]
Signature="$WINDOWS NT$"
Class=Sample
ClassGuid={78945612-3456-7890-abcd-1234567890ab}
Provider=%MFG%
DriverVer=12/14/2025,1.0.0.0

[Manufacturer]
%MFG%=MyModels, NTamd64

[MyModels.NTamd64]
%DEVDESC%=MyDrv_Install, Root\MyVirtualDevice

[MyDrv_Install.NT]
CopyFiles=MyDrv_Files

[MyDrv_Install.NT.Services]
AddService=MyDrv,,MyDrv_Service_Inst

[MyDrv_Files]
mydrv.sys

[MyDrv_Service_Inst]
DisplayName=%SVCNAME%
ServiceType=1
StartType=3
ErrorControl=1
ServiceBinary=%12%\mydrv.sys

[DestinationDirs]
MyDrv_Files=12

[Strings]
MFG="My Company"
DEVDESC="My Virtual Driver"
SVCNAME="MyDrv"

如需针对特定设备类型(如 USB、PCI、Filter Driver、Co-installer 等)的 INF 字段说明,也可以进一步提问!