[PATCH 2/3] winebus.sys: Move udev configuration values to the winebus service key.

Zebediah Figura z.figura12 at gmail.com
Wed May 29 23:02:29 CDT 2019


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/winebus.sys/bus.h      |  4 +++-
 dlls/winebus.sys/bus_sdl.c  | 30 ++++++++--------------------
 dlls/winebus.sys/bus_udev.c |  4 ++--
 dlls/winebus.sys/main.c     | 40 ++++++++++++++++++-------------------
 4 files changed, 33 insertions(+), 45 deletions(-)

diff --git a/dlls/winebus.sys/bus.h b/dlls/winebus.sys/bus.h
index c74221b1ec7..4de723f76ff 100644
--- a/dlls/winebus.sys/bus.h
+++ b/dlls/winebus.sys/bus.h
@@ -50,5 +50,7 @@ void process_hid_report(DEVICE_OBJECT *device, BYTE *report, DWORD length) DECLS
 DEVICE_OBJECT* bus_enumerate_hid_devices(const platform_vtbl *vtbl, enum_func function, void* context) DECLSPEC_HIDDEN;
 
 /* General Bus Functions */
-DWORD check_bus_option(UNICODE_STRING *registry_path, const UNICODE_STRING *option, DWORD default_value) DECLSPEC_HIDDEN;
+DWORD check_bus_option(const UNICODE_STRING *option, DWORD default_value) DECLSPEC_HIDDEN;
 BOOL is_xbox_gamepad(WORD vid, WORD pid) DECLSPEC_HIDDEN;
+
+HANDLE driver_key DECLSPEC_HIDDEN;
diff --git a/dlls/winebus.sys/bus_sdl.c b/dlls/winebus.sys/bus_sdl.c
index c53402d79d2..284ff486763 100644
--- a/dlls/winebus.sys/bus_sdl.c
+++ b/dlls/winebus.sys/bus_sdl.c
@@ -993,14 +993,9 @@ static void process_device_event(SDL_Event *event)
         set_mapped_report_from_event(event);
 }
 
-typedef struct _thread_args {
-    HANDLE event;
-    UNICODE_STRING *registry_path;
-} thread_arguments;
-
 static DWORD CALLBACK deviceloop_thread(void *args)
 {
-    thread_arguments *thread_args = args;
+    HANDLE init_done = args;
     SDL_Event event;
 
     if (pSDL_Init(SDL_INIT_GAMECONTROLLER|SDL_INIT_HAPTIC) < 0)
@@ -1015,16 +1010,10 @@ static DWORD CALLBACK deviceloop_thread(void *args)
     /* Process mappings */
     if (pSDL_GameControllerAddMapping != NULL)
     {
-        HANDLE key;
-        OBJECT_ATTRIBUTES attr;
-        WCHAR buffer[MAX_PATH];
-        UNICODE_STRING regpath = {0, sizeof(buffer), buffer};
-        static const WCHAR szPath[] = {'\\','m','a','p',0};
-
-        RtlCopyUnicodeString(&regpath, thread_args->registry_path);
-        RtlAppendUnicodeToString(&regpath, szPath);
-        InitializeObjectAttributes(&attr, &regpath, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);
-        if (NtOpenKey(&key, KEY_ALL_ACCESS, &attr) == STATUS_SUCCESS)
+        HKEY key;
+        static const WCHAR szPath[] = {'m','a','p',0};
+
+        if (!RegOpenKeyExW(driver_key, szPath, 0, KEY_ENUMERATE_SUB_KEYS, &key))
         {
             DWORD index = 0;
             CHAR *buffer = NULL;
@@ -1063,7 +1052,7 @@ static DWORD CALLBACK deviceloop_thread(void *args)
         }
     }
 
-    SetEvent(thread_args->event);
+    SetEvent(init_done);
 
     while (1)
         while (pSDL_WaitEvent(&event) != 0)
@@ -1085,7 +1074,6 @@ NTSTATUS WINAPI sdl_driver_init(DRIVER_OBJECT *driver, UNICODE_STRING *registry_
 
     HANDLE events[2];
     DWORD result;
-    thread_arguments args;
 
     TRACE("(%p, %s)\n", driver, debugstr_w(registry_path->Buffer));
     if (sdl_handle == NULL)
@@ -1136,13 +1124,11 @@ NTSTATUS WINAPI sdl_driver_init(DRIVER_OBJECT *driver, UNICODE_STRING *registry_
         pSDL_JoystickGetVendor = wine_dlsym(sdl_handle, "SDL_JoystickGetVendor", NULL, 0);
     }
 
-    map_controllers = check_bus_option(registry_path, &controller_mode, 1);
+    map_controllers = check_bus_option(&controller_mode, 1);
 
     if (!(events[0] = CreateEventW(NULL, TRUE, FALSE, NULL)))
         return STATUS_UNSUCCESSFUL;
-    args.event = events[0];
-    args.registry_path = registry_path;
-    if (!(events[1] = CreateThread(NULL, 0, deviceloop_thread, &args, 0, NULL)))
+    if (!(events[1] = CreateThread(NULL, 0, deviceloop_thread, events[0], 0, NULL)))
     {
         CloseHandle(events[0]);
         return STATUS_UNSUCCESSFUL;
diff --git a/dlls/winebus.sys/bus_udev.c b/dlls/winebus.sys/bus_udev.c
index 1f45f8c434c..716a43714ec 100644
--- a/dlls/winebus.sys/bus_udev.c
+++ b/dlls/winebus.sys/bus_udev.c
@@ -1468,12 +1468,12 @@ NTSTATUS WINAPI udev_driver_init(DRIVER_OBJECT *driver, UNICODE_STRING *registry
         return STATUS_UNSUCCESSFUL;
     }
 
-    disable_hidraw = check_bus_option(registry_path, &hidraw_disabled, 0);
+    disable_hidraw = check_bus_option(&hidraw_disabled, 0);
     if (disable_hidraw)
         TRACE("UDEV hidraw devices disabled in registry\n");
 
 #ifdef HAS_PROPER_INPUT_HEADER
-    disable_input = check_bus_option(registry_path, &input_disabled, 0);
+    disable_input = check_bus_option(&input_disabled, 0);
     if (disable_input)
         TRACE("UDEV input devices disabled in registry\n");
 #endif
diff --git a/dlls/winebus.sys/main.c b/dlls/winebus.sys/main.c
index bf13d2f0a07..f7cdc4dcf03 100644
--- a/dlls/winebus.sys/main.c
+++ b/dlls/winebus.sys/main.c
@@ -63,6 +63,8 @@ static const WORD PID_XBOX_CONTROLLERS[] =  {
 
 static DRIVER_OBJECT *driver_obj;
 
+HANDLE driver_key;
+
 struct pnp_device
 {
     struct list entry;
@@ -738,30 +740,19 @@ void process_hid_report(DEVICE_OBJECT *device, BYTE *report, DWORD length)
     LeaveCriticalSection(&ext->report_cs);
 }
 
-DWORD check_bus_option(UNICODE_STRING *registry_path, const UNICODE_STRING *option, DWORD default_value)
+DWORD check_bus_option(const UNICODE_STRING *option, DWORD default_value)
 {
-    OBJECT_ATTRIBUTES attr;
-    HANDLE key;
-    DWORD output = default_value;
+    char buffer[FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data[sizeof(DWORD)])];
+    KEY_VALUE_PARTIAL_INFORMATION *info = (KEY_VALUE_PARTIAL_INFORMATION*)buffer;
+    DWORD size;
 
-    InitializeObjectAttributes(&attr, registry_path, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);
-    if (NtOpenKey(&key, KEY_ALL_ACCESS, &attr) == STATUS_SUCCESS)
+    if (NtQueryValueKey(driver_key, option, KeyValuePartialInformation, info, sizeof(buffer), &size) == STATUS_SUCCESS)
     {
-        DWORD size;
-        char buffer[FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data[sizeof(DWORD)])];
-
-        KEY_VALUE_PARTIAL_INFORMATION *info = (KEY_VALUE_PARTIAL_INFORMATION*)buffer;
-
-        if (NtQueryValueKey(key, option, KeyValuePartialInformation, info, sizeof(buffer), &size) == STATUS_SUCCESS)
-        {
-            if (info->Type == REG_DWORD)
-                output = *(DWORD*)info->Data;
-        }
-
-        NtClose(key);
+        if (info->Type == REG_DWORD)
+            return *(DWORD*)info->Data;
     }
 
-    return output;
+    return default_value;
 }
 
 BOOL is_xbox_gamepad(WORD vid, WORD pid)
@@ -782,6 +773,7 @@ static void WINAPI driver_unload(DRIVER_OBJECT *driver)
     udev_driver_unload();
     iohid_driver_unload();
     sdl_driver_unload();
+    NtClose(driver_key);
 }
 
 NTSTATUS WINAPI DriverEntry( DRIVER_OBJECT *driver, UNICODE_STRING *path )
@@ -794,16 +786,24 @@ NTSTATUS WINAPI DriverEntry( DRIVER_OBJECT *driver, UNICODE_STRING *path )
     static UNICODE_STRING sdl = {sizeof(sdlW) - sizeof(WCHAR), sizeof(sdlW), (WCHAR *)sdlW};
     static const WCHAR SDL_enabledW[] = {'E','n','a','b','l','e',' ','S','D','L',0};
     static const UNICODE_STRING SDL_enabled = {sizeof(SDL_enabledW) - sizeof(WCHAR), sizeof(SDL_enabledW), (WCHAR*)SDL_enabledW};
+    OBJECT_ATTRIBUTES attr = {0};
+    NTSTATUS ret;
 
     TRACE( "(%p, %s)\n", driver, debugstr_w(path->Buffer) );
 
+    attr.Length = sizeof(attr);
+    attr.ObjectName = path;
+    attr.Attributes = OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE;
+    if ((ret = NtOpenKey(&driver_key, KEY_ALL_ACCESS, &attr)) != STATUS_SUCCESS)
+        ERR("Failed to open driver key, status %#x.\n", ret);
+
     driver_obj = driver;
 
     driver->MajorFunction[IRP_MJ_PNP] = common_pnp_dispatch;
     driver->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = hid_internal_dispatch;
     driver->DriverUnload = driver_unload;
 
-    if (check_bus_option(path, &SDL_enabled, 1))
+    if (check_bus_option(&SDL_enabled, 1))
     {
         if (IoCreateDriver(&sdl, sdl_driver_init) == STATUS_SUCCESS)
             return STATUS_SUCCESS;
-- 
2.21.0




More information about the wine-devel mailing list