elva

驱动程序安装-INF

当用户刚插上设备或启动引导(Boot)时,设备是刚刚物理存在于机器上时,总线驱动应自动地,动态的检测,识别硬件的变化。这时,就要有一个识别设备,安装驱动的INF文件。

所谓文件是指用一个共同的符号名称作为代表,若干个逻辑记录构成的信息集合或目的,形式和内容的表示上彼此相似的一些信息项的集合。简单的说,就是具有一定名称的一组相关数据的集合。

所谓INF文件,就是以INF为扩展名的文本文件,他控制与驱动安装程序有关的大多数活动。

因为这个INF文件抽象了设备的上层建筑,含有安装驱动所有的必需的信息,所以它要由驱动开发人员随驱动一起提供,来告诉操作系统那些文件需要复制到用户的硬盘上,应添加或修改哪个注册表等。简单的说,INF文件就是机器的参考文件(Information File)。

INF文本文件与Windows 3XINI文件很类似,INF文件分为几节,每节包括一项或几项。每节与安装过程中的某一步相关:比如说,某一节是关于文件拷贝的。某一节是关于如何添加注册表项等等。作为一个开发者,你可以通过任何文本编辑器创建生成INF文件。Microsoft还在DDK中提供了INFEDIT工具,使拥护可以很方便的编辑INF 文件(如果实例用INFEDIT,请参阅DDK)。

INF文件可以支持很复杂的安装脚本,但是大多数的开发者只愿意使用处理一些最基本的脚本。一个基本的安装脚本应该包括:

1鉴定硬件设备

2把驱动程序从安装盘上拷贝到系统盘上去

3鉴定硬件设备资源的需求

4当硬件设备被仿真是,就在注册表中加上DevLoader一项

INF文件通常与磁盘或光盘上的硬件驱动程序一起提供。INF文件的结构和内容由驱动程序创作者决定

1.          举例说明

下面举例说明有关INF的基本特征和内容,以便更好的理解。

[Version]

Singnature=$windowsNT$                 //选择版本

Class=Unknown                          //系统定义用户指定的类名

Provider=%ABCD%                        //提供商

DirverVer=11/15/2001                    //

CatelogFile[.Ntetc]          //包含WHQL数字签名的目录说明文件。

 

[Strings]

ABCD=”me, the writer”       //定义宏

[SourceDisksNames]     //源代码盘或发行盘的描述,目录和打包文件

L=”Ggdriver directory”…obj\i386\

[SourceDisksFiles]      //和打包文件

Ggdriver.sys=l,obj\i386\some\

[DestinationDirs] //复制缺省文件和Filelist节中的文件,

//指定目录和子目录的ID 并指定文件的标准位置。

 

Ggdiver.Files.Driver=10,System32\Drivers

Ggdiver.Files.Driver=10, System32\Drivers

[Manufacturer]            //指定生产厂商和models节中相应的名称

%ABCD%=Ggdriver

[models]                  //最新的硬件ID号先出现

%USBDevice_V2%=V2Install,USB\VID_ABCD%PID_EFOL&REV_DO02

%USBDevice_V1%=V2Install,USB\VID_ABCD%PID_EFOL

[install]                         //指向添加的设备接口列表

Copyfiles=Ggdriver.Files.Driver

AddReg=Ggdriver.AddReg

LogConfig=logconfig

DirverVer=19/10/2001

ProfileItems=AB\cd

[filelist]

[addreg]

[logconfig]

[install.AddService]

ServiceTypy=l

StartType=start-code

ErrorControl=error-control-level

ServiceBinary=path-tc-driver

INF文件是一个文本文件,由不同的节组成,每一个节从括在方括号中的节名称开始,后面是节的内容。这些节也是分层的,其先后顺序与本样例基本保持一致。

在上面的样例中:

[Verson ]节中,Signature项只能在$WindowsNT$,$Winfows95$以及$WindowsNT$中选一;

Provider项是INF文件的创造者,通常是设备的生产商;

Class项是系统定义用户指定的类名;

CatalogFile[.NTetc]则是必须包含的驱动程序包的WHQL数字签名的目录说明文件。

[Strings ]节中定义代替字符串的宏: 

如例中:ABCD=me,the writer”即是说%ABCD%的意思是me,the writer。而在使用时,也用“methe writer”代替ABCD。为了适应不同的语言上下文,可以在String 的后面附加(在WinntH`中定义的)LangIDSubLangID,形成新的Strings节。LangIDSubLangID都是两位数,它们合作指定某语言上下文。

如定义一个英国英语(0902)的flour:

[Strings]

ABC=”Flor”

[Strings.0902]

ABC=”Flour”

[SourceDisksName][SourceDisksFiles]节分别是指源代码盘或发行盘的描述,目录和打包文件。如果所有文件都在根目录中,[SourceDisksFiles]节可以是在空的

[DestinationDirs]节中,复制缺省文件和Filelist节中的文件,指定目录和子目录的ID 并指定文件的标准位置。

[Manufacture]节指定生产厂商和models节中相应的名称;

[install]节则指向添加的设备接口列表,接口键的注册表,其中:

Copyfiles=filename|filelist项,指定要复制的文件或后面列出文件的列表节的名称。

AddReg=addreg项,指定后面遗留设备节的名称。

LogConfig=logconfig项,指定后面遗留设备节的名称。

ProfileItems项,指定添加到计算机界面“开始”菜单中的文件名称项。

[filelist]指定要安装的文件列表。

[addreg]节,指定新的键和值。

[logconfig]节,指定遗留设备的I/O地址,IRQ等配置的详细信息。

[installAddService]节,只针对Windows2000的驱动程序,指定驱动程序的详细信息。

 

下面我们具体介绍一下INF文件结构。

1.1INF文件结构

一个INF文件是一个被划分为节(Section)的简单的文本文件,每节由方括号([])内的标示符表示。某些节名字是必须的,而另一些是驱动程序专用的。每节下面的各项控制某些安装操作,或者连接或列举其它节。

文件中各节出项的顺序并不重要,因为每节都被命名和链接了。一节内容在遇到另一节或者遇到文件结尾之前继续执行。规定节的唯一的名字是区分大小写的,并且在长度上必须限制在28个字符以内,以保持与Windows 98 的兼容性。节的名字可以包括空格,但是只有在整个名字应用时。允许下划线和点字符。

节中各项的基本格式如下:

entry=value[value….]

这里的entry是一个指令,关键字或者文件名,而value是应用于entry的属性。

下图表示了节名字链接。

Entryvalue名字可以规定为一个字符串记号(string token),它是一个由百分号%包围的替换字节串,一个独立的INF——[Strings],给指定的语言ID提供了字符串记号值。

下面我们看一下INF文件的各个小节及小节的基本内容:(表1,表2

下面我们详细每一节的内容:

1.2 Version

一个有效的INF文件以一个[Version]节开始,它担当整个INF文件的头部和签名。[Version]节中允许的和要求的项都列在了下表-3

 

1.3 Manufacturers

另一个必须的节是[Manufacturers]项。该节中的每个项列出INF文件安装的设备和他们的驱动程序。每个项的格式如下:

 manufacturer=model

这里的manufacturer列出要被安装的一个或多个硬件型号的制造商在INF文件中的唯一名字。Model值指向另一个INF节名字,进一步列出硬件型号驱动程序安装的方向。

1.4 Models

对于列在[Manfacturers]节中的每个型号,必须有一个相应的节作为由model指定的节出现。每个model项的形式为:

device-description=install-section-namehw-id[compatible-id…]

这里的device-description表示人可以理解的设备型号列表和一个简单的描述。在一些安装过程中此字符串在一个对话框中提交给用户,因此有必要提供多种语言作为字符串记号。

 install-section-name值引用[DDInstall]节,表示值进一步安装的另一个INF节,hw-id值是硬件设备在PNP兼容的总线上声明时返回的PnP标示符。例如。USB \ VID_045E&PID_OOB   标示USB上的Microsoft HIDHuman Input Device)键盘设备。能够增加任意数量的compatlible-id值,表示相同的安装脚本可以用于列表中包含的任何设备。

1.5 DDInstall

INF节名字链表的低部附近(但并非最低部)是[DDInstall]节,它从[Models]节中为每个制造商的每个型号规定一个唯一的名字。[DDInstall]节中允许的和要求的项目见下面表4.

       虽然在语法上只有AddReg项是必需的,但是CopyFiles项是[DDInstall]节的一个基本指令。它采取如下形式:

CopyFiles = file – list – section [file – list – section….]或者

CopyFile = @filename

前一种形式更加常用,因为它允许一个间接指针指向包含被安装的文件列表的其他节。然而,对于简单的驱动开发程序安装,采取直接文件名方法就行了。在下面两个小节中将对AddRegCopyFiles指令做进一步解释。

1.6  CopyFiles

INF文件的[CopyFiles]节有一个唯一的名字,并从[DDInstall]节的CopyFiles指令引用它。该节中的每个项采用如下形式:

destination – filename[source- filenametemp-filenameflag]

这里的destiantion-filename是最重要复制的目标文件名。如果源文件名不相同,必须规定source – filenameTemp-filename值不再适用(虽然 Windows 98仍然要求),它在系统再次引导之前规定新文件的临时文件名。对于Windows 2000,忽略此值。

 Falg 值规定对新目标文件的处理,其描述见表5。可以对falg值中的各个为进行“或”运算,以使多个操作起作用。几种操作是互斥的(例如,WARN_IF_SKIPNOSKIP,有疑问时应当查阅有关文档。

因为[CopyFiles]节的项的语法没有包含一个可选项来规定源文件的磁盘或路径,必须使用其他INF节——[SourceDisksNames][SourceDisksFiles]。然而[CopyFiles]节中各项复制的文件由另一个INF节——[DestiantionDirs]节指定。

1.7 AddReg

一个INF文件的[AddReg]节被唯一命名,并从[DDInstall]节中的AddReg指令引用它。此节的目的是提供增加或者修改目标系统注册表中的项目。本节中每个项目采取如下形式:

 reg-root[subkeyvalue- nameflags value]

这里的reg- root是注册表库(hive)之一的缩写,见表6所列。值表示要被修改的注册表库。Subbkey值表示库底下的键名,在层次结构中子键用反斜线(\)字符隔开。例如,software\W2KdriverBook\Driver\Seting HKCU或者HKLM库的一个有效子键。

Value-name指定要增加或修改的注册表值。每个注册表键包含一个或多个值,保存不同类型的数据。注册表编辑器(Registy Editor)在右边面板中列出子键的值。值名和值数据同时在该面板中出现,左边面板只列出子键。图3说明了注册表术语之间的关系。

Flags指定数据保存的类型,flages可能的位置见表7所列:

1.8  SourceDisksNames

如果INF文件控制的驱动程序文件的分布跨越多个磁盘(软盘或光盘),则INF文件必须包含一个[SourceDisksNames]节。本节在分布集中为每个磁盘包含一项,项目采取如下形式:

Diskid=disk – descript[tagfileunusedpath]

这里的diskid`是分布集内的一个一个唯一的编码。通常,磁盘从1开始编码。Disk – description 标签是一个供人阅读的文本串,可以保证安装过程中拥护提供正确的磁盘,在安装过程继续之前核对tagfile值是否在插入的煤体上。如果tagfile文件不存在,则提示用户插入正确的磁盘。如果tagfile值包含-CAB扩展,则该文件被认为是磁盘上驱动程序源文件的压缩文件集。

Path值是磁盘上驱动程序源文件的相对于根目录的磁盘路径。与tagfile值一样,path是可选的。如果忽略它,则认为根目录是文件的源。

1.9 SourceDisksFiles

驱动程序INF文件还必须包含一个称为[SourceDisksFiles]的节。此节列出驱动程序安装期间使用的文件名。每个文件对应于本节中的一个项,并采取如下形式:

Filename = diskid[sbdirsize]

很自然,diskid值在[SourceDisksNames]节中指定了找到filename的一个磁盘,subdir值可选,它指定文件在磁盘上的一个路径。Size值可选,指定文件以字节为单位的未压缩大小。在开始文件复制前,安装进程可以使用此大小确定源文件是否合适目标系统。

1  DestinationDirs

这是INF文件中必需的节,指定源文件的目标目录。没有这部分内容,安装程序或进程将没有用来拷贝文件的目标目录。[DestinatonDirs]节中的项采取如下形式:

File – list – section = dirid[subdir]或者

DefaultDestDir = dirid[subdir]

这里file – list – section规定了在[CopyFiles]指令中调出来的部分。它规定一个指令拷贝的所有文件安装到指定的目录。对于项目DefaultDestDir,上述规范适用于所有[CopyFiles]指令,否则不会与[DestionationDirs]节中的file- list – section项关联。

Dirid值根据表8规定了目标的一个列举值。如果提供了值subdir,它指定diid调处的目录下面的一个相对路径。

 

2. DDInstall.Services

为了真正的使复制的文件成为目标系统上的驱动程序,必须通知服务器管理程序(SCM)。安装在Windows 2000下的每个驱动程序在HKLM\System\Current-ControlSet\Services下的注册表中有一项。ServiceType值为1表示一个内核模式设备驱动程序。StartType指定在引导过程中的什么点上驱动程序装入(3表示按需或手动启动)。在驱动程序装入过程中遇到错误时,ErrorControl值确定发生了什么情况。ServiceBinary值指向驱动程序文件(。SYS文件)的位置,但是,如果二进制值位于%windir%\system32\drivers目录,并且与HKLM\…\Services下的子键有相同的名字,则可以忽略ServiceBinary值。

DDInstall.Services节项目中包括一个形式如下的项目:

AddService = ServiceName[flags]service – install – section[eventlog – install – section]

这里的ServiceName表示设备的名字,通常是驱动程序的名字,没有。SYS扩展名。Flags值的描述见表9

Service – install – section和可选的eventlog- install – section值调出控制服务值项目(诸如ServiceTypeStartType)的新增的INF节名字。

3. ServiceInstall

[ServiceInstall]节名字实际上由DDInstall.Services节中每个AddService项唯一规定,它控制把驱动程序安装到服务控制管理程序。[ServiceInstall]节允许的项见表10所列。

4 .验证INF语法

DDK包含一个基本的工具CHKINF,在DDKTools目录中。它依赖于Perl脚本引擎,该引擎可以从www.perl.com上下载。虽然工具没有什么优点,但它在检查标准Microsoft INF文件时能报告许多错误。工具以HTML文件形式输出。

DDK Tools目录还包括一个用语简化INF文件构造的实用程序CENINFEXE 。 必须把该工具区分为基本工具,它对入门者是有用的。

最后,DDK提供了STAMPINFEXE这一简单工具,它提供了快速增加或修改INF中版本信息的机制。

posted on 2008-03-17 10:00 叶子 阅读(10611) 评论(1)  编辑 收藏 引用 所属分类: 驱动开发

Feedback

# re: 驱动程序安装-INF 2008-06-25 20:12 毛小平

驱动程序安装INF视频和游戏控制器  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理