现在的位置: 首页 > 综合 > 正文

如何编写INF文件

2013年01月31日 ⁄ 综合 ⁄ 共 7258字 ⁄ 字号 评论关闭

几乎没有看到什么书详细介绍INF文件的编写规则。

庆幸的是,我今天终于在一本很不起眼的书上找到了

面对网上大同小异的说法,我一直很怀疑其可信度,所以我在此把书上的原话写出来。供大家分享。

书本,毕竟相对而言比较权威。

 

1INF文件的基本语法

       INF文件是简单的文本文件,由若干命名的节组成,每个节用”[节名]”来表示。节名是大小写无关的,部分节名是由系统定义的,INF文件的作者也可以根据需要命名新的节。系统通过节名而不是位置来定位相关的节,并会自动合并名称相同的节,因此在INF文件中节出现的先后顺序无关。但通常有一个习惯上的顺序。每个节含有一系列形如”keyword=value”的语句。其中value可以是另一个节的节名。这样在INF文件中不同的节就形成了一个层次结构。如图所示。

 

INF文件中也可以使用字符串,用%开始并以%结束,字符串需要在[string]节中声明。

 

2、常用节
       1[version]版本节

       一个INF文件必须要有的节,作为整个INF文件的头和标记,其要求的关键字如表所示。

1 [version]节关键字

关键字

说明

Signature

签名,只能从以下三项中选其一:Windows NTWindows 95$Chicago$

Class

系统定义或用户指定的类名,一些诸如NETDISPLAY的名称是预定义的

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文件安装的驱动程序所对应的一个或多个设备,它定义了设备的字符串名、设备IDDDInstall节名之间的映射关系(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缩写为HKCRHKEY_CURRENT_USER缩写为HKCUHKEY_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表示驱动程序的类型。

 

3INF举例

       下面用一个简单例子来说明INF文件。在该例子中,驱动程序中包含了连个文件Ant.SYSAnt.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"

 

4INF文件安装

       一旦常见了驱动程序的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管理器首先为设备加载所有低层过滤驱动程序,然后加载功能驱动程序,最后加载所有上层过滤驱动程序。

 

抱歉!评论已关闭.