[PATCH v2 5/7] winebus.sys: Load bus options in main.c.

Rémi Bernon rbernon at codeweavers.com
Mon Aug 23 02:55:23 CDT 2021


And pass them to bus_init function.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/winebus.sys/bus.h       |  1 -
 dlls/winebus.sys/bus_iohid.c |  5 ++++
 dlls/winebus.sys/bus_sdl.c   | 12 ++++-----
 dlls/winebus.sys/bus_udev.c  | 28 ++++++-------------
 dlls/winebus.sys/main.c      | 52 +++++++++++++++++++++++++-----------
 dlls/winebus.sys/unixlib.h   | 15 +++++++++++
 6 files changed, 69 insertions(+), 44 deletions(-)

diff --git a/dlls/winebus.sys/bus.h b/dlls/winebus.sys/bus.h
index a3e84bf8bd8..1e4f37ae896 100644
--- a/dlls/winebus.sys/bus.h
+++ b/dlls/winebus.sys/bus.h
@@ -52,7 +52,6 @@ void process_hid_report(DEVICE_OBJECT *device, BYTE *report, DWORD length) DECLS
 DEVICE_OBJECT *bus_enumerate_hid_devices(const WCHAR *bus_id, enum_func function, void *context) DECLSPEC_HIDDEN;
 
 /* General Bus Functions */
-DWORD check_bus_option(const UNICODE_STRING *option, DWORD default_value) DECLSPEC_HIDDEN;
 BOOL is_xbox_gamepad(WORD vid, WORD pid) DECLSPEC_HIDDEN;
 
 extern HANDLE driver_key DECLSPEC_HIDDEN;
diff --git a/dlls/winebus.sys/bus_iohid.c b/dlls/winebus.sys/bus_iohid.c
index f1fe34e1780..18d9dc2dbe9 100644
--- a/dlls/winebus.sys/bus_iohid.c
+++ b/dlls/winebus.sys/bus_iohid.c
@@ -99,6 +99,7 @@ static IOHIDManagerRef hid_manager;
 static CFRunLoopRef run_loop;
 
 static const WCHAR busidW[] = {'I','O','H','I','D',0};
