概述

Windows 驱动开发 INF 文件解析

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

相关参考

[toc]

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

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


一、标准节(Standard Sections)

1. [Version]

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

[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]

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

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

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

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

[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](自定义安装节)

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

[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]

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

[MyDriver_CopyFiles]
mydriver.sys
myhelper.dll

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


6. [MyDriver_Service_Inst]

定义驱动服务的属性。

[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 自动处理)。

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

8. [DestinationDirs]

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

[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] 中的字段需与语言资源对应:

[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] 节中,但也可用宏定义(不推荐,降低可读性)。

示例:

[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]

注释

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

行续接

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

    AddReg = MyReg_Add \
             MyReg_Add2

四、完整简化示例

[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 字段说明,也可以进一步提问!