驱动总是和inf文件相关,在WinDDK的时候,许多inf文件都需要开发工程师手动编写,不过,现在已经可以使用inx文件来生成inf文件了,它经常用于驱动的安装和卸载;不过,并不是所有的驱动都需要使用inf文件安装,也不是所有inf文件都是用来安装驱动,在inf系列文章的最后,我们会讨论这些额外的情况,不过在那之前,先看一下inf文件的基础知识吧。
INF文件是组织成命名节的文本文件。某些节具有系统定义的名称,某些节的名称由 INF 文件的编写者确定。每个部分都包含由设备安装组件解释的特定于部分的条目。 某些条目以预定义关键字 (keyword) 开头。 这些条目称为指令。
出于特定目的,某些 INF 文件条目基本上是从一个部分到另一个部分的指针。 例如, INF AddReg 指令标识包含指示 Windows 修改注册表的条目的部分。 这些条目有时包括其他参数 。
其他 INF 文件条目不指向其他部分,但提供 Windows 在安装期间使用的信息,例如文件名、注册表值、硬件配置信息、标志等。 例如, INF DriverVer 指令 提供驱动程序版本信息。
当 Windows 开始安装时,它首先查找INF版本部分([Version])来验证 INF 文件的有效性。 然后,它通过查找 INF 制造商([Manufacturer])部分来启动安装。
inf文件的语法规则
区分大小写: 节名称、条目和指令不区分大小写。 例如, version、 VERSION 和 Version 是 INF 文件中同样有效的节名称规范。
必需和可选内容: 任何特定 INF 文件中的必需和可选部分、条目和指令集取决于要安装的设备/驱动程序或组件的类型。安装任何特定设备及其驱动程序所需的一组节、特定于节的条目和指令也在某种程度上取决于相应的类安装程序。
节名称: 节名称的规则如下:
- 可以按任意顺序指定节。 大多数 INF 文件按约定按特定顺序列出节,但 Windows 按名称而不是按 INF 文件中的位置查找节;
- INF 文件中的每个节都以括在方括号 ([ ]) 的节名称开头。 节名称可以是系统定义的,也可以是 INF 编写器定义的。例如, [Manufacturer] 指定系统命名的 Manufacturer 节的开头,而 [Std.按文 种] 表示特定 INF 编写器定义的 Models 节名称。在 Windows 2000 及更高版本的 Windows 上,节名称的最大长度为 255 个字符;
- 每个节在新 [section-name] 的开头或文件末尾标记处结束;
- 如果 INF 文件中的多个节具有相同的名称,系统会将其条目和指令合并到单个节中;
- 除非它用双引号字符括起来 (“) ,否则 INF 编写器定义的节名称必须是唯一到 INF 无引号的显式可见字符字符串,不包括具有 INF 特定含义的某些字符。 具体而言,由节项或指令引用的无引号节名称不能有前导空格或尾随空格、换行符、返回字符或任何不可见的控制字符,并且不应包含制表符。 此外,它不能包含括号 ([ ]) 字符、单个百分比 (%) 字符、分号 (;) 或任何内部双引号 (“) 字符,并且不能将反斜杠 (\) 作为其最后一个字符;
使用字符串标记: INF 文件中的许多值(包括 INF 编写器定义的节名称)可以表示为 strkey% 形式的%字符串键标记。 在 INF 文件的 INF 字符串 部分中,每个字符串键必须与由一系列显式可见字符组成的字符串值相关联。 如有必要,设置代码会将字符串值转换为 Unicode。
行格式、延续和注释: 格式和注释方面的规则如下
- 节中的每个条目和指令都以返回或换行符结尾。 因此,用于创建 INF 文件的文本编辑器不得在编辑器确定的任意字符数之后插入回车符或换行符。
- 反斜杠字符 (\) 可用作条目或指令中的显式行连续符。 但是,路径规范中也使用反斜杠字符。 若要确保路径规范中显示的反斜杠字符不会被错误地解释为行连续符,
- 注释以分号 (开头 ;) 字符。 分析和解释 INF 文件时,系统会假定以下内容与安装过程无关:同一行中分号后面的任何字符,除非分号出现在 “带引号的字符串” 或 %strkey% 标记中除换;行符或返回字符外不包含任何内容的任何空行;
- 逗号分隔节条目和指令中提供的值。INF 文件条目或指令可以在值列表中间省略可选值,但逗号必须保留。 INF 文件可以省略尾随逗号。
- 若要在节条目和指令中提供的值中包含百分比 (%) 字符,请使用另一个百分比字符对百分比字符进行转义。
- 若要在节条目和指令中提供的值中包含双引号 (“) 字符,请使用另一个双引号字符转义双引号字符。 请注意,字符串必须位于 “带引号的字符串”内。
INF 大小限制: 在字符串替换和包含终止 NULL 字符之前,INF 文件字段的最大长度(以字符为单位)为 4096。字符串替换后,INF 文件字符串的最大长度(以字符为单位)为 4096,其中包括终止 NULL 字符。
INF文件解析1
下面是官方给出一个inf例子,以显示任何 INF 文件如何由部分组成,每个部分都包含零行或更多行,其中一些是引用其他 INF 编写器定义的部分的条目::
[Version]
Signature = "$Windows NT$"
Class = Mouse
ClassGUID = {4D36E96F-E325-11CE-BFC1-08002BE10318}
Provider = %Provider% ; defined later in Strings section
DriverVer = 09/28/1999,5.0.2136.1
CatalogFile = ExampleCatalog.cat
PnpLockdown = 1
[DestinationDirs]
DefaultDestDir = 13
; ... [ControlFlags] section omitted here
[Manufacturer]
%StdMfg% = StdMfg ; (Standard types)
%MSMfg% = MSMfg ; Microsoft
; ... other Manufacturer entries omitted here
[StdMfg] ; per-Manufacturer Models section
; Std serial mouse
%*pnp0f0c.DeviceDesc% = Ser_Inst,*PNP0F0C,SERENUM\PNP0F0C,SERIAL_MOUSE
; Std InPort mouse
%*pnp0f0d.DeviceDesc% = Inp_Inst,*PNP0F0D
; ... more StdMfg entries and following MSMfg and xxMfg Models sections omitted here
; per-Models DDInstall (Ser_Inst, Inp_Inst, etc.) sections also omitted here
[Strings]
; where INF %strkey% tokens are defined as user-visible (and
; possibly as locale-specific) strings.
Provider = "Microsoft"
; ...
StdMfg = "(Standard mouse types)"
MSMfg = "Microsoft"
; ...
*pnp0f0c.DeviceDesc = "Standard Serial Mouse"
*pnp0f0d.DeviceDesc = "InPort Adapter Mouse"
; ...
以前的 INF 文件中的几个部分具有系统定义的名称,例如 Version、 DestinationDirs、 Manufacturer 和 Strings。 某些命名节(如 Version、 DestinationDirs 和 Strings) 仅包含简单的条目。 其他引用其他 INF 编写器定义的部分,如制造商(Manufacturer)的 上一个示例所示。
请注意鼠标设备驱动程序安装相关部分的隐含层次结构,从上一示例中的 “制造商 ”部分开始。 下图显示了 INF 文件中某些节的层次结构:
请注意以下有关 INF 文件的隐式层次结构:
- “制造商”[Manufacturer]部分中的每一个项都引用 INF 文件中其他位置 (StdMfg、MSMfg) 中的每个制造商的型号部分;
- 每个模型部分([models-section-name])指定一些条目数;在示例中,它们以 xxx 开头,%DeviceDesc% ;
- 每个这样的 %xxx.DeviceDesc% 令牌引用该制造商产品系列 (Ser_Inst和Inp_Inst) 的一些按型号的 DDInstall 部分,每个条目标识单个设备 (*PNP0F0C 和 *PNP0F0D,因此此处显示的“DeviceDesc”) 或一组设备的兼容型号;
- 每个此类 DDInstall-typeXxx_Inst 节又可以追加某些系统定义的扩展,并且可以包含引用其他 INF 编写器定义的节的指令。 例如,在上一示例中显示为片段的完整 INF 文件也有Server_Inst。服务 部分[Server]及其Ser_Inst节具有 CopyFiles 指令,该指令引用此 INF 文件其他位置的Server_CopyFiles节;