https://git.reactos.org/?p=reactos.git;a=commitdiff;h=97847f20780a79e8148d5…
commit 97847f20780a79e8148d5d44641b97b634876e69
Author:     Katayama Hirofumi MZ <katayama.hirofumi.mz(a)gmail.com>
AuthorDate: Sun Jul 25 11:56:17 2021 +0900
Commit:     GitHub <noreply(a)github.com>
CommitDate: Sun Jul 25 11:56:17 2021 +0900
    [IMM32] Improve ImmGetImeInfoEx (#3833)
    - Rewrite ImmGetImeInfoEx function.
    - Implement CtfImmIsTextFrameServiceDisabled function.
    - Modify imm32.spec.
    CORE-11700
---
 dll/win32/imm32/imm.c      | 57 ++++++++++++++++++++++++++++++++++++++--------
 dll/win32/imm32/imm32.spec |  1 +
 win32ss/include/ntuser.h   |  1 +
 3 files changed, 50 insertions(+), 9 deletions(-)
diff --git a/dll/win32/imm32/imm.c b/dll/win32/imm32/imm.c
index 904e0d25725..53c13d27d9f 100644
--- a/dll/win32/imm32/imm.c
+++ b/dll/win32/imm32/imm.c
@@ -39,6 +39,7 @@
 #include <ndk/pstypes.h>
 #include <ndk/rtlfuncs.h>
 #include "../../../win32ss/include/ntuser.h"
+#include "../../../win32ss/include/ntwin32.h"
 #include <imm32_undoc.h>
 #include <strsafe.h>
@@ -3608,29 +3609,67 @@ BOOL WINAPI ImmRegisterClient(PVOID ptr, /* FIXME: should point to
SHAREDINFO st
     return TRUE;
 }
+/***********************************************************************
+ *             CtfImmIsTextFrameServiceDisabled(IMM32.@)
+ */
+BOOL WINAPI CtfImmIsTextFrameServiceDisabled(VOID)
+{
+    PTEB pTeb = NtCurrentTeb();
+    if (((PW32CLIENTINFO)pTeb->Win32ClientInfo)->CI_flags & CI_TFSDISABLED)
+        return TRUE;
+    return FALSE;
+}
+
 /***********************************************************************
  *              ImmGetImeInfoEx (IMM32.@)
  */
+
+static BOOL APIENTRY Imm32GetImeInfoEx(PIMEINFOEX pImeInfoEx, IMEINFOEXCLASS SearchType)
+{
+    return NtUserGetImeInfoEx(pImeInfoEx, SearchType);
+}
+
 BOOL WINAPI
 ImmGetImeInfoEx(PIMEINFOEX pImeInfoEx,
                 IMEINFOEXCLASS SearchType,
                 PVOID pvSearchKey)
 {
+    BOOL bDisabled = FALSE;
+    HKL hKL;
+    PTEB pTeb;
+
     switch (SearchType)
     {
         case ImeInfoExKeyboardLayout:
-            pImeInfoEx->hkl = *(LPHKL)pvSearchKey;
-            if (!IS_IME_HKL(pImeInfoEx->hkl))
-                return FALSE;
             break;
-        case ImeInfoExImeFileName:
-            lstrcpynW(pImeInfoEx->wszImeFile, (LPWSTR)pvSearchKey,
-                      ARRAY_SIZE(pImeInfoEx->wszImeFile));
+        case ImeInfoExImeWindow:
+            bDisabled = CtfImmIsTextFrameServiceDisabled();
+            SearchType = ImeInfoExKeyboardLayout;
             break;
-        default:
-            return FALSE;
+        case ImeInfoExImeFileName:
+            StringCchCopyW(pImeInfoEx->wszImeFile,
_countof(pImeInfoEx->wszImeFile),
+                           pvSearchKey);
+            goto Quit;
     }
-    return NtUserGetImeInfoEx(pImeInfoEx, SearchType);
+
+    hKL = *(HKL*)pvSearchKey;
+    pImeInfoEx->hkl = hKL;
+
+    if (!IS_IME_HKL(hKL))
+    {
+        if (g_dwImm32Flags & IMM32_FLAG_CICERO_ENABLED)
+        {
+            pTeb = NtCurrentTeb();
+            if (((PW32CLIENTINFO)pTeb->Win32ClientInfo)->W32ClientInfo[0] & 2)
+                return FALSE;
+            if (!bDisabled)
+                goto Quit;
+        }
+        return FALSE;
+    }
+
+Quit:
+    return Imm32GetImeInfoEx(pImeInfoEx, SearchType);
 }
diff --git a/dll/win32/imm32/imm32.spec b/dll/win32/imm32/imm32.spec
index 43107d4797a..3c950672c35 100644
--- a/dll/win32/imm32/imm32.spec
+++ b/dll/win32/imm32/imm32.spec
@@ -1,4 +1,5 @@
 @ stdcall CtfImmIsCiceroEnabled()
+@ stdcall CtfImmIsTextFrameServiceDisabled()
 @ stdcall -stub ImmActivateLayout(long)
 @ stdcall ImmAssociateContext(ptr ptr)
 @ stdcall ImmAssociateContextEx(ptr ptr long)
diff --git a/win32ss/include/ntuser.h b/win32ss/include/ntuser.h
index 54499388337..cc454ba1e2c 100644
--- a/win32ss/include/ntuser.h
+++ b/win32ss/include/ntuser.h
@@ -281,6 +281,7 @@ typedef struct _CALLBACKWND
 #define CI_CURTHPRHOOK       0x00000010
 #define CI_CLASSESREGISTERED 0x00000020
 #define CI_IMMACTIVATE       0x00000040
+#define CI_TFSDISABLED       0x00000400
 typedef struct _CLIENTINFO
 {