WinUSB
+ -

WinUSB使用控制端点0发送USB标准请求

2022-05-11 876 0

向默认端点发出控制请求来与设备通信。

除了与接口关联的端点外,所有 USB 设备还有一个默认端点。 默认端点的主要用途是为主机提供可用来配置设备的信息。 不过,设备还可以将默认端点用于设备特定的用途。

控制命令包含一个 8 字节设置数据包,其中包括指定特定请求的请求代码和可选的数据缓冲区。 请求代码和缓冲区格式是供应商定义的。 在此示例中,应用程序将数据发送到设备来控制灯条。 用于设置灯条的代码是0xD8,为方便起见,它定义为SET_BARGRAPH_DISPLAY。 对于此请求,设备需要一个 1 字节数据缓冲区,该缓冲区通过设置相应的位来指定应点亮哪些元素。

应用程序可以通过用户界面 (UI) 对此进行设置,例如,通过提供总数为 8 个的一组复选框控件来指定应点亮灯条的哪些元素。 指定的元素对应于缓冲区中的相应位。 为避免编写 UI 代码,此部分中的示例代码将设置位以使备用灯亮起。

  • 分配一个 1 字节数据缓冲区,并将数据加载到通过设置相应位来指定应点亮的元素的缓冲区中。

  • 在调用方分配的结构中构造WINUSB_SETUP_PACKET数据包。 将成员初始化,以便表示请求类型和数据,如下所示:

    • RequestType 成员指定请求方向。 它设置为 0,表示主机到设备的数据传输。 对于设备到主机的传输,请将 RequestType 设置为 1。
    • Request 成员已针对此请求设置为请求类型。 。
    • Length 成员设置为数据缓冲区的大小。
    • Index 和 Value 成员对于此请求而言并非必需,因此它们设置为零。

      关于这些字段的含义详见 USB标准请求

  • 调用 WinUsb_ControlTransfer ,通过传递设备的 WinUSB 接口句柄、设置数据包和数据缓冲区,将请求传输到默认终结点。 该函数在 LengthTransferred 参数中接收已传输到的设备的字节数。

BOOL SendDatatoDefaultEndpoint(WINUSB_INTERFACE_HANDLE hDeviceHandle)
{
    if (hDeviceHandle==INVALID_HANDLE_VALUE)
    {
        return FALSE;
    }

    BOOL bResult = TRUE;


    UCHAR bars = 0; //bar为控制请求携带的数据

    WINUSB_SETUP_PACKET SetupPacket;
    ZeroMemory(&SetupPacket, sizeof(WINUSB_SETUP_PACKET));
    ULONG cbSent = 0;

    //Set bits to light alternate bars
    for (short i = 0; i < 7; i+= 2)
    {
        bars += 1 << i;
    }

    //Create the setup packet
    SetupPacket.RequestType = 0;
    SetupPacket.Request = 0xD8;
    SetupPacket.Value = 0;
    SetupPacket.Index = 0; 
    SetupPacket.Length = sizeof(UCHAR);

    bResult = WinUsb_ControlTransfer(hDeviceHandle, SetupPacket, &bars, sizeof(UCHAR), &cbSent, 0);
    if(!bResult)
    {
        goto done;
    }

    printf("Data sent: %d \nActual data transferred: %d.\n", sizeof(bars), cbSent);


done:
    return bResult;

}
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标准请求、类特定请求总结
做USB开发,最常见的就是USB的控制请求的那8个字节的分析,如果抓包工具有协议分析那还好说,但是如果不带速协议分析,那其实还是挺郁闷的。所以说,如何快速的通过USB请求的那几个字段定位出是何请求,是可以大大的提高我们的协议分析效率的。USB的请求这里包括USB的标准请求和特定类请求,其包括以下几......
USB 控制传输方式
USB协议规定了四种传输类型:控制传输、批量传输、同步传输、中断传输。控制传输是一种特殊的传输方式。当USB设备初次连接主机时,用控制传输传送控制命令等对设备进行配置。同时设备接入主机时,需要通过控制传输去获取USB设备的描述符以及对设备进行识别,在设备的枚举过程中都是使用控制传输进行数据交换......
USB超高速 控制传输
控制传输的目的与特点与USB2.0协议完全相同。这个规格的协议层章节详细描述了用于完成控制传输的包,总线事务处理和事务处理流程。设备架构那章定义了完整系列的设备使用的标准命令编码。每个设备需要启动默认控制管道作为一个消息管道。这个管道用来进行设备初始化和管理,用来访问设备描述符和向设备请求对其进行操......
UVC 控制传输与请求处理
请求是主机软件与实体中控制器交流的一种机制。请求都是由主机向设备端发起的功能请求,所有的USB设备都需要支持标准的设备请求和与Class相关的特殊类请求。标准请求: 在标准协议中有相关描述,不做详细展开特殊类请求: 事实上特殊类请求也可以根据接口来分成两大类:视频控制请求.视频流请求。1)视......
使用BUSHOUND手动分析USB控制传输的URB
USB的控制传输是最基本的传输类型,控制传输适用于设备的枚举和设备的状态控制。我里我们使用BUSHOUND来抓取USB控制传输的URB。同样的,我们使用的操作系统是Windows10 x64,和同步传输的URB抓包一样,我们先抓取数据,然后再分析数据结构。这里我插入电脑的U盘的枚举以获取设备描述符为......
USB2.0协议 传输包、事务和传输
USB总线上传递的数据流是USB主机和USB设备通讯的基础。USB数据流包括3个阶段:令牌阶段 :定义了本次传输的类型,表示一次传输的开始。令牌阶段由同步字段,令牌包和EOP组成。数据阶段 :包括了本次传输的数据。数据的大小根据端点大小和传输类型决定,一般最大的数据量为1024字节。数据阶段由同......
USB2.0 控制传输数据包PID序列
USB数据包的PID序列指的不是数据包的PID序列,特指DATA0,DATA1,DATA2和MDATA的PID序列,即USB在数据传输过程中这些数据包的顺序。USB的数据传输分为四种,分别为控制传输、同步传输、批量传输和中断传输。这四种数据传输方式除过控制传输,其余数据的传输过程都是通过IN事务或者......
USB2.0低速、全速、高速模式四种传输模式速宽对比
USB 数据传输通过事务来实现。事务在帧的主机控制时间间隔内进行。事务的长度和频率取决于端点使用的传输类型。可以在一个帧中发送的传输类型和帧长度由 USB 的指定速度定义。低速模式下控制传输、中断传输、批量传输、同步传输对比低速帧速率为1ms传输类型最大传输长度每帧的传输次数最大理......
HID设备描述符请求及实例分享
使用BUSHOUND拆包,获取设备描述符使用GET_DESCRIPTOR请求,其内容如下:Device Length Phase Data Description ------ --......
WinUSB使用控制端点0发送USB标准请求
向默认端点发出控制请求来与设备通信。除了与接口关联的端点外,所有 USB 设备还有一个默认端点。 默认端点的主要用途是为主机提供可用来配置设备的信息。 不过,设备还可以将默认端点用于设备特定的用途。控制命令包含一个 8 字节设置数据包,其中包括指定特定请求的请求代码和可选的数据缓冲区。 请求代码......
自研BUSHOUND工具USBHound开发调试笔记-USB控制传输的数据抓包实现
本想着搞一个自研的BUSHOUND应该是一件比较简单的事,但没想到也麻烦了。搞了一天upperfilter,最终还是投降,换成了lowerfilter.前面搞的时候,对系统中所有USB设备进行过滤,导致系统中的数据打印太多,无法分清谁是谁。当然也可以分清,每个设备的地址不一样,并且设备栈也是明确的,......
USBIP 控制传输-获取描述符GetDescriptor
URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICEUSB设备枚举过程中,需要获取USB相关的描述符。这些描述符一般包括USB设备描述符,USB配置描述符,USB字符串描述符。USBIP获取描述符通过store_urb_get_dev_desc来实现。static NTS......
USBIP 控制传输URB_FUNCTION_CONTROL_TRANSFER
static NTSTATUSstore_urbr_submit(PIRP irp, struct urb_req *urbr){... case URB_FUNCTION_CONTROL_TRANSFER: status = store_urb_control_tra......
USBIP 扩展控制传输URB_FUNCTION_CONTROL_TRANSFER_EX
static NTSTATUSstore_urbr_submit(PIRP irp, struct urb_req *urbr){... case URB_FUNCTION_CONTROL_TRANSFER_EX: status = store_urb_control_......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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