mirror of
https://github.com/reactos/reactos.git
synced 2024-09-29 14:09:10 +00:00
[IMM32] Rewrite ImmLoadLayout (#6138)
ImmLoadLayout was buggy. - Don't do zero fill pImeInfoEx. - Simplify registry handling. - Don't reset pImeInfoEx->fLoadFlag if failed early. CORE-19268
This commit is contained in:
parent
414f3da7a6
commit
b7dcc1024b
|
@ -67,49 +67,45 @@ BOOL WINAPI ImmRegisterClient(PSHAREDINFO ptr, HINSTANCE hMod)
|
|||
BOOL WINAPI ImmLoadLayout(HKL hKL, PIMEINFOEX pImeInfoEx)
|
||||
{
|
||||
DWORD cbData, dwType;
|
||||
HKEY hLayoutKey;
|
||||
LONG error;
|
||||
HKEY hKey;
|
||||
LSTATUS error;
|
||||
WCHAR szLayout[MAX_PATH];
|
||||
LPCWSTR pszSubKey;
|
||||
|
||||
TRACE("(%p, %p)\n", hKL, pImeInfoEx);
|
||||
|
||||
ZeroMemory(pImeInfoEx, sizeof(IMEINFOEX));
|
||||
|
||||
if (IS_IME_HKL(hKL) || !IS_CICERO_MODE() || IS_16BIT_MODE())
|
||||
/* Choose a key */
|
||||
if (IS_IME_HKL(hKL) || !IS_CICERO_MODE() || IS_16BIT_MODE()) /* Non-Cicero? */
|
||||
{
|
||||
StringCchPrintfW(szLayout, _countof(szLayout), L"%s\\%08lX",
|
||||
REGKEY_KEYBOARD_LAYOUTS, HandleToUlong(hKL));
|
||||
|
||||
error = RegOpenKeyExW(HKEY_LOCAL_MACHINE, szLayout, 0, KEY_READ, &hLayoutKey);
|
||||
if (IS_ERROR_UNEXPECTEDLY(error))
|
||||
return FALSE;
|
||||
pszSubKey = szLayout;
|
||||
}
|
||||
else
|
||||
else /* Cicero */
|
||||
{
|
||||
error = RegOpenKeyExW(HKEY_LOCAL_MACHINE, REGKEY_IMM, 0, KEY_READ, &hLayoutKey);
|
||||
if (IS_ERROR_UNEXPECTEDLY(error))
|
||||
return FALSE;
|
||||
pszSubKey = L"Software\\Microsoft\\Windows NT\\CurrentVersion\\IMM";
|
||||
}
|
||||
|
||||
cbData = sizeof(pImeInfoEx->wszImeFile);
|
||||
error = RegQueryValueExW(hLayoutKey, L"Ime File", NULL, &dwType,
|
||||
(LPBYTE)pImeInfoEx->wszImeFile, &cbData);
|
||||
pImeInfoEx->wszImeFile[_countof(pImeInfoEx->wszImeFile) - 1] = UNICODE_NULL;
|
||||
|
||||
RegCloseKey(hLayoutKey);
|
||||
|
||||
pImeInfoEx->fLoadFlag = 0;
|
||||
|
||||
/* Open the key */
|
||||
error = RegOpenKeyExW(HKEY_LOCAL_MACHINE, pszSubKey, 0, KEY_READ, &hKey);
|
||||
if (IS_ERROR_UNEXPECTEDLY(error))
|
||||
return FALSE;
|
||||
|
||||
if (dwType != REG_SZ)
|
||||
{
|
||||
ERR("\n");
|
||||
return FALSE;
|
||||
}
|
||||
/* Load "IME File" value */
|
||||
cbData = sizeof(pImeInfoEx->wszImeFile);
|
||||
error = RegQueryValueExW(hKey, L"IME File", NULL, &dwType,
|
||||
(LPBYTE)pImeInfoEx->wszImeFile, &cbData);
|
||||
|
||||
/* Avoid buffer overrun */
|
||||
pImeInfoEx->wszImeFile[_countof(pImeInfoEx->wszImeFile) - 1] = UNICODE_NULL;
|
||||
|
||||
RegCloseKey(hKey);
|
||||
|
||||
if (error != ERROR_SUCCESS || dwType != REG_SZ)
|
||||
return FALSE; /* Failed */
|
||||
|
||||
pImeInfoEx->hkl = hKL;
|
||||
pImeInfoEx->fLoadFlag = 0;
|
||||
return Imm32LoadImeVerInfo(pImeInfoEx);
|
||||
}
|
||||
|
||||
|
|
|
@ -58,7 +58,6 @@
|
|||
#define LANGID_JAPANESE MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT)
|
||||
|
||||
#define REGKEY_KEYBOARD_LAYOUTS L"System\\CurrentControlSet\\Control\\Keyboard Layouts"
|
||||
#define REGKEY_IMM L"Software\\Microsoft\\Windows NT\\CurrentVersion\\IMM"
|
||||
|
||||
#define ROUNDUP4(n) (((n) + 3) & ~3) /* DWORD alignment */
|
||||
|
||||
|
|
Loading…
Reference in a new issue