UAC开发调试笔记
+ -

UAC虚拟麦克风同步传输数据结构与BUSHOUND抓包URB的对比

2023-02-08 247 0

昨天晚上在家又在卷。。。
在Windows系统下虚拟的UAC麦克风,这是一个自己很熟练的事情了,不过自己为了再次优化一些代码,也在疯狂的试探某些数据的底线在那里,所以卷的结果就是使用BUSHOUND抓了个包。
UAC设备是USB的音视设备分类,所以我们看到的USB麦克风、扬声器(耳机)之类的,都符合UAC规范,当然也是基于USB规范的。
UAC规范定义了UAC设备的数据传输方式为USB同步传输方式,其在Windows驱动中表现为IRP的IO_STACK_LOCATION成员Parameters.Others.Argument1对应的URB,该URB支持USB的各种数据传输方式,包括同步传输数据方式。

PURB GetUrb(PIRP Irp)
{
    PIO_STACK_LOCATION IoStack = IoGetCurrentIrpStackLocation(Irp);
    PURB Urb = (PURB)IoStack->Parameters.Others.Argument1;
    return Urb;
}

USB的同步传输方式相对于其它传输方式如中断传输批量传输或者控制传输,其数据结构相对复杂一些,但是在数据处理上,也就更麻烦了一些。
URB同步方式的数据结构如下:

typedef LONG USBD_STATUS;
typedef PVOID PMDL;
typedef PVOID USBD_PIPE_HANDLE;

struct _URB_HEADER {
    USHORT Length;
    USHORT Function;
    USBD_STATUS Status;
    PVOID UsbdDeviceHandle; // Reserved
    ULONG UsbdFlags; // Reserved
    ULONG reversed; // Reserved    
};
struct _URB_HCD_AREA {
    PVOID Reserved[8]; 
};

typedef struct _USBD_ISO_PACKET_DESCRIPTOR {
    ULONG Offset;
    ULONG Length;
    USBD_STATUS Status;
} USBD_ISO_PACKET_DESCRIPTOR;

struct _URB_ISOCH_TRANSFER {
    struct _URB_HEADER Hdr;
    PVOID PipeHandle;
    ULONG TransferFlags;
    ULONG TransferBufferLength;
    PVOID TransferBuffer;
    PVOID TransferBufferMDL;
    PVOID  *UrbLink; // Reserved
    struct _URB_HCD_AREA hca; // Reserved
    ULONG StartFrame;
    ULONG NumberOfPackets;
    ULONG ErrorCount;
    _USBD_ISO_PACKET_DESCRIPTOR IsoPacket[10];
};

对于一组十六进制,我们可以通过本站的一个在线分析工具来进行数据分析,详见https://www.usbzh.com/tool/urb-iso.html

本人昨晚通过bushound抓取的UAC麦克风数据包如下:

  38.1      1764  ISOC   c8 07 c1 11  03 07 14 0e  e7 07 b2 0c  57 09 fd 0b  54 09 fc 0a  ec 07 10 0b  da 05 37 0c  af 03 de 0c 
后续还有很多,这里省略

而对应的URB如下:

38.1 URB    10 01 0a 00  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  81 01 01 00  00 00 00 00  ISOC TRANSFER 
            05 00 00 00  e4 06 00 00  10 91 ae 03  02 80 ff ff  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00                
            00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00                
            00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00                
            c0 3f 00 00  0a 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00  c0 00 00 00  00 00 00 00                
            00 00 00 00  80 01 00 00  00 00 00 00  00 00 00 00  40 02 00 00  00 00 00 00  00 00 00 00  00 03 00 00                
            00 00 00 00  00 00 00 00  c0 03 00 00  00 00 00 00  00 00 00 00  80 04 00 00  00 00 00 00  00 00 00 00                
            40 05 00 00  00 00 00 00  00 00 00 00  00 06 00 00  00 00 00 00  00 00 00 00  c0 06 00 00  00 00 00 00                
            00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00

不过在实际测试的时候,发现音频控制面板中的虚拟出来的麦克风并没有能量波动,使用audacity-win这类软件在录制该麦克风的数据时,竟录一到任何数据。
所以这和BUSHOUND上显示的不一致,因为我从上面BUSHOUND上面来看,是有数据的,且是连续的。
那么只有一种情况就是数据可能被系统判为无效,不过BUSHOUND上确实显示了每包1764个字节,这和我们2通道16位44100的采样率是一致的。而且由于我们的麦克风传输的是PCM数据,所以也不存在数据实校验等问题,这1764就真实的PCM数据。

那问题出在哪里呢?

BUSHOUND作为第三方工具并且搞了这么久的工具,在我们不潜意识里应该是没有问题的。但是在Window系统层面来讲,确实没有数据,所以依操作系统的角度来讲,bushound是有问题的。

