几乎没有看到什么书详细介绍INF文件的编写规则。
庆幸的是,我今天终于在一本很不起眼的书上找到了
面对网上大同小异的说法,我一直很怀疑其可信度,所以我在此把书上的原话写出来。供大家分享。
书本,毕竟相对而言比较权威。
1、INF文件的基本语法
INF文件是简单的文本文件,由若干命名的节组成,每个节用”[节名]”来表示。节名是大小写无关的,部分节名是由系统定义的,INF文件的作者也可以根据需要命名新的节。系统通过节名而不是位置来定位相关的节,并会自动合并名称相同的节,因此在INF文件中节出现的先后顺序无关。但通常有一个习惯上的顺序。每个节含有一系列形如”keyword=value”的语句。其中value可以是另一个节的节名。这样在INF文件中不同的节就形成了一个层次结构。如图所示。
在INF文件中也可以使用字符串,用%开始并以%结束,字符串需要在[string]节中声明。
2、常用节
1)[version]版本节
一个INF文件必须要有的节,作为整个INF文件的头和标记,其要求的关键字如表所示。
表1 [version]节关键字
关键字 |
说明 |
Signature |
签名,只能从以下三项中选其一:Windows NT、Windows 95、$Chicago$ |
Class |
系统定义或用户指定的类名,一些诸如NET、DISPLAY的名称是预定义的 |
ClassGuid |
类的唯一GUID值 |
Provider |
INF文件的提供者,一般为设备的生产厂商 |
LayoutFile |
仅用于系统支持的INF文件,OEM支持的文件必须用源磁盘名或源磁盘文件代替 |
CatalogFile |
必须包含的驱动程序包的WHQL数字签名的目录说明文件 |
DriverVer |
mm/dd/yyyy[ , x, y, v, z ];日期之后为可选版本号 |
2)[manufacturer]厂商节
该节中的每条语句列出了通过INF文件安装的设备和驱动程序。每条语句的格式如下所示:manufacturer=model
其中,manufacturer为生产者列出了唯一的INF文件名,model值指向另一个INF节,进一步指定硬件驱动程序的安装路径。
该节常被成为“目录表”,因为其中的每一条语句都指向一个系统定义的Model节,而Model节的每一条语句又指向一个INF作者定义的节。如对应于每一条Model都会有一个DDInstall节,DDInstall.Services节等等。
3)[models]模型节
[manufacturer]节中的一条语句必须有与之对应的[models]节,目的是识别INF文件安装的驱动程序所对应的一个或多个设备,它定义了设备的字符串名、设备ID与DDInstall节名之间的映射关系(DDInstall中含有设备的安装信息),其语句格式如下:
Device-description = install-section-name,hw-id[ , compatible-id… ],其中device-description表示一个设备的可读的字符串名。Install-section-name称作DDInstall节,指向指导进一步安装的另一个INF节。Hw-id为设备ID。
4)[DDInstall]安装节
要安装[Models]中列出的设备必须要有[DDInstall],[modlels]节中的一条语句有一个对应的[DDInstall]节,多个[model]语句也可以共享一个[DDInstall]节。[DDInstall]节关键字如表所示。
表2
关键字 |
说明 |
Driver |
Vermm/dd/yyyy[ , x, y, v, z ] |
CopyFiles |
指向另一个节(含有安装时所需复制的文件列表)或@单独文件名(当只需要安装单个文件时) |
AddReg |
指向另一个节,包含安装时需要向注册表中添加的信息 |
Include |
指向安装时需要的其他INF文件(和命令) |
Needs |
Include的子集 |
DelFiles |
指向其他节,这些节列出了需从目标系统中移走的文件 |
RenFiles |
指向其他节,这些节列出了安装前在目标系统中需要重命名的文件 |
DelReg |
指向另一个节,包含安装时需要从注册表中删除的信息 |
ProfileItems |
指向其他节,包含了对目标系统开始菜单的更改信息 |
其中:CopyFiles是[DDInstall]节的基本说明,它相当于一条宏指令,其格式如下:
CopyFiles=file-list-section[, file-list-section… ]
或
CopyFiles=@filename
5)[CopyFiles]复制文件节
[CopyFiles]的语句格式如下所示
目标文件名[ ,
源文件名, 临时文件名,
标志 ]
其中:[ ]中为可选内容。对被复制文件而言,目标文件名是最终目标名;如果源文件名不同,源文件名必须说明;Windows98中要求临时文件名,windows2000忽略临时文件名。如表所示,标志指定复制目标文件时的相关设置,每一位是一个掩码。
表三 [CopyFiles]标志定义
标志位值 |
符号名 |
描述 |
0x0400 |
COPYFLG_REPLACEONLY |
如果源文件已经存在,则复制 |
0x0800 |
COPYFLG_NODECOMP |
不解压缩复制 |
0x0008 |
COPYFLG_FORCE_FILE_IN_USE |
将源文件复制给临时文件,强制重新启动,重命名临时文件 |
0x0010 |
COPYFLG_NO_OVERWRITE |
禁止替换现有源文件 |
0x1000 |
COPYFLG_REPLACE_BOOT_FILE |
文件是启动系统的一部分,强制重新启动 |
0x2000 |
COPYFLG_NOPRUNE |
即使安装者认为不重要,也要强制执行复制操作 |
0x0020 |
COPYFLG_NO_VERSION_DIALOG |
不要重写新文件(如果安装包有数字签名则忽略) |
0x0004 |
COPYFLG_NOVERSIONCHECK |
总是覆盖目标文件 |
0x0040 |
COPYFLG_OVERWRITE_OLDER_ONLY |
覆盖旧的目标文件 |
0x001 |
COPYFLG_WARN_IF_SKIP |
如果使用者跳过该文件,则警告 |
0x0002 |
COPYFLG_NOSKIP |
不允许使用者跳过该文件 |
6)[AddReg]节
该节的目的是在目标系统的注册表中添加、修改子键或值。其语句格式如下:
reg-root[, subkey, value-name, flags, value ]
其中:reg-root是主键的缩写,如HKEY_CLASSES_ROOT缩写为HKCR,HKEY_CURRENT_USER缩写为HKCU,HKEY_LOCAL_MACHINE缩写为HKLM等。Subkey为子键名。标志flags规定了被保存数据的数据类型,其可能的取值如表所示
表4 [AddReg] flags定义
flags |
符号名称 |
说明 |
0x00000 |
FLG_ADDREG_TYPE_SZ |
以’NULL”结尾的字符串 |
0x00001 |
FLG_ADDREG_BINVALUE_TYPE |
二进制数 |
0x00002 |
FLG_ADDREG_NOCLOBBER |
不替换现有值 |
0x00004 |
FLG_ADDREG_DELVALUE |
删除子键或键名 |
0x00010 |
FLG_ADDREG_KEYONLY |
创建子键,忽略键值 |
0x00020 |
FLG_ADDREG_OVERWRITEONLY |
如果键值已经存在,则替换它 |
0x10000 |
FLG_ADDREG_TYPE_MULTI_SZ |
REG_MULTI_SZ数据(数组) |
0x00008 |
FLG_ADDREG_APPEND |
附加到现有的REG_MULTI_SZ数组 |
0x20000 |
FLG_ADDREG_TYPE_EXPAND_SZ |
REG_EXPAND_SZ数据 |
0x10001 |
FLG_ADDREG_TYPE_DWORD |
DWORD数据 |
0x20001 |
FLG_ADDREG_TYPE_NONE |
REG_NONE数据 |
7)[SourcDisksNames]源磁盘名称节
如果厂家发布的驱动程序分布在不同的磁盘上,则INF文件中应包含该节。发行包中的没一张盘对应一条语句,语句格式如下:
diskid=disk-description[, tagfile, unused, path ]
其中,diskid是磁盘的唯一号码,磁盘从1开始编号。磁盘描述disk-description是一个可读的文本字符串,用于向用户提示插入需要的磁盘。
标签文件tagfile的目的是为了保证在安装过程中用户提供准确的磁盘。在安装继续之前,对插入磁盘上的tagfile标签文件进行校验,如果标签文件丢失,用户被再次提示插入正确的磁盘,如果tagfile包含.CAB扩展名,则被表示为压缩文件。
path是一个从根目录开始的路径名,缺省则假定为根目录。
8)[SourceDisksFiles]源磁盘文件节
一个驱动程序的INF文件必须包含源磁盘文件节,该节列出了驱动程序安装过程中用到的文件名,每个文件对应节的一条语句,其格式如下:
Filename=diskid[, subdir, size ]
通常,diskid为在[SourceDisksNames]节中指定的磁盘,该磁盘中包含了要安装的文件的文件名,subdir为文件指定路径,size指定文件不压缩时的大小,以字节为单位。在安装过程中将使用size来判断源文件是否能正确地复制到目标系统中。
9)[DestinationDirs]目标路径节
该节指定了源文件复制到目标系统时的目标路径。其格式如下:
file-list-dection=dirid[, subdir ]
或
DefaultDestDir=dirid[, subdir ]
其中,第一种格式表示由file-list-section指定的文件的安装目录,第二种格式则表示缺省的文件安装目录。dirid表示特定的安装目录,其含义如表所示
表5
dirid值 |
意义 |
12 |
对于Windows2000表示%windir%\system32\drivers |
对于windows98表示%windir%\system\IoSubsys |
|
10 |
%windir% |
11 |
对于windows2000表示%windir%\system32 |
对于windows98表示%windir%\system |
|
30 |
启动设备的根目录 |
54 |
Windows2000的根目录 |
01 |
该INF文件的目录 |
17 |
INF文件目录 |
20 |
字体目录 |
51 |
假脱机目录 |
52 |
假脱机驱动程序目录 |
55 |
打印机目录 |
23 |
颜色(ICM) |
-1 |
绝对路径 |
21 |
阅读器目录 |
53 |
用户简要目录 |
24 |
应用目录 |
25 |
共享目录 |
18 |
帮助目录 |
16406 |
所有用户\开始菜单 |
16407 |
所有用户\开始菜单\程序 |
16408 |
所有用户\开始菜单\程序\启动 |
16409 |
所有用户\桌面 |
16415 |
所有用户\优先项 |
16419 |
所有用户\应用数据 |
16422 |
程序文件 |
16427 |
程序文件\通用 |
16429 |
所用用户\模板 |
16430 |
所有用户\文档 |
10)[DDInstall.Services]节
该节是对[DDInstall]节的扩展,它控制应该在何时及怎样启动特定驱动程序提供的服务,表明该驱动程序与低层遗留设备驱动程序的依赖关系等等,如果驱动程序支持事件记录的话,该节负责设置事前记录服务,格式如下:
AddServie=ServiceName,[flags], service-install-section[ , eventlog-install-section]
ServiceName代表一个服务的名字,通常是驱动程序的名称去掉.sys扩展名。
service-install-section指向另一个节,用于设定具体的服务类型。
Eventlog-install-section也指向另一个节,用于设置事件记录服务。
Flags如附表所示
表6 [AddService] flags定义
Flags值 |
-SPSVCINST_符号名 |
说明 |
0x0002 |
ASSOCSERVICE |
驱动程序是FDO(功能驱动程序),而不是过滤器 |
0x0008 |
NOCLOBBER_DISPLAYNAME |
不覆盖友好的名称 |
0x0100 |
NOCLOBBER_DESCRIPTION |
不覆盖描述 |
0x0010 |
NOCLOBBER_STARTTYPE |
不要覆盖开始类型 |
0x0020 |
NOCLOBBER_ERRORCONTROL |
不要覆盖错误控制 |
11)[ServiceInstall]服务安装节
对应于[DDInstall.Service]中的每一条AddService语句有一个[ServiceInstall]节。该节用于控制服务控制管理器安装驱动程序的方法。格式如下:
关键字=值
其关键字包括:
StartType指定驱动程序的加载方式;如果加载驱动程序时发生错误,则ErrorControl值表示如何处理错误;ServiceBinary表示驱动程序的完全路径;DislayName表示在设备管理器中显示的驱动程序的名称;Description是关于驱动程序的简短描述;ServiceType表示驱动程序的类型。
3、INF举例
下面用一个简单例子来说明INF文件。在该例子中,驱动程序中包含了连个文件Ant.SYS和Ant.HLP。二进制驱动程序Ant.SYS被复制到系统驱动程序目录(如WINNT\SYSTEM32\DRIVERS),帮助文件Ant.HLP复制到系统帮助目录(如WINNT\HELP)。
[Version] Signature = "$Windows NT$" Class = Animal ClassGUID = { C9B3D080-6889-11D4-93FC-444553540000 } Provider = W2KDriverBook DriverVer = 07/04/2000, 1.00.2648.1 [DestinationDirs] ;说明文件复制到何处 DefaultDestDir = 12 ;缺省的复制路径为%windir%\system32\drivers CopyAntHelp = 18 ;指定CopyAntHelp的复制路径 [Manufacturer] W2KDriverBook = MyMfgName ;调用[models]节 [MyMfgName] ;开始一个[models]节 "ISA Animal Ant" = InstallAnt, ISA\ANT [InstallAnt] ;[DDInstall]节 CopyFiles = CopyAntFiles; CopyFiles = CopyAntHelp; AddReg = AntRegSection [CopyAntFiles] Ant.sys [CopyAntHelp] Ant.hlp [AntRegSection] HKR, "Parameters", "Coordinates", FLG_ADDREG_TYPE_DWORD, 0 [SourceDisksNmes] 1 = "Animal Ant Driver Files" [SourceDiskFiles] Ant.sys = 1 Ant.hlp = 1 [InstallAnt.Service] ;[DDInstall.Service]节 AddService = Ant, 2, LaunchServic ;驱动程序名为Ant.sys,属于功能驱动程序,由[LaunchServic]节控制驱动程序的安装 [LaunchService] ServiceType = 1 ;驱动程序属于内核驱动程序,而不是文件系统驱动程序 StartType = 3 ;在需要时启动,2为在系统启动后自动启动 ErrorControl = 1 ;向用户显示错误 ServiceBinary = %12%\Ant.sys ;表示在windows2000下驱动程序的全路径名为"%windir%\system32\drivers"
4、INF文件安装
一旦常见了驱动程序的INF文件,就可以安装它。
1)手动安装
为了手动处理INF文件,可以使用windows资源管理器中的文件管理器选择INF文件,右击文件会出现文件安装选项
在即插即用环境,插入或移走设备会导致安装、加载和卸载相应的驱动程序,因此手工安装一般用于驱动程序最初的调试和测试。
2)自动安装
当即插即用设备插入系统时,I/O子系统的各组件相互作用,将引导加载新的驱动程序。步骤如下:
A)当设备插入时,总线驱动程序会被通知新设备已经插入。然后总线驱动程序枚举总线设备,检测到新的设备,该设备具有特殊的设备ID
B)内核模式的PnP管理器通知用户模式的PnP管理器具有特殊ID的设备已经出现在系统中。
C)用户模式的PnP管理器为新设备构建一个驱动程序列表,用新设备的类和模型信息搜索系统的INF目录,进行匹配。
D)如果无法定位到合适的INF文件,系统延迟进一步的操作直至高级用户请求联机,然后用户将看到一个“添加新硬件向导”的对话框,由用户提供驱动程序的位置,定位INF文件。
E)一旦找到INF文件,则在INF文件的控制下复制、安装驱动程序文件、修改注册表中的子键和值
F)根据INF文件的提示,内核模式的PnP管理器首先为设备加载所有低层过滤驱动程序,然后加载功能驱动程序,最后加载所有上层过滤驱动程序。