Aric Stewart : winebus.sys: Improve unloading the winebus driver.

Alexandre Julliard julliard at winehq.org
Thu Sep 13 15:14:47 CDT 2018


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

Author: Aric Stewart <aric at codeweavers.com>
Date:   Wed Sep 12 11:22:09 2018 -0500

winebus.sys: Improve unloading the winebus driver.

Signed-off-by: Aric Stewart <aric at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winebus.sys/bus.h       |  3 +++
 dlls/winebus.sys/bus_iohid.c | 34 +++++++++++++++++++++++++---------
 dlls/winebus.sys/bus_sdl.c   | 10 ++++++++++
 dlls/winebus.sys/bus_udev.c  | 10 ++++++++++
 dlls/winebus.sys/main.c      |  9 +++++++++
 5 files changed, 57 insertions(+), 9 deletions(-)

diff --git a/dlls/winebus.sys/bus.h b/dlls/winebus.sys/bus.h
index bf93c04..16e9bf7 100644
--- a/dlls/winebus.sys/bus.h
+++ b/dlls/winebus.sys/bus.h
@@ -22,6 +22,9 @@ typedef int(*enum_func)(DEVICE_OBJECT *device, void *context);
 NTSTATUS WINAPI udev_driver_init(DRIVER_OBJECT *driver, UNICODE_STRING *registry_path) DECLSPEC_HIDDEN;
 NTSTATUS WINAPI iohid_driver_init(DRIVER_OBJECT *driver, UNICODE_STRING *registry_path) DECLSPEC_HIDDEN;
 NTSTATUS WINAPI sdl_driver_init(DRIVER_OBJECT *driver, UNICODE_STRING *registry_path) DECLSPEC_HIDDEN;
+void udev_driver_unload( void ) DECLSPEC_HIDDEN;
+void iohid_driver_unload( void ) DECLSPEC_HIDDEN;
+void sdl_driver_unload( void ) DECLSPEC_HIDDEN;
 
 /* Native device function table */
 typedef struct
diff --git a/dlls/winebus.sys/bus_iohid.c b/dlls/winebus.sys/bus_iohid.c
index ac706f5..95077ac 100644
--- a/dlls/winebus.sys/bus_iohid.c
+++ b/dlls/winebus.sys/bus_iohid.c
@@ -98,6 +98,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(plugplay);
 
 static DRIVER_OBJECT *iohid_driver_obj = NULL;
 static IOHIDManagerRef hid_manager;
+static CFRunLoopRef run_loop;
+static HANDLE run_loop_handle;
 
 static const WCHAR busidW[] = {'I','O','H','I','D',0};
 
@@ -372,7 +374,7 @@ static void handle_RemovalCallback(void *context, IOReturn result, void *sender,
 /* This puts the relevant run loop for event handling into a WINE thread */
 static DWORD CALLBACK runloop_thread(void *args)
 {
-    CFRunLoopRef run_loop = CFRunLoopGetCurrent();
+    run_loop = CFRunLoopGetCurrent();
 
     IOHIDManagerSetDeviceMatching(hid_manager, NULL);
     IOHIDManagerRegisterDeviceMatchingCallback(hid_manager, handle_DeviceMatchingCallback, NULL);
@@ -388,18 +390,12 @@ static DWORD CALLBACK runloop_thread(void *args)
 
     CFRunLoopRun();
     TRACE("Run Loop exiting\n");
-
-    IOHIDManagerRegisterDeviceMatchingCallback(hid_manager, NULL, NULL);
-    IOHIDManagerRegisterDeviceRemovalCallback(hid_manager, NULL, NULL);
-    IOHIDManagerUnscheduleFromRunLoop(hid_manager, run_loop, kCFRunLoopDefaultMode);
-    CFRelease(hid_manager);
     return 1;
+
 }
 
 NTSTATUS WINAPI iohid_driver_init(DRIVER_OBJECT *driver, UNICODE_STRING *registry_path)
 {
-    HANDLE run_loop_handle;
-
     TRACE("(%p, %s)\n", driver, debugstr_w(registry_path->Buffer));
 
     iohid_driver_obj = driver;
@@ -414,10 +410,25 @@ NTSTATUS WINAPI iohid_driver_init(DRIVER_OBJECT *driver, UNICODE_STRING *registr
         return STATUS_UNSUCCESSFUL;
     }
 
-    CloseHandle(run_loop_handle);
     return STATUS_SUCCESS;
 }
 
+void iohid_driver_unload( void )
+{
+    TRACE("Unloading Driver\n");
+    if (iohid_driver_obj != NULL)
+    {
+        IOHIDManagerUnscheduleFromRunLoop(hid_manager, run_loop, kCFRunLoopDefaultMode);
+        CFRunLoopStop(run_loop);
+        WaitForSingleObject(run_loop_handle, INFINITE);
+        CloseHandle(run_loop_handle);
+        IOHIDManagerRegisterDeviceMatchingCallback(hid_manager, NULL, NULL);
+        IOHIDManagerRegisterDeviceRemovalCallback(hid_manager, NULL, NULL);
+        CFRelease(hid_manager);
+    }
+    TRACE("Driver Unloaded\n");
+}
+
 #else
 
 NTSTATUS WINAPI iohid_driver_init(DRIVER_OBJECT *driver, UNICODE_STRING *registry_path)
@@ -426,4 +437,9 @@ NTSTATUS WINAPI iohid_driver_init(DRIVER_OBJECT *driver, UNICODE_STRING *registr
     return STATUS_NOT_IMPLEMENTED;
 }
 
+void iohid_driver_unload( void )
+{
+    TRACE("Stub: Unload Driver\n");
+}
+
 #endif /* HAVE_IOHIDMANAGERCREATE */
diff --git a/dlls/winebus.sys/bus_sdl.c b/dlls/winebus.sys/bus_sdl.c
index 159727f..6b2b28e 100644
--- a/dlls/winebus.sys/bus_sdl.c
+++ b/dlls/winebus.sys/bus_sdl.c
@@ -927,6 +927,11 @@ static DWORD CALLBACK deviceloop_thread(void *args)
     return 0;
 }
 
