USB百科
+ -

USB设备硬件ID和兼容ID的生成规则介绍

2022-10-26 2394 0

USB设备在插入电脑后,会触发一系列的操作,详见Windows下USB设备的枚举过程分析:https://www.usbzh.com/article/detail-420.html
当然这里更多是站在硬件或者USB层面来讲的,但是USB设备与驱动是怎么绑定的呢?
这里得先介绍一个概念叫做硬件ID和兼容ID.
我们在电脑中找一个USB设备,在设备管理器中查看其设备属性可以看到:
硬件ID
兼容ID

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_XX
这里的MI_00代表的接口描述符的bInterfaceNumber。

还有一种是HID独有的COL_XX,代表着HID设备的一个报告描述符中解析出了多个设备,如我们可以把键盘和鼠标的报告描述符合成一个报告描述符,那么HID设备会生成2个设备,一个是键盘,一个是鼠标,那么其COL分别为COL_01,COL_02,如如下的设备:
HID设备
其硬件ID分别为:
COL_01
COL_02

这个我们看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为:
视频类兼容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

HID人机交互QQ群:564808376    UAC音频QQ群:218581009    UVC相机QQ群:331552032    BOT&UASP大容量存储QQ群:258159197    STC-USB单片机QQ群:315457461    USB技术交流QQ群2:580684376    USB技术交流QQ群:952873936   

0 篇笔记 写笔记

USB通用父驱动usbccgp.sys的过滤UVC摄像头、UAC麦克风和HID设备硬件ID
激动的心情,无溢言表。。虽然只是一个很简单的东西。。但相于折腾了这么久,还是很开心的了。最近有个需求,功能是这样的:有一个USB复合设备,连接到windows系统中它在windows下的设备树如下:USB Composite Device(usbccgp.sys)UVC CameraUAC ......
HID复合设备(键盘、鼠标)的实现
在使用一些USB键盘或鼠标的时候,特别是一些电竟高档HID设备时,经常发现这些设备会额外定义一些特别的快捷键,使得这些设备不仅有基础设备(如键盘,鼠标)的功能,也有一些特别的快捷功能(如系统声音的放大放小)。甚至更有一些复杂的设备,只需要一个USB接口,就同时支持鼠标键盘功能或在键盘的额外区域支持触......
Windows驱动硬件ID生成
Windows驱动硬件ID生成的测试代码这里只是对代码进行收藏,方便以后要用的时候直接复制来用Index = swprintf(Buffer, L"USB\Class_%02x&SubClass_%02x&Prot_%02x", DeviceDescript......
USBCCGP 复合设备接口设备ID
复合 USB 设备上的接口可分组到集合中或分别代表一个 USB 函数。如果接口未分组在集合中,则通用父驱动程序会为每个接口创建一个 PDO,并为每个 PDO 生成一组硬件 Id。USB设备ID接口 PDO 的设备 ID具有以下格式:USBVID_v(4)&PID_p(4)&MI......
Windows驱动usbstor硬件ID生成规则
如本人手中的金士顿U盘,在设备管理器中如下:我们查看设备的属性信息,可以看到,其使用的驱动是:USBPCapy.sysUSBSTOR.SYS从驱动来看,这是一个典型的BOT协议的U盘,更多详见:http://www.usbzh.com/article/detail-353.htmlUSBST......
HID报告描述符复合HID设备
如我们电脑中有一个键盘,其设备管理器中如下:它们的硬件ID分别如下:USBVID_1A2C&PID_2124&REV_0110USBVID_1A2C&PID_2124&REV_0110&MI_00HIDVID_1A2C&PID_2124......
HIDCLASS.SYS获取HID设备的硬件ID
在应用层通过如下代码实现: HANDLE tmp_DeviceHandle = CreateFile(st.DeviceName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, ......
使用微软系统描述符1.0制作免驱动自定义USB设备
本文作者XTOOLBOX,本站得到了作者本人的转载授权。本文介绍如何使用微软的操作系统描述符来实现自定义USB设备在Windows系统上的免驱动使用。前言在Linux上开发USB设备是不需要特别的驱动的,Linux内核的USB驱动会将USB设备的基本操作都暴露到应用层,由应用层来完成实际的业......
USB设备硬件ID兼容ID的生成规则介绍
USB设备在插入电脑后,会触发一系列的操作,详见Windows下USB设备的枚举过程分析:https://www.usbzh.com/article/detail-420.html当然这里更多是站在硬件或者USB层面来讲的,但是USB设备与驱动是怎么绑定的呢?这里得先介绍一个概念叫做硬件ID和兼容I......
USBIP 请求设备ID(IRP_MN_QUERY_ID)
一个设备包括各种ID,不过都是通过IRP_MN_QUERY_ID来完成的,只是根据不同的参数来区分不同的ID类型。 case IRP_MN_QUERY_ID: status = pnp_query_id(vdev, irp, irpstack); break;......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!