HID开发笔记
+ -

Windows系统HID设备的启动过程

2022-04-12 1634 0

在做USB设备固件调试时,经常遇到在设备管理器显示设备启动失败,code:10。
这个启动失败从字面意思上,大家都懂,但实际这个启动到底都执行了什么操作了,又没有人能说的清楚。这里本人结合ReactOS的关于HIDUSB的源代码来给大家解释一下。

在Windows驱动架构中,一个启动的启动是通过IRP_MN_START_DEVICE来实现的,这个IRP执行成功,就表示设备启动成功,这时在设备管理器中会显示这个设备运转正常。所以说,这里的启动实际上是设备被系统的识别并信息验证通过,这些成功后设备就可以进行工作态了。
这个设备运转正常。

如果失败,在设备管理器就显示启动失败,代码为10,有时会有相关的信息提示,不过大多数是没有任何错误提示的。
不过遇到此类问题的时候,我们也不需要慌,只要认真的进行抓包分析,就可以大概判断是什么原因了,因为我们已经在很多篇文章中详细地给大家介绍过了USB的识别过程了,大家只需要按照这个识别过程来进行一一判断,结合抓包工作如BUSHOUND,USB总线分析仪等来进行判断。
启动失败代码10

下面我们来介绍HID设备的启动过程。
在ReactOS的HIDUSB.C文件中,相关的启动IRP操作为IRP_MN_START_DEVICE。其大概原理过程是这样的。
在介绍之前得先说一下,由于这时系统已经为该设备开始加载驱动并启动设备了,故在硬件上设备关于此设备的信息已经收集完成。如第一次插入时的获取设备描述符(最少8字节),设置地址,启用地址。

  • 将该IRP传递给PDO,等待硬件启动成功。这一步一般没什么问题,只是USB设备栈的信息传递。
  • 执行Hid_PnpStart来执行真正的设备“启动”

    • 获取设备描述符
    • 获取18字节的配置描述符,并判断是否成功。
    • 解析出配置描述符的总长度wTotalLength之后,再次获取全部的配置描述符,并判断是否成功。
    • 从配置描述符中解析出InterfaceClass为USB_DEVICE_CLASS_HUMAN_INTERFACE(0x03)的接口描述符。如果解析不出,则返回失败。详见http://www.usbzh.com/article/detail-221.html
    • 对解析出的接口描述符进行必要的判断,如描述符类型(USB_INTERFACE_DESCRIPTOR_TYPE),长度(sizeof(USB_INTERFACE_DESCRIPTOR))和bInterfaceClass必须为USB_DEVICE_CLASS_HUMAN_INTERFACE(0x03)

    • 接口描述符后面紧跟的是HID描述符,进行地址偏移,判断是否为HID描述符。判断的条件包括描述符的类型和和长度。

    • 使用函数Hid_SelectConfiguration选择配置。
      • 获取HID设备的接口描述符
      • 设备的接口配置,主要是端点配置
    • SET_IDLE请求,
    • 使用USB_GET_PROTOCOL_REQUEST请求获取1字节的协议号,不进行结果判断。 boot protocol active 0x00 disabled 0x1

另外大家可能会奇怪,这里不获取HID的报告描述符吗?是要获取的,不过不是HIDUSB驱动中,而是在HIDCLASS驱动中。在类驱动的IRP_MN_START_DEVICE中执行HidClassFDO_StartDevice来实现。忽略其它的代码,主要是在HidClassFDO_GetDescriptors函数中。其是通过向HIDUSB发送一个IRP_MJ_INTERNAL_DEVICE_CONTROL的IRP,CTRL CODE为IOCTL_HID_GET_DEVICE_DESCRIPTOR先获取HID描述符,然后再使用IOCTL_HID_GET_REPORT_DESCRIPTOR的CTLR CODE获取报告描述符
当然获取报告描述符之后,也需要对报告描述符进行解析,则使用的是HidP_GetCollectionDescription函数来实现。解析成功之后,才算HIDCLASS的HidClassFDO_StartDevice函数执行成功。

至于HIDCLASS和HIDUSB之间的关系,可详见http://www.usbzh.com/article/detail-590.html
两者虽然只算一个设备驱动层,不过又有实际上的分层概念。HIDCLASS在HIDUSB之上,所以HIDCLASS经常通过一些内部的个IRP_MJ_INTERNAL_DEVICE_CONTROL的IRP来获取HIDUSB关于设备的特定信息。

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 篇笔记 写笔记

