winebus.sys: Move udev configuration values to the winebus service key.
Signed-off-by: Zebediah Figura <z.figura12@gmail.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
50b9456e87
commit
d525c736b9
|
@ -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;
|
||||
|
|
|
@ -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};
|
||||
HKEY key;
|
||||
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)
|
||||
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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue