USBIP解读及源码分析
+ -

Windows内核USB配置描述符解析函数

2022-10-10 23 0

从USB配置描述符中解析相关的描述符,大量利用系统提供的函数。可以大量节省时间。


#include <usbdlib.h>

PUSB_INTERFACE_DESCRIPTOR
dsc_find_first_intf(PUSB_CONFIGURATION_DESCRIPTOR dsc_conf)
{
    return (PUSB_INTERFACE_DESCRIPTOR)USBD_ParseDescriptors(dsc_conf, dsc_conf->wTotalLength, dsc_conf, USB_INTERFACE_DESCRIPTOR_TYPE);
}

PUSB_INTERFACE_DESCRIPTOR
dsc_find_intf(PUSB_CONFIGURATION_DESCRIPTOR dsc_conf, UCHAR intf_num, USHORT alt_setting)
{
    return USBD_ParseConfigurationDescriptorEx(dsc_conf, dsc_conf, intf_num, alt_setting, -1, -1, -1);
}

static BOOLEAN
intf_has_matched_ep(PUSB_CONFIGURATION_DESCRIPTOR dsc_conf, PUSB_INTERFACE_DESCRIPTOR dsc_intf, PUSB_ENDPOINT_DESCRIPTOR dsc_ep)
{
    PVOID    start = dsc_intf;
    PUSB_ENDPOINT_DESCRIPTOR    dsc_ep_try;
    UCHAR    n_ep = dsc_intf->bNumEndpoints;

    while (n_ep > 0) {
        dsc_ep_try = dsc_next_ep(dsc_conf, start);
        if (dsc_ep_try == NULL)
            break;
        if (dsc_ep->bLength == dsc_ep_try->bLength) {
            if (RtlCompareMemory(dsc_ep, dsc_ep_try, dsc_ep->bLength) == dsc_ep->bLength)
                return TRUE;
        }
        start = dsc_ep_try;
        n_ep--;
    }
    return FALSE;
}

PUSB_INTERFACE_DESCRIPTOR
dsc_find_intf_by_ep(PUSB_CONFIGURATION_DESCRIPTOR dsc_conf, PUSB_ENDPOINT_DESCRIPTOR dsc_ep)
{
    PVOID    start = dsc_conf;

    while (start != NULL) {
        PUSB_INTERFACE_DESCRIPTOR    dsc_intf;

        dsc_intf = (PUSB_INTERFACE_DESCRIPTOR)USBD_ParseDescriptors(dsc_conf, dsc_conf->wTotalLength, start, USB_INTERFACE_DESCRIPTOR_TYPE);
        if (dsc_intf == NULL)
            break;
        if (intf_has_matched_ep(dsc_conf, dsc_intf, dsc_ep))
            return dsc_intf;
        start = NEXT_DESC(dsc_intf);
    }
    return NULL;
}

PUSB_ENDPOINT_DESCRIPTOR
dsc_find_intf_ep(PUSB_CONFIGURATION_DESCRIPTOR dsc_conf, PUSB_INTERFACE_DESCRIPTOR dsc_intf, UCHAR epaddr)
{
    PVOID    start = dsc_intf;
    PUSB_ENDPOINT_DESCRIPTOR    dsc_ep;
    int    i;

    for (i = 0; i < dsc_intf->bNumEndpoints; i++) {
        dsc_ep = dsc_next_ep(dsc_conf, start);
        if (dsc_ep == NULL)
            return NULL;
        if (dsc_ep->bEndpointAddress == epaddr)
            return dsc_ep;
    }
    return NULL;
}

PUSB_ENDPOINT_DESCRIPTOR
dsc_next_ep(PUSB_CONFIGURATION_DESCRIPTOR dsc_conf, PVOID start)
{
    PUSB_COMMON_DESCRIPTOR    dsc = (PUSB_COMMON_DESCRIPTOR)start;
    if (dsc->bDescriptorType == USB_ENDPOINT_DESCRIPTOR_TYPE)
        dsc = NEXT_DESC(dsc);
    return (PUSB_ENDPOINT_DESCRIPTOR)USBD_ParseDescriptors(dsc_conf, dsc_conf->wTotalLength, dsc, USB_ENDPOINT_DESCRIPTOR_TYPE);
}

ULONG
dsc_conf_get_n_intfs(PUSB_CONFIGURATION_DESCRIPTOR dsc_conf)
{
    PVOID    start = dsc_conf;
    ULONG    n_intfs = 0;

    while (start != NULL) {
        PUSB_COMMON_DESCRIPTOR    desc = USBD_ParseDescriptors(dsc_conf, dsc_conf->wTotalLength, start, USB_INTERFACE_DESCRIPTOR_TYPE);
        if (desc == NULL)
            break;
        start = NEXT_DESC(desc);
        n_intfs++;
    }
    return n_intfs;
}

0 篇笔记 写笔记

USB音箱 UAC配置描述符分析
该USB音箱的配置描述符和普通USB设备描述符结构体一致,并无特别区别。该配置描述符的总长度(包括后续的所有其它描述符)为110字节,这里相对华为耳机的要少了很多,这是因为少了像麦克风和HID。从配置描述符的字段bmAttributes来看,并不支持远程唤醒功能。 ------------......
华为UAC耳机 配置描述符
配置描述符的大小其实不光包括配置描述符自身,也包括后续的所有描述符。这里我们只先介绍一下配置描述符,后续的接口描述符和其它UAC相关描述符在后续一节介绍。配置描述符的内容如下: ------------------ Configuration Descriptor --------------......
UAC 其它速率配置描述符
在UAC规范中,并没有定义特别的其它速率配置描述符,故UAC音频设备的其它速率描述符应符合USB规范中的其它速率配置描述符。......
USB-UAC麦克风 配置描述符
UAC麦克风采用的配置描述符结构和USB配置描述符的结构一致.偏移地址字段长度值描述0bLength10x09配置描述符的长度1bDescriptorType10x02描述符类型,配置描述符类型2wTotalLength20x0064配置描述符的总长度(包括后续的UAC音频控制和UAC音频流接口描述......
USB设备描述符、配置描述符、接口描述符和端点描述符的拓扑关系
在USB设备的逻辑组织中,包含设备、配置、接口和端点4个层次。每个USB设备都提供了不同级别的配置信息,可以包含一个或多个配置,不同的配置使设备表现出不同的功能组合(在探测/连接期间需从其中选定一个),配置由多个接口组成。一次只能有一个配置是活动的。大多数的设备只有一个配置和一个接口,当一个设备......
USB 其它速率配置描述符
其它速率配置描述符(OTHER_SPEED_CONFIGURATION)。其它速率配置描述符与设备限定描述符(Device Qualifier Descriptor)配合使用, 当工作在其他速度下时使用, 除了描述符类型, 其他字段含义格式与配置描述符完全一致。 位移字段名称长度(字节......
UAC 配置描述符
UAC配置描述符仅用于单一功能的USB设备,没有专门的UAC特定的配置描述符,所以UAC音频设备的配置描述符应满足通用USB设备的配置描述符规范。......
USB 配置描述符
配置描述符定义了设备的配置信息,一个设备可以有多个配置描述符。大部分的USB设备只有一个配置描这符,设备存在多个配置描述符时.配置描述符指定设备的供电方式、最大功耗是多少、它拥有的接口数量。因此,可以有两种配置,一种用于设备由总线供电时,另一种用于设备供电时。由于这是接口描述符的“头”,因此使一种配......
HID报表描述符与设备描述符、配置描述符、字符串描述符的通讯格式对比
报表描述符是USB HID规范中一个很重要的概念。USB HID设备报表描述符内容表述了该HID设备的功能及数据传输的格式。USB HID报表描述符在概念上和设备描述符,配置描述符,接口描述符,端点描述符和其它USB设备描述符类似,但是还是有一些细微的区别。我里我们做一个简要的区别:设备描述符、......
UAC麦克风配置描述符
配置描述符包含了设备的配置信息,随配置描述符一起返回给主机的其它描述符代表了该设备的特性。UAC麦克风配置描述符的数据配置如下:数据结构定义如下:struct usb_config_descriptor { __u8 bLength; __u8 bDescriptorType; ......
仿照USBCCGP.SYS对USB配置描述符按功能拆分
USB大的规范中两个最麻烦的描述符一个是配置描述符,另一个是HID的报告描述符。一个因与其它描述符相互组合而复杂,一个因其自身的多样性而复杂。但你要问要问USB设备中那个描述符最烦人,答案肯定是配置描述符了。这是因为USB配置描述符不仅包含自己本身,也包含了其它描述符,如常用的接口描述符、端点描述符......
USB 设备同时支持全速模式与高速模式
当一个USB高速设备接入全速的HUB时,这时会出现高速模式协商失败,这时为了设备能正常使用,会自动使用全速模式来运行。所以为了同时支持全速与高速的设备,必须有Device Qualifier Descriptor和其它速率配置描述符(OTHER_SPEED_CONFIGURATION),用于描述全速......
Windows和Linux不同主机下USB设备枚举过程中的差别
第一次获取设备描述符的不同USB设备刚上电时,是通过端点0使用控制方式来获取设备描述符。不同的设备模式获取端点0的大小不同的:高速模式的端点0最大包长固定为64个字节;全速模式可端点0在8、16、32、64字节中选择;低速模式的端点0最大包长固定为8个字节由于USB主机和USB设备第一次通讯时......
Windows内核USB配置描述符解析函数
从USB配置描述符中解析相关的描述符,大量利用系统提供的函数。可以大量节省时间。#include PUSB_INTERFACE_DESCRIPTORdsc_find_first_intf(PUSB_CONFIGURATION_DESCRIPTOR dsc_......
Windows驱动中从配置描述符中解析接口描述符
Correct Sample A:/* pConfigurationDescriptor points to the descriptor previously requested from the driver. */PUSB_CONFIGURATION_DESCRIPTOR pConf......
作者信息
USB中文网
B站搜索 站长漫谈 看视频。
pnpon内核开发网,USB中文网,
busrom硬核技术网站长
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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