winebus.sys: Load bus options in main.c.
And pass them to bus_init function. Signed-off-by: Rémi Bernon <rbernon@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
edbb3fac25
commit
7e1d1fac70
|
@ -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;
|
DEVICE_OBJECT *bus_enumerate_hid_devices(const WCHAR *bus_id, enum_func function, void *context) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
/* General Bus Functions */
|
/* 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;
|
BOOL is_xbox_gamepad(WORD vid, WORD pid) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
extern HANDLE driver_key DECLSPEC_HIDDEN;
|
extern HANDLE driver_key DECLSPEC_HIDDEN;
|
||||||
|
|
|
@ -99,6 +99,7 @@ static IOHIDManagerRef hid_manager;
|
||||||
static CFRunLoopRef run_loop;
|
static CFRunLoopRef run_loop;
|
||||||
|
|
||||||
static const WCHAR busidW[] = {'I','O','H','I','D',0};
|
static const WCHAR busidW[] = {'I','O','H','I','D',0};
|
||||||
|
static struct iohid_bus_options options;
|
||||||
|
|
||||||
struct platform_private
|
struct platform_private
|
||||||
{
|
{
|
||||||
|
@ -387,6 +388,10 @@ static void handle_RemovalCallback(void *context, IOReturn result, void *sender,
|
||||||
|
|
||||||
NTSTATUS iohid_bus_init(void *args)
|
NTSTATUS iohid_bus_init(void *args)
|
||||||
{
|
{
|
||||||
|
TRACE("args %p\n", args);
|
||||||
|
|
||||||
|
options = *(struct iohid_bus_options *)args;
|
||||||
|
|
||||||
if (!(hid_manager = IOHIDManagerCreate(kCFAllocatorDefault, 0L)))
|
if (!(hid_manager = IOHIDManagerCreate(kCFAllocatorDefault, 0L)))
|
||||||
{
|
{
|
||||||
ERR("IOHID manager creation failed\n");
|
ERR("IOHID manager creation failed\n");
|
||||||
|
|
|
@ -60,8 +60,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(plugplay);
|
||||||
WINE_DECLARE_DEBUG_CHANNEL(hid_report);
|
WINE_DECLARE_DEBUG_CHANNEL(hid_report);
|
||||||
|
|
||||||
static const WCHAR sdl_busidW[] = {'S','D','L','J','O','Y',0};
|
static const WCHAR sdl_busidW[] = {'S','D','L','J','O','Y',0};
|
||||||
|
static struct sdl_bus_options options;
|
||||||
static DWORD map_controllers = 0;
|
|
||||||
|
|
||||||
static void *sdl_handle = NULL;
|
static void *sdl_handle = NULL;
|
||||||
static UINT quit_event = -1;
|
static UINT quit_event = -1;
|
||||||
|
@ -748,7 +747,7 @@ static void try_add_device(unsigned int index)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (map_controllers && pSDL_IsGameController(index))
|
if (options.map_controllers && pSDL_IsGameController(index))
|
||||||
controller = pSDL_GameControllerOpen(index);
|
controller = pSDL_GameControllerOpen(index);
|
||||||
|
|
||||||
id = pSDL_JoystickInstanceID(joystick);
|
id = pSDL_JoystickInstanceID(joystick);
|
||||||
|
@ -891,8 +890,9 @@ static void sdl_load_mappings(void)
|
||||||
|
|
||||||
NTSTATUS sdl_bus_init(void *args)
|
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};
|
TRACE("args %p\n", args);
|
||||||
static const UNICODE_STRING controller_mode = {sizeof(controller_modeW) - sizeof(WCHAR), sizeof(controller_modeW), (WCHAR*)controller_modeW};
|
|
||||||
|
options = *(struct sdl_bus_options *)args;
|
||||||
|
|
||||||
if (!(sdl_handle = dlopen(SONAME_LIBSDL2, RTLD_NOW)))
|
if (!(sdl_handle = dlopen(SONAME_LIBSDL2, RTLD_NOW)))
|
||||||
{
|
{
|
||||||
|
@ -963,8 +963,6 @@ NTSTATUS sdl_bus_init(void *args)
|
||||||
pSDL_JoystickEventState(SDL_ENABLE);
|
pSDL_JoystickEventState(SDL_ENABLE);
|
||||||
pSDL_GameControllerEventState(SDL_ENABLE);
|
pSDL_GameControllerEventState(SDL_ENABLE);
|
||||||
|
|
||||||
map_controllers = check_bus_option(&controller_mode, 1);
|
|
||||||
|
|
||||||
/* Process mappings */
|
/* Process mappings */
|
||||||
if (pSDL_GameControllerAddMapping != NULL) sdl_load_mappings();
|
if (pSDL_GameControllerAddMapping != NULL) sdl_load_mappings();
|
||||||
|
|
||||||
|
|
|
@ -90,13 +90,12 @@ WINE_DECLARE_DEBUG_CHANNEL(hid_report);
|
||||||
|
|
||||||
static struct udev *udev_context = NULL;
|
static struct udev *udev_context = NULL;
|
||||||
static struct udev_monitor *udev_monitor;
|
static struct udev_monitor *udev_monitor;
|
||||||
static DWORD disable_hidraw = 0;
|
|
||||||
static DWORD disable_input = 0;
|
|
||||||
static int deviceloop_control[2];
|
static int deviceloop_control[2];
|
||||||
static int udev_monitor_fd;
|
static int udev_monitor_fd;
|
||||||
|
|
||||||
static const WCHAR hidraw_busidW[] = {'H','I','D','R','A','W',0};
|
static const WCHAR hidraw_busidW[] = {'H','I','D','R','A','W',0};
|
||||||
static const WCHAR lnxev_busidW[] = {'L','N','X','E','V',0};
|
static const WCHAR lnxev_busidW[] = {'L','N','X','E','V',0};
|
||||||
|
static struct udev_bus_options options;
|
||||||
|
|
||||||
struct platform_private
|
struct platform_private
|
||||||
{
|
{
|
||||||
|
@ -1181,11 +1180,11 @@ static void build_initial_deviceset(void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!disable_hidraw)
|
if (!options.disable_hidraw)
|
||||||
if (udev_enumerate_add_match_subsystem(enumerate, "hidraw") < 0)
|
if (udev_enumerate_add_match_subsystem(enumerate, "hidraw") < 0)
|
||||||
WARN("Failed to add subsystem 'hidraw' to enumeration\n");
|
WARN("Failed to add subsystem 'hidraw' to enumeration\n");
|
||||||
#ifdef HAS_PROPER_INPUT_HEADER
|
#ifdef HAS_PROPER_INPUT_HEADER
|
||||||
if (!disable_input)
|
if (!options.disable_input)
|
||||||
{
|
{
|
||||||
if (udev_enumerate_add_match_subsystem(enumerate, "input") < 0)
|
if (udev_enumerate_add_match_subsystem(enumerate, "input") < 0)
|
||||||
WARN("Failed to add subsystem 'input' to enumeration\n");
|
WARN("Failed to add subsystem 'input' to enumeration\n");
|
||||||
|
@ -1224,7 +1223,7 @@ static struct udev_monitor *create_monitor(int *fd)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!disable_hidraw)
|
if (!options.disable_hidraw)
|
||||||
{
|
{
|
||||||
if (udev_monitor_filter_add_match_subsystem_devtype(monitor, "hidraw", NULL) < 0)
|
if (udev_monitor_filter_add_match_subsystem_devtype(monitor, "hidraw", NULL) < 0)
|
||||||
WARN("Failed to add 'hidraw' subsystem to monitor\n");
|
WARN("Failed to add 'hidraw' subsystem to monitor\n");
|
||||||
|
@ -1232,7 +1231,7 @@ static struct udev_monitor *create_monitor(int *fd)
|
||||||
systems++;
|
systems++;
|
||||||
}
|
}
|
||||||
#ifdef HAS_PROPER_INPUT_HEADER
|
#ifdef HAS_PROPER_INPUT_HEADER
|
||||||
if (!disable_input)
|
if (!options.disable_input)
|
||||||
{
|
{
|
||||||
if (udev_monitor_filter_add_match_subsystem_devtype(monitor, "input", NULL) < 0)
|
if (udev_monitor_filter_add_match_subsystem_devtype(monitor, "input", NULL) < 0)
|
||||||
WARN("Failed to add 'input' subsystem to monitor\n");
|
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)
|
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};
|
TRACE("args %p\n", args);
|
||||||
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};
|
options = *(struct udev_bus_options *)args;
|
||||||
static const UNICODE_STRING input_disabled = {sizeof(input_disabledW) - sizeof(WCHAR), sizeof(input_disabledW), (WCHAR*)input_disabledW};
|
|
||||||
|
|
||||||
if (pipe(deviceloop_control) != 0)
|
if (pipe(deviceloop_control) != 0)
|
||||||
{
|
{
|
||||||
|
@ -1305,16 +1303,6 @@ NTSTATUS udev_bus_init(void *args)
|
||||||
goto error;
|
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)))
|
if (!(udev_monitor = create_monitor(&udev_monitor_fd)))
|
||||||
{
|
{
|
||||||
ERR("UDEV monitor creation failed\n");
|
ERR("UDEV monitor creation failed\n");
|
||||||
|
|
|
@ -411,6 +411,20 @@ static NTSTATUS build_device_relations(DEVICE_RELATIONS **devices)
|
||||||
return STATUS_SUCCESS;
|
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)
|
static NTSTATUS handle_IRP_MN_QUERY_DEVICE_RELATIONS(IRP *irp)
|
||||||
{
|
{
|
||||||
NTSTATUS status = irp->IoStatus.Status;
|
NTSTATUS status = irp->IoStatus.Status;
|
||||||
|
@ -632,6 +646,7 @@ struct bus_main_params
|
||||||
{
|
{
|
||||||
const WCHAR *name;
|
const WCHAR *name;
|
||||||
|
|
||||||
|
void *init_args;
|
||||||
HANDLE init_done;
|
HANDLE init_done;
|
||||||
unsigned int init_code;
|
unsigned int init_code;
|
||||||
unsigned int wait_code;
|
unsigned int wait_code;
|
||||||
|
@ -643,7 +658,7 @@ static DWORD CALLBACK bus_main_thread(void *args)
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
|
|
||||||
TRACE("%s main loop starting\n", debugstr_w(bus.name));
|
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);
|
SetEvent(bus.init_done);
|
||||||
TRACE("%s main loop started\n", debugstr_w(bus.name));
|
TRACE("%s main loop started\n", debugstr_w(bus.name));
|
||||||
|
|
||||||
|
@ -682,35 +697,55 @@ static NTSTATUS bus_main_thread_start(struct bus_main_params *bus)
|
||||||
static NTSTATUS sdl_driver_init(void)
|
static NTSTATUS sdl_driver_init(void)
|
||||||
{
|
{
|
||||||
static const WCHAR bus_name[] = {'S','D','L',0};
|
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 =
|
struct bus_main_params bus =
|
||||||
{
|
{
|
||||||
.name = bus_name,
|
.name = bus_name,
|
||||||
|
.init_args = &bus_options,
|
||||||
.init_code = sdl_init,
|
.init_code = sdl_init,
|
||||||
.wait_code = sdl_wait,
|
.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);
|
return bus_main_thread_start(&bus);
|
||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS udev_driver_init(void)
|
static NTSTATUS udev_driver_init(void)
|
||||||
{
|
{
|
||||||
static const WCHAR bus_name[] = {'U','D','E','V',0};
|
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 =
|
struct bus_main_params bus =
|
||||||
{
|
{
|
||||||
.name = bus_name,
|
.name = bus_name,
|
||||||
|
.init_args = &bus_options,
|
||||||
.init_code = udev_init,
|
.init_code = udev_init,
|
||||||
.wait_code = udev_wait,
|
.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);
|
return bus_main_thread_start(&bus);
|
||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS iohid_driver_init(void)
|
static NTSTATUS iohid_driver_init(void)
|
||||||
{
|
{
|
||||||
static const WCHAR bus_name[] = {'I','O','H','I','D'};
|
static const WCHAR bus_name[] = {'I','O','H','I','D'};
|
||||||
|
struct iohid_bus_options bus_options;
|
||||||
struct bus_main_params bus =
|
struct bus_main_params bus =
|
||||||
{
|
{
|
||||||
.name = bus_name,
|
.name = bus_name,
|
||||||
|
.init_args = &bus_options,
|
||||||
.init_code = iohid_init,
|
.init_code = iohid_init,
|
||||||
.wait_code = iohid_wait,
|
.wait_code = iohid_wait,
|
||||||
};
|
};
|
||||||
|
@ -1120,21 +1155,6 @@ void process_hid_report(DEVICE_OBJECT *device, BYTE *report, DWORD length)
|
||||||
LeaveCriticalSection(&ext->cs);
|
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)
|
BOOL is_xbox_gamepad(WORD vid, WORD pid)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
|
@ -29,6 +29,21 @@
|
||||||
|
|
||||||
#include "wine/unixlib.h"
|
#include "wine/unixlib.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
|
enum unix_funcs
|
||||||
{
|
{
|
||||||
sdl_init,
|
sdl_init,
|
||||||
|
|
Loading…
Reference in New Issue