Windows下枚举系统中所有HID设备
Windows下对任何设备,文件的打开都是通过CreateFile来实现的,不过要打开一个设备得首先知道设备或文件名。由上节可知道,对于HID设备,都会注册一个接口类型为{2ACCFE60-C130-11D2-B082-00A0C91EFB8B}的GUID。我们可以通过Setup系列函数枚举出系统中......
HID 设置协议SetProtocol
SetProtocol用于设置ID设备的协议值。对于USB引导设备,该协议是必须对;对于非引导设备,是可选的。详见:USB请求bmRequestType(1):0x21bRequest(1): SetProtocol,值为0bwValue(2):数据为0表示引导协议,为1表示报告协议。wInd......
HID 设置报告请求SetReport
SetReport请求用于主机向设备发送报告请求。详见:USB请求bmRequestType(1):0x21bRequest(1): SET_REPORT,值为09.wValue(2):高字节报告类型,低字节为报告ID.01:表示输入报告02: 表示输出报告03: 表示特定报告wIndex......
HID 触摸屏的报表描述符
讲道理,这个触摸屏的报告描述符是我从网上搜索的一段代码,这个触摸屏的报告内容本人也进行了测试。测试是通过本站编写的虚拟触摸屏驱动实现的。0x05, 0x0d, // USAGE_PAGE (Digitizers) 0 0x......
HID 简介
 HID(Human Interface Device,人机接口设备)是USB设备中常用的设备类型,是直接与人交互的USB设备,例如键盘、鼠标与游戏杆等。在USB设备中,HID设备的成本较低。另外,HID设备并不一定要有人机交互功能,只要符合HID类别规范的设备都是HID设备。  Wndows操作系......
HID 体系结构
Windows 中的 HID 驱动程序堆栈的体系结构基于名为 hidclass.sys 的类驱动程序。 客户端和传输微型驱动程序从用户模式或内核模式下访问的类驱动程序。HID类驱动程序在系统提供的 HID 类驱动程序是 WDM 功能驱动程序和总线驱动程序 HID 设备安装程序类 (HIDClass)......
HID 报表描述符数字显示实例
USAGE_PAGE (Alphnumeric Display) 05 14USAGE (Alphanumeric Display) 09 01LOGICAL_MINIMUM (0) 15 00 CO......
HID键盘设备数据抓包分析实践
本文使用 Bus Hound 工具对 USB HID 设备数据包进行分析,并结合官方手册及网上文章进行整理。在进行数据分析前,我们先回顾一下USB相关的基础知识。USB描述符USB 主机是通过各种描述符来识别设备的,有设备描述符,接口描述符,端点描述符,字符描述符,报告描述符(HID)等。和普通的......
USB复合HID设备报告描述符的区分
在USB规范中,设备的功能是通过接口来承载的,在USB规格书中就是接口描述符。对于一般的设备,一般一个接口就是一个功能,这个功能可以是鼠标,键盘或其它设备类型。当然这个只是对USB简易设备而言的,对于一些USB复杂设备如UVC摄像头,UAC音频等是多接口相互配合来实现其功能的,为了整合这么多接口使......
HID 设备描述符关系
HID设备连接到USB主机后,主机通过发送Get_Descriptor请求读取HID设备的描述符,了解描述符对了解USB设备是至关重要的。HID设备的描述符HID设备除了支持USB设备的5种标准描述符之外,还支持HID设备特有的3种描述符。这些描述符是:USB标准描述符:设备描述符、配置描述符、......
HID描述符
HID描述符的主要作用是用来识别HID通信所使用的额外描述符。下表是HID描述符结构。偏移量字段字节数数值类型说明0bLength1Numeric描述符字节数1bDescriptorType1Constant0x21 = HID描述符2bcdH......
HID报告描述符详解
HID的报告描述符和其它描述符不一样,不是具有固定的数据结构,而是由固件开发商根据上报的数据自行组装的。这个组装的原材料是HID规范定义的ITEM。所以说HID报告描述符就像搭积木一样,其最终的数据结构和设计图纸是什么,都是由固件开发商决定的,但是其最终的产品又是由HID规范提供的各个标准积木模块搭......
HID 报表描述符远程控制实例
USAGE_PAGE (Consumer Devices) 05 0CUSAGE (Consumer Control) 09 01COLLECTION (Application) A1 01 ......
HID 报表描述符键盘实例
通过下面的报告描述符的定义,我们根据上面的注释可知,包含一个中断输入报表描述符和一个中断输出报告描述符。其中断输入报告描述符用于USB HID键盘中断输入端点,输出报表描述符用于USB HID键盘中断输出端点。USB HID键盘的中断输入报告对于中断输入端点,数据格式定义如下:BYTE0:该字......
USB通用父驱动usbccgp.sys的过滤UVC摄像头、UAC麦克风和HID设备硬件ID
激动的心情,无溢言表。。虽然只是一个很简单的东西。。但相于折腾了这么久,还是很开心的了。最近有个需求,功能是这样的:有一个USB复合设备,连接到windows系统中它在windows下的设备树如下:USB Composite Device(usbccgp.sys)UVC CameraUAC ......
关注公众号
  • HID人机交互
  • Linux&USB
  • UAC音频
  • TYPE-C
  • USB规范
  • USB大容量存储
  • USB百科
  • USB周边
  • UVC摄像头
  • Windows系统USB
  • 音视频博客
  • 取消
    感谢您的支持,我会继续努力的!
    扫码支持
    扫码打赏,你说多少就多少

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

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