USB總線驅(qū)動中的標(biāo)識串
在驅(qū)動設(shè)備的枚舉和加載過程中,設(shè)備的標(biāo)識串起著很重要的作用。設(shè)備標(biāo)識串一般分為硬件標(biāo)識串、兼容類標(biāo)識串和設(shè)備標(biāo)識串這幾種。這些標(biāo)識串其實(shí)是由上一級的驅(qū)動程序(一般是總線驅(qū)動)產(chǎn)生的,Windows系統(tǒng)用它來尋找和加載相應(yīng)的驅(qū)動程序。
舉一個(gè)簡單的例子,當(dāng)你插入一個(gè)U盤時(shí),USB總線就會檢測到這個(gè)U盤設(shè)備被插入了,然后,它就會創(chuàng)建這個(gè)U盤設(shè)備的PDO,同時(shí)呢,會給這個(gè)PDO產(chǎn)生標(biāo)識串,就象你在設(shè)備管理器中設(shè)備屬性對話框的詳細(xì)信息中看到的那樣:
設(shè)備范例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
每種設(shè)備產(chǎn)生的標(biāo)識串都是不一樣的,特別的,對于USB設(shè)備,這些標(biāo)識串的產(chǎn)生是有一定的規(guī)范的。
USB設(shè)備分為單功能設(shè)備和多功能設(shè)備。單功能設(shè)備最常見,如U盤、鼠標(biāo)等,而多功能設(shè)備是指設(shè)備描述符里具備多個(gè)接口描述符的設(shè)備,如USB手柄,包含按鍵和聽筒及受話器,按鍵部分定義的是HID接口,聽筒及受話器部分定義的是Audio接口。
多功能設(shè)備的枚舉比單功能設(shè)備要復(fù)雜一些,USB總線要先加載usbccgp.sys驅(qū)動。然后,這個(gè)驅(qū)動按每個(gè)功能接口繼續(xù)枚舉設(shè)備。
硬件標(biāo)識串
它是由多個(gè)子字符串組成的,以來分隔,以結(jié)尾。
對于普通的單功能設(shè)備來說,一般是2個(gè)子字符串,第一個(gè)字符串是 USBVID_xxxx&PID_xxxx&REV_xxxx,每個(gè)xxxx都是4位的16進(jìn)制字符數(shù)字,分別表示Vendor ID, Product ID, Revision ID。一般而言,這三項(xiàng)能精確確定某一款具體的設(shè)備。但一般情況下,Revision ID不是很重要,在設(shè)備驅(qū)動安裝時(shí)可以不指定,所以就有了第二個(gè)字符串USBVID_xxxx&PID_xxxx。
對于多功能設(shè)備來說,一般包含一個(gè)子字符串USBVID_xxxx&PID_xxxx&MI_xx,前面的xxxx分別表示是 Vendor ID和Product ID,后面的xx則是表示接口的數(shù)目,與設(shè)備的接口描述符的bInterfaceNumber項(xiàng)一致。
兼容標(biāo)識串
它也是由多個(gè)子字符串組成的,以來分隔,以結(jié)尾。
對于普通的單功能設(shè)備來說,一般是3個(gè)子字符串,第一個(gè)字符串是 USBCLASS_xx&SUBCLASS_xx&PROT_xx,每個(gè)xx都是2位的16進(jìn)制字符數(shù)字,分別表示Class ID, SubClass ID, Protocol ID。一般而言,這三項(xiàng)能精確確定該設(shè)備是屬于哪一類設(shè)備用的是什么協(xié)議。其中Class ID最重要,其它兩項(xiàng)則有可能會被忽略,所以就有了第二、第三個(gè)子字串:USBCLASS_xx&SUBCLASS_xx, USBCLASS_xx。
對于多功能設(shè)備來說,一般是4個(gè)子字符串,前三個(gè)子字符串是差不多 的:USBDEVCLASS_xx&SUBCLASS_xx&PROT_xx,USB DEVCLASS_xx&SUBCLASS_xx,USBDEVCLASS_xx,第四個(gè)子字符串則是 USBCOMPOSITE。