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

你可能感兴趣的:(configuration)