关于USBD_CreateConfigurationRequestEx的实现

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()来选择接口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值