Zebediah Figura : wineusb.sys: Partially implement URB_FUNCTION_SELECT_CONFIGURATION.

Alexandre Julliard julliard at winehq.org
Mon Apr 20 15:48:18 CDT 2020


Module: wine
Branch: master
Commit: a103ee579413bf89456a02d5cf1e63147f0c9132
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=a103ee579413bf89456a02d5cf1e63147f0c9132

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Fri Apr 17 18:03:05 2020 -0500

wineusb.sys: Partially implement URB_FUNCTION_SELECT_CONFIGURATION.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wineusb.sys/wineusb.c | 39 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/dlls/wineusb.sys/wineusb.c b/dlls/wineusb.sys/wineusb.c
index ed82bd3a13..2f436c1bd7 100644
--- a/dlls/wineusb.sys/wineusb.c
+++ b/dlls/wineusb.sys/wineusb.c
@@ -460,6 +460,25 @@ static void queue_irp(struct usb_device *device, IRP *irp, struct libusb_transfe
     LeaveCriticalSection(&wineusb_cs);
 }
 
+struct pipe
+{
+    unsigned char endpoint;
+    unsigned char type;
+};
+
+static HANDLE make_pipe_handle(unsigned char endpoint, USBD_PIPE_TYPE type)
+{
+    union
+    {
+        struct pipe pipe;
+        HANDLE handle;
+    } u;
+
+    u.pipe.endpoint = endpoint;
+    u.pipe.type = type;
+    return u.handle;
+}
+
 static NTSTATUS usb_submit_urb(struct usb_device *device, IRP *irp)
 {
     URB *urb = IoGetCurrentIrpStackLocation(irp)->Parameters.Others.Argument1;
@@ -501,6 +520,26 @@ static NTSTATUS usb_submit_urb(struct usb_device *device, IRP *irp)
             return STATUS_PENDING;
         }
 
+        case URB_FUNCTION_SELECT_CONFIGURATION:
+        {
+            struct _URB_SELECT_CONFIGURATION *req = &urb->UrbSelectConfiguration;
+            ULONG i;
+
+            /* FIXME: In theory, we'd call libusb_set_configuration() here, but
+             * the CASIO FX-9750GII (which has only one configuration) goes into
+             * an error state if it receives a SET_CONFIGURATION request. Maybe
+             * we should skip setting that if and only if the configuration is
+             * already active? */
+
+            for (i = 0; i < req->Interface.NumberOfPipes; ++i)
+            {
+                USBD_PIPE_INFORMATION *pipe = &req->Interface.Pipes[i];
+                pipe->PipeHandle = make_pipe_handle(pipe->EndpointAddress, pipe->PipeType);
+            }
+
+            return STATUS_SUCCESS;
+        }
+
         default:
             FIXME("Unhandled function %#x.\n", urb->UrbHeader.Function);
     }




More information about the wine-cvs mailing list