记录windows驱动开发inf文件详解
记录windows驱动开发inf文件详解
Windows 驱动程序开发相关
1. 驱动的注册表位置:
1.
硬件子键:
HKEY_LOCATION_MACHINE\SYSTEM\ControlSet001\Enum
指明硬件的HID,VID,DID等跟硬件和硬件厂商相关的信息。
2.
服务子健:
HKEY_LOCATION_MACHINE\SYSTEM\ControlSet001\Services
它主要是跟驱动相关的,指明驱动的路径,以及驱动名字。
**3.
类子健:**
HKEY_LOCATION_MACHINE\SYSTEM\ControlSet001\Control\Class,
指明INF文件。
2. INF 详解
INF 文件是一个文本文件,由许多按层次结构排列的节组成
规则一:**
**INF
文件是分节的,每一个
INF
文件有许多的节组成,节名用方括号括起来。**
这些节名有些是系统定义好的,有一些是用户自定义的。每一个节名最长为
255
个字符(
Windows 2000/XP/2003
操作系统中)或
28
个字符(
Windows 98
操作系统中)。节与节之间没有先后顺序的区别,另外,同一个
INF
文件中如果出现两个同样的节名,则系统会自动将这两个节名下面的条目合并到一起。
规则二:
**在节与节之间的内容叫条目,每一个节又是由许多的条目组成的,每一个条目都是由形如
“signature="$CHICAGO$"”
的形式组成的。如果每一个条目的等号后有多个值,则每一个值之间用
“
,
”
号分隔开。**
规则三:**
**INF
文件对大小写不敏感。**
规则四:
**“
;
”
号后面的内容为注释。**
规则五:**
**如果一个条目的内容过多,在一行无法书写完全,则用
“\”
将一行内容书写为多行。**
INF
文件中常用的节
节 | 说明 |
Version | INF 文件的开始 |
SourceDisksNames | 指明去的那个程序所在的磁盘或 CD-ROM |
SourceDisksFiles | 指明驱动程序的文件名 |
Destination | 指明 INF 文件和驱动程序的目标文件 |
Manufacturer | 指明供应商及其对应 Models 节的名称 |
Models | 指明 Install/DDInstall 节的名称、设备的硬件 ID 等信息 |
Install ( Windows 98 ) Install ( Windows 2000 ) | 指明需复制的文件、想注册表中添加的内容等信息 |
DDInstall.Services 仅适用于 Windows 2000 | 指明驱动程序安装的详细信息 |
String | 指明一系列字符串 |
2.1 Version
Version
节通常作为
INF
文件的开始,下表列出了其包含的各项。所有
INF
文件都必须含有
Version
节及其
Signature
项
Version
节中的各项
项 | 说明 |
Signature | 指明驱动程序的签名,其取值为: $Windows NT$ 、 $Windows 95$ 、 $Chicago$ 、 |
Class | 指明驱动程序所属的类别 |
ClassGuid | 指明设备类的 GUID ,其格式为: {nnnnnnnn-nnnn-nnnn-nnnnnnnnnnnn} ① |
Provider | 指明该 INF 文件的供应商 |
LayoutFile | 仅由 内部提供的 INF 文件使用 |
CatalogFile | 指明数字签名文件的文件名,其扩展名为 .cat |
DriverVer | 指明驱动程序的版本信息,其格式为: mm/dd/yyyy[,x.y.v.z] |
注: ① n 代表一个 16 进制数 |
下面对主要的各项进行详细介绍。
①
.Signature
项:指明驱动程序的签名。对于
Windows 98
和
Windows 2000
下的
USB
设备驱动程序,该项的取值通常为
“$Chicago$”
。
②
.Class
和
ClassGuid
项:指明驱动程序所属的设备类别及其
GUID
。
常用设备类别及其
GUID
Class | ClassGuid | 说明 |
1394 | 6BDD1FC1-810F-11D0-BEC7-08002BE2092F | 1394 主控制器 |
CDROM | 4D36E965-E325-11CE-BFC1-08002BE10318 | CD-ROM 驱动器 |
DiskDrive | 4D36E967-E325-11CE-BFC1-08002BE10318 | 磁盘驱动器 |
Display | 4D36E968-E325-11CE-BFC1-08002BE10318 | 显示适配器 |
FDC | 4D36E969-E325-11CE-BFC1-08002BE10318 | 软盘驱动器 |
HDC | 4D36E96A-E325-11CE-BFC1-08002BE10318 | 硬盘控制器 |
HIDClass | 745a17a0-74d3-11d0-b6fe-00a0c90f57da | 人机接口设备 |
Keyboard | 4D36E96B-E325-11CE-BFC1-08002BE10318 | 键盘 |
Modem | 4d36e96c-e325-11ce-bfc1-08002be10318 | 调制解调器 |
Monitor | 4d36e96e-e325-11ce-bfc1-08002be10318 | 监视器 |
Mouse | 4d36e96f-e325-11ce-bfc1-08002be10318 | 鼠标 |
Net | 4d36e972-e325-11ce-bfc1-08002be10318 | 网络适配器 |
Ports | 4d36e978-e325-11ce-bfc1-08002be10318 | 端口( COM&LPT ) |
Printer | 4d36e979-e325-11ce-bfc1-08002be10318 | 打印机 |
System | 4d36e97d-e325-11ce-bfc1-08002be10318 | 系统设备 |
TapeDrive | 6D807884-7D21-11CF-801C-08002BE10318 | 磁带驱动器 |
USB | 36FC9E60-C465-11CF-8056-444553540000 | USB |
③
.DriverVer
项:指明驱动程序的版本信息。其
“mm/dd/yyyy”
代表月
/
日
/
年;
“x.y.v.z”
代表驱动程序的版本号,它是可选的。
2.2 SourceDisksNames
SourceDisksNames
节指明设备驱动程序所在的磁盘或
CD-ROM
,其各项的格式如下:
diskid=disk-description,disk-label,disk-serial-number (Windows 98)
diskid=disk-description[,[tagfile][,unused,path]] (Windows 2000)
其中,
“diskid”
指出磁盘驱动器的编号,它是正整型数,通常从
1
开始,且不能重复;
“disk-description”
表示磁盘的描述信息,他通常为一个字符串。对于
Windows 98
,
“disk-label”
指出磁盘的卷标;
“disk-serial-numbe”
指出磁盘的序列号。对于
Windows 2000
,
“tagfile”
指出磁盘标签文件的文件名;
“unused”
保留未用;
“path”
指出驱动程序所在的路径;
“[ ]”
表示可选参数。
2.3 SourceDisksFiles
SourceDisksFiles
节指明设备驱动程序的文件全路径,其各项格式如下:
filename=diskid[,subdir] (Windows 98)
filename=diskid[,[,subdir][,size]] (Windows 2000)
其中,
“filename”
指出驱动程序的文件名;
“diskid”
指出磁盘驱动器的编号;
“subdir”
指出该文件在磁盘上的路径;
“size”
指出该文件未经压缩时的大小,以字节为单位。
2.4 DestinationDirs
DestinationDirs
节指明
INF
文件和设备驱动程序的目标目录。
当
INF
文件使用
CopyFiles
、
DelFiles
、
RenFiles
指令时,则必须包含该节
。其各项的格式如下:
DefaultDestDir=dirid[,subdir]
File-list-section=dirid[,subdir]
其中,
“DefaultDestDir”
是一个项名称,代表文件复制、删除、重命名操作的缺省目标目录;
“file-list-section”
指出
CopyFiles
、
DelFiles
、
RenFiles
指令所引用的节;
“dirid”
指出目标目录值,见下表;
“subdir”
指出
dirid
目录下的子目录。
DestinationDirs
节中的常用
dirid
dirid | 目标目录 | dirid | 目标目录 |
10 | Windows 目录: %windir% | 17 | INF 目录 |
11 | 系统目录 Windows 98:%windir%/system Windows 2000:%windir%/system32 | 18 | 帮助目录 |
20 | 字体目录 | ||
12 | 驱动程序目录 Windows 98:%windir%/system/IoSubsys Windows 2000:%windir%/system32/drivers | 23 | 颜色目录 |
24 | 应用程序目录( Windows2000 ) | ||
13 | 命令目录( Windows98 ) | 25 | 共享目录 |
14 | 控制面板目录( Windows98 ) | 50 | %windir%/system(Windows2000) |
15 | 打印机目录( Windows98 ) | 54 | Ntldr.exe 和 osloader.exe 所在的目录( Windows2000 ) |
16 | 工作组目录( Windows98 ) | 55 | 打印处理器目录( Windows2000 ) |
2.5 Manufacturer
Manufacturer
节指明供应商及其对应
Models
接的名称,其各项的格式如下:
%strkey%=models-section-name
其中,
“strkey”
代表设备制造的名字,其字符串值在
String
节中定义;
“models-section-name”
指出
Models
节的名称。
**32
位和
64
位自适应安装,**
%strkey%=models-section-name,NT,NTamd64 //
(逗号分隔)然后在
Models
中增加
[models-section-name.NT]
和
[models-section-name.NTamd64]
两个节即可。
2.6 Models
Models
节指明
Install/DDInstall
节的名称、设备的硬件
ID
和兼容
ID
等信息,其节名称由
Manufacturer
节指定。其各项的格式如下:
device-description= install-section-name
,hw-id[,compatiable-id…]
其中,
“device-description”
指出设备的表述信息,他可以是一个字符串,也可以使一个
%strkey%
;
“install-section-name”
指出
Install/DDInstall
节的名称;
“hw-id”
指出设备的硬件
ID
;
“compatiable-id”
指出设备的兼容
ID
。
2.7 Install/DDInstall
Install/DDInstall
节指明需复制的文件、想注册表中添加的内容等信息,其节名称由
Models
节指定。下表列出了其包含的常用项。
Install/DDInstall
节中的常用项
项 | 说明 |
DriverVer | 指明驱动程序的版本信息,格式为: mm/dd/yyyy[,x.y.z] |
CopyFiles | 指明需复制的文件,格式为: CopyFiles=@filename |
AddReg | 指明向注册表中添加的其他 INF 文件按,格式为: AddReg=add-registry-section[,add-registry-section]… |
Include | 指明安装时需要的其他 INF 文件,格式为: Include=filename.inf[,filename2.inf]… |
Needs | 指明安装时所需的特定 INF 文件,格式为: Needs=inf-section-name[,inf-section-name]… |
Delfiles | 指明需删除的文件,格式为: Delfiles=inf-section-name[,inf-section-name]… |
RenFiles | 指明需重命名的文件,格式为: Renfiles=inf-section-name[,inf-section-name]… |
DelReg | 指明需删除的注册表内容,格式为: DelReg=del-registry-section[,del-registry-section]… |
Install/DDInstall
节中的常用项的详细介绍。
CopyFiles
项:它是
Install/DDInstall
节中的一个基本指令,用于指明需要复制的文件。其
“filename”
指出目标文件名;
“file-list-section”
是其创建的文件列表节,该节格式为
[file-list-section]
destination-file-name
[,source-file-name][,temporary-file-name][,flag]
其中,
“destination-file-name”
指出目标文件名;
“source-file-name”
指出源文件名,如果其和目标文件名相同,则可忽略该参数;
“temporary-file-name”
指出复制操作过程中所需要的临时文件名,他只适用于
Windows 98
;
“flag”
指出该文件的一些处理方法,其取之情况如下表。
CopyFiles
项中的
flag
参数
值 | 符号 | 说明 |
0x00000400 | COPYFLG_REPLACEONLY | 仅替换目标目录中的文件 |
0x00000800 | COPYFLG_NODECOMP | 复制并不解压缩 |
0x00000008 | COPYFLG_FORCE_FILE_IN_USE | 将源文件赋值为临时文件名,以重新命名 |
0x00000010 | COPYFLG_NO_OVERWRITE | 不替换原有文件 |
0x00001000 | COPYFLG_REPLACE_BOOT_FILE | 强制用户重新引导系统 |
0x00002000 | COPYFLG_NOPRUNE | 强制复制文件 |
0x00000020 | COPYFLG_NO_VERSION_DIALOG | 不覆盖新版本的文件 |
0x00000004 | COPYFLG_NOVERSIONCHECK | 可覆盖任何版本的文件 |
0x00000040 | COPYFLG_OVERWRITE_ORDER_ONLY | 仅覆盖旧版本的文件 |
0x00000001 | COPYFLG_WARN_IF_SKIP | 当用户跳过文件时发出警告 |
0x00000002 | COPYFLG_NOSKIP | 不允许用户跳过文件 |
AddReg
项:它是
Install/DDInstall
节所必须包含的指令,用于指明需项注册表中添加的内容。其
“add-registry-section”
是它创建的添加注册表节,该节的格式为
[add-registry-section]
reg-root, [subkey], [value-entry-name], [flags], [value]
其中,
“reg-root”
指出注册表树的根目录,它的取值在下表中;
“subkey”
指出
reg-root
下的子目录(或称子键);
“value-entry-name”
指出要增加的注册表值;
“flags”
指出其对注册表的一些处理方法,取值在下面的
flags
表中;
“value”
指出新增加注册表值的数据。
AddReg
项中的
reg-root
参数
值 | 说明 |
HKCR | HKEY_CLASSES_ROOT |
HKCU | HKEY_CURRENT_USER |
HKLM | HKEY_LOCAL_MACHINE |
HKU | HKEY_USER |
HKR | 被安装设备的注册表键 |
AddReg
项中的
flags
参数
值 | 符号 | 说明 |
0x00000000 | FLG_ADDREG_TYPE_SZ | value 为 REG_SZ 类型 |
0x00000001 | FLG_ADDREG_BINVALUETYPE | value 为 2 进制数据 |
0x00000002 | FLG_ADDREG_NOCLOBBER | 不替换已有注册表中的 value |
0x00000004 | FLG_ADDREG_DELVAL | 从注册表中删除 subkey 或 value-entry-name |
0x00000010 | FLG_ADDREG_KEYONLY | 仅建立 subkey ,忽略 value-entry-name 和 value |
0x00000020 | FLG_ADDREG_OVERWRITEONLY | 仅当 value-entry-name 时替换 value |
0x00010000 | FLG_ADDREG_TYPE_MULTI_SZ | value 为 REG_MULTI_SZ 类型 |
0x00000008 | FLG_ADDREG_APPEND | 添加 value 至已有注册表值 |
0x00020000 | FLG_ADDREG_TYPE_EXPEND_SZ | value 为 REG_EXPAND_SZ 类型 |
0x00010001 | FLG_ADDREG_TYPE_DWORD | value 为 REG_DWORD 类型 |
0x00020001 | FLG_ADDREG_TYPE_NONE | value 为 REG_NONE 类型( Windows2000 ) |
DelFiles
项:它是
Install/DDInstall
节中的可选指令,用于指明需删除的文件。其
“file-list-section”
是它创建的文件列表节,该节的格式为
[file-list-section]
destination-file-name[,,,flag]
其中,
“destination-file-name”
指出目标文件名;
“flag”
指出该文件的一些处理方法,其取值如下表。
DelFiles
项中的
flag
参数
值 | 符号 | 说明 |
0x0000001 | DELFLG_IN_USE | 在其安装处理操作完成后再删除该文件 |
0x0001000 | DELFLG_IN_USE1 | 功能与 DELFLG_IN_USE 一样,仅适用 Windows2000 |
RenFiles
项:它是
Install/DDInstall
节中的可选指令,用于指明需重命名的文件。其
“file-list-section”
是它创建的文件列表节,该节的格式为
[file-list-section]
new-dest-file-name, old-source-file-name
其中,
“new-dest-file-name”
指出该文件的新文件名;
“old-source-file-name”
指出其原有文件名。
DelReg
项:它是
Install/DDInstall
节中的可选指令,用于指明需从注册表中删除的内容。其
“del-registry-section”
是它创建的删除注册表节,该节的格式为
[del-registry-section]
reg-root, subkey [,value-entry-name]
其中,
“reg-root”
指出该注册表树中的根目录,取值与
AddReg
的
ret-root
相同;
“subkey”
指出
reg-root
下的子目录(或称子键);
“value-entry-name”
指出要删除的注册表值。
2.8 DDInstall.Services
DDInstall.Services
节指明驱动程序安装的详细信息,他只是用于
Windows 2000.
他的节名称为
[install-section-name.Services]
,其
“install-section-name”
由
Models
节指定。下表列出了其包含的常用项。
DDInstall.Services
节中的常用项
项 | 说明 |
AddService | 控制驱动程序的安装过程,格式为 AddService=ServiceName,[flags],service-install-section [,event-log-install-section[,[EventLogType][,EventName]]]… |
DelService | 删除一个或多个已有的驱动程序,格式为 DelService=ServiceName [,[flags][,[EventLogType][,EventName]]]… |
Include | 指明安装时所需的其他 INF 文件,格式为 Include =filename.inf [,filename2.inf]… |
Needs | 之敏感转世所需要的特定 INF 文件,格式为 Needs = inf-section-name[,inf-section-name]… |
主要项进行详细介绍。
AddService
项:它是
DDInstall.Services
节所必须包含的指令,用于控制设备驱动程序的安装过程。其
“ServiceName”
指出驱动程序的名字;
“flags”
指出一个或多个系统定义的标识,其取值情况如下表;
“event-log-install-section”
是其创建的事件日志安装,下表中列出了该节所包含的常用项;
“service-install-section”
是其创建的服务安装节,下表中列出了该节所包含的常用项;
“EventLogType”
指出事件日志的类型,其取值为
System
、
Security
和
Application
;
“EventName”
指出事件日志的名字。
AddService
项的常用
flags
参数
值 | 符号 | 说明 |
0x00000002 | SPSVCINST_ASSOCSERVICE | 指明其为 PnP 功能驱动程序 |
0x00000008 | SPSVCINST_NOCLOBBER_DISPLAYNAME | 不覆盖指定服务的名字 |
0x00000100 | SPSVCINST_NOCLOBBER_DESCRIPTION | 不覆盖指定服务的描述 |
0x00000010 | SPSVCINST_NOCLOBBER_STARTTYPE | 不覆盖指定服务的启动类型 |
0x00000020 | SPSVCINST_NOCLOBBER_ERRORCONTROL | 不覆盖指定服务的差错控制值 |
event-log-install-section
节中的常用项
项 | 说明 |
AddReg | 指明向注册表中添加的内容,格式如下 AddReg=add-registry-section[,add-registry-section]… |
DelReg | 指明需删除的注册表内容,格式如下 DelReg=del-registry-section[,del-registry-section]… |
BitReg | 有效但几乎无用,格式如下 BitReg=bit-registry-section[,bit-registry-section]… |
DisplayName | 驱动程序的名字,为字符串值 |
Description | 驱动程序的描述,为字符串值 |
ServiceType | 驱动程序的类型,为特定 16 进制数 |
StartType | 驱动程序的启动类型,为特定 16 进制数 |
ErrorControl | 驱动程序的差错控制级别,为特定 16 进制数 |
ServiceBinary | 驱动程序的完整路径名: %dirid% /filename |
一下是对
event-log-install-section
节中的常用项的主要项进行详细介绍。
<1>ServiceType
项:指明驱动程序的类型,取值情况如下表。
ServiceType
项的取值
值 | 符号 | 说明 |
0x00000001 | SERVICE_BOOT_START | 内核模式驱动程序 |
0x00000002 | SERVICE_KERNEL_FILE_SYSTEM_DRIVER | 上层网络驱动程序或文件系统 |
0x00000010 | SERVICE_WIN32_OWN_PROCESS | Win32 应用程序 |
0x00000020 | SERVICE_WIN32_SHARE_PROCESS | Win32 应用程序 |
<2>StartType
项:指明驱动程序的启动类型,其取值情况如下表。
StartType
项的取值
值 | 符号 | 说明 |
0x0 | SERVICE_BOOT_START | 由操作系统加载程序启动 |
0x1 | SERVICE_SYSTEM_START | 由操作系统初始化过程中启动 |
0x2 | SERVICE_AUTO_START | 由服务控制管理器启动 |
0x3 | SERVICE_DEMAND_START | 由 PnP 管理器或服务控制管理器按需启动 |
0x4 | SERVICE_DISABLE | 禁止启动 |
<3>ErrorControl
项:指明驱动程序的差错控制级别,其取值情况如下表。
ErrorControl
项的取值
值 | 符号 | 说明 |
0x0 | SERVICE_ERROR_IGNORE | 不显示警告信息 |
0x1 | SERVICE_ERROR_NORMAL | 显示警告信息 |
0x2 | SERVICE_ERROR_SERVICE | 当驱动程序加载失败时,系统将使用其注册的 LastKnownGood 重试,并忽略其后的错误 |
0x3 | SERVICE_ERROR_CRITICAL | 当驱动程序加载失败时,系统将使用其注册的 LastKnownGood 重试,并对其后的错误进行检验 |
②
DelService
项:它是
DDInstall.Service
节中的可选指令,用于删除一个或多个已有的设备驱动程序。其
“ServiceName”
指出驱动程序的名字;
“flags”
指出一个或多个系统定义的标识,取值见下表;
“EventLogType”
指出事件日志的类型,其取值为
System
、
Security
或
Application
;
“EventName”
指出事件日志的名字。
DelService
项的
flags
参数
符号 | 说明 |
SPSVCINST_DELETEEVENTLOGENTRY | 删除与 ServiceName 有关的事件日志 |
SPSVCINST_STOPSERVICE | 在删除之前首先停止服务 |
2.9 String
String
节指明一些列字符串,其所含各项的格式为
strkey=[“]some string[“]
其中,
“strkey”
指出字符串的名字,它只能包含字母和数字;
“some string”
为字符串的内容。