既然数据没有问题,那么就是其返回的数据的参数问题了,我们把焦点放在了USB的同步传输URB中,通过我们的工具分析其URB数据如下:

_URB_ISOCH_TRANSFER        
_URB_HEADER    Hdr    
USHORT    Length    10 01 
USHORT    Function    0A 00 
USBD_STATUS    Status    00 00 00 00 
PVOID    UsbdDeviceHandle    00 00 00 00 00 00 00 00 
ULONG    UsbdFlags    00 00 00 00 
ULONG    reversed    00 00 00 00 

PVOID    PipeHandle    81 01 01 00 00 00 00 00 
ULONG    TransferFlags    05 00 00 00 
ULONG    TransferBufferLength    E4 06 00 00 
PVOID    TransferBuffer    10 91 AE 03 02 80 FF FF 
PVOID    TransferBufferMDL    00 00 00 00 00 00 00 00 
PVOID    UrbLink*    00 00 00 00 00 00 00 00 
_URB_HCD_AREA    hca    
PVOID    Reserved[8]
00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 

ULONG    StartFrame    C0 3F 00 00 
ULONG    NumberOfPackets    0A 00 00 00 
ULONG    ErrorCount    00 00 00 00 
_USBD_ISO_PACKET_DESCRIPTOR    IsoPacket[10]

ULONG    Offset    00 00 00 00 
ULONG    Length    00 00 00 00 
USBD_STATUS    Status    00 00 00 00 


ULONG    Offset    C0 00 00 00 
ULONG    Length    00 00 00 00 
USBD_STATUS    Status    00 00 00 00 


ULONG    Offset    80 01 00 00 
ULONG    Length    00 00 00 00 
USBD_STATUS    Status    00 00 00 00 


ULONG    Offset    40 02 00 00 
ULONG    Length    00 00 00 00 
USBD_STATUS    Status    00 00 00 00 


ULONG    Offset    00 03 00 00 
ULONG    Length    00 00 00 00 
USBD_STATUS    Status    00 00 00 00 


ULONG    Offset    C0 03 00 00 
ULONG    Length    00 00 00 00 
USBD_STATUS    Status    00 00 00 00 


ULONG    Offset    80 04 00 00 
ULONG    Length    00 00 00 00 
USBD_STATUS    Status    00 00 00 00 


ULONG    Offset    40 05 00 00 
ULONG    Length    00 00 00 00 
USBD_STATUS    Status    00 00 00 00 


ULONG    Offset    00 06 00 00 
ULONG    Length    00 00 00 00 
USBD_STATUS    Status    00 00 00 00 


ULONG    Offset    C0 06 00 00 
ULONG    Length    00 00 00 00 
USBD_STATUS    Status    00 00 00 00

在通过工具分的的URB中,可以看到:

ULONG    TransferBufferLength    E4 06 00 00 
PVOID    TransferBuffer    10 91 AE 03 02 80 FF FF

分别代表了数据传输的长度和内存地址。这里是正确的。因为E4 06 00 00 就是1764,而10 91 AE 03 02 80 FF FF 就是这1764个字节存储的地址。这和BUSHOUND显示的一致,不过实际上是没有获取到数据的,这是因为USBD_ISO_PACKET_DESCRIPTOR因引的,我们看到10个USBD_ISO_PACKET_DESCRIPTOR,其数据长度都为0,所以总的数据长度就是0。所以有效数据就是0。

