From 941c5de64c3aa5cbf2480f4ca0135f8f3185b91f Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Thu, 12 Jul 2007 05:31:08 +0000 Subject: [PATCH] Fixed joystick name detection - merged from revision 3226 on SDL 1.2 branch --- src/joystick/win32/SDL_mmjoystick.c | 91 +++++++++++++++-------------- 1 file changed, 47 insertions(+), 44 deletions(-) diff --git a/src/joystick/win32/SDL_mmjoystick.c b/src/joystick/win32/SDL_mmjoystick.c index 4e0672368..de0d6bbd3 100644 --- a/src/joystick/win32/SDL_mmjoystick.c +++ b/src/joystick/win32/SDL_mmjoystick.c @@ -78,59 +78,62 @@ GetJoystickName(int index, const char *szRegKey) index (1-16) listed in the registry */ char *name = NULL; + HKEY hTopKey; HKEY hKey; DWORD regsize; LONG regresult; - unsigned char regkey[256]; - unsigned char regvalue[256]; - unsigned char regname[256]; + char regkey[256]; + char regvalue[256]; + char regname[256]; - SDL_snprintf((char *) regkey, SDL_arraysize(regkey), "%s\\%s\\%s", + SDL_snprintf(regkey, SDL_arraysize(regkey), "%s\\%s\\%s", REGSTR_PATH_JOYCONFIG, szRegKey, REGSTR_KEY_JOYCURR); - regresult = RegOpenKeyExA(HKEY_LOCAL_MACHINE, - (LPTSTR) & regkey, 0, KEY_READ, &hKey); + hTopKey = HKEY_LOCAL_MACHINE; + regresult = RegOpenKeyExA(hTopKey, regkey, 0, KEY_READ, &hKey); + if (regresult != ERROR_SUCCESS) { + hTopKey = HKEY_CURRENT_USER; + regresult = RegOpenKeyExA(hTopKey, regkey, 0, KEY_READ, &hKey); + } + if (regresult != ERROR_SUCCESS) { + return NULL; + } + + /* find the registry key name for the joystick's properties */ + regsize = sizeof(regname); + SDL_snprintf(regvalue, SDL_arraysize(regvalue), "Joystick%d%s", index + 1, + REGSTR_VAL_JOYOEMNAME); + regresult = + RegQueryValueExA(hKey, regvalue, 0, 0, (LPBYTE) regname, ®size); + RegCloseKey(hKey); + + if (regresult != ERROR_SUCCESS) { + return NULL; + } + + /* open that registry key */ + SDL_snprintf(regkey, SDL_arraysize(regkey), "%s\\%s", REGSTR_PATH_JOYOEM, + regname); + regresult = RegOpenKeyExA(hTopKey, regkey, 0, KEY_READ, &hKey); + if (regresult != ERROR_SUCCESS) { + return NULL; + } + + /* find the size for the OEM name text */ + regsize = sizeof(regvalue); + regresult = + RegQueryValueExA(hKey, REGSTR_VAL_JOYOEMNAME, 0, 0, NULL, ®size); if (regresult == ERROR_SUCCESS) { - /* - find the registry key name for the - joystick's properties - */ - regsize = sizeof(regname); - SDL_snprintf((char *) regvalue, SDL_arraysize(regvalue), - "Joystick%d%s", index + 1, REGSTR_VAL_JOYOEMNAME); - regresult = RegQueryValueExA(hKey, - (char *) regvalue, 0, 0, - (LPBYTE) & regname, (LPDWORD) & regsize); - RegCloseKey(hKey); - if (regresult == ERROR_SUCCESS) { - /* open that registry key */ - SDL_snprintf((char *) regkey, SDL_arraysize(regkey), - "%s\\%s", REGSTR_PATH_JOYOEM, regname); - regresult = - RegOpenKeyExA(HKEY_LOCAL_MACHINE, (char *) regkey, 0, - KEY_READ, &hKey); - if (regresult == ERROR_SUCCESS) { - /* find the size for the OEM name text */ - regsize = sizeof(regvalue); - regresult = - RegQueryValueExA(hKey, - REGSTR_VAL_JOYOEMNAME, - 0, 0, NULL, (LPDWORD) & regsize); - if (regresult == ERROR_SUCCESS) { - /* - allocate enough memory - for the OEM name text ... - */ - name = (char *) SDL_malloc(regsize); - /* ... and read it from the registry */ - regresult = - RegQueryValueExA(hKey, + /* allocate enough memory for the OEM name text ... */ + name = (char *) SDL_malloc(regsize); + if (name) { + /* ... and read it from the registry */ + regresult = RegQueryValueExA(hKey, REGSTR_VAL_JOYOEMNAME, 0, 0, - (LPBYTE) name, (LPDWORD) & regsize); - RegCloseKey(hKey); - } - } + (LPBYTE) name, ®size); } } + RegCloseKey(hKey); + return (name); }