深入学习INF文件-笔记
本帖最后由 仙乃日 于 2010-7-28 16:55 编辑一、INF文件是什么?
INF是Device INFormation File的英文缩写,INF文件是Microsoft公司为硬件设备制造商发布其驱动程序推出的一种文件格式,INF文件中包含硬件设备的信息或脚本以控制硬件操作。在INF文件中指明了硬件驱动该如何安装到系统中,源文件在哪里、安装到哪一个文件夹中、怎样在注册表中加入自身相关信息等等。INF文件是由标准的ASCII码组成,您可以用任何一款文字编辑器查看修改其中的内容。装信息INF文件与Windows内建的安装服务引擎(API函数库)紧密协同工作,基于其严格的编写语法制作而成的INF文件在拷贝、删除文件,增、删注册表键,更改系统设置等方面都有优秀的表现,完全可以用来实现应用程序文件安装的目标。
二、INF文件的一些规则?
规则1:INF文件不区别大小写。但出于提高可读性的目的,请在编写节名时保持大小写一致性。
规则2:节名的最大长度是有限制的。在基于 Windows NT 操作系统上,请确保节名不超过 255 字节的最大长度。
规则3:使用“;”分号为注释符。也就是说inf 文件分析器会跳过与分号同处一行并出现在分号后面的任何字符,除非分号出现由引号 (") 或百分比符号 (%) 括起的字符串中,如,"stri;ng" 、%stri;ng%。
规则4:使用百分比符号 (%%)为字串转换符号。类似于定义变量。
规则5:使用用“\”作为分行符号。如果一个项(条目)的内容过多,在一行无法书写完,则可以在需要断开项的地方插入反斜杠 (\) 可在下一行继续编写该项。 但是,如果项指定了一个以反斜杠结束的值 (如目录路径),请将字符串或反斜杠用引号括起来。例如,用 \Programs\MyTestApps"\"可将反斜杠重新解释为行继续符。
规则6:INF文件是分节的,每一个INF文件有许多的节组成,节名用方括号括起来。某些节名是系统定义好的,不可以更改的。节与节之间没有先后顺序的区别,另外,同一个INF文件中如果出现两个同样的节名,则系统会自动将这两个节名下面的条目合并到一起。
规则7:在节与节之间的内容叫项(也有的翻译成条目),每一个节又是由许多的项组成的,每一个项都是由形如“Signature="$WINDOWS NT$"”的形式组成的。如果每一个项的等号后有多个值,则用逗号 (,) 将节项中提供的值分开。 逗号与逗号之间的值可为空,但逗号不能随意省略。值是对书写的位置敏感的。在值列表中间省略某个可选值时,必须保留逗号。但是,在用于 Windows NT操作系统的 .inf 文件中可以省略后缀逗号。
规则8:应用下列条件时,请用一对引号 (") 括起字符串:
a、字符串包含必须保留为字符串的一部分的前导或后缀空白。用一对引号括起字符串可防止 .inf 文件分析器丢弃前导或后缀空白。.inf 文件分析器不会丢弃内部空白,而是将它保留为字符串的一部分。
b、字符串很长,为了在文本编辑器中换行而包含了内部换行符或回车符。用一对引号括起字符串可防止在第一个内部换行符或回车符处截断字符串。
c、字符串包含分号。用一对引号括起字符串可防止在分号处截断字符串。
d、字符串以反斜杠结束。用一对引号括起字符串可防止将反斜杠解释为行继续符。
e、括起字符串的引号是字符串的一部分。要保留带显式引号的字符串,请用另一对引号括起这个带引号的字符串。例如,用 ""somestring"" 保留字符串 "somestring"。
f、要保留单个引号 ("),请在该位置用两个引号 ("")。例如,用 ""some""string"" 保留 "some"string"。
g、.inf 文件分析器不但丢弃最外面的一对引号,而且将剩下的每对相邻引号转换为单个的引号字符。也就是说,"""some string""" 在分析后将变成 "some string"。
h、用下划线 (_) 表示字符串关键字名称中的空格。
规则9:节中的每项以换行符或回车符作为结束标志。 因此,使用文本编辑器编写 .inf 文件时一定不能任意插入换行符或回车符,因为 .inf 文件分析器可能将项或节的结束解释到错误的位置。但是.inf 文件分析器会忽略只包含换行符或回车符的空行或空白行。 请确保项中的值列中不包含不必要的空格。
三、INF文件的结构
本帖最后由 仙乃日 于 2010-7-28 09:47 编辑用于确认 .inf 文件的基本版本信息。包含以下项:
Signature是必选项,每个INF文件都必需指定的项。Signature是用来指定INF文件所能工作的系统版本。其值如下:
"$CHICAGO$" 表明这个inf文件可以用于windows 95以后的所有平台上,目前来说就是win98,winme,winnt4,win2k,winxp,win2k3。
"$Windows 95$" 表明这个inf文件可以用于windows 95以后的Win9x平台上,目前来说就是win98,winme。
"$Windows NT$" 表明这个inf文件可以用于WindowsNT系列的平台上,包括winnt4,win2k,winxp,win2k3。WIN9x系列的操作系统的SetupAPI将会拒绝执行这种类型的inf文件。
Provider 可选项。用于指定 .inf 文件创建者名的字符串。在驱动INF文件也用于指定设备的生产商。
LayoutFile 可选项。对包含安装该组件所需布局信息文件。一般只用于系统自带的INF文件。用于指定源盘和文件路径等信息。
Class 可选项。用于定义驱动的类别名称。如:Class=hdc。
ClassGuid 可选项。驱动类别的GUID,其值的形式为{nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn},一般是唯一的。
CatalogFile 可选项。用于指定驱动签名的CatalogFile文件。
DriverVer 可选项。用于指定驱动日期和版本号。如:DriverVer=07/01/2001,5.1.2600.5512。
节,用于指定应用程序所驻留的源磁盘上的名称和路径。可以指定多个源磁盘。
diskid = disk-description [,,[,path][,flags][,tag-file]]
diskid 必选项。标识源盘的唯一号码。如果有多个源盘,则每个源盘都必须有唯一的序号。
disk-description 必选项。说明这张磁盘的内容或用途的字符串或字符串主项。安装程序向用户显示该字符串以标识磁盘。此说明文字用双引号引起来。
tag-or-cab-file 可选项。tag或cabinet文件名。此说明文字用双引号引起来。
path 可选项。tag或cabinet文件在源磁盘的路径。此说明文字用双引号引起来。省缺则默认为源磁盘根目录。
flags 可选项(Windows XP以后版本)。有效值为0x10。选用该项则tag-or-cab-file选项应为cabinet文件,tag -file选项应为tag文件。
tag -cab-file 可选项(Windows XP以后版本)。tag文件名。该文件应在源磁盘根目录或path项定义的路径中,此说明文字用双引号引起来。
如:1=%DiskName%,file.tag,, 或者1="Codec4WMP Files","Code4WMP.cab",,"i386" 本帖最后由 仙乃日 于 2010-7-28 10:09 编辑
用于INF文件所驻留的源磁盘上指定文件的名称和路径。
filename = diskid[,[ subdir][, size]]
filename 必选项,文件源名
diskid 必选项。必选项。指定包含源文件的磁盘的整数。此值和包含源文件的路径必须定义在同一 .inf 文件的 SourceDisksFiles 节中包含文件的源盘序号,而且必须是大于或等于 1 的值(0 是无效的盘号参数值)。
subdir 可选项。用于指定源文件所驻留磁盘上子目录的字符串;该子目录相对于SourceDisksNames 节中指定的路径(如果有)。如果没有使用该参数,则默认值是源盘上的根文件夹。 size 可选参数,以字节为单位指定文件大小。
如:hdj.sys=1 或者hdj.dll=1,hdj,999
用于指定要进行文件操作所需要的具体路径。
]
]
DefaultDestDir 可选项。用于定义默认文件操作的目录。
filelist-section 可选项。CopyFiles、RenFiles 或 DelFiles 节的名称。
dirid 必选项。逻辑磁盘标识 (dirid)。-1至 32767及65535的数字为系统已定义的逻辑磁盘标识。相当于目录宏。-1表示为绝对路径。常见的对应关系如下:
%10% Windows C:\Windows
%11% System32 C:\Windows\system32
%12% Drivers C:\Windows\system32\drivers
%17% inf C:\Windows\inf
%18% Help C:\Windows\Help
%20% Fonts C:\Windows\Fonts
%21% Viewers C:\Windows\system32\viewers
%23% Color C:\Windows\system32\spool\drivers\color
%24%AppsC:\
%25% Shared C:\Windows
%30% Boot C:\
%50% System16 C:\Windows\system
%51% Spool C:\Windows\system32\spool
%52% Spooldrivers C:\Windows\system32\spool\drivers\w32x86
%53% Userprofile C:\Documents and Settings\username
%54% Loader C:\
%55% Printprocessor C:\Windows\system32\spool\Prtprocs\w32x86
%16406% All Users\Start Menu C:\Documents and Settings\All Users\Start Menu
%16407% All Users\Start Menu\Programs C:\Documents and Settings\All Users\Start Menu\Programs
%16408% All Users\Start Menu\Programs\Startup C:\Documents and Settings\All Users\Start Menu\Programs\Startup
%16409% All Users\Desktop C:\Documents and Settings\All Users\Desktop
%16415% All Users\Favorites C:\Documents and Settings\All Users\Favorites
%16419% All Users\Application Data C:\Documents and Settings\All Users\Application Data
%16422% Program Files C:\Program Files
%16425% system 32 on RISC C:\Windows\system32
%16426% Program Files on RISC C:\Program Files
%16427% Program Files\Common C:\Program Files\Common
%16428% x86 Program Files\Common on RISC C:\Program Files\Common
%16429% All Users\Templates C:\Documents and Settings\All Users\Templates
%16430% All Users\Documents C:\Documents and Settings\All Users\Documents
%16437% All Users\Documents\My Music C:\Documents and Settings\All Users\Documents\My Music
%16438% All Users\Documents\My Pictures C:\Documents and Settings\All Users\Documents\My Pictures 本帖最后由 仙乃日 于 2010-7-28 10:19 编辑
这一节中定义了字符串变量,当某些字符串频繁地出现在INF文件中,为简化输入,可以在该节中定义一个字符串变量,代表该字符串出现在INF文件中。
strings-key 由字符和数字组成的唯一名称。
value 由字母、数字或其他可打印字符组成的字符串。如果在项目类型中使用需要双引号的相应字符串主项,则应该用双引号将它引起来。
用于列出用户单击“控制面板”上的“添加/删除程序”图标,单击“安装 Windows”选项卡,然后单击“从磁盘安装”按钮时,显示的 installsection 节。在列表中installsection节会当作复选框显示。如:
Codec4WMP
OptionDesc ="Codec4WMP addon pack"
Tip ="Codec4WMP by仙乃日"
Modes =0,1,2,3
CopyFiles=copy.sys,copy.wmp,copy.wmp.Codec4WMP
Registerdlls=register.codecs
AddReg=Codec4WMP.Reg
DelReg=deloldwmpreg
ProfileItems =codec.Config
UpdateInis=codec.Config1
安装节
本帖最后由 仙乃日 于 2010-7-28 10:34 编辑|
...]
...]
...]
...]
...]
...]
...]
...]
...]
...]
...]
...]
...]
...]
...] 本帖最后由 仙乃日 于 2010-7-28 11:11 编辑
和是系统保留的节名,用于默认的安装和卸载。系统保留的安装节名还包括:| | | | 等。这些节所包含的项都是一样,项其实就是操作命令。
destination-file-name[,source-file-name][,temporary-file-name][,flag]
CopyFiles-section-name是指执行文件复制操作的节名,可以自定义。但必需在“安装节”下列出。
destination-file-name目标文件名。如果没有给出源文件名,那么它也是源文件名。
source-file-name 可选项。源文件名。文件复制操作的源文件名不一定要和目标文件名完全相同。
temporary-file-name 可选项。文件复制操作的临时文件名。安装程序将复制源文件,但给它临时文件名。下一次启动操作系统时,将把临时文件名重命名为目标文件名。
Flag 可选项。用于指定在复制进程期间执行某个操作的数字值。Flag值的具体含义如下:
COPYFLG_WARN_IF_SKIP 1 0x00000001 用户尝试跳过发生错误后产生的文件时警告他。
COPYFLG_NOSKIP 2 0x00000002 关键安装:不允许用户跳过复制文件的操作。
COPYFLG_NOVERSIONCHECK 4 0x00000004 忽略版本检查并且始终复制文件。这将会覆盖较新的文件。
COPYFLG_FORCE_FILE_IN_USE 8 0x00000008 强制重命名。安装程序将该文件作为正在使用的文件进行处理。只有文件已经存在于用户的计算机上时才会发生这种情况。
COPYFLG_NO_OVERWRITE 16 0x00000010 如果文件已经在目标计算机上,则不会复制。
COPYFLG_NO_VERSION_DIALOG 32 0x00000020 抑制版本冲突对话框,并且不会覆盖较新的文件。
COPYFLG_OVERWRITE_OLDER_ONLY 64 0x00000040 不改写目标目录中的现有文件。
COPYFLG_REPLACEONLY 1024 0x00000400 仅当源文件存在于目标目录中时才将它复制到目标目录中。
COPYFLG_NODECOMP 2048 0x0000800 源文件已压缩,复制时不解压。
COPYFLG_REPLACE_BOOT_FILE 4096 0x00001000 当源文件为系统文件时提示重新启动系统。
CE_COPYFLG_NO_DATE_DIALOG 536870912 0x20000000 如果目标文件比源文件新,请勿复制此文件。
CE_COPYFLG_NODATECHECK 1073741824 0x40000000 改写目标文件时忽略数据。
CE_COPYFLG_SHARED 2147483648 0x80000000 考虑共享 DLL 时,创建一个引用。
CopyFiles还可以使用文件名搭配 "@" 字符来强制复制单个文件 (在这种情况下源文件名和目标文件名必须相同,并且不能使用临时文件) 。如:
CopyFiles = @aliide.sys
CopyFiles = @pciidex.sys
CopyFiles = @atapi.sys 本帖最后由 仙乃日 于 2010-7-28 11:39 编辑
destination-file-name[,,,flag]
destination-file-name目标文件名。如果没有给出源文件名,那么它也是源文件名。
Flag 可选项。用于指定在复制进程期间执行某个操作的数字值。如果不将flag 参数设为1,在执行 DelFiles 节时如果正在使用该文件,则不能从计算机上删除此文件。 本帖最后由 仙乃日 于 2010-7-28 11:41 编辑
new-file-name, old-file-name
new-file-name 新文件名。
old-file-name 旧文件名。 本帖最后由 仙乃日 于 2010-7-28 11:46 编辑
reg_root,subkey,,,
指定在安装期间向设备注册表添加的子键或值,可以有选择地设置它的值。
reg-root 必选项。注册表根键,用于指定注册表根位置的字符串。
例子:
hklm,"SOFTWARE\Microsoft\MediaPlayer\Player\Extensions\Descriptions","10",,"Lossy Audio Files (*.aac;*.m4a;*.mpc;*.mpp;*.mp+;*.ogg;*.ogm;*.spx)" 本帖最后由 仙乃日 于 2010-7-28 15:23 编辑
reg-root, subkey[, value-entry-name][, flags][, value]
reg-root 必选项。注册表根键。
subkey 必选项,子键或分支,所指定注册表根下要设置的注册表路径的值。
value-entry-name可选项。值项名称,用于指定现有子项值中的值名称。
value 可选项(适用WindowsXP以后版本)。值项数据。
flags 可选项(适用WindowsXP以后版本)。操作参数,用于指定控制注册表操作的值。
参数具体如下:
FLG_DELREG_KEYONLY_COMMON 8192 0x00002000 删除子键
FLG_DELREG_32BITKEY 16384 0x00004000 修改32位注册表,默认本地注册表
FLG_DELREG_MULTI_SZ_DELSTRING 98306 0x00018002 删除值项
更新ini文件操作
本帖最后由 仙乃日 于 2010-7-28 15:26 编辑ini-file,ini-section,, ,
ini-file 必选项,更改条目的 .ini文件的文件名。名必须是字符串或字符串主项(字符串主项的形式可为 %strkey%,其中 strkey 是在 .inf 文件的 Strings 节中定义的)。在任何情况下名称都必须是有效文件名。名称应包括文件所在文件夹的名称,但是文件夹名应以逻辑目录标识符 (LDID) 指定,而不是实际名称。在安装期间安装程序将用实际名称替换 LDID。LDID 的形式为 %ldid%,其中 ldid 是预定义标识符或在 DestinationDirs 节中定义的标识符。注意常数 LDID_BOOT 和 LDID_BOOTHOST 被替换,在路径中加上反斜线。例如,LDID_BOOT 用 C:\ 替换。但是在 .inf 文件中可以使用反斜线,也可以不使用。例如,在引导驱动器的根中,可以使用“%30%boot.ini”和“%30%\boot.ini”来引用 BOOT.ini。
ini-section 必选项,更改条目的.ini 文件中的节名。
old-ini-entry 可选项,现有条目,常用形式为 Key=Value。
new-ini-entry 可选项,替换、删除或添加的条目,常用形式为 Key=Value。主项或值都可以指定可替代字符串。例如,在参数 new-ini-entry 中指定的主项或值可能为 %String1%,替代 %String1% 的字符串定义在 .inf 文件的 Strings 节 指定主项和值时可以使用星号 (*) 通配符,可以正确地解释此符号。
flags 可选项。操作参数。
这个操作项在win9x的系统比较经常使用。 本帖最后由 仙乃日 于 2010-7-28 16:30 编辑
ini-file,ini-section,profile-name,,,
ini-file 必选项,要更改的 .ini 文件的文件名。
ini-section 必选项,.ini 文件中要更改的节名。
profile-name 必选项,.ini 文件中要更改的条目名称。
rold-field 可选项。.ini 文件中要删除的“字段”值。
new-field 可选项,要添加.ini 文件而原来没有的字段值。
flags 可选项。 本帖最后由 仙乃日 于 2010-7-28 16:33 编辑
ini-file,ini-section,,reg-root,subkey[,flags]
ini-file 必选项,要复制到注册表的 .ini 文件的文件名。
ini-section 必选项,要复制到注册表的.ini文件中的节名。
ini-key 可选项,要复制到注册表的 .ini 文件中的项名。如果 ini-key 为空,则将整节复制到指定的注册表项。
reg-root 必选项。目标注册表根键。
subkey 必选项,目标子键或分支。
flags 可选项。操作参数。 本帖最后由 仙乃日 于 2010-7-28 16:40 编辑
dirid, , filename, registration flags[, [, argument]]
dirid 必选项,是逻辑磁盘标识或在DestinationDirs 节中定义的标识符
subdir 可选项,目录路径。
filename必选项。动态链接库名称。
registration flags 必选项,操作参数,用于指定控制动态链接库注册操作的值:
FLG_REGSVR_DLLREGISTER 1 0x00000001 调用DllRegisterServer函数 ,动态链接库系统登录(即注册)
FLG_REGSVR_DLLINSTALL 2 0x00000002 调用DllInstall函数,动态链接库系统登录(即注册)
optional timeout 可选项,延时(秒),缺省延时是60 秒。
argument 可选项,注册命令。缺省是“/RegServer”,用于指定控制注册表操作的值。
例子:
11,,msvcp71.dll,1
11,,msvcr71.dll,1
11,,pncrt.dll,1
11,,rmoc3260.dll,1
11,,DCBassSource.ax,1 本帖最后由 仙乃日 于 2010-7-28 16:42 编辑
dirid, , filename, registration flags[, [, argument]]
dirid 必选项,是逻辑磁盘标识或在 DestinationDirs 节中定义的标识符
subdir 可选项,目录路径。
filename必选项。动态链接库名称。
registration flags 必选项,操作参数,用于指定控制动态链接库注册操作的值:
FLG_REGSVR_DLLREGISTER 1 0x00000001 调用DllUnRegisterServer函数 ,动态链接库系统注销
FLG_REGSVR_DLLINSTALL 2 0x00000002 调用DllInstall函数,动态链接库系统登录(即注册)
optional timeout 可选项,延时(秒),缺省延时是60 秒。
argument 可选项,注册命令。缺省是“/UnRegServer”,用于指定控制注册表操作的值。