inf文件说明以及CyUSB.inf实例详解

Inf简介

InfDevice information File)是Microsoft公司为硬件设备制造商发布其驱动程序推出的一种文件格式,Inf文件中包含硬件设备的信息或脚本以控制硬件操作。在Inf文件中指明了硬件驱动该如何安装到系统中,源文件在哪里、安装到哪一个文件夹中、怎样在注册表中加入自身相关信息等。

C:/Windows/INF文件夹中存放有大量的inf文件。Inf文件其实是一种纯文本文件,可以用任意一款文本编辑器打开进行编辑。

INF的功能

1.       复制文件、删除文件、或重新命名文件。

2.       新增或删除注册表(Registry)中的项目。

3.       修改重要的系统设置文件(如Autoexec.batConfig.sys.INI等)

 

Inf文件的编写规则:

1.       每个inf文件有许多节(section)组成,节名用方括号括起来。这些节名有些是系统定义好的,有一些是用户自定义的。每一个节名最长为255个字符,节与节之间没有先后顺序的区别,另外,同一个Inf文件中如果出现两个同样的节名,则系统会自动将这两个节名下面的条目合并到一起。

2.       在节与节之间的内容叫条目,每一个节又是由许多的条目组成,每个条目都是由形如”signature=”$WINDOWS NT$””的形式。如果每一个条目的等号后面有多个值,则每一个值之间用“,”号分隔开。

3.       Inf文件对大小写不敏感。

4.       “;”后面的内容为注释。

5.       如果一个条目的内容过多,在一行无法书写完全,则用“\”将一行内容书写多行。

关键section有:

[Version]版本描述信息,主要用于版本控制。

[Strings]字符串信息,用于常量定义。

[DestinationDirs]定义系统路径信息,指定CopyFilesRenFilesDelFiles入口的缺省操作目录。

[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.infOEM0.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/98Windows2000以上的操作系统,如果是$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节至少标识一个设备,并规定设备的VIDPID。同时引用这个设备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.AddServiceinf文件编写者定义的特定节,其中包括了所需要添加的服务项目,该节的定义可以在服务子键中观察其对应的子项。

针对不同安装平台,需要对其完成节名修饰,如

[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}"


你可能感兴趣的:(windows)