Signed-off-by: Zebediah Figura z.figura12@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(®path, thread_args->registry_path); - RtlAppendUnicodeToString(®path, szPath); - InitializeObjectAttributes(&attr, ®path, 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;