Inf简介
Inf(Device information File)是Microsoft公司为硬件设备制造商发布其驱动程序推出的一种文件格式,Inf文件中包含硬件设备的信息或脚本以控制硬件操作。在Inf文件中指明了硬件驱动该如何安装到系统中,源文件在哪里、安装到哪一个文件夹中、怎样在注册表中加入自身相关信息等。
在C:/Windows/INF文件夹中存放有大量的inf文件。Inf文件其实是一种纯文本文件,可以用任意一款文本编辑器打开进行编辑。
INF的功能
1. 复制文件、删除文件、或重新命名文件。
2. 新增或删除注册表(Registry)中的项目。
3. 修改重要的系统设置文件(如Autoexec.bat、Config.sys、.INI等)
Inf文件的编写规则:
1. 每个inf文件有许多节(section)组成,节名用方括号括起来。这些节名有些是系统定义好的,有一些是用户自定义的。每一个节名最长为255个字符,节与节之间没有先后顺序的区别,另外,同一个Inf文件中如果出现两个同样的节名,则系统会自动将这两个节名下面的条目合并到一起。
2. 在节与节之间的内容叫条目,每一个节又是由许多的条目组成,每个条目都是由形如”signature=”$WINDOWS NT$””的形式。如果每一个条目的等号后面有多个值,则每一个值之间用“,”号分隔开。
3. Inf文件对大小写不敏感。
4. “;”后面的内容为注释。
5. 如果一个条目的内容过多,在一行无法书写完全,则用“\”将一行内容书写多行。
关键section有:
[Version]版本描述信息,主要用于版本控制。
[Strings]字符串信息,用于常量定义。
[DestinationDirs]定义系统路径信息,指定CopyFiles、RenFiles或DelFiles入口的缺省操作目录。
[SourceDisksNames]指明源盘信息。
[SourceDisksFiles]指明源盘文件名。
[DefaultInstall]执行安装
INF文件路径:
Windows 98/Me:操作系统会把驱动程序中包含安装信息的I N F 文件直接拷贝到自身的inf文件夹中( 位于C :\Windows\INF),因此,只需知道驱动程序原来使用的INF 文件名就能在Windows 的INF 文件夹中找到对应文件。
Windows 2000/XP:Windows 2000/XP 却不是直接拷贝INF 文件,它们对没有经过微软认证的驱动程序的INF 文件都会改名存放,而且目前不少驱动程序都没经过认证,所以要找到它们还要费些功夫。如果你注意观察,会发现在INF 文件夹中有很多以OEM 开头的文件,这就是Windows2000/XP 的杰作。它们把没有经过认证的安装信息文件改名为OEMx.INF 和OEMx.PNF(PNF 为预编译信息文件)来存放。我们只需要根据上面关于INF文件的内容介绍便可以轻松找到相应文件。x是从数字0开始的正整数,例如:OEM0.inf和OEM0.PNF表示第一个没有认证的驱动程序安装信息文件,依此类推。
Inf文件详细说明:
一、Version样例:
[Version]
Signature="$ CHICAGO$"
Class=USB
ClassGUID={36FC9E60-C465-11CF-8056-444553540000}
provider=%MSFT%
DriverVer=03/21/2012,1.0.0.1
说明:
Signature:此条目主要描述此INF文件支持的设备类型和适用的操作系统,只能取值为$Windows NT$、$Chicago$ 或 $Windows95$。如果不是以上这些字符,则不被认可为inf文件。该条目如果是$Windows95$表示该INF文件只适用于Windows95/98的系统,如果是$Chicago$表示该INF文件适用于Windows95/98及Windows2000以上的操作系统,如果是$Windows NT$表示该INF文件只适用于Windows2000/XP/2003及以上的操作系统。
Class:此条目表明设备的类型,常见的有:Display(显示设备,如显卡)、Media(多媒体设备,如声卡)、Net(网络设备,如网卡)、Modem(调制解调器)、Printer(打印设备)、Image(图像捕获设备,如摄像头)、USB(通用串行总线控制器)。
ClassGUID:设备的GUID,如果设备是一个标准类别,使用标准类的名称和GUID,否则创建一个自定义的类别名称,并自定义它的GUID。
Provider:设备提供商,对应设备管理器中显示的设备提供商的信息。
DriverVer:对应设备管理器中显示的驱动程序版本的信息。
二、DestinationDirs样例:
[DestinationDirs]
DefaultDestDir=DRID[,subdir]
目录位置DRID说明:
DRID值 |
目录 |
10 |
C:\WINDOWS目录 |
11 |
C:\WINDOWS\System目录 |
12 |
C:\WINDOWS\System32\drivers目录 |
三、SourceDisksNames样例:
[SourceDisksNames]
disk-ordinal=”disk-description”,disk-label,disk-serial-number
罗列源文件所在盘符序列码、盘描述符、盘卷标号和盘序列号。
其中disk-ordinal是盘符序列码,标识一个源盘,具有唯一性,一般可设置为从1开始递增的整数,0不是一个有效的盘符序列码。当存在多个源盘时,盘符序列码之间不能重复。disk-description是盘描述符,用双引号括起来的字符串或字符串宏描述盘的内容或目的。安装引擎将该字符串显示在对话框内以提示用户。disk-label为源盘的卷标识。disk-serial-number被设置为0。
四、DefaultInstall节说明
此节指定包含的安装指令节,其中每一个条目将会成为一节。
[DefaultInstall]节中定义的操作:
LogConfig=log-config-section-name[,log-config-section-name]... ;Log日志文件配置
Copyfiles=file-list-section[,file-list-section]... ;复制文件
Renfiles=file-list-section[,file-list-section]... ; 文件改名
Delfiles=file-list-section[,file-list-section]... ; 删除文件
UpdateInis=update-ini-section[,update-ini-section]... ; 更新Inis
UpdateIniFields=update-inifields-section[,update-inifields-section]... ; 更新Ini字段
AddReg=add-registry-section[,add-registry-section]... ; 添加注册项
DelReg=del-registry-section[,del-registry-section]... ; 删除注册项
Ini2Reg=ini-to-registry-section[,ini-to-registry-section]... ; Ini文件转换为Reg文件
以上各条目并非全部必须。节名必须为可见字符。每一个条目包含一到多个节,第一个命名之后的所有命名必须以“,”引导。
以下介绍几个经常用到的操作:
1. Copyfiles
样例:
[DefaultInstall]
CopyFiles = copyfile_list_section[,copyfile_list_section]
[copyfile_list_section]
dest_filename,[source_filename],[,flags]
[dest_filename,[source_filename],[,flags]]
说明:
dest_filename
必选项。用于指定目标文件名的字符串。如果不提供 source_filename,则使用 dest_filename 作为源文件名。
source_filename
必选项。用于指定源文件名的字符串。如果 source_filename 与 dest_filename 相同,则可省略source_filename。
flags
可选项。用于指定在复制进程期间执行某个操作的数字值。下表列出了 Windows CE 支持的值。
标志 |
值 |
说明 |
COPYFLG_WARN_IF_SKIP |
0x00000001 |
用户尝试跳过发生错误后产生的文件时警告他。 |
COPYFLG_NOSKIP |
0x00000002 |
不允许用户跳过复制文件的操作。 |
COPYFLG_NO_OVERWRITE |
0x00000010 |
不改写目标目录中的现有文件。 |
COPYFLG_REPLACEONLY |
0x00000400 |
仅当源文件存在于目标目录中时才将它复制到目标目录中。 |
CE_COPYFLG_NO_DATE_DIALOG |
0x20000000 |
如果目标文件比源文件新,请勿复制此文件。 |
CE_COPYFLG_NODATECHECK |
0x40000000 |
改写目标文件时忽略数据。 |
CE_COPYFLG_SHARED |
0x80000000 |
考虑共享 DLL 时,创建一个引用。 |
2. AddReg
样例:
[DefaultInstall]
AddReg = add_registry_section[,add_registry_section]
[add_registry_section]
reg_root_string,subkey,[value_name],flags,value[,value]
[reg_root_string,subkey,[value_name],flags,value[,value]]
reg_root_string
必选项。用于指定注册表根位置的字符串。下表显示了注册表根及其缩写。
注册表根字符串 |
注册表根 |
HKCR |
HKEY_CLASSES_ROOT |
HKCU |
HKEY_CURRENT_USER |
HKLM |
HKEY_LOCAL_MACHINE |
HKR |
与注册表关键子有关,最适合AddReg命令出现的地方。比如,注册表中每个设备的“硬件”子键:…/Enum/枚举器ID/设备ID,与此相对的注册表中每个驱动程序指定的“软件”子键:…/CLASS/类GUID/设备ID等。 |
subkey
必选项。用于指定如 Strings 节中定义的字符串关键字或 reg_root_key 下要设置的注册表路径的值。此值可以指定以下项:
· 将添加到给定注册表路径末尾处的注册表的新子项。
· 将写入其他指定值的现有子项,这些值可能替换给定子项的现有值。
· 要和其初始值项一起添加到注册表中的新子项。
value_name
可选项。用于指定现有子项值中的值名称或创建要添加的新值名称的字符串。如果被省略,则使用默认注册表值名称。
flags
必选项。用于指定注册表项的数据类型和/或控制添加注册表根项的操作的值。下表列出了 Windows CE 支持的标志值。
标志 |
值 |
数据类型说明 |
FLG_ADDREG_NOCLOBBER |
0x00000002 |
如果注册表项存在,请不要改写它。您可以将此标志与表中的其他标志组合。 |
FLG_ADDREG_TYPE_SZ |
0x00000000 |
REG_SZ 注册表数据类型。通常为默认类型,这样在注册表项操作此类型的 value 时可省略此标志。 |
FLG_ADDREG_TYPE_MULTI_SZ |
0x00010000 |
REG_MULTI_SZ 注册表数据类型。其后的 value字段可以包含由逗号隔开的字符串列表。不需要字符串值的 NULL 结束符。 |
FLG_ADDREG_TYPE_BINARY |
0x00000001 |
REG_BINARY 注册表数据类型。其后的 value 字段必须是由逗号分隔(每个字段为一字节)的数值列表且不能使用 0x 十六进制前缀。 |
FLG_ADDREG_TYPE_DWORD |
0x00010001 |
REG_DWORD 注册表数据类型。只支持 Win32 Setup .inf 文档中的非兼容格式。 |
value
必选项。用于指定由 value_name 给出并添加到注册表项中的实际数据的值。对指定的类型应该使用合适的格式。
五、[Manufacturer]节说明
该节标志一个或者多个用INF文件安装的设备的制造商,它也为制造商的设备即驱动程序的安装定义Models节名。每个INF文件都必须有Manufacturer节。
样例:
[Manufacturer]
%MfgName%=Microsoft
[Microsoft]
%USB/VID_045E&PID_930A.DeviceDesc%=BULKUSB.Dev, USB/VID_045E&PID_930A
说明:
在Strings节中可以找到%MfgName%定义的字符串,例如在Strings节中定义MfgName=”Intel”,表明设备制造商是Intel。而右边的Microsoft也是制造商的Models节的节名。该节名是有Inf编写者自己定义的,不属于系统节名。每个制造商的Models节至少标识一个设备,并规定设备的VID和PID。同时引用这个设备inf文件的Install节。该节也可以规定一个或多个附加设备ID。当设备管理器发现设备检测ID与此节定义ID相符时,设备管理器就知道找到了正确的INF文件。
六、[install.Service]节说明
该节包含一个或多个AddService命令,用以控制一个特定驱动程序的服务装载的时间和方式,控制本服务对其他服务和下一级驱动程序的依赖等。
样例:
[BULKUSB.Dev.NT.Services]
Addservice = BULKUSB, 0x00000002, BULKUSB.AddService
[BULKUSB.AddService]
DisplayName = %BULKUSB.SvcDesc%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 3 ; SERVICE_DEMAND_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %\System32\Drivers\BULKUSB.sys
LoadOrderGroup = Base
说明:
其中BULKUSB是指定的所需安装服务的名称。对一个设备,这个值通常是该设备驱动程序的属性。0x00000002是一个系统指定的标记,不同的标记有不同的服务功能。BULKUSB.AddService是inf文件编写者定义的特定节,其中包括了所需要添加的服务项目,该节的定义可以在服务子键中观察其对应的子项。
针对不同安装平台,需要对其完成节名修饰,如
[BULKUSB.DEV.NT.Services]
[BULKUSB.DEV.NTAMD64.Services]
七、节名修饰
Install节通常包含指导安装程序安装所需软件的实际指示。该节必须在一个设备或者型号(Models)的条目中引用。根据节名的修饰,选择驱动相应的工作平台。
样例:
[install-section-name]
……
无修饰表示在Windows 9x平台中选择安装的条目。
[install-section-name.nt]
……
.nt修饰表示在Windows 2000平台中选择安装的条目。
[install-section-name.ntx86]
……
.ntx86表示限定在x86为基础的Windows 2000平台上安装的驱动。
Windows Server 2003 SP1 和更高 Windows 版本上的驱动程序 INF 文件必须使用 .ntia64 或 .ntamd64 正确修饰 [Manufacturer] 节和 [Models] 节名称中的条目,以指定非 x86 系统上的操作系统版本。此更改不会影响基于 x86 的系统的 INF 文件或非 PnP 驱动程序的 INF 文件(包括基于 x64 的体系结构的文件系统驱动程序INF 文件)。
以下CyUsb.inf实例:
首先要明白一个INF文件的基本结构:INF由节组成,即一个个段组成。每个段的功能不一样。(大部分书上把这个段叫作“节”)
[Version]段:主要用说明版本信息的。
[Strings]段:字符串信息,用于常量定义,用于显示。凡在其他段中出现的%XXXX%(就是两个百分号夹着一组字母),则对应的就会在Strings段里对应着它的一个字符串。
[SourceDisksNames]段: 定义安装源文件所在磁盘,一般为1,表示在第一个磁盘。此节可无。
[SourceDiskFiles]段:驱动程序文件列表及被安装的位置,该节必须结合[SourceDisksNames]节才能知道具体的位置。如“atinbtxx.sys=1”,则你必须到[DestinationDirs]节去查看“1”具体代表那个位置。
[DestinationDirs]段: 这里表示的就是上述驱动文件安装到什么地方。
[Defaultinstall]段和[Install]段:这里表示安装段,对实际文件进行操作,比如说复制,删除,添加注册表等,但是安装段的名字不一定是这两个,可以通过Model段中指明哪个段是安装段。
[Model] :此段用来指明安装段的名称。即说明哪个段是安装段。格式:%xxxx%=安装段名,USB\VID_04B4&PID_8613.所以这里不仅指明了安装段,还设置了引导安装的VID,PID,当与检测到设备的PID和VID相同时,则设备管理器认为该设备找到了自己的安装信息文件(INF文件),从而开始引导安装。
[Manufacturer]段: 此段用来指定设备供应商的名称,这个名称同时也是Model段。
关于INF文件的相关语法:
1、最后应该明白这8个段,有两个段不是直接显示出来的,就是[Model]和[Install],都是通过别的段指明的。
2、关于段的定义:我个人认为,只要在INF文件中将自己的段名用中括号包起来即可,如[MySection]...... 则这个MySection就可以认为是一个段了。
3、各个段之间的关系是并行的关系。如果两个段名相同,则接成一个段。不区分大小写
4、字符串标记,格式%xxxxxx%,这是一个字符串的标记,并不是字符串,他只是代表一个字符串,这个字符串在Srtings段定义,当然可以把这个字符串和一个段名关联起来。
例如:[Manufacturer]
%MFGNAME%=Cypress
[Cypress]
......
[Strings]
MFGNAME="Cypress" // %MFGNAME%是个字符串标记,代表的字符串为“Cypress”。这个字符串和model段名关联了。
下面是CyUSB.inf文件
[Version] //版本段
Signature="$CHICAGO$" //Signature必须一般为此值
Class=USB //驱动程序的类别,说明此为USB设备
ClassGUID={36FC9E60-C465-11CF-8056-444553540000} //对应USB设备的GUID值。不同设备的GUID值不同。
provider=%PROVIDER% //INF文件的提供者,%PROVIDER%是一个字符串标记,在Strings段可以看到它所指的字符串为"Cypress"
[SourceDisksNames]
1=%CYUSB_INSTALL%,,, 表示安装在磁盘1
[SourceDisksFiles] //待安装的源文件,即待安装的驱动程序
CyUsbME.sys = 1 //1表示要安装到哪个目录,具体那个目录在[DestinationDirs]说明
CyUsb.sys = 1
CyUsb.spd = 1
[Manufacturer] //指定设备供应商,同时也指定了那一段为Model段
%MFGNAME%=Cypress //Cypress为Model段
[Cypress] //此为Model段,并列出相应的安装段,可以列写多个设备PID,VID。用来表示响应不同的固件。
; Cypress FX2LP default ID
%VID_04B4&PID_8613.DeviceDesc%=CyUsb, USB\VID_04B4&PID_8613//CyUsb被设置为安装段
; Cypress FX1 default ID
%VID_04B4&PID_6473.DeviceDesc%=CyUsb, USB\VID_04B4&PID_6473
; Cypress FX2LP Example Device. DVK firmware examples use this VID/PID
%VID_04B4&PID_1004.DeviceDesc%=CyUsb, USB\VID_04B4&PID_1004
[DestinationDirs]
CyUsbME.Files.Ext = 10,System32\Drivers //意思是把CyUsbME.Files.Ext ,CyUsb.Files.Ext里的东西指定了方向,即右边的路径。这里没有操作,只是,10,表示C盘下的windows目录
CyUsb.Files.Ext = 10,System32\Drivers //CyUsbME.Files.Ext ,CyUsb.Files.Ext是两个段,在后面定义了,可以看到这两个段代表了两个驱动文件CyUsbME.sys
[CyUsb]//此段为安装段,开始向[DestinationDirs]所示路径安装文件
CopyFiles=CyUsbME.Files.Ext //CopyFiles是个指令,即将=后面的文件CyUsbME.Files.Ext安装到DestinationDirs]所示路径安装文件,
AddReg=CyUsbME.AddReg //在注册表中添加相应的新的子健,进行相应操作,操作在CyUsbME.AddReg段中放着
[CyUsb.HW]
AddReg=CyUsb.AddReg.Guid //在HW下的注册
[CyUsb.NT] //在NT(大于win98的平台)平台下的安装及注册
CopyFiles=CyUsb.Files.Ext
AddReg=CyUsb.AddReg
[CyUsb.NT.HW]
AddReg=CyUsb.AddReg.Guid
[CyUsb.NT.Services]//添加安装文件的服务信息
Addservice = CyUsb, 0x00000002, CyUsb.AddService // Addservice 是个操作指令格式:Addservice =需要服务的安装的安装段名,0x00000002是固定值,安装服务信息段名
[CyUsb.AddService]//安装服务信息段
DisplayName = %CyUsb.SvcDesc%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 3 ; SERVICE_DEMAND_START//2值表示为自动安装
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %10%\System32\Drivers\CyUsb.sys //这个表示驱动所在路径,最终可在设备管理器中看到
LoadOrderGroup = Base //不知道干嘛的
[CyUsbME.AddReg] //不同安装段的注册表操作
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,CyUsbME.sys
[CyUsb.AddReg] //不同安装段的注册表操作
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,CyUsb.sys
[CyUsbME.Files.Ext] //待安装的驱动程序文件
CyUsbME.sys
[CyUsb.Files.Ext] //待安装的驱动程序文件
CyUsb.sys
[CyUsb.AddReg.Guid] //不同安装段的注册表操作
;HKR,,DriverGUID,,%CyUsb.GUID%
;---------------------------------------------------------------;
[Strings] //一些显示的字符串,在设备管理器中可以看到
PROVIDER="Cypress"
MFGNAME="Cypress"
CYUSB_INSTALL="Cypress Generic USB Driver Installation Disk"
VID_04B4&PID_8613.DeviceDesc="Cypress EZ-USB FX2LP - EEPROM missing"
VID_04B4&PID_6473.DeviceDesc="Cypress EZ-USB FX1 - EEPROM missing"
VID_04B4&PID_1004.DeviceDesc="Cypress EZ-USB Example Device"
CyUsb.SvcDesc="Cypress Generic USB Driver"
;CyUsb.GUID="{AE18AA60-7F6A-11d4-97DD-00010229B959}"