所以从这里看的出来一个问题,BUSHOUND和体统取的数据位置是一样的,但有效长度是不一样的。一般情况下USBD_ISO_PACKET_DESCRIPTOR中的Length之和就是TransferBufferLength,但我们由于是虚拟的麦克风,没有对这个有效长度设置,出现了二般情况了。

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-UAC麦克风 音频控制接口
音频控制接口描述符描述了设备的结构(拓扑结构),并通过特定类请求对音频的控制。UAC麦克风 音频控制接口描述符偏移地址字段长度值描述0bLength10x09接口描术符的长度1bDescriptorType10x04描述符的类型接口描述符2bInterfaceNumber10x00接口ID号3bA......
UVC 等时传输中的URB_ISOCH_TRANSFER
通过UVC规范可知,视频图像数据的读取可使用两种端点传输方式,分别为:BULK 块/批量传输方式ISO 等时/同步传输方式在Windows内核中,USB数据的读取是通过URB来进行传输的,其结构体是一个大大的共用体,根据数据传输的方式对应其不同的结构体,其内容如下:typedef _Struct_s......
UVC等时传输中的dwMaxPayloadTransferSize
UVC的视频流接口控制请求的数据大小可为26字节,34字节和48字节,其分别对应的是UVC的1.0,1,1和UVC1.5版本。在其整个视频流控制接口参数偏移地址22处的字段为一4字节的dwMaxPayloadTransferSize,根据其字段解释为“指定设备在单个有效负载传输中可以传输或接收的最大......
USB-UAC麦克风 配置描述符
UAC麦克风采用的配置描述符结构和USB配置描述符的结构一致.偏移地址字段长度值描述0bLength10x09配置描述符的长度1bDescriptorType10x02描述符类型,配置描述符类型2wTotalLength20x0064配置描述符的总长度(包括后续的UAC音频控制和UAC音频流接口描述......
华为UAC麦克风的工作过程数据分析
看完了耳机的数据分析,再来分析麦克风,就相对来说很简单了,这是因为:第一:麦克风没有音频控制特效单元描述符,所以少了很多特定类请求。第二:麦克风只有一个音频流转换接口,且只支持采样率为48000HZ 16位。具体的过程见下:Length Phase Data-------- --......
USB-UAC麦克风 功能简介
这里描述的设备是一个USB麦克风。这是一个非常简单的设备,没有音频控制合并等其它功能。它通过音频流接口向主机提供单声道音频数据流。这个使用的音频数据格式是16位8KHz PCM。同步类型为异步源。它使用内部时钟作为参考源。本章要介绍的是UAC1.0规范附录B自带的USB麦克风的内容。从拓年图上可以看......
USB-UAC麦克风 字符串描述符
偏移地址字段长度值描述0bLength10x18描述符长度1bDescriptorType10x03描述符类型:字符串描述符2bString10x00540x00480x00450x00200x00430x004F0x004D0x00500x00410x004E0x0059“THE COMPANY”......
USB 等时/同步传输、块传输与转换设置在UVC摄像头驱动中的探讨
最近在Windows10 x64环境下,开发了一个虚拟UVC摄像头驱动。确切的来说这不是摄像头驱动,而是一个虚拟USB总线驱动。使用该虚拟总线驱动使用应用软件通过IOCTL控制总线子设备的创建与卸载。框架设计驱动安装完成后,是一个单纯的USB虚拟总线。应用软件通过发送自定义IOCTL码IOCTL......
USB通用父驱动usbccgp.sys的过滤UVC摄像头、UAC麦克风和HID设备硬件ID
激动的心情,无溢言表。。虽然只是一个很简单的东西。。但相于折腾了这么久,还是很开心的了。最近有个需求,功能是这样的:有一个USB复合设备,连接到windows系统中它在windows下的设备树如下:USB Composite Device(usbccgp.sys)UVC CameraUAC ......
USB-UAC麦克风 音频流接口
音频流接口有2个转换接口。UAC麦克风 零带宽转换接口转换接口0是零带宽设置,用于在麦克风未使用。这是通电后的默认设置。实现了零带宽通过指定接口的此备用设置没有与之关联的端点(bNumEndpoints=0)。偏移地址字段长度值描述0bLength10x091bDescriptorType10x04......
UVC 静止图像触发控制
静止图像触发控制通知设备开始通过相关的同步或大容量管道发送静态图像数据。专用的静态图像大容量管道仅用于静态图像捕获的方法3。此控制只能在流式传输时设置,并且在发送静态图像后,硬件应将其重置为“正常操作”模式。仅当设备支持静态图像检索的方法2或方法3时,才需要此控件。控制选择子VS_STILL_IMA......
USB 同步/等时传输方式
USB协议规定了四种传输类型:控制传输、批量传输、同步传输、中断传输。等时传输也有“同步传输”的叫法,一般用于要求数据连续、实时且数据量大的场合,其对传输延时十分敏感,类似用于USB摄像设备,USB语音设备等等。同步事务没有握手包。当一个同步传输中有多个事务时,最后一个事务之前的事务的数据长......
USB-UAC麦克风 设备描述符
UAC麦克风采用的设备描述符结构和USB设备描述符的结构一致,只是有些字段的值有所要求。偏移地址字段长度值描述0bLength10x12设备描述符的总和长度1bDescriptorType10x01设备描述符类型2bcdUSB 20x01001.00使用的USB版本号4bDeviceClass10x......
USB超高速 同步传输
正如USB2.0一样,超速同步传输类型是用来支持想要能容忍错误,周期性的轮询服务的传输流。超速跟USB2.0一样不发送起始帧,但是时序信息要通过同步时间戳包(ITP)被发送给设备。这个规格的协议层章详细描述了用来完成同步传输的包,总线事务和事务处理流程。也描述了怎么样传送时序信息给设备。超速同步传输......
UAC麦克风拓扑图
UAC麦克风是UAC规范中的USB音频输入设备,它的拓扑图如下:可以看到,在UAC域内,这个拓扑图是一个最简单的UAC麦克风拓扑图,只包括一个输入终端和一个输出终端,输入终端对应的是拾音端,而输出终端将最终的音频数据打包通过USB端点传输给主机。当然,不管是不是最简单的麦克风,最基本的东西都是......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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