大部分人都会安装驱动程序,但不是每个会安装驱动的人都可以看的懂inf文件格式,甚至很多写过一点驱动的人都不是很明白,结合网上看到的关于inf文件的介绍和WDM书籍的介绍,写一些自己的理解。
INF是DeviceInformation File的缩写,是微软公司为硬件厂商发布硬件驱动开发的一种文件格式,INF文件包含硬件信息和控制脚本以控制硬件驱动的安装。
copyright注释
在设备级的驱动中应该包含一个“copyright”的注释(以分号开头的行),以满足CHKINF程序的检查,操作系统可以接受没有这个注释的INF文件,但Microsoft不会认证没有这项内容的驱动程序。(是不是说没有这项内容,微软数字签名是不成功的呢?)
INF文件结构
INF文件包含一些由方括号[]括起来的段(或称节),有些段是必须的,而其它是驱动程序特定的,每个部分是一些安装动作﹐或者连接或者列举其它部分。文件中的顺序是不重要的,但每个段名长度被限制在28个字符内,大小写是不敏感的,这样做是为了与win98兼容,段名可以包含下划线和圆点字符。文件内容的一般格式如下:
entry = value[, value...]
entry是指令,关键词或者文件名。value是被entry应用的属性。entry和value都可以指定为用百分号(%)代替的表示符,标示符必须在[Strings]段中给出定义。
把一个大的INF文件看成是一个树结构的线形描述可以更容易理解INF文件。一个段就是树上的一个节点,而每个指令就是指向另一个段的指针。
[Version]
一个有效的inf文件从一个命名为[Version]的段开始,它想一个inf文件的头和标示,但并不一定要在文件的最顶端。
Entry |
Value |
Signature |
“$Windws NT$”,”$Windows 95$”和”$Chicago$”中的一个。 |
Class |
驱动程序类名,下表列出 |
ClassGUID |
一个类的独一无二的GUID。 |
Provider |
Inf提供者的名字,一般在[Strings]指定 |
CatalogFile |
一般指定数字签名文件 |
DriverVer |
mm/dd/yyyy[,x,y,v,z],必须的条目﹐包含版本信息。 |
INF类名 |
描述 |
1394 |
IEEE 1394总线控制器(不是外设) |
Battery |
电池设备 |
CDROM |
CD-ROM驱动器,包括SCSI和IDE |
DiskDrive |
硬盘驱动器 |
Display |
显示适配器 |
FDC |
软盘控制器 |
FloppyDisk |
软盘驱动器 |
HDC |
硬盘控制器 |
HIDClass |
人机接口设备 |
Image |
静态图象捕捉设备,包括数码相机和扫描仪 |
Infrared |
Serial-IR和Fast-IR红外端口的NDIS miniport驱动程序 |
Keyboard |
键盘 |
MediumChanger |
SCSI媒体交换器设备 |
Media |
多媒体设备,包括音频、DVD、游戏杆、全动态视频捕捉设备 |
Modem |
调制解调器 |
Monitor |
监视器 |
Mouse |
鼠标和其它指点设备 |
MTD |
内存设备的内存技术驱动程序 |
Multifunction |
多功能设备 |
MultiportSerial |
智能多端口串行卡 |
Net |
网络适配器 |
NetClient |
网络文件系统和打印提供者(客户方) |
NetService |
网络文件系统的服务器方支持 |
NetTrans |
网络协议驱动程序 |
PCMCIA |
PCMCIA和CardBus主机控制器(不是外设) |
Ports |
串行和并行口 |
Printer |
打印机 |
SCSIAdapter |
SCSI和RAID控制器,主机总线适配器miniports,和磁盘阵列控制器 |
SmartCardReader |
智能卡读写器 |
System |
系统设备 |
TapeDrive |
磁带驱动器 |
USB |
USB主控制器和hub(不是外设) |
Volume |
逻辑存储卷驱动程序 |
[Manufacturers]
必须段。列出硬件描述的所有公司。条目形式:
manufacturer=model
可以包含多个条目。安装多个驱动,甚至是不同厂家的驱动。model是硬件型号段。一般指向另一个继续安装的段。例如:
[manufacturer]
"Walter Oney Software"=DeviceList
"Finest Organization On Earth Yet"=FOOEY
[DeviceList]
...
[FOOEY]
...
在model后面可以跟NTx86, NTia64, NTamd64等,用逗号隔开。是为了区分不同平台的安装。(不要也可以?)这样做也可以在model根据平台的不同,提供不同的Desciption或InstallSectionName,或是DeviceID。
[model]
每个model段描述了一个或多个设备。条目形式如下:
device-description=install-section-name,hw-id[,compatible-id...]
device-description描述了设备列表,install-section-name指向的是DDInstall的部分
[DeviceList]
"AMCC S5933 Development Board(DMA)"=DriverInstall,PCI\VEN_10E8&DEV_4750
[DDInstall]
它的名字是model段指定的install-section-name,可能再加上.NTx86或.NTia64或是.NTamd64。用后缀来控制平台的最佳安装条目。例如,假设你有三个install段,第一个无后缀,后两个分别带有.NT后缀和.NTx86后缀。如果你安装到x86平台的Windows 2000系统中,安装程序会使用.NTx86段。如果安装到在非Intel平台上运行的Windows 2000中,它将使用.NT段。如果windows支持ARM等处理器,可能要用到.NT段了。
Entry |
Value |
DriverVer |
mm/dd/yyyy[,x,y,v,z]﹐必须的条目﹐包含可选择的版本号码 |
CopyFiles |
另一个指定需要复制的文件列表的部分或者一个单独的有”@”为前缀的文件名 |
AddReg |
必须的﹐另一个包含需要的注册表信息的部分 |
Include |
指向其它的INF文件名指针列表 |
Needs |
Include条目的子集﹐列出了它的INF文件中需要的部分 |
DelFiles |
指定另一个需要删除的文件列表的部分(一般是升级的目的) |
RenFiles |
指定另一个需要重命名的文件列表的部分(一般是存储安装之前的状态) |
DelReg |
指定另一个需要删除的系统注册表信息的部分 |
ProfileItems |
指定另一个需要更改系统开始菜单的部分 |
AddReg条目在语法上是必须的﹐CopyFiles条目对于[DDInstall]部分是重要的。
CopyFiles语法如下:
CopyFiles=file-list-section[,file-list-section...]或者CopyFiles=@filename。
前者是更普通的版本﹐它允许一个指向另一个包含一个安装文件列表的部分的指针﹒然而对于简单的驱动程序的安装﹐可以直接的使用文件名。
[CopyFiles]
即上面的file-list-section。
CopyFiles条目形式如下:
destination-filename[,source-filename,temp-filename,flag]
二进制值 |
符号名 |
描述 | |
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 |
重写老的目标文件 | |
0x0001 |
COPYFLG_WARN_IF_SKIP |
如果用户跳过文件﹐则警告 | |
0x0002 |
COPYFLG_NOSKIP |
不允许用户跳过文件 |
destination-filename是需要复制的文件名﹐如果与源文件名不同﹐source-filename必须被指定﹐temp-filename在WIN98中是为新文件指定一个中间的文件名直到系统重新激活﹐对于WIN2000来说﹐它是无用的。
flag值指定新的目标文件的部署﹒这些值可以OR起来使它有多个性质﹒应该确认没有互斥的项目
因为[CopyFiles]条目的语法不包含指定源文件的磁盘或者路径选项﹐所以﹐必须使用其它的INF文件的部分[SourceDisksNames]和[SourceDisksFiles]﹒[CopyFiles]是复制的源文件名﹐复制的目标则在[DestinationDirs]部分。
[AddReg]
[AddReg]段在DDInstall中指定。这个部分的目的是提供在系统注册表中添加或者修改条目﹐形式是﹕
reg-root[,subkey,value-name,flags,value]
reg-root是注册表根的缩写﹐子键描述根键下的键名﹐使用反斜线字符(\)分开子键﹒例如﹐Software\W2KDriverBook\Driver\Setting是有效的HKCU或者HKLM根键的子键﹒
缩写 |
意义 |
HKCR |
HKEY_CLASSES_ROOT |
HKCU |
HKEY_CURRENT_USER |
HKLM |
HKEY_LOCAL_MACHINE |
HKU |
HKEY_USERS |
HKR |
设备安装的硬件子键 |
value-name指定被添加或者修改注册表值﹒每个系统注册表键包含零个或者多个不同数据类型的值﹒注册表编辑器在右边的窗格列出了子键的值﹒值的名字和值的数据也一起显示出来﹒左边的窗格仅仅显示子键﹒flags指定数据的类型﹒
flags类型如下:
二进制值 |
符号 |
意义 |
0x00000 |
FLG_ADDREG_TYPE_SZ |
以零为结束的字符串 |
0x00001 |
FLG_ADDREG_BINVALUETYPE |
二进制数据 |
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值 |
[SourceDisksNames]
如果INF文件包含的驱动程序文件分布在多个磁盘上﹐INF文件就必须包含[Source-DisksNames]部分﹐这个部分包含文件分布的每个磁盘的人口.
diskid=disk-description[,tagfile,unused,path]
diskid是唯一的分配设置中的名字﹒通常﹐磁盘号从1开始﹐disk-description是一个提示用户合适的磁盘的字符串。
tagfile值有双重的作用﹒确定在安装过程中用户提供正确的磁盘﹐tagfile值在安装过程继续进行之前被检验﹐如果tagfile文件不存在﹐用户被重新提示插入正确的磁盘﹒如果agfile值包含.CAB的扩展名﹐表示磁盘上的驱动程序文件是压缩文件。
path值是一个以root-relative为磁盘根目录的驱动程序文件的路径﹒像tagfile值一样是可选择的
[SourceDisksFiles]
INF文件必须包含一个[SourceDisksFiles]部分﹒这个部分列出了在安装驱动程序过程中使用的文件名﹒每个文件都有相应的条目。
filename=diskid[,subdir,size]
diskid值是一个[SourceDisksNames]部分指定的可以找到文件名的磁盘﹐可选的subdir值指定文件的路径﹒可选的size值指定解压缩文件的字节大小﹐安装过程使用这个数据在尝试复制文件之前决定目标系统是否适合安装。
[DestinationDirs]
这是个必须的提供目标路径的部分。
file-list-section=dirid[,subdir] 或者
DefaultDestDir=dirid[,subdir]
file-list-section是一个被[CopyFiles]的指示器唤起的部分﹒它指定所有的被指示器复制的文件安装到指定的路径﹒对于DefaultDestDir﹐用于[CopyFiles]中所有的指示器﹐通常与file-list-section联合使用。
以下是 DestinationDirsID定义:
值 |
意义 |
12 |
%windir%\system32\drivers 对于 Windows 2000 |
%windir%\system\IoSubsys 对于 Windows 98 | |
10 |
%windir% |
11 |
%windir%\system32 对于 Windows 2000﹐%windir%\system对于 Windows 98 |
30 |
根驱动器的根路径 |
54 |
Windows 2000的根路径 |
1 |
这个INF文件的路径 |
17 |
INF文件的路径 |
20 |
Fonts的路径 |
51 |
假脱机的路径 |
52 |
假脱机的驱动程序路径 |
55 |
打印机处理机路径 |
23 |
Color (ICM) |
-1 |
绝对路径 |
21 |
Viewers路径 |
53 |
User Profile路径 |
24 |
应用软件路径 |
25 |
共享路径 |
18 |
帮助路径 |
16406 |
All Users\Start Menu |
16407 |
All Users\Start Menu\Programs |
16408 |
All Users\Start Menu\Programs\Startup |
16409 |
All Users\Desktop |
16415 |
All Users\Favorites |
16419 |
All Users\Application Data |
16422 |
Program Files |
16427 |
Program Files\Common |
16429 |
All Users\Templates |
16430 |
All Users\Documents |
[DDInstall.Services]
为了让复制的文件在目标系统中起驱动程序的作用﹐必须通知服务控制管理器(SCM)﹐在WIN2000中安装的每个驱动程序在注册表的HKLM\System\CurrentControlSet\Services下面﹐ServiceType值是1表示内核模式的驱动程序﹒StartType指出在系统引导过程中在何时加载驱动程序﹒ErrorControl值决定在驱动程序加载的过程中如果遇到错误后如何是好﹒ServiceBinary值指出驱动程序的位置(.SYS文件)﹒但是可能会被遗漏﹐如果二进制文件在%windir%\system32\drivers路径并且与HKLM\...\Services下面的子键名的名字相同的时候就发生这种情况。
DDInstall.Services部分条目的形式是﹕
AddService=ServiceName,[flags],service-install-
section[,eventlog-install-section]
ServiceName描述服务的名字﹐典型的是驱动程序的名字(没有.SYS扩展名)。
flags定义如下:
二进制值 |
符号名 |
意义 |
0x0002 |
ASSOCSERVICE |
驱动程序是一个FDO﹐不是滤波驱动程序 |
0x0008 |
NOCLOBBER_DISPLAYNAME |
不重写friendly名字 |
0x0100 |
NOCLOBBER_DESCRIPTION |
不重写Description |
0x0010 |
NOCLOBBER_STARTTYPE |
不重写starttype |
0x0020 |
NOCLOBBER_ERRORCONTROL |
不重写错误控制 |
service-install部分和可选的eventlog-install部分唤起附加的控制服务值条目的INF部分(例如﹐ServiceType和StartType)。
[ServiceInstall]
[ServiceInstall]部分﹐它的名字在DDInstall.Services部分的AddService条目中唯一指定﹐控制和安装驱动程序到服务控制管理器。
条目列表如下:
条目 |
值 |
DisplayName |
驱动程序的Friendly名字﹐显示在设备管理器中 |
Description |
简短的描述驱动程序或者服务的目的﹐显示在设备管理器中 |
ServiceType |
驱动程序类型: 0x01 -内核驱动程序﹐0x02 -文件系统驱动程序 |
StartType |
何时驱动程序加载: 0 -引导时﹐1 -系统开始时,2 -系统开始后自动加载﹐3 -需要时手动﹐4 -禁止使用 |
ErrorControl |
驱动程序加载时错误部署: 0 -忽视所有错误﹐1 -显示错误给用户﹐2 -使用最后的良好状态重新激活﹐忽视错误﹐3 -使用最后的良好状态重新激活﹐调试错误 |
ServiceBinary |
驱动程序的全路径名﹐可能包含dirid值 |
未完待续!
文件大部分内容转自: http://wfpb.blogbus.com/logs/5596832.html