Zebediah Figura : wineusb.sys: Start an event handler thread.
Alexandre Julliard
julliard at winehq.org
Thu Apr 16 16:45:14 CDT 2020
Module: wine
Branch: master
Commit: eb8cb9e0cfae1d43ebccc72ded6179b60012e188
URL: https://source.winehq.org/git/wine.git/?a=commit;h=eb8cb9e0cfae1d43ebccc72ded6179b60012e188
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Wed Apr 15 09:43:21 2020 -0500
wineusb.sys: Start an event handler thread.
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
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;
More information about the wine-cvs
mailing list