关于USBD_CreateConfigurationRequestEx的实现

简介: USBD_CreateConfigurationRequestEx()是用来格式化URB的,URB发送到USB总线驱动程序完成真正的配置操作。 UsbBuildSelectConfigurationRequest()通常是将最后一个参数设置为NULL来卸载USB的当前配置的。

USBD_CreateConfigurationRequestEx()是用来格式化URB的,URB发送到USB总线驱动程序完成真正的配置操作。

UsbBuildSelectConfigurationRequest()通常是将最后一个参数设置为NULL来卸载USB的当前配置的。

 

PURB
STDCALL
USBD_CreateConfigurationRequestEx(
    PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
    PUSBD_INTERFACE_LIST_ENTRY InterfaceList
    )
{
    PURB Urb;
    DWORD UrbSize;
    DWORD InterfaceCount;

    for (InterfaceCount = 0;
         InterfaceList[InterfaceCount].InterfaceDescriptor != NULL;
         ++InterfaceCount)
       ;
   
    ++InterfaceCount;

    UrbSize = sizeof(Urb->UrbSelectConfiguration) +
       (InterfaceCount * sizeof(PUSBD_INTERFACE_LIST_ENTRY));
    Urb = ExAllocatePool(NonPagedPool, UrbSize);
    Urb->UrbSelectConfiguration.Hdr.Function =
        URB_FUNCTION_SELECT_CONFIGURATION;       
    Urb->UrbSelectConfiguration.Hdr.Length =
        sizeof(Urb->UrbSelectConfiguration);
    Urb->UrbSelectConfiguration.ConfigurationDescriptor =
       ConfigurationDescriptor;
   
memcpy((PVOID)&Urb->UrbSelectConfiguration.Interface, (PVOID)InterfaceList,
      
InterfaceCount * sizeof(PUSBD_INTERFACE_LIST_ENTRY));

    return Urb;
}

 

USBD_CreateConfigurationRequestEx()是用来格式化URB的,URB发送到USB总线驱动程序完成真正的配置操作。

UsbBuildSelectConfigurationRequest()通常是将最后一个参数设置为NULL来卸载USB的当前配置的。

 

PURB
STDCALL
USBD_CreateConfigurationRequestEx(
    PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor,
    PUSBD_INTERFACE_LIST_ENTRY InterfaceList
    )
{
    PURB Urb;
    DWORD UrbSize;
    DWORD InterfaceCount;

    for (InterfaceCount = 0;
         InterfaceList[InterfaceCount].InterfaceDescriptor != NULL;
         ++InterfaceCount)
       ;
   
    ++InterfaceCount;

    UrbSize = sizeof(Urb->UrbSelectConfiguration) +
       (InterfaceCount * sizeof(PUSBD_INTERFACE_LIST_ENTRY));
    Urb = ExAllocatePool(NonPagedPool, UrbSize);
    Urb->UrbSelectConfiguration.Hdr.Function =
        URB_FUNCTION_SELECT_CONFIGURATION;       
    Urb->UrbSelectConfiguration.Hdr.Length =
        sizeof(Urb->UrbSelectConfiguration);
    Urb->UrbSelectConfiguration.ConfigurationDescriptor =
       ConfigurationDescriptor;
   
memcpy((PVOID)&Urb->UrbSelectConfiguration.Interface, (PVOID)InterfaceList,
      
InterfaceCount * sizeof(PUSBD_INTERFACE_LIST_ENTRY));

    return Urb;
}


 

对于Multiple InterfacesUSB设备,用UsbBuildSelectInterfaceRequest()来选择接口: 实际上是格式化URB,以待发送给USB总线驱动程序。

 

通常的流程:先取得目标配置的配置描述符,然后调用USBD_ParseConfigurationDescriptor()来辅助得到PUSBD_INTERFACE_INFORMATION List, 设置带宽等参数后,接着调用USBD_CreateConfigurationRequestEx()生成URB,然后发送到USB总线驱动程序完成配置。接下来就可以调用UsbBuildSelectConfigurationRequest()来选择接口。

目录
相关文章
MFC编程 -- 实现拖拽文件获取路径
MFC编程 -- 实现拖拽文件获取路径
449 0
|
安全 虚拟化 Windows
Windows x64内核下注入DLL姿势之一
讲述了Windows x64内核下注入DLL的思路与流程
|
C# 图形学 Windows
Winform控件优化之背景透明那些事2:窗体背景透明、镂空穿透、SetStyle、GDI透明效果等
两行代码就能实现Form窗体的(背景)透明效果,它不是Opacity属性的整个窗体透明,`TransparencyKey`实现窗体的透明、窗体中间部分镂空效果...
4832 0
Winform控件优化之背景透明那些事2:窗体背景透明、镂空穿透、SetStyle、GDI透明效果等
|
安全 网络安全 网络虚拟化
这40个网络工程师必知术语,背上!
【7月更文挑战第26天】
2447 11
这40个网络工程师必知术语,背上!
|
域名解析 缓存 网络协议
DNS协议 是什么?说说DNS 完整的查询过程? _
DNS是互联网的域名系统,它像翻译官一样将域名转换成IP地址。域名由点分隔的名字组成,如www.xxx.com,包含三级、二级和顶级域名。查询方式分为递归和迭代,递归是请求者必须得到答案,而迭代则是服务器指引请求者如何获取答案。域名解析过程中,会利用浏览器和操作系统的缓存,如果缓存未命中,本地域名服务器会通过递归或迭代方式向上级服务器查询,最终得到IP地址并返回给浏览器,同时在各级缓存中保存记录。
943 1
DNS协议 是什么?说说DNS 完整的查询过程? _
|
存储 芯片 内存技术
(嵌入式常识)-rom,flash和ram的区别
我老是将MCU中常见的存储设备搞混,故记录于此
|
缓存 安全 算法
[笔记]深入解析Windows操作系统《三》系统机制(四)
[笔记]深入解析Windows操作系统《三》系统机制(四)
1317 0
|
存储 缓存 分布式数据库
[笔记]Windows核心编程《十七》内存映射文件(二)
[笔记]Windows核心编程《十七》内存映射文件(二)
640 0
|
数据可视化 定位技术 数据处理
Python数据可视化——风析图
Python数据可视化——风析图
527 1
|
Linux 内存技术
飞腾FT-2000/4、D2000 log报错指导(1)
飞腾FT-2000/4、D2000 log报错指导(1)
3482 0
飞腾FT-2000/4、D2000 log报错指导(1)