[PATCH v2 4/6] wineusb.sys: Start an event handler thread.

Zebediah Figura z.figura12 at gmail.com
Wed Apr 15 09:43:21 CDT 2020


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/wineusb.sys/wineusb.c | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/dlls/wineusb.sys/wineusb.c b/dlls/wineusb.sys/wineusb.c
index 14795f4ec4..060fb3d0d2 100644
--- a/dlls/wineusb.sys/wineusb.c
+++ b/dlls/wineusb.sys/wineusb.c
@@ -40,6 +40,25 @@ WINE_DEFAULT_DEBUG_CHANNEL(wineusb);
 
 static DEVICE_OBJECT *bus_fdo, *bus_pdo;
 
+static BOOL thread_shutdown;
+static HANDLE event_thread;
+
+static DWORD CALLBACK event_thread_proc(void *arg)
+{
+    int ret;
+
+    TRACE("Starting event thread.\n");
+
+    while (!thread_shutdown)
+    {
+        if ((ret = libusb_handle_events(NULL)))
+            ERR("Error handling events: %s\n", libusb_strerror(ret));
+    }
+
+    TRACE("Shutting down event thread.\n");
+    return 0;
+}
+
 static NTSTATUS fdo_pnp(IRP *irp)
 {
     IO_STACK_LOCATION *stack = IoGetCurrentIrpStackLocation(irp);
@@ -55,6 +74,11 @@ static NTSTATUS fdo_pnp(IRP *irp)
             break;
 
         case IRP_MN_REMOVE_DEVICE:
+            thread_shutdown = TRUE;
+            libusb_interrupt_event_handler(NULL);
+            WaitForSingleObject(event_thread, INFINITE);
+            CloseHandle(event_thread);
+
             irp->IoStatus.Status = STATUS_SUCCESS;
             IoSkipCurrentIrpStackLocation(irp);
             ret = IoCallDriver(bus_pdo, irp);
@@ -111,6 +135,8 @@ NTSTATUS WINAPI DriverEntry(DRIVER_OBJECT *driver, UNICODE_STRING *path)
         return STATUS_UNSUCCESSFUL;
     }
 
+    event_thread = CreateThread(NULL, 0, event_thread_proc, NULL, 0, NULL);
+
     driver->DriverExtension->AddDevice = driver_add_device;
     driver->DriverUnload = driver_unload;
     driver->MajorFunction[IRP_MJ_PNP] = driver_pnp;
-- 
2.26.0




More information about the wine-devel mailing list