On 3/5/19 1:32 PM, Aric Stewart wrote:
diff --git a/dlls/winebus.sys/bus_sdl.c b/dlls/winebus.sys/bus_sdl.c index 55891138c8..863660ee89 100644 --- a/dlls/winebus.sys/bus_sdl.c +++ b/dlls/winebus.sys/bus_sdl.c @@ -106,6 +106,7 @@ MAKE_FUNCPTR(SDL_HapticRunEffect); MAKE_FUNCPTR(SDL_HapticStopAll); MAKE_FUNCPTR(SDL_JoystickIsHaptic); MAKE_FUNCPTR(SDL_memset); +MAKE_FUNCPTR(SDL_GameControllerAddMapping); #endif static Uint16 (*pSDL_JoystickGetProduct)(SDL_Joystick * joystick); static Uint16 (*pSDL_JoystickGetProductVersion)(SDL_Joystick *
joystick);
@@ -904,6 +905,59 @@ static DWORD CALLBACK deviceloop_thread(void *args) pSDL_JoystickEventState(SDL_ENABLE); pSDL_GameControllerEventState(SDL_ENABLE);
- /* Process mappings */
- if (pSDL_GameControllerAddMapping != NULL)
- {
HANDLE key;
OBJECT_ATTRIBUTES attr;
static const WCHAR szPath[] = {'\\',
'R','e','g','i','s','t','r','y','\\',
'U','s','e','r','\\',
'S','-','1','-','5','-','2','1','-','0','-','0','-','0','-','1','0','0','0','\',
'S','o','f','t','w','a','r','e','\\',
'W','i','n','e','\\',
'S','D','L',0};
I think this should use RtlFormatCurrentUserKeyPath() rather than hardcoding it. But why do we need to use NT APIs here? Also, why are we storing this in a new key instead of in the existing key for the SDL driver?
static const UNICODE_STRING path = {sizeof(szPath) -
sizeof(WCHAR), sizeof(szPath), (WCHAR*)szPath};
InitializeObjectAttributes(&attr, &path,
OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);
if (NtOpenKey(&key, KEY_ALL_ACCESS, &attr) == STATUS_SUCCESS)
{
ULONG index = 0;
KEY_VALUE_PARTIAL_INFORMATION *info;
DWORD length, result_len;
NTSTATUS status;
length = sizeof(KEY_VALUE_PARTIAL_INFORMATION) + (1000 *
sizeof(WCHAR));
info = HeapAlloc(GetProcessHeap(), 0, length);
do {
status = NtEnumerateValueKey(key, index,
KeyValuePartialInformation,
info, length, &result_len);
if (status == STATUS_SUCCESS)
{
CHAR mapping[1000] = {0};
WideCharToMultiByte(CP_ACP, 0, info->Data,
(info->DataLength / sizeof(WCHAR)), mapping,
sizeof(mapping),
NULL, NULL);
if (mapping[0] != 0)
{
TRACE("Setting mapping
%s\n",debugstr_a(mapping));
pSDL_GameControllerAddMapping(mapping);
} else {
ERR("Failed to convert mapping
%s\n",debugstr_w(info->Data));
}
index ++;
}
} while (status == STATUS_SUCCESS);
HeapFree(GetProcessHeap(), 0, info);
NtClose(key);
}
}
else
{
ERR("Controller Mapping unsuported in this version of SDL\n");
}
SetEvent(init_done);
while (1)
@@ -969,6 +1023,7 @@ NTSTATUS WINAPI sdl_driver_init(DRIVER_OBJECT
*driver, UNICODE_STRING *registry_
LOAD_FUNCPTR(SDL_HapticStopAll); LOAD_FUNCPTR(SDL_JoystickIsHaptic); LOAD_FUNCPTR(SDL_memset);
LOAD_FUNCPTR(SDL_GameControllerAddMapping);
#undef LOAD_FUNCPTR pSDL_JoystickGetProduct = wine_dlsym(sdl_handle,
"SDL_JoystickGetProduct", NULL, 0);
pSDL_JoystickGetProductVersion = wine_dlsym(sdl_handle,
"SDL_JoystickGetProductVersion", NULL, 0);