[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(®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;
--
2.21.0
More information about the wine-devel
mailing list