???? 最近要在web中播放视频,但下端厂商不给提供CAB包,只提供一堆dll和ocx,无奈只有自己打了,难点在哪儿?编写INF文件上。摸爬滚打,找了一天,终于解决了,现在分享一篇INF文件介绍的文章。
?
原文地址:http://blog.csdn.net/shanhe/archive/2004/12/25/229368.aspx
?
?
INF文件必须包含以下规则:
?????? 节(Sections)开始于由中括号([])扩起来的节名
必须包含版本信息节以表明自己属于win95还是winnt4格式。
值(Value)由%strkey%替代的表达式字符串表达组成,strkey必须在strings节中定义。如果出现%,则用%%替代。
?
Setup程序使用以下各节:
[Version]??????? 必须包含在INF文件中,表明inf文件格式
[Version]
Signature="signature-name"
Class=class-name
ClassGUID=GUID
Provider=INF-creator
LayoutFile=filename.inf[,filename.inf]...
?
Signature-name
参数可以取值 $Windows NT$, $Chicago$, or $Windows 95$(引号括起来).如果不是以上这些字符串,则不被认可为inf文件。 (特别注意!)
Class-name
此参数用于安装设备驱动。详细信息见DDK Programmer's Guide.
GUID
此参数用于安装设备驱动。详细信息见DDK Programmer's Guide.
INF-creator
标示INF的创建者. 典型的情况,此值为inf文件的创建者所在组织
filename.inf
INF文件必须包含SourceDisksFiles 和 SourceDisksNames 节。这些文件的描述文件通常命名为 LAYOUT.INF. 如果文件名不是特别指定,SourceDisksNames 和 SourceDisksFiles 必须出现在当前inf文件中
以下为典型的例子:
[Version]
Signature="$Windows NT$"
Class=Mouse
ClassGUID={4D36E96F-E325-11CE-BFC1-08002BE10318}
Provider=%Provider%
LayoutFile=layout.inf
?
[Strings]
Provider="Corporation X"
?
[Install]?? 此节指定包含的安装指令节,每一个条目将会成为一节
????????????? [install-section-name]
LogConfig=log-config-section-name[,log-config-section-name]...
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]...
UpdateIniFields=update-inifields-section[,update-inifields-section]...
AddReg=add-registry-section[,add-registry-section]...
DelReg=del-registry-section[,del-registry-section]...
Ini2Reg=ini-to-registry-section[,ini-to-registry-section]...
??????
????????????? 以上各条目并非全部必须。节名必须为可见字符。每个条目包含一到多个节。第一个命名之后的所有命名必须以,引导。条目指定了必须出现在INF文件中的各节。CopyFiles则可例外(如果没有任何文件被拷贝)。
如果安装驱动程序,仅仅使用LogConfig条目。详见DDK Programmer's Guide.
????????????? CopyFiles条目中可以包含特殊字符@ 以直接拷贝一个单一文件。文件将拷贝到DefaultDestDir, DestinationDirs节包含了DefaultDestDir的描述。如例子:
????????????? [MyInstall]
CopyFiles= @MyFile.exe
此文件将拷贝到缺省目标目录。
?
为适应不同平台,可以在install节后加上不同的后缀。可以出现defaultInstall.nt这样的节名。install-section-name可选的后缀:
Extension????????????????????????????????????? Platform
.Win?????????????????????????????????????????? Windows 95
.NT?????????????????????????????????????????? Windows NT (all platforms)
.NTx86??????????????????????????????????????? Windows NT (x86 only)
.NTMIPS????????????????????????????? Windows NT (MIPS only)
.NTAlpha??????????????????????????????????? Windows NT (Alpha only)
.NTPPC?????????????????????????????????????? Windows NT (PowerPC only)
?
以下例子展示了如何出现两个copyfiles节:
[Ser_Inst]
CopyFiles=Ser_CopyFiles, mouclass_CopyFiles
?
[Ser_CopyFiles]
sermouse.sys
?
[mouclass_CopyFiles]
mouclass.sys
?
?
?
?
?
?
[Add Registry]?????? 描述如何增加注册表项目。add-registry-section 节名必须处现在install节中的 AddReg 条目中。
????????????? [add-registry-section]
reg-root-string, [subkey], [value-name], [flags], [value]
[reg-root-string, [subkey], [value-name], [flags], [value]]
?????????????
????????????? reg-root-string 注册表的根名:
????????????? HKCR??????????????? HKEY_CLASSES_ROOT.
HKCU??????????????? HKEY_CURRENT_USER.
HKLM??????????????? HKEY_LOCAL_MACHINE.
HKU??????????????? HKEY_USERS.
HKR??????????????? 相关于 SetupInstallFromInfSection.节中指定的值
?
subkey
可选,例如 key1\key2\key3....
?
value-name
可选,标示subkey的值名称。对于字符串类型可以空,标示缺省字符串值
?
flag??????? 值类型的标示
Value???????????????????????????? Meaning
FLG_ADDREG_BINVALUETYPE? The value is "raw" data.
FLG_ADDREG_NOCLOBBER???????? 如果注册表中出现不要覆盖此值.
FLG_ADDREG_DELVAL?????????????????????? 从注册表中删除此键
FLG_ADDREG_APPEND?????????????????????? 追加一个值到已存值中,仅仅支持REG_MULTI_SZ 值
FLG_ADDREG_TYPE_MASK?????????????? Mask.
FLG_ADDREG_TYPE_SZ??????????????? REG_SZ类型
FLG_ADDREG_TYPE_MULTI_SZ? REG_MULTI_SZ.
FLG_ADDREG_TYPE_EXPAND_SZ REG_EXPAND_SZ.
FLG_ADDREG_TYPE_BINARY??? REG_BINARY.
FLG_ADDREG_TYPE_DWORD??? REG_DWORD.
FLG_ADDREG_TYPE_NONE?????????????? REG_NONE.
???????????????????? Windows 95 安装程序将视扩展数据类型为REG_SZ or REG_BINARY.
????????????????????
value
可选. 16进值或者字符串
??????
?
?
?
?
?
?
[CopyFiles]?????? 此类节可以有多个,定义于install节中。
???????????????????? [file-list-section]
destination-file-name[,source-file-name][,temporary-file-name][,flag]
[destination-file-name[,source-file-name][,temporary-file-name]][,flag]
.
???????????????????? destination-file-name
目标文件名,如果没有给出源文件名,那么此名也是源文件名.
source-file-name
源文件名,如果没有给出目标文件名,那么此名也是目标文件名.
temporary-file-name
被忽略,setup函数自动处理临时文件.
flag
可选,用于控制文件如何被拷贝。你必须配置实际值
COPYFLG_WARN_IF_SKIP (0x00000001)
如果用户试图在发生一个错误后跳过将显示警告信息
COPYFLG_NOSKIP (0x00000002)
不允许用户跳过拷贝此文件
COPYFLG_NOVERSIONCHECK (0x00000004)
如果文件存在于目标目录,忽略
COPYFLG_FORCE_FILE_IN_USE (0x00000008)
替换被使用得文件?,当拷贝时文件被使用
COPYFLG_NO_OVERWRITE (0x00000010)
不覆盖目标文件中已存文件
COPYFLG_NO_VERSION_DIALOG (0x00000020)
如果目标文件已存且新则不覆盖也不出现对话框
COPYFLG_REPLACEONLY (0x00000040)
替换目标文件
?
?
?
[delete Registry]?????? 描述如何增加注册表项目。del-registry-section 节名必须处现在install节中的 DelReg 条目中。
????????????? [del-registry-section]
reg-root-string, [subkey], [value-name], [flags], [value]
[reg-root-string, [subkey], [value-name], [flags], [value]]
?????????????
????????????? reg-root-string 注册表的根名:
????????????? HKCR??????????????? HKEY_CLASSES_ROOT.
HKCU??????????????? HKEY_CURRENT_USER.
HKLM??????????????? HKEY_LOCAL_MACHINE.
HKU??????????????? HKEY_USERS.
HKR??????????????? 相关于 SetupInstallFromInfSection.节中指定的值
?
subkey
?
value-name
可选,标示subkey的值名称。对于字符串类型可以空,标示缺省字符串值
?
?
[Delete Files]?????? 此节指定需要被删除的文件,节名必须出现在install中的delfiles条目中
????????????? [file-list-section]
file-name[,,,flag]
?????????????
????????????? flag
????????????? 可选。
DELFLG_IN_USE (0x00000001)
当因为文件正被使用,SetupCommitFileQueue 取消, 将排队在系统重新启动时候被删除。
如果不使用此值,则安装时候被使用的文件不会被delete files指定节删除
DELFLG_IN_USE1 (0x00010000)
高字节版本的DELFLG_IN_USE. Setting DELFLG_IN_USE1 差别在于同样可适用于Copyfiles节和delete Files节即使COPYFLG_WARN_IF_SKIP 标志被使用。
?
?
[INI File to Registry] 此节指示那些ini文件中的条目将对应到注册表。
???????????????????? [ini-to-registry-section]
ini-file, ini-section, [ini-key],reg-root-string,subkey[,flags]
?
ini-file
ini文件名.
ini-section
ini文件的节
ini-key
条目
flags
指示当注册表存在对应的注册表项目是否是否覆盖旧值。
Bit??????? value?
0??????? 0?????????????? 缺省,不删除ini文件项目,当ini转移到注册表后
0?????? 1?????????????? 删除ini文件中的项目,当ini转移到注册表后?
1??????? 0?????????????? 缺省,当注册表存在此子项,则不覆盖
1??????? 1?????????????? 覆盖
?
?
[Rename Files]????????????? 此类型节列出那些将样改名的文件。此节名必须出现在install节中
????????????? [rename-files-section-name]
new-file-name,old-file-name
?
new-file-name
新文件名
old-file-name
原来的文件名。此参数必须定义于 SourceDisksFiles 节中。
?
?
[Update INI Fields]??????????? 此节替换、增加、删除指定ini文件的条目。此节名必须存在于install节中。
????????????? [update-inifields-section-name]
ini-file,ini-section,profile-name,[old-field],[new-field],[flags]
????????????
????????????? 参数说明见上
?
?
[Update INI File]? 此节删除、替换或者新增INI 的项目. 节名必须处现在install节中的 UpdateInis 条目中
????????????? update-ini-section-name]
ini-file,ini-section,[old-ini-entry],[new-ini-entry],[flags]
?????????????
????????????? ini-file
包含将要改变的条目的ini文件。
ini-section
节名
old-ini-entry
可选的,通常为key=value形式
new-ini-entry
可选。通常来自key=value. key 或者value可以为可替换的字符串。
flags
可选命令标志.
Value?????????????? Meaning
0?????????????????? 缺省。如果old-ini-entry key 出现在INI file 条目中, 将被new-ini-entry替换。 值会被忽略,只要key匹配即可。为无条件增加新条目到ini文件,可设置 old-ini-entry为NULL。 为无条件从ini文件中删除old-ini-entry from,设置 new-ini-entry 为NULL。
1?????????????????? 如果 old-ini-entry 的key 和value 已经存在于 INI 文件,将被 new-ini-entry替换。? old-ini-entry 参数的key和value都必须匹配
2?????????????????? 如果old-ini-entry 参数没有出现在INI 文件中, 将不进行任何替换
若 old-ini-entry 的key存在于INI 文件且new-ini-entry的key存在于 INI 文件, INI 文件中匹配的 new-ini-entry 的key参数被删除,? old-ini-entry 的key匹配参数被替换
?
3?????????????????? 类似2,但是,例外情况为:old-ini-entry 参数匹配基于key和value,并不限于key
?
可以使用通配符 (*)指代key和value的一部分和全部
?
ini文件名可以为字符串或者字符键。即%strkey% ,此 strkey 定义于[Strings]节,且必须是一个合法文件名。
?
Ini文件明应当包含目录,可以是直接目录,也可以是特定目录标示符。
可以拥有%dirid% 指定目录,dirid指定于 SetupSetDirectoryId节中. 当时用目录标示符,你应当使用反斜线号于一个目录路径中。举例:,你可以使用 %11%\card.ini 表示 CARD.INI 存在于System32 目录中。
?
以下为例子:
?
%11%\sample.ini, Section1,, Value1=2???????????? ; 新增一个条目
%11%\sample.ini, Section2, Value3=*,???????????? ; 删除老条目
%11%\sample.ini, Section4, Value5=1, Value5=4???? ;替换老条目
?
?
?
?
[Services]条目?????? 此节条目列出增加和删除的服务列表。
?
????????????? [install-section-name.Services]
AddService=ServiceName,flag,service-install-section[,event-log-install-section]
DelService=ServiceName
?????????????
????????????? ServiceName
将要安装/删除的服务名
flag
指定将如何增加服务。此参数仅用于AddService 键,取值为:
SPSVCINST_TAGTOFRONT (0x1)
将服务标签题见到服务所在组的前列
SPSVCINST_ASSOCSERVICE (0x2)
此增加的服务关联的服务.
service-install-section
服务安装节
event-log-install-section
时间记录安装节。
?
以下为例子:
????????????? [Ser_Inst.Services]
AddService = sermouse, 0x00000002, sermouse_Service_Inst, sermouse_EventLog_Inst ; Port Driver
AddService = mouclass,, mouclass_Service_Inst, mouclass_EventLog_Inst
?????????????????????? ; Class Driver
?
[Service Install]????????????? 此节列出将要安装的每一个服务信息
?????? [install-section-name_ServiceInstallSection]
DisplayName=[name]
ServiceType=type-code
StartType=start-code
ErrorControl=error-control-level
ServiceBinary=path-to-service
LoadOrderGroup=[load-order-group-name]
Dependencies=+depend-on-group-name[[,depend-on-service-name]...]
StartName=[driver-object-name]
?????????????
????????????? name
可选,友好的服务名称
type-code
驱动类型。为任何被theCreateService 函数认可的参数。
start-code
何时启动驱动程序。可为:
SERVICE_BOOT_START (0x0)
由操作系统loader启动。使用此值仅用于操作系统基本服务。
SERVICE_SYSTEM_START (0x1)
操作系统初始化式启动。
SERVICE_AUTO_START (0x2)
SCM在系统启动期间启动
SERVICE_DEMAND_START (0x3)
SCM根据需要启动
SERVICE_DISABLED (0x4)
此服务不可被启动
error-control-level
指定错误控制级别。
CRITICAL (0x3)
如果驱动装载失败,启动失败。如果启动不是在 “最后一次正确(LastKnownGood.)”控制集,切换到LastKnownGood。如果启动试图用于 LastKnownGood, 运行故障检查例程
SEVERE (0x2)
如果启动不是用于 LastKnownGood , 切换到LastKnownGood。如果启动试图LastKnownGood, 发生错误时继续启动。
NORMAL (0x1)
若初始化时失败,启动将继续,但显示警告信息
IGNORE (0x0)
若初始化时失败,启动将继续,无警告信息
path
二进制文件路径
load-order-group-name
可选. 指示服务处在的服务组中的次序: pointer, port, primary disk, and so forth.
+depend-on-group-name
可选,服务依赖的服务组,服务仅当该组的最后一个服务都启动后才启动
depend-on-service-name
可选。依赖的服务。
driver-object-name
可选。如果类型属于 Kernel driver或者file system driver,,此名用于I/O管理器装载的名称
例子:
[mouclass_Service_Inst]
DisplayName??? = %mouclass.SvcDesc%
ServiceType??? = 1????????????????? ; SERVICE_KERNEL_DRIVER
StartType????? = 1????????????????? ; SERVICE_SYSTEM_START
ErrorControl?? = 1????????????????? ; SERVICE_ERROR_NORMAL
ServiceBinary? = %12%\mouclass.sys
LoadOrderGroup = Pointer Class
?
?
[DestinationDirs]?????? 此节用于指定(copy file ,rename file等节中的目标目录)
?????? [DestinationDirs]
file-list-section=drid[,subdir]
.????? .
[DefaultDestDir=drid[,subdir]]
?
file-list-section
?Copy Files, Rename Files, 或者Delete Files 节名. drid
目录标示(DRID)。 安装程序在安装期间替换一个 DIRID采用实际的目录
DIRID? %dirid% 为预先定义的目录
DIRID 可为以下值:
-01,0xffff?????????????? 目录
01??????????????????????? SourceDrive:\path.
10??????????????????????? Windows directory.
11??????????????????????? System directory. (%windir%\system on Windows 95, %windir%\system32 on Windows NT)
12??????????????????????? Drivers directory.(%windir%\system32\drivers on Windows NT)
17??????????????????????? INF 文件目录
18??????????????????????? help目录
20???????????????????????? Fonts directory.
21??????????????????????? 察看器目录
24???????????????????????? 应用程序目录
25??????????????????????? 共享目录Shared directory.
30???????????????????????? 启动驱动器的根目录Root directory of the boot drive.
50???????????????????????? %windir%\system
51??????????????????????? 假脱机目录Spool directory.
52???????????????????????? Spool drivers directory.
53??????????????????????? 用户 Profile 目录
54???????????????????????? ntldr or OSLOADER.EXE 所在目录
?
subdir
子目录名
可选项 DefaultDestDir 提供缺省的目标目录。如果DefaultDestDir 未用于 DestinationDirs 节,缺省的目录设为 drid_system.
?
?
[SourceDisksFiles]????????? 此节指定源安装盘上的文件
????????????? 为了允许多操作系统分发源文件,你可构造针对特定平台的SourceDisksFiles 节举例来讲, 在 MIPS 平台上,所有安装功能在用到 SourceDisksFiles 节将首先查找 SourceDisksFiles.Mips 节。 如果安装功能未找到 SourceDisksFiles.Mips 节, 或者某个特定行未能在那里找到,安装功能将使用 SourceDisksFiles 节。此行为直接或间接影响安装功能处理 SourceDisksFiles节作为其进程的一部分。
?????? 大小写不敏感的前缀可为:
????????????? alpha
mips
ppc
x86
?
????????????? [SourceDisksFiles]
filename=disk-number[,subdir][,size]
?????? filename
??????????????? 在源此盘上的文件名
disk-number
??????????????? 第几号源盘包含此文件。大于等于1,且定义于 SourceDisksNames 节
subdir
??????????????? 可选参数。在源盘上的子目录,缺省为源盘的跟目录
size
???????? 可选参数,文件的压缩尺寸
????????
???????? [SourceDisksFiles]
???????? SRS01.x86 = 1?????????????????????? ;源文件SRS01.x86存在于安装盘一号盘的根目录
?
?
[SourceDisksNames]???????? 指示源文件的磁盘名称
???????? 为了允许多操作系统分发源文件,你可构造针对特定平台的SourceDisksNames节举例来讲, 在 MIPS 平台上,所有安装功能在用到 SourceDisksNames节将首先查找 SourceDisksNames.Mips 节。 如果安装功能未找到 SourceDisksNames.Mips 节, 或者某个特定行未能在那里找到,安装功能将使用 SourceDisksNames节。此行为直接或间接影响安装功能处理 SourceDisksNames节作为其进程的一部分。
大小写不敏感的前缀可为:
????????????? alpha
mips
ppc
x86
?
???????????? [SourceDisksNames[.platform]]
???????????? disk-ordinal="disk-description"[,[disk-label],[unused,path]
.??????????????
??????????????? platform
????????????????? 指示源文件应用的平台指示符。
??????????????? disk-ordinal
??????????????????????????????? 磁盘序号
??????????????? disk-description
??????????????????????????????? “”包含的字符串,用于标示磁盘。
??????????????? disk-label
??????????????????????????????? 磁盘卷标
??????????????? unused
??????????????????????????????? 保留未用
??????????????? path????????????????
??????????????????????????????? 可选参数,源文件的绝对路径,如果未用,则表示示根目录
??????????????? 如下例子中, write.exe 所有平台都一样,且存在于源盘1的\common 目录。圆盘1将所有平台都一致的文件存在于\common目录中。 CMD.EXE 文件特定于平台,磁盘2指示安装功能针对每一个平台的特定目录。HALNECMP.DLL 文件特定于MIPS 平台。
??????????????? [SourceDisksNames]
??????????????? 1 = "Windows NT CD-ROM", Instd1,, \common
???????????????
??????????????? [SourceDisksNames.Alpha]
??????????????? 2 = "Windows NT CD-ROM", Instd1,, \alpha
???????????????
??????????????? [SourceDisksNames.Mips]
??????????????? 2 = "Windows NT CD-ROM", Instd1,, \mips
???????????????
??????????????? [SourceDisksNames.x86]
??????????????? 2 = "Windows NT CD-ROM", Instd1,, \x86
???????????????
??????????????? [SourceDisksNames.ppc]
??????????????? 2 = "Windows NT CD-ROM", Instd1,, \ppc
?
??????????????? [SourceDisksFiles]
??????????????? write.exe = 1
??????????????? cmd.exe = 2
?
??????????????? [SourceDisksFiles.Mips]
??????????????? halnecmp.dll = 2
???????????????
[EventLog Install]??????????????? 该节往注册表中加入事件消息文件,也可利用此节移除事件消息文件。
??????????????? [install-section-name_EventLogInstallSection]
??????????????? AddReg=add-registry-section
??????????????? DelReg=del-registry-section
??????????????
??????????????? add-registry-section
??????????????? del-registry-section
???????????????????????????????????? 事件消息节名
??????????????? AddReg???????????????????????????? 指示哪节将作为增加事件的注册表项
??????????????? DelReg??????????? 指示删除事件项
???????????????
??????????????? 以下为典型的 EventLog 安装节:
??????????????? [sermouse_EventLog_Inst]
??????????????????????????????? AddReg=sermouse_EventLog_AddReg?????????????
??????????????? [sermouse_EventLog_AddReg]
???????? HKR,EventMessageFile,0x00020000,"%%SystemRoot%%\System32\IoLogMsg.dll\;%%SystemRoot%%\System32\drivers\sermouse.sys"
??????????????? HKR,,TypesSupported,0x00010001,7
?
?
?
?
[Strings]??? 该节定义了1个或多个字符串关键字. 一个字符串key 展开一个可打印字符串
可以有针对特定语言的String节
?
??????????????? [Strings[.langid]]
??????????????? strings-key=value
???????????????
??????????????? langid
??????????????????????????????? 可选的指示string节所属语言的语言标示符. 举例, U.S. English 是 0409 以及Standard French 是 040c.
??????????????? strings-key
??????????????????????????????? 由字符和数字组成的唯一名符
??????????????? value
??????????????????????????????? 展开后的字符串内容
???????????????
??????????????? 例子:
?
??????????????? [Strings]
??????????????? String0="Corporation X"
??????????????? String1="Corporation X"
??????????????? String2="CS2590 SCSI Adapter"
?
??????????????? 特定语言的例子:
??????????????? [Strings.0409]
??????????????? ; American English strings
??????????????? S1 = "Hello"
???????????????
??????????????? [Strings.0009]
??????????????? ; British English strings
??????????????? ; Note that 0009 is used instead of 0809 to make this the default
??????????????? ; for English languages other than U.S. English.
??????????????? S1 = "Greetings"
???????????????
??????????????? [Strings]
??????????????? ; French strings
??????????????? ; Not specifying a langid makes this the default
??????????????? S1 = "Bonjour"
???????????????
???????????????
??????????????? 注释
??????????????? 尽管此节通常处于inf文件的最后一节,但是定义的字符串Key可用于inf文件任何位置。安装程序将展开字符串
??????????????? 如果用到%,请使用%%。
??????????????? Windows 95: 不可包含strings节,不支持多语言.