https://git.reactos.org/?p=reactos.git;a=commitdiff;h=b7dcc1024b001e45f3cecf945ff46ff1e79f4c5a

commit b7dcc1024b001e45f3cecf945ff46ff1e79f4c5a
Author:     Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com>
AuthorDate: Sat Dec 9 09:49:57 2023 +0900
Commit:     GitHub <nore...@github.com>
CommitDate: Sat Dec 9 09:49:57 2023 +0900

    [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
---
 dll/win32/imm32/imm.c     | 46 +++++++++++++++++++++-------------------------
 dll/win32/imm32/precomp.h |  1 -
 2 files changed, 21 insertions(+), 26 deletions(-)

diff --git a/dll/win32/imm32/imm.c b/dll/win32/imm32/imm.c
index aa81c0935bd..d3d4b7dcb07 100644
--- a/dll/win32/imm32/imm.c
+++ b/dll/win32/imm32/imm.c
@@ -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";
     }
 
+    /* Open the key */
+    error = RegOpenKeyExW(HKEY_LOCAL_MACHINE, pszSubKey, 0, KEY_READ, &hKey);
+    if (IS_ERROR_UNEXPECTEDLY(error))
+        return FALSE;
+
+    /* Load "IME File" value */
     cbData = sizeof(pImeInfoEx->wszImeFile);
-    error = RegQueryValueExW(hLayoutKey, L"Ime File", NULL, &dwType,
+    error = RegQueryValueExW(hKey, L"IME File", NULL, &dwType,
                              (LPBYTE)pImeInfoEx->wszImeFile, &cbData);
-    pImeInfoEx->wszImeFile[_countof(pImeInfoEx->wszImeFile) - 1] = 
UNICODE_NULL;
-
-    RegCloseKey(hLayoutKey);
 
-    pImeInfoEx->fLoadFlag = 0;
+    /* Avoid buffer overrun */
+    pImeInfoEx->wszImeFile[_countof(pImeInfoEx->wszImeFile) - 1] = 
UNICODE_NULL;
 
-    if (IS_ERROR_UNEXPECTEDLY(error))
-        return FALSE;
+    RegCloseKey(hKey);
 
-    if (dwType != REG_SZ)
-    {
-        ERR("\n");
-        return FALSE;
-    }
+    if (error != ERROR_SUCCESS || dwType != REG_SZ)
+        return FALSE; /* Failed */
 
     pImeInfoEx->hkl = hKL;
+    pImeInfoEx->fLoadFlag = 0;
     return Imm32LoadImeVerInfo(pImeInfoEx);
 }
 
diff --git a/dll/win32/imm32/precomp.h b/dll/win32/imm32/precomp.h
index cb87f48890c..7bb2569777b 100644
--- a/dll/win32/imm32/precomp.h
+++ b/dll/win32/imm32/precomp.h
@@ -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 */
 

Reply via email to