在驱动设备的枚举和加载过程中,设备的标识串起着很重要的作用。设备标识串一般分为硬件标识串、兼容类标识串和设备标识串这几种。这些标识串其实是由上一级的驱动程序(一般是总线驱动)产生的,Windows系统用它来寻找和加载相应的驱动程序。
举一个简单的例子,当你插入一个U盘时,USB总线就会检测到这个U盘设备被插入了,然后,它就会创建这个U盘设备的PDO,同时呢,会给这个PDO产生标识串,就象你在设备管理器中设备属性对话框的详细信息中看到的那样:
设备范例Id:
USBVID_123A&PID_567B1234567890ABCDEF
硬件Id:
USBVid_123A&Pid567B&Rev_0001
USBVid_123A&Pid567B
兼容Id:
USBClass_08&SubClass_06&Pro_50
USBClass_08&SubClass_06
USBClass_08
每种设备产生的标识串都是不一样的,特别的,对于USB设备,这些标识串的产生是有一定的规范的。
USB设备分为单功能设备和多功能设备。单功能设备最常见,如U盘、鼠标等,而多功能设备是指设备描述符里具备多个接口描述符的设备,如USB手柄,包含按键和听筒及受话器,按键部分定义的是HID接口,听筒及受话器部分定义的是Audio接口。
多功能设备的枚举比单功能设备要复杂一些,USB总线要先加载usbccgp.sys驱动。然后,这个驱动按每个功能接口继续枚举设备。
硬件标识串
它是由多个子字符串组成的,以来分隔,以结尾。
对于普通的单功能设备来说,一般是2个子字符串,第一个字符串是 USBVID_xxxx&PID_xxxx&REV_xxxx,每个xxxx都是4位的16进制字符数字,分别表示Vendor ID, Product ID, Revision ID。一般而言,这三项能精确确定某一款具体的设备。但一般情况下,Revision ID不是很重要,在设备驱动安装时可以不指定,所以就有了第二个字符串USBVID_xxxx&PID_xxxx。
对于多功能设备来说,一般包含一个子字符串USBVID_xxxx&PID_xxxx&MI_xx,前面的xxxx分别表示是 Vendor ID和Product ID,后面的xx则是表示接口的数目,与设备的接口描述符的bInterfaceNumber项一致。
兼容标识串
它也是由多个子字符串组成的,以来分隔,以结尾。
对于普通的单功能设备来说,一般是3个子字符串,第一个字符串是 USBCLASS_xx&SUBCLASS_xx&PROT_xx,每个xx都是2位的16进制字符数字,分别表示Class ID, SubClass ID, Protocol ID。一般而言,这三项能精确确定该设备是属于哪一类设备用的是什么协议。其中Class ID最重要,其它两项则有可能会被忽略,所以就有了第二、第三个子字串:USBCLASS_xx&SUBCLASS_xx, USBCLASS_xx。
对于多功能设备来说,一般是4个子字符串,前三个子字符串是差不多 的:USBDEVCLASS_xx&SUBCLASS_xx&PROT_xx,USB DEVCLASS_xx&SUBCLASS_xx,USBDEVCLASS_xx,第四个子字符串则是 USBCOMPOSITE。