USB设备的驱动程序是USB主机应用程序与USB外部设备之间沟通的桥梁,高效的USB驱动程序开发是USB设备研发的关键。用户可以使用WindowsDDK、DriverStudio等多种工具来开发USB设备驱动程序,但驱动程序的开发过程都比较复杂,而且很容易致使USB主机内存泄漏而死机。
一、驱动程序文件简介
在Windows操作系统中,一个硬件设备的驱动程序是由驱动程序文件(*.sys)和相应的INF文件(*.inf)来描述的。
驱动程序文件(*.sys):硬件设备驱动程序的核心文件,提供了应用程序与外部硬件设备的通信通道和方法。
INF文件(*.inf):即DeviceInformationFile(设备信息文件),用来指示安装Windows驱动程序(*.sys)。INF文件包含了相应的硬件设备及其驱动程序的详细信息,这些信息包括硬件设备名称、使用什么驱动程序文件,硬件设备信息在系统注册表中的存储等等。
一般来说,一个硬件设备的Windows驱动程序需要配合一个INF文件才可以进行安装。虽然INF文件后缀名为*.inf,但INF文件本质上是文本类型的文件,可以使用记事本、UltraEdit等软件工具打开、查看以及执行编辑操作。INF文件可以确保硬件设备能够在连接到计算机主机的时候被正确地配置。USB设备也就是采用这种驱动程序形式来完成安装、识别和通信操作的。
1、USB设备驱动程序安装
USB设备驱动程序的安装,大致经历如下几个步骤,如图14.1所示:
(1)首先,在Windows操作系统中插入USB硬件设备。此时操作系统发现新硬件,驱动程序会自动搜索驱动程序,如果搜索不到合适的驱动程序,将提示用户给予一个合适的驱动程序。
(2)用户安装提示指定一个驱动程序。这里其实指示的是该驱动程序的INF文件,该文件中包含了该USB硬件设备的全部信息。
(3)操作系统读取INF文件中的硬件ID,并与USB硬件设备的ID进行比对,如果符合则安装此驱动,否则将提示用户重新指定驱动程序INF文件。
(4)对于符合该硬件的驱动程序,操作系统将驱动程序文件(*.sys)和相应的INF文件复制到指定的系统目录中。
(5)操作系统按照INF文件的指示,将USB硬件设备的一些基本信息保存在操作系统注册表中。(6)最后,重新启动操作系统便可以完成USB硬件设备驱动程序的安装。重新启动之后,USB设备便可以正常工作。注意:最后一步重新启动系统并非必须的,有的设备无需重新启动也可以进入正常工作状态。
2、USB设备的识别
在Windows操作系统中,当USB设备连接到计算机上的时候,操作系统将检测到USB设备的连接。然后将系统中所有的INF文件中的数据信息与该USB设备进行比较,逐个找到与之相符合的INF文件。USB设备的识别过程如图14.2所示,大致可以分为如下几个步骤:
(1)首先,在Windows操作系统中插入USB硬件设备。此时操作系统发现新硬件
(2)Windows操作系统读取USB硬件ID,包括设备描述符的供应商字段(idVender)和产品字段(idProduct)。
(3)然后在操作系统内查找与该硬件ID相符合的INF文件。如果不存在,则系统提示用户自己安装该USB设备的驱动程序。
(4)如果找到符合的INF文件,将加载对应的驱动程序文件,并为该硬件设备分配指定的硬件资源。此时USB设备便可以正常工作。
二、驱动程序INF文件的结构
虽然对于USB硬件设备来说,驱动程序文件(*.sys)是核心,但是该文件对于用户来说是不可读的。相反,用户可以读取INF文件(*.inf)的内容,来了解驱动程序的信息。因此,INF文件便成为用户了解驱动程序功能的主要对象。
INF文件其实是一个文本格式的文件,在Winodws操作系统下用来描述设备或文件等数据信息。INF文件是由标准的ASCII码组成,您以用任何一款文字编辑器查看修改其中的内容,例如记事本、UltraEdit等等。
我们可以将INF文件看成是Windows系统底下的超强批处理,其功能非常强大,几乎能完成日常操作的所有功能。
INF文件的结构包括节(Sections),键(Key)和值(value)三部分。其中,INF文件的节(Sections)以方括号的形式开始,并按照层次结构排列。INF文件的节(Sections)后面紧跟该节中的各个项,也就是键(Key)和值(value)。INF文件的节中各项的基本定义格式如下:
Key=value[,value…]其中,各个参数的含义如下:
Key:代表项目名称,也就是键(Key)。
Value:表示项目的值,也就是值(value)。
注意,在INF文件中,所有名称都不区分大小写。Windows操作系统中的INF文件可以包含多个节(Sections),每个节(Sections)下可以包含多个键(Key)和值(value)。INF文件中的主要节包括如下几类:
Version:版本节,在INF文件的开始,主要用于版本控制和版本描述信息。
DestinationDirs:目标磁盘节,用于指定驱动安装的系统路径信息。
SourceDisksNames:源文件盘符节,用于指定源盘信息。
SourceDisksFiless:源文件节,用于指定源盘文件名。
DefaultInstall:默认安装节,表示开始执行安装以及安装过程的各项操作。
Manufacturer:供应商节,指明供应商及其对应的Models节的名称
Strings:字符串节,用于常量定义,包含多个字符串信息。
Models:Models节,用于指明Install/DDInstall节的名称,设备的硬件ID等信息。
1、版本节(Version)
版本节(Version)一般位于INF文件的开始,主要用于版本控制。
版本节中描述了该驱动程序的主要版本信息。版本节(Version)包括很多项,其中最主要的是Signature项、Class项、ClassGUID项、Provider项、LayoutFile项、CatalogFile项和DriverVer项这几项。
1.1、Signature项
版本节(Version)的Signature项定义了该INF文件需要运行在何种操作系统版本中,有如下值可供选择:
$WindowsNT$
$Chicago$
$Windows95$一般来说,版本节(Version)的Signature项选择$Chicago$即可。
1.2、Class项
版本节(Version)的Class项用于指明驱动程序所属的类别。在Windows系统下,为每个类型的设备指定了一个类别名称,如表14.1所示。
1.3、 ClassGUID 项
版本节(Version)的 ClassGUID 项用于指明设备驱动程序类别的 GUID,对于常用的设 备类别其 GUID 值是固定的。在 Windows 系统中,常用设备类别的 GUID 值如表 14.2 所示。 说 明 : 关 于 更 为 详 细 的 介 绍 , 读 者 可 以 参 阅 Microsoft MSDN 的 官 方 网 站 http://msdn2.microsoft.com/en-us/library/ms791134.aspx。
1.4、Provider项
版本节(Version)的Provider项用于指明该驱动程序INF文件的供应商名称。
1.5、LayoutFile项
版本节(Version)的LayoutFile项比较特殊,其仅在Windows操作系统内部提供的INF文件中使用,供应商提供的INF文件一般不使用。
1.6、CatalogFile项
版本节(Version)的CatalogFile项,用于指明驱动程序数字签名文件的文件名,其扩展名为.cat。
1.7、.DriverVer项
版本节(Version)的DriverVer项,用于指明该驱动程序的版本信息。版本的格式为mm/dd/yyyy[,x.y.v.z]。其中
mm/dd/yyyy:表示月/日/年。
x.y.v.z:表示驱动程序的版本号。这里需要注意的是,虽然版本节(Version)可以有很多项,但是所有的INF文件都必须包含Version节和Signature项。典型的版本节(Version)的示例代码如下:
2、源文件盘符节(SourceDisksNames)
源文件盘符节(SourceDisksNames)用于罗列源文件所在盘符序列码、盘描述符、盘卷标号和盘序列号。源文件盘符节(SourceDisksNames)内语句的语法格式如下:disk-ordinal=“disk-description”,disk-label,disk-serial-number其中各项的含义如下:
disk-ordinal:表示盘符序列码。disk-ordinal标识一个源盘,具有惟一性。一般其可以设置为从1开始递增的整数,当存在多个源盘时,盘符序列码之间不能重复。值得注意的是,0不是一个有效的盘符序列码。
disk-description:表示盘描述符,其是采用双引号括起的字符串或字符串宏,以达到描述盘的内容等目的。安装引擎将该字符串显示在对话框内以提示用户。
disk-label:表示源盘的卷标识。disk-serial-number:一般不使用,但必须被设置为0。这里需要注意的是,对于一个驱动程序INF文件来说,disk-ordinal和disk-description为必选项。典型的源文件盘符节(SourceDisksNames)的示例代码如下:
3、源文件节(SourceDisksFiles)
源文件节(SourceDisksFiles)用于指定安装时使用的源文件和盘符序列码、盘描述符。源文件节(SourceDisksFiles)内语句的语法如下:file-name=disk-number[,subdir][,file-size]其中各项的含义如下:
file-name:表示源盘上文件的名称。
disk-number:表示包含file-name指定文件所在源盘的盘符序列码,该盘符序列码需在源文件盘符节(SourceDisksNames)中列出,并大于或等于1。
Subdir:用于指定文件所在源盘的子目录,如省略则源盘为缺省安装路径。
file-size:用于表明文件的大小,以字节(Byte)为单位。这里需要注意的是,对于一个驱动程序INF文件来说,file-name为必选项。典型的源文件节(SourceDisksFiles)的示例代码如下:
4、供应商节(Manufacturer)
供应商节(Manufacturer)用于指明供应商及其对应Models节的名称。供应商节(Manufacturer)中各项的语法格式如下:%StrKey%=Models-Name其中各项的含义如下:
StrKey:表示设备制造商的名称,其字符串的值在String节中定义;
Models-Name:指明了Models节的名称。典型的供应商节(Manufacturer)的示例代码如下:
[Manufacturer]
%MFGNAME%=Cypress
5、默认安装节(DefaultInstall)
默认安装节(DefaultInstall)指明添加注册表的子节,等号后面的为自定义节名。默认安装节(DefaultInstall)包含如下几项:
LogConfigLog,表示日志文件配置;
Copyfiles,表示复制文件;
Renfiles,表示文件改名;
Delfiles,表示删除文件;
UpdateInis,表示更新Inis;
UpdateIniFields,表示更新Ini字段;
AddReg,表示添加注册项;
DelReg,表示删除注册项;
Ini2RegIni,表示文件转换为Reg文件;
6、字符串节(String)
字符串节(String)中用于定义字符串变量。字符串节(String)长用于在INF文件中频繁地出现某些字符串的场合。此时使用一个字符串变量来代替,可以达到简化输入的目的。然后用该字符串变量代表该字符串出现在INF文件中。其定义格式如下:StrKey=”String”其中各项的含义如下:StrKey表示字符串的名称,其由数字和字母组成。
String表示字符串的内容。典型的字符串节(String)的示例代码如下: