USB调试笔记
+ -

Windows下虚拟USB设备数据的读写请求调试笔记

2021-09-09 2135 3

到现在为止,本人已经在Windows下确切来说是Windows10 x64下开发了以下USB虚拟USB设备:

  • USB虚拟UVC摄像头设备
  • USB虚拟UAC麦克风设备
  • USB虚拟HID键盘设备
  • USB虚拟HID鼠标设备
  • USB虚拟HID键盘鼠标复合设备
  • USB虚拟HID单点触摸屏设备
  • USB虚拟HID多点触摸屏设备

断断续续,搞了好几个月了,下一步打算继续虚拟别的设备。这里本人对以上的虚拟设备开发的过程中遇到的一个问题做一个总结:
USB虚拟子设备的控制请求如设备在工作时的UVC相机的PTZ控制,HID设备中断数据的收发的时机等。

以上的设备控制或数据收发都是设备在工作状态时,子设备的PDO收到IRP_MJ_INTERNAL_DEVICE_CONTROL控制请求实现的。
该IRP的当前IO_STACK_LOCATION堆栈区域的Parameters.Others.Argument1字段载带的URB字段,是USB设备数据通讯的核心数据结构。

PIO_STACK_LOCATION IoStack = IoGetCurrentIrpStackLocation(Irp);
PURB Urb = (PURB)IoStack->Parameters.Others.Argument1;

而URB根据判断USB控制请求类型URB_FUNCTION_CLASS_INTERFACE用于UVC特定类请求

struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST {
    struct _URB_HEADER Hdr;
    PVOID Reserved;
    ULONG TransferFlags;
    ULONG TransferBufferLength;
    PVOID TransferBuffer;
    PMDL TransferBufferMDL;
    struct _URB *UrbLink; // Reserved
    struct _URB_HCD_AREA hca; // Reserved
    UCHAR RequestTypeReservedBits;
    UCHAR Request;
    USHORT Value;
    USHORT Index;
    USHORT Reserved1;
};

这个结构体包括了常见的USB标准请求和UVC特定类请求,详情可参见相站相关的章节。

而URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER用于中断传输批量传输

struct _URB_BULK_OR_INTERRUPT_TRANSFER {
    struct _URB_HEADER Hdr;
    USBD_PIPE_HANDLE PipeHandle;
    ULONG TransferFlags;
    ULONG TransferBufferLength;
    PVOID TransferBuffer;
    PMDL TransferBufferMDL;
    struct _URB *UrbLink; // Reserved
    struct _URB_HCD_AREA hca; // Reserved
};

URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER用于中断数据收发。

以上的两种请求是在USB虚拟设备在工作时遇到的最常见的数据请求。(这里的UVC的同步传输这里不讨论,其和BULK传输类似,只是换了一套结构体而已)。

关于这里的处理,我见到的有人将它们全部挂入队列中,然后再设备创建时,开启线程串行处理。特别是对URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER这类需要等待数据的请求,使用KeWaitForsingleObject来处理,但是对于如UVC特定类请求又可能会因为这个等待导致如PTZ等控制请求得不到及时响应,导致很慢,很卡..
这里为什么要开启线程处理呢?是因为异步问题。如果不异步会导致比较多奇怪的问题,我遇到的最夸张的是设备子设备不能枚举完全成功。
如我们枚举一个虚拟触摸屏设备,如果在主线程中KeWaitForsingleObject,但是又由TP数据是中断方式输入给主机的,系统会下发IPR给子设备,会导致HID输入设备树下无法再枚举触摸屏设备。
所以对于这里的请求,一般是将IRP Pending,挂入队列,由于我的是虚拟的,当应用下发数据时,再获取IRP,完成该IPR.这样实现了所谓的异步。

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系列函数枚举出系统中......
UVC 等时传输中的URB_ISOCH_TRANSFER
通过UVC规范可知,视频图像数据的读取可使用两种端点传输方式,分别为:BULK 块/批量传输方式ISO 等时/同步传输方式在Windows内核中,USB数据的读取是通过URB来进行传输的,其结构体是一个大大的共用体,根据数据传输的方式对应其不同的结构体,其内容如下:typedef _Struct_s......
Windows下UVC虚拟摄像头的实现
最近在Windows10 x64环境下,开发了一个虚拟UVC摄像头驱动。确切的来说这不是摄像头驱动,而是一个虚拟USB总线驱动。使用该虚拟总线驱动使用应用软件通过IOCTL控制总线子设备的创建与卸载。驱动安装完成后,是一个单纯的USB虚拟总线。应用软件通过发送自定义IOCTL码IOCTL_BUSEN......
USB复合HID设备报告描述符的区分
在USB规范中,设备的功能是通过接口来承载的,在USB规格书中就是接口描述符。对于一般的设备,一般一个接口就是一个功能,这个功能可以是鼠标,键盘或其它设备类型。当然这个只是对USB简易设备而言的,对于一些USB复杂设备如UVC摄像头,UAC音频等是多接口相互配合来实现其功能的,为了整合这么多接口使......
USB通用父驱动usbccgp.sys的过滤UVC摄像头、UAC麦克风和HID设备硬件ID
激动的心情,无溢言表。。虽然只是一个很简单的东西。。但相于折腾了这么久,还是很开心的了。最近有个需求,功能是这样的:有一个USB复合设备,连接到windows系统中它在windows下的设备树如下:USB Composite Device(usbccgp.sys)UVC CameraUAC ......
HID设备固件升级失败
USB设备现在比较多,像UVC摄像头,UAC音频或TOUCH设备,这些设备在设备管理器中无不都会带一个自定义的HID设备。这个自定义的HID主要的功能一般是通过应用层与固件进行数据通讯,比如对固件参数的配置,甚至固件的升级。在Windows下,两2套与HID设备的通讯的接口,一组是WriteFil......
Win10使用虚拟USB鼠标实现自动挂机测试功能
昨天要测试一个软件不停的整机的功能:在整机软件中需要不停地点击某个软件的按钮,启动会议功能,然后隔一段时间后,需要再次呼出关闭按钮,并点击将该按钮停止会议,如此往复的操作。当然这些操作是需要人工操作点击软件界面的某些按钮实现的。本以为是一个很简单的东西,没想到还是弄出了花样。初始版本 - 脚本方......
USB复合设备-UVC摄像头HID设备共存的设计实现
通常做USB设备的开发,我们做的都是单一的功能设备。这种单一的功能设备只实现某种特定的功能,如只实现一个HID鼠标或键盘,只实现一个USB存储功能,或再复杂一点只实现一个UVC音频麦克风和扬声器功能或一个UVC摄像头功能。但我们在一般的市场上看到的设备通常不只实现一种功能,如UVC摄像头功能还提供......
Windows10下开发虚拟USB鼠标之枚举子设备失败(STATUS_DEVICE_DATA_ERROR)
之前发过一篇文章:Win10使用虚拟USB鼠标实现自动挂机测试功能(文章地址:http://www.usbzh.com/article/detail-476.html ) 使用的是虚拟驱动实现的一个虚拟USB鼠标,实现了产品的自动测试功能。生成的设备在设备管理器中如下:但在开发过程中,并不是一帆......
Windows下通过USB虚拟的键盘鼠标总结
产品级详见:https://www.usbzh.com/article/detail-1182.html哐哐铛铛的,终于把以前搞的虚拟键盘、鼠标的驱动代码重新整理完成,并且在此基础上将USB虚拟的键盘和鼠标整合到一个驱动中。将键盘和鼠标的代码合并在一起的原因很简单:第一是为了验证自己写的这个虚......
Windows虚拟UAC麦克风增加特性单元的开发调试笔记
昨晚突然接到通知,需要增加对UAC麦克风设备音量增益的控制。我努力地回忆了去年12月份自己粗略地整理的UAC规范,发布于http://www.usbzh.com/article/forum-1.html想着今天完成应该是美好的周五,会心满意足地完成工作,然后美美地打卡下班。可没想到就这么一个简单的......
Win10 x64虚拟设备之触摸屏
前一段时间在本人整理了自己编写的USB虚拟驱动框架,在其基础上实现了虚拟键盘,鼠标的功能。本节是继虚拟键盘鼠标的另一个虚拟USB设备-触摸屏触摸屏设备是HID设备的一个小类,但是随着触摸设备使用的越来越广泛,这类设备也变地越来越重要。触摸屏设备的原理和我们手机上的触摸屏原理一样,是在电脑屏幕上有一层......
HID设备的实现原理-HID描述符
USB设备的信息存储在USB设备的固件中,当USB设备接入PC机启动后,主机会通过USB的标准请求对存储在USB设备的固件信息进行读取分析。这些存储的信息主要包括各种USB描述符信息,如设备描述符,配置描述符,接口描述符、端点描述符和字符串描述符等。USB设备的功能按接口来进行分类的,一个接口就代......
HID设备描述符的级级关系
和大多数的USB设备一样,HID设备也有USB设备的一些标准描述符,如设备描述符、配置描述符、接口描述符、端点找述符。但HID设备也有一些特的描述述,如HID描述符和报告描述符(也叫描表描述符)。HID设备的设备类型不是在设备类型中定义,而是在接口描述符中定义。设备描述符中的bDeviceCla......
HID设备的bInterfaceClass、bInterfaceSubClass和bInterfaceProtocol
HID设备是USB规范定义的设备类型之一,其分类号为0x03.关于USB设备类型定义,可参见本站:http://www.usbzh.com/article/detail-221.htmlHID设备除了用于专门的输入输出设备外,有时也与其它的设备类型组合成一个复杂的设备。如对于UVC摄像头设备,可以......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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