+void sdl_driver_unload( void )
+{
+    TRACE("Unload Driver\n");
+}
+
 NTSTATUS WINAPI sdl_driver_init(DRIVER_OBJECT *driver, UNICODE_STRING *registry_path)
 {
     static const WCHAR controller_modeW[] = {'M','a','p',' ','C','o','n','t','r','o','l','l','e','r','s',0};
@@ -1023,4 +1028,9 @@ NTSTATUS WINAPI sdl_driver_init(DRIVER_OBJECT *driver, UNICODE_STRING *registry_
     return STATUS_NOT_IMPLEMENTED;
 }
 
+void sdl_driver_unload( void )
+{
+    TRACE("Stub: Unload Driver\n");
+}
+
 #endif /* SONAME_LIBSDL2 */
diff --git a/dlls/winebus.sys/bus_udev.c b/dlls/winebus.sys/bus_udev.c
index 788b564..dabda6a 100644
--- a/dlls/winebus.sys/bus_udev.c
+++ b/dlls/winebus.sys/bus_udev.c
@@ -1418,6 +1418,11 @@ static DWORD CALLBACK deviceloop_thread(void *args)
     return 0;
 }
 
+void udev_driver_unload( void )
+{
+    TRACE("Unload Driver\n");
+}
+
 NTSTATUS WINAPI udev_driver_init(DRIVER_OBJECT *driver, UNICODE_STRING *registry_path)
 {
     HANDLE events[2];
@@ -1482,4 +1487,9 @@ NTSTATUS WINAPI udev_driver_init(DRIVER_OBJECT *driver, UNICODE_STRING *registry
     return STATUS_NOT_IMPLEMENTED;
 }
 
+void udev_driver_unload( void )
+{
+    TRACE("Stub: Unload Driver\n");
+}
+
 #endif /* HAVE_UDEV */
diff --git a/dlls/winebus.sys/main.c b/dlls/winebus.sys/main.c
index ce68e4a..fd795f1 100644
--- a/dlls/winebus.sys/main.c
+++ b/dlls/winebus.sys/main.c
@@ -699,6 +699,13 @@ BOOL is_xbox_gamepad(WORD vid, WORD pid)
     return FALSE;
 }
 
+static void WINAPI driver_unload(DRIVER_OBJECT *driver)
+{
+    udev_driver_unload();
+    iohid_driver_unload();
+    sdl_driver_unload();
+}
+
 NTSTATUS WINAPI DriverEntry( DRIVER_OBJECT *driver, UNICODE_STRING *path )
 {
     static const WCHAR udevW[] = {'\\','D','r','i','v','e','r','\\','U','D','E','V',0};
@@ -720,5 +727,7 @@ NTSTATUS WINAPI DriverEntry( DRIVER_OBJECT *driver, UNICODE_STRING *path )
     IoCreateDriver(&udev, udev_driver_init);
     IoCreateDriver(&iohid, iohid_driver_init);
 
+    driver->DriverUnload = driver_unload;
+
     return STATUS_SUCCESS;
 }




More information about the wine-cvs mailing list