+static struct iohid_bus_options options;
 
 struct platform_private
 {
@@ -387,6 +388,10 @@ static void handle_RemovalCallback(void *context, IOReturn result, void *sender,
 
 NTSTATUS iohid_bus_init(void *args)
 {
+    TRACE("args %p\n", args);
+
+    options = *(struct iohid_bus_options *)args;
+
     if (!(hid_manager = IOHIDManagerCreate(kCFAllocatorDefault, 0L)))
     {
         ERR("IOHID manager creation failed\n");
diff --git a/dlls/winebus.sys/bus_sdl.c b/dlls/winebus.sys/bus_sdl.c
index cf81120c2f9..cc0bafa89ba 100644
--- a/dlls/winebus.sys/bus_sdl.c
+++ b/dlls/winebus.sys/bus_sdl.c
@@ -60,8 +60,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(plugplay);
 WINE_DECLARE_DEBUG_CHANNEL(hid_report);
 
 static const WCHAR sdl_busidW[] = {'S','D','L','J','O','Y',0};
-
-static DWORD map_controllers = 0;
+static struct sdl_bus_options options;
 
 static void *sdl_handle = NULL;
 static UINT quit_event = -1;
@@ -748,7 +747,7 @@ static void try_add_device(unsigned int index)
         return;
     }
 
-    if (map_controllers && pSDL_IsGameController(index))
+    if (options.map_controllers && pSDL_IsGameController(index))
         controller = pSDL_GameControllerOpen(index);
 
     id = pSDL_JoystickInstanceID(joystick);
@@ -891,8 +890,9 @@ static void sdl_load_mappings(void)
 
 NTSTATUS sdl_bus_init(void *args)
 {
-    static const WCHAR controller_modeW[] = {'M','a','p',' ','C','o','n','t','r','o','l','l','e','r','s',0};
-    static const UNICODE_STRING controller_mode = {sizeof(controller_modeW) - sizeof(WCHAR), sizeof(controller_modeW), (WCHAR*)controller_modeW};
+    TRACE("args %p\n", args);
+
+    options = *(struct sdl_bus_options *)args;
 
     if (!(sdl_handle = dlopen(SONAME_LIBSDL2, RTLD_NOW)))
     {
@@ -963,8 +963,6 @@ NTSTATUS sdl_bus_init(void *args)
     pSDL_JoystickEventState(SDL_ENABLE);
     pSDL_GameControllerEventState(SDL_ENABLE);
 
-    map_controllers = check_bus_option(&controller_mode, 1);
-
     /* Process mappings */
     if (pSDL_GameControllerAddMapping != NULL) sdl_load_mappings();
 
diff --git a/dlls/winebus.sys/bus_udev.c b/dlls/winebus.sys/bus_udev.c
index a4b20f3efae..953d1d9436c 100644
--- a/dlls/winebus.sys/bus_udev.c
+++ b/dlls/winebus.sys/bus_udev.c
@@ -90,13 +90,12 @@ WINE_DECLARE_DEBUG_CHANNEL(hid_report);
 
 static struct udev *udev_context = NULL;
 static struct udev_monitor *udev_monitor;
-static DWORD disable_hidraw = 0;
-static DWORD disable_input = 0;
 static int deviceloop_control[2];
 static int udev_monitor_fd;
 
 static const WCHAR hidraw_busidW[] = {'H','I','D','R','A','W',0};
 static const WCHAR lnxev_busidW[] = {'L','N','X','E','V',0};
+static struct udev_bus_options options;
 
 struct platform_private
 {
@@ -1181,11 +1180,11 @@ static void build_initial_deviceset(void)
         return;
     }
 
-    if (!disable_hidraw)
+    if (!options.disable_hidraw)
         if (udev_enumerate_add_match_subsystem(enumerate, "hidraw") < 0)
             WARN("Failed to add subsystem 'hidraw' to enumeration\n");
 #ifdef HAS_PROPER_INPUT_HEADER
-    if (!disable_input)
+    if (!options.disable_input)
     {
         if (udev_enumerate_add_match_subsystem(enumerate, "input") < 0)
             WARN("Failed to add subsystem 'input' to enumeration\n");
@@ -1224,7 +1223,7 @@ static struct udev_monitor *create_monitor(int *fd)
         return NULL;
     }
 
-    if (!disable_hidraw)
+    if (!options.disable_hidraw)
     {
         if (udev_monitor_filter_add_match_subsystem_devtype(monitor, "hidraw", NULL) < 0)
             WARN("Failed to add 'hidraw' subsystem to monitor\n");
@@ -1232,7 +1231,7 @@ static struct udev_monitor *create_monitor(int *fd)
             systems++;
     }
 #ifdef HAS_PROPER_INPUT_HEADER
-    if (!disable_input)
+    if (!options.disable_input)
     {
         if (udev_monitor_filter_add_match_subsystem_devtype(monitor, "input", NULL) < 0)
             WARN("Failed to add 'input' subsystem to monitor\n");
@@ -1288,10 +1287,9 @@ static void process_monitor_event(struct udev_monitor *monitor)
 
 NTSTATUS udev_bus_init(void *args)
 {
-    static const WCHAR hidraw_disabledW[] = {'D','i','s','a','b','l','e','H','i','d','r','a','w',0};
-    static const UNICODE_STRING hidraw_disabled = {sizeof(hidraw_disabledW) - sizeof(WCHAR), sizeof(hidraw_disabledW), (WCHAR*)hidraw_disabledW};
-    static const WCHAR input_disabledW[] = {'D','i','s','a','b','l','e','I','n','p','u','t',0};
-    static const UNICODE_STRING input_disabled = {sizeof(input_disabledW) - sizeof(WCHAR), sizeof(input_disabledW), (WCHAR*)input_disabledW};
+    TRACE("args %p\n", args);
+
+    options = *(struct udev_bus_options *)args;
 
     if (pipe(deviceloop_control) != 0)
     {
@@ -1305,16 +1303,6 @@ NTSTATUS udev_bus_init(void *args)
         goto error;
     }
 
-    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(&input_disabled, 0);
-    if (disable_input)
-        TRACE("UDEV input devices disabled in registry\n");
-#endif
-
     if (!(udev_monitor = create_monitor(&udev_monitor_fd)))
     {
         ERR("UDEV monitor creation failed\n");
diff --git a/dlls/winebus.sys/main.c b/dlls/winebus.sys/main.c
index b231cf51200..63c1b57b186 100644
--- a/dlls/winebus.sys/main.c
+++ b/dlls/winebus.sys/main.c
@@ -413,6 +413,20 @@ static NTSTATUS build_device_relations(DEVICE_RELATIONS **devices)
     return STATUS_SUCCESS;
 }
 
+static DWORD check_bus_option(const UNICODE_STRING *option, DWORD 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;
+
+    if (NtQueryValueKey(driver_key, option, KeyValuePartialInformation, info, sizeof(buffer), &size) == STATUS_SUCCESS)
+    {
+        if (info->Type == REG_DWORD) return *(DWORD *)info->Data;
+    }
+
+    return default_value;
+}
+
 static NTSTATUS handle_IRP_MN_QUERY_DEVICE_RELATIONS(IRP *irp)
 {
     NTSTATUS status = irp->IoStatus.Status;
@@ -634,6 +648,7 @@ struct bus_main_params
 {
     const WCHAR *name;
 
+    void *init_args;
     HANDLE init_done;
     unsigned int init_code;
     unsigned int wait_code;
@@ -645,7 +660,7 @@ static DWORD CALLBACK bus_main_thread(void *args)
     NTSTATUS status;
 
     TRACE("%s main loop starting\n", debugstr_w(bus.name));
-    status = winebus_call(bus.init_code, NULL);
+    status = winebus_call(bus.init_code, bus.init_args);
     SetEvent(bus.init_done);
     TRACE("%s main loop started\n", debugstr_w(bus.name));
 
@@ -684,35 +699,55 @@ static NTSTATUS bus_main_thread_start(struct bus_main_params *bus)
 static NTSTATUS sdl_driver_init(void)
 {
     static const WCHAR bus_name[] = {'S','D','L',0};
+    static const WCHAR controller_modeW[] = {'M','a','p',' ','C','o','n','t','r','o','l','l','e','r','s',0};
+    static const UNICODE_STRING controller_mode = {sizeof(controller_modeW) - sizeof(WCHAR), sizeof(controller_modeW), (WCHAR*)controller_modeW};
+    struct sdl_bus_options bus_options;
     struct bus_main_params bus =
     {
         .name = bus_name,
+        .init_args = &bus_options,
         .init_code = sdl_init,
         .wait_code = sdl_wait,
     };
 
+    bus_options.map_controllers = check_bus_option(&controller_mode, 1);
+    if (!bus_options.map_controllers) TRACE("SDL controller to XInput HID gamepad mapping disabled\n");
+
     return bus_main_thread_start(&bus);
 }
 
 static NTSTATUS udev_driver_init(void)
 {
     static const WCHAR bus_name[] = {'U','D','E','V',0};
+    static const WCHAR hidraw_disabledW[] = {'D','i','s','a','b','l','e','H','i','d','r','a','w',0};
+    static const UNICODE_STRING hidraw_disabled = {sizeof(hidraw_disabledW) - sizeof(WCHAR), sizeof(hidraw_disabledW), (WCHAR*)hidraw_disabledW};
+    static const WCHAR input_disabledW[] = {'D','i','s','a','b','l','e','I','n','p','u','t',0};
+    static const UNICODE_STRING input_disabled = {sizeof(input_disabledW) - sizeof(WCHAR), sizeof(input_disabledW), (WCHAR*)input_disabledW};
+    struct udev_bus_options bus_options;
     struct bus_main_params bus =
     {
         .name = bus_name,
+        .init_args = &bus_options,
         .init_code = udev_init,
         .wait_code = udev_wait,
     };
 
+    bus_options.disable_hidraw = check_bus_option(&hidraw_disabled, 0);
+    if (bus_options.disable_hidraw) TRACE("UDEV hidraw devices disabled in registry\n");
+    bus_options.disable_input = check_bus_option(&input_disabled, 0);
+    if (bus_options.disable_input) TRACE("UDEV input devices disabled in registry\n");
+
     return bus_main_thread_start(&bus);
 }
 
 static NTSTATUS iohid_driver_init(void)
 {
     static const WCHAR bus_name[] = {'I','O','H','I','D'};
+    struct iohid_bus_options bus_options;
     struct bus_main_params bus =
     {
         .name = bus_name,
+        .init_args = &bus_options,
         .init_code = iohid_init,
         .wait_code = iohid_wait,
     };
@@ -1122,21 +1157,6 @@ void process_hid_report(DEVICE_OBJECT *device, BYTE *report, DWORD length)
     LeaveCriticalSection(&ext->cs);
 }
 
-DWORD check_bus_option(const UNICODE_STRING *option, DWORD 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;
-
-    if (NtQueryValueKey(driver_key, option, KeyValuePartialInformation, info, sizeof(buffer), &size) == STATUS_SUCCESS)
-    {
-        if (info->Type == REG_DWORD)
-            return *(DWORD*)info->Data;
-    }
-
-    return default_value;
-}
-
 BOOL is_xbox_gamepad(WORD vid, WORD pid)
 {
     int i;
diff --git a/dlls/winebus.sys/unixlib.h b/dlls/winebus.sys/unixlib.h
index 003ceb5c9e5..abd9c8a1d81 100644
--- a/dlls/winebus.sys/unixlib.h
+++ b/dlls/winebus.sys/unixlib.h
@@ -27,6 +27,21 @@
 #include <ddk/wdm.h>
 #include <hidusage.h>
 
+struct sdl_bus_options
+{
+    BOOL map_controllers;
+};
+
+struct udev_bus_options
+{
+    BOOL disable_hidraw;
+    BOOL disable_input;
+};
+
+struct iohid_bus_options
+{
+};
+
 enum unix_funcs
 {
     sdl_init,
-- 
2.33.0




More information about the wine-devel mailing list