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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值