USB设备硬件ID和兼容ID的生成规则介绍
USB设备在插入电脑后,会触发一系列的操作,详见Windows下USB设备的枚举过程分析:https://www.usbzh.com/article/detail-420.html
当然这里更多是站在硬件或者USB层面来讲的,但是USB设备与驱动是怎么绑定的呢?
这里得先介绍一个概念叫做硬件ID和兼容ID.
我们在电脑中找一个USB设备,在设备管理器中查看其设备属性可以看到:
USB设备硬件ID
USB设备的硬件ID的生成规则:
swprintf(Buffer, L"USB\\VID_%04X&PID_%04X&REV_%04X",
FDODeviceExtension->MicParameter.VenderID,
FDODeviceExtension->MicParameter.ProductID,
FDODeviceExtension->MicParameter.VersionId);
可以看到VID,PID 和VER分别对应的是设备描述符中的厂商ID,产品ID和BCDDevice.
其实对于一些复合设备的,如以接口复合的设备,对其使用usbccgp.sys来驱动的话,其硬件ID会多一个MI_XX,这个XX其实代表的是其设备功能的接口描述符的ID,如:
这里的MI_00代表的接口描述符的bInterfaceNumber。
还有一种是HID独有的COL_XX,代表着HID设备的一个报告描述符中解析出了多个设备,如我们可以把键盘和鼠标的报告描述符合成一个报告描述符,那么HID设备会生成2个设备,一个是键盘,一个是鼠标,那么其COL分别为COL_01,COL_02,如如下的设备:
其硬件ID分别为:
这个我们看REACTOS关于HIDCLASS.SYS的驱动的时候就可以看到:
if (PDODeviceExtension->Common.DeviceDescription.CollectionDescLength > 1)
{
//
// multi-tlc device
//
Offset = swprintf(&Buffer[Offset], L"HID\\Vid_%04x&Pid_%04x&Rev_%04x&Col%02x", PDODeviceExtension->Common.Attributes.VendorID, PDODeviceExtension->Common.Attributes.ProductID, PDODeviceExtension->Common.Attributes.VersionNumber, PDODeviceExtension->CollectionNumber) + 1;
Offset += swprintf(&Buffer[Offset], L"HID\\Vid_%04x&Pid_%04x&Col%02x", PDODeviceExtension->Common.Attributes.VendorID, PDODeviceExtension->Common.Attributes.ProductID, PDODeviceExtension->CollectionNumber) + 1;
}
else
{
//
// single tlc device
//
Offset = swprintf(&Buffer[Offset], L"HID\\Vid_%04x&Pid_%04x&Rev_%04x", PDODeviceExtension->Common.Attributes.VendorID, PDODeviceExtension->Common.Attributes.ProductID, PDODeviceExtension->Common.Attributes.VersionNumber) + 1;
Offset += swprintf(&Buffer[Offset], L"HID\\Vid_%04x&Pid_%04x", PDODeviceExtension->Common.Attributes.VendorID, PDODeviceExtension->Common.Attributes.ProductID) + 1;
}
USB设备兼容ID
不过我们在电脑中看到大部分的设备其实是免驱动,这是因为他们用了兼容ID的原因。满足某一类规范的设备可以使用其类驱动,这样就可以不关注PID,VID这些东西了。
如视频类的为0x0e,其兼容ID为:
而HID类的必须就是03的了,至于这个编号的规范那就是usbif定义的了,可以参见 USB设备类型定义 https://www.usbzh.com/article/detail-221.html
参考文章:
USB的VendorID、ProductID和BcdDevice有什么作用 https://www.usbzh.com/article/detail-845.html