usbhub.sys: Add support for URB_FUNCTION_SELECT_INTERFACE.
authorAlexander Morozov <amorozov@etersoft.ru>
Fri, 5 Jun 2009 09:00:06 +0000 (13:00 +0400)
committerAlexander Morozov <amorozov@etersoft.ru>
Tue, 9 Mar 2010 14:14:37 +0000 (17:14 +0300)
dlls/usbhub.sys/usbhub.c

index 277cd4f237ebfa34668d2e24c62156875edd32c5..f83bf04b186db82ed48e8056856d29a02a036e78 100644 (file)
@@ -129,6 +129,33 @@ static NTSTATUS WINAPI usbhub_internal_ioctl( DEVICE_OBJECT *device, IRP *irp )
                 }
             }
             break;
+        case URB_FUNCTION_SELECT_INTERFACE:
+            {
+                struct _URB_SELECT_INTERFACE *request =
+                        &urb->u.UrbSelectInterface;
+                libusb_device_handle *husb;
+
+                TRACE( "URB_FUNCTION_SELECT_INTERFACE\n" );
+
+                if (!libusb_open( inst->dev, &husb ))
+                {
+                    int ret;
+
+                    ret = libusb_claim_interface( husb,
+                            request->Interface.InterfaceNumber );
+                    if (!ret)
+                    {
+                        ret = libusb_set_interface_alt_setting( husb,
+                                request->Interface.InterfaceNumber,
+                                request->Interface.AlternateSetting );
+                        if (!libusb_release_interface( husb,
+                                request->Interface.InterfaceNumber ) && !ret)
+                            status = STATUS_SUCCESS;
+                    }
+                    libusb_close( husb );
+                }
+            }
+            break;
         case URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE:
             {
                 struct _URB_CONTROL_DESCRIPTOR_REQUEST *request =
@@ -366,6 +393,33 @@ static NTSTATUS WINAPI usbhub_internal_ioctl( DEVICE_OBJECT *device, IRP *irp )
                 }
             }
             break;
+        case URB_FUNCTION_SELECT_INTERFACE:
+            {
+                struct _URB_SELECT_INTERFACE *request =
+                        &urb->u.UrbSelectInterface;
+                usb_dev_handle *husb;
+
+                TRACE( "URB_FUNCTION_SELECT_INTERFACE\n" );
+
+                husb = usb_open( inst->dev );
+                if (husb)
+                {
+                    int ret;
+
+                    ret = usb_claim_interface( husb,
+                            request->Interface.InterfaceNumber );
+                    if (!ret)
+                    {
+                        ret = usb_set_altinterface( husb,
+                                request->Interface.AlternateSetting );
+                        if (!usb_release_interface( husb,
+                                request->Interface.InterfaceNumber ) && !ret)
+                            status = STATUS_SUCCESS;
+                    }
+                    usb_close( husb );
+                }
+            }
+            break;
         case URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE:
             {
                 struct _URB_CONTROL_DESCRIPTOR_REQUEST *request =