USB虚拟设备实现示例
+ -

Windows10下开发虚拟USB鼠标之枚举子设备失败(STATUS_DEVICE_DATA_ERROR)

2021-08-04 311 1

之前发过一篇文章:Win10使用虚拟USB鼠标实现自动挂机测试功能(文章地址:http://www.usbzh.com/article/detail-476.html ) 使用的是虚拟驱动实现的一个虚拟USB鼠标,实现了产品的自动测试功能。

生成的设备在设备管理器中如下:
虚拟USB鼠标

但在开发过程中,并不是一帆风顺的,自己也是踩过很多坑,蓝屏问题,设备枚举失败问题…

今天本人要介绍的是本人踩过的一个坑 - 总线枚举子设备失败的问题。
总线枚举子设备失败
然后通过设备状态的信息查看错误码为10,表示的是子设备启动时失败,错误信息为:STATUS_DEVICE_DATA_ERROR.
STATUS_DEVICE_DATA_ERROR

通过以上问题,首先本人查找IRP_MN_START_DEVICEC相关的代码时,发现并没有问题。
然后再往后查找问题,这里到了分别获取设备描述符配置描述符字符串描述符和报表描述符相关的代码。
在调试的过程中,发现一个很奇怪的问题,系统在别的描述符时是没有重复获取的,而到了报表描述符时,获取了三次后就就进行了URB_FUNCTION_ABORT_PIPE,然后再进入了删除设备的IRP_MN_REMOVE_DEVICE操作。
所以经过上面的调试分析,可以得出一个结论是系统获取报表描述符的问题。
但是本人仔仔细细的分析了相关的代码,这里并没有什么问题啊,报表描述符返回了56字节的描述符,里面的内容也正常啊,所以也不存在STATUS_DEVICE_DATA_ERROR啊。

 UCHAR ReportDesc[46] = {
            0x05, 0x01,  //USAGE_PAGE (Generic Desktop)                
            0x09, 0x02,  //USAGE (Mouse)        
            0xa1, 0x01, //COLLECTION (Application)          
            0x09, 0x01,  //  USAGE (Pointer)              
            0xa1, 0x00, //  COLLECTION (Physical)        
            0x05, 0x09,   //  USAGE_PAGE (Button)             
            0x19, 0x01, //    USAGE_MINIMUM (Button 1)     
            0x29, 0x03,  //   USAGE_MAXIMUM (Button 3)                
            0x15, 0x00, //     LOGICAL_MINIMUM (0)          
            0x25, 0x01,  //    LOGICAL_MAXIMUM (1)     
            0x95, 0x08,  //    REPORT_COUNT (8)            
            0x75, 0x01,   //    REPORT_SIZE (1)       
            0x81, 0x02,  //    INPUT (Data,Var,Abs)    8位按钮

            0x05, 0x01,  //    USAGE_PAGE (Generic Desktop)       
            0x09, 0x30,  //    USAGE (X)     
            0x09, 0x31,  //    USAGE (Y)     
            0x09, 0x38,  //    USAGE(wheel)
            0x15, 0x81, //    LOGICAL_MINIMUM (-127)         
            0x25, 0x7f, //    LOGICAL_MAXIMUM (127)  
            0x75, 0x08,  //    REPORT_SIZE (8)         
            0x95, 0x03, //    REPORT_COUNT (3)     
            0x81, 0x06,  //    INPUT (Data,Var,Rel)        xyz3个这节 
            0xc0, 0xc0
    };

没办法,我们继续调试。因为获取三个报表描述符肯定是不正常的,本人在调试USB HID设备抓包分析时,并没有出现如此的现象,所以这个不正常应该是突破口,但突破口在那里,还需要仔细的调试。

在windbg单步过程中,我注意到了一个很奇怪的现象。
数据长度不一致
这里的size表的的是我返回的报表描述符的长度,56字节=0x2e,但系统下发的URB中分配的数据长度为0x2e40.
从我们以往的经验来看,系统分配内存时一般是按需分配的,并不会多分配的。再看到这两个数据长度,一个是0x24,一个是0x2e40.你俩咋这么像呢?不会是数据没有对齐的锅吧?
我感紧再回看一下配置描述符,数据填充正常,那么唯一引起问题的就是结构体的定义了。
返回到HID_DESCRIPTOR的定义处:

typedef struct _HID_DESCRIPTOR {
    UINT8  bLength;
    UINT8  bDescriptorType;
    UINT16 bcdHID;
    UINT8  bCountryCode;
    UINT8  bNumDescriptors;
    UINT8  bClassDescriptorType;
    UINT16 wClassDescriptorLength;
} HID_DESCRIPTOR, * PHID_DESCRIPTOR;

这个长度由于wClassDescriptorLength占2字节,系统默认会进行补充1字节的数据对齐。
所以修改代码,将整个数据结构进行1字节对齐,再次编译,加载驱动,一切就正常了。

欢迎光临USB中文网进行技术交流,本站微信技术群有200多位全国做USB,UAC,UVC等USB方面的技术开发者和专家,还有解决不了的USB问题?

0 篇笔记 写笔记

Windows下UVC虚拟摄像头的实现
最近在Windows10 x64环境下,开发了一个虚拟UVC摄像头驱动。确切的来说这不是摄像头驱动,而是一个虚拟USB总线驱动。使用该虚拟总线驱动使用应用软件通过IOCTL控制总线子设备的创建与卸载。驱动安装完成后,是一个单纯的USB虚拟总线。应用软件通过发送自定义IOCTL码IOCTL_BUSEN......
Windows10设备管理器USB设备描述符请求失败(未知的usb设备)
在电脑中插入USB设备后,有时会报USB设备描述符请求失败,导致USB设备在设备管理器中枚举失败。USB设备描述符请求失败现象USB设备描述符请求失败在设备管理器中发现通用串行总线控制器下面有一项黄色感叹号并提示“未知USB设备(设备描述符请求失败)”或者是“Unknown USB Device(......
USB鼠标HID报告描述符数据格式分析
注意:这里的鼠标为普通鼠标报告描述符的信息解释,其并不适用于全鼠标报表描述符。一个示例如下:0x05,0x01, // Global Generic Desktop0x09,0x02, // Local Mouse0xa1,0x01, // Main app collection0x09,......
为什么Windows7重新安装系统后插在USB3.0端口的鼠标不能使用?
在 Windows 7 及更早版本的操作系统中,USB 3.0 驱动程序堆栈由第三方提供,操作系统不提供USB3.0驱动栈。 因此,Windows7重新安装系统后插在USB3.0端口上的所有设备都无法工作,需要安装第三方提供的USB控制器和集线器驱动,这样才能识别出挂接在该USB总线下的设备。从Wi......
HID 报表描述符鼠标实例
USAGE_PAGE (Generic Desktop) 05 01USAGE (Mouse) 09 02COLLECTION (Application) A1 01 ......
Win10使用虚拟USB鼠标实现自动挂机测试功能
昨天要测试一个软件不停的整机的功能:在整机软件中需要不停地点击某个软件的按钮,启动会议功能,然后隔一段时间后,需要再次呼出关闭按钮,并点击将该按钮停止会议,如此往复的操作。当然这些操作是需要人工操作点击软件界面的某些按钮实现的。本以为是一个很简单的东西,没想到还是弄出了花样。初始版本 - 脚本方......
USB鼠标HID全局坐标报表描述符
常用的USB HID鼠标是相对的描述符,鼠标的移动是相对当前位置的相对移动。如相对当前位置左移,右移等。这种相对的坐标描述符有的时候在使用上有一定麻烦的,最重要的原因就是需要计算鼠标指针的当前位置。如本人之前做的一个USB鼠标挂机测试脚本,内容详见:http://www.usbzh.com/ar......
HID复合设备(键盘、鼠标)的实现
在使用一些USB键盘或鼠标的时候,特别是一些电竟高档HID设备时,经常发现这些设备会额外定义一些特别的快捷键,使得这些设备不仅有基础设备(如键盘,鼠标)的功能,也有一些特别的快捷功能(如系统声音的放大放小)。甚至更有一些复杂的设备,只需要一个USB接口,就同时支持鼠标键盘功能或在键盘的额外区域支持触......
USB设备的调试笔记-奇怪枚举失败问题
自己搞了一个USB 触摸屏的驱动,通过对系统的USB触摸屏设备进行更改,这样可以在自己的驱动中过滤来自触摸屏的数据。在不加自定义驱动的情况下,设备管理器树关系如下:USB输入设备USB触摸屏设备而加上自己的设备驱动后,设备管理器树关系如下:自己的驱动程序USB输入设备USB触摸屏设备......
Windows10下开发虚拟USB鼠标之枚举子设备失败(STATUS_DEVICE_DATA_ERROR)
之前发过一篇文章:Win10使用虚拟USB鼠标实现自动挂机测试功能(文章地址:http://www.usbzh.com/article/detail-476.html ) 使用的是虚拟驱动实现的一个虚拟USB鼠标,实现了产品的自动测试功能。生成的设备在设备管理器中如下:但在开发过程中,并不是一帆......
Windows下通过USB虚拟的键盘鼠标总结
哐哐铛铛的,终于把以前搞的虚拟键盘、鼠标的驱动代码重新整理完成,并且在此基础上将USB虚拟的键盘和鼠标整合到一个驱动中。将键盘和鼠标的代码合并在一起的原因很简单:第一是为了验证自己写的这个虚拟的总线的功能第二就是键盘一般和鼠标是联系在一起的,用键盘的地方大部也要用到鼠标。所以干脆将这两个设备合并......
Windows虚拟UAC麦克风增加特性单元的开发调试笔记
昨晚突然接到通知,需要增加对UAC麦克风设备音量增益的控制。我努力地回忆了去年12月份自己粗略地整理的UAC规范,发布于http://www.usbzh.com/article/forum-1.html想着今天完成应该是美好的周五,会心满意足地完成工作,然后美美地打卡下班。可没想到就这么一个简单的......
Win10 x64虚拟设备之触摸屏
前一段时间在本人整理了自己编写的USB虚拟驱动框架,在其基础上实现了虚拟键盘,鼠标的功能。本节是继虚拟键盘鼠标的另一个虚拟USB设备-触摸屏触摸屏设备是HID设备的一个小类,但是随着触摸设备使用的越来越广泛,这类设备也变地越来越重要。触摸屏设备的原理和我们手机上的触摸屏原理一样,是在电脑屏幕上有一层......
HID设备虚拟触摸屏上报的多点数据系统不响应
前一般时间在Windows10下使用USB驱动虚拟了一个触摸屏设备,上层软件按照HID报告述符的格式下发触摸屏数据给驱动,再由驱动将数据上交给系统,实现虚拟触摸屏的功能。今天,突发奇想,上次的报告描述符仅支持的是一个点触摸效果,今天保不实现了一下多点触摸效果,所以我通过在一个支持多点触摸屏的设备......
Win10 x64下USB-UAC虚拟声卡扬声器的实现
去年的时候,使用portclass驱动模型在windows下虚拟了一个虚拟扬声器和虚拟麦克风。扬声器和麦克风在内部通过拓扑结构进行数据关联,即麦克风的数据的来源于扬声器,实现了这样的回环。最近突然有个需求,就是不需要麦克风,只要一个扬声器,即虚拟声卡。那怎么办呢?既然本人是专门做USB驱动开发的,在......
作者信息
USB中文网
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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