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

commit eb4d13c823f1d444e877a704eb6a15ea541998c3
Author:     Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com>
AuthorDate: Fri Nov 3 22:45:51 2023 +0900
Commit:     GitHub <nore...@github.com>
CommitDate: Fri Nov 3 22:45:51 2023 +0900

    [IMM32][SDK] Implement CtfImm(Hide,Restore)ToolbarWnd (#5863)
    
    - Add Imm32GetFn helper function.
    - Implement CtfImmHideToolbarWnd and
      CtfImmRestoreToolbarWnd functions.
    - Add them to <imm32_undoc.h>.
    CORE-19268
---
 dll/win32/imm32/ctf.c             | 178 ++++++++++++++++++++++++++++++++++----
 dll/win32/imm32/imm32.spec        |   2 +-
 sdk/include/reactos/imm32_undoc.h |   2 +
 3 files changed, 165 insertions(+), 17 deletions(-)

diff --git a/dll/win32/imm32/ctf.c b/dll/win32/imm32/ctf.c
index b403cb3ad59..78f9b09acb9 100644
--- a/dll/win32/imm32/ctf.c
+++ b/dll/win32/imm32/ctf.c
@@ -6,18 +6,127 @@
  */
 
 #include "precomp.h"
+#include <msctf.h>
+#include <ctfutb.h>
 
 WINE_DEFAULT_DEBUG_CHANNEL(imm);
 
-/*
- * NOTE: Microsoft CTF protocol has vulnerability.
- *       If insecure, we don't follow the dangerous design.
- *
- * 
https://www.zdnet.com/article/vulnerability-in-microsoft-ctf-protocol-goes-back-to-windows-xp/
- * https://googleprojectzero.blogspot.com/2019/08/down-rabbit-hole.html
+BOOL
+Imm32GetFn(
+    _Inout_opt_ FARPROC *ppfn,
+    _Inout_ HINSTANCE *phinstDLL,
+    _In_ LPCWSTR pszDllName,
+    _In_ LPCSTR pszFuncName)
+{
+    WCHAR szPath[MAX_PATH];
+
+    if (*ppfn)
+        return TRUE;
+
+    if (*phinstDLL == NULL)
+    {
+        Imm32GetSystemLibraryPath(szPath, _countof(szPath), pszDllName);
+        *phinstDLL = LoadLibraryExW(szPath, NULL, 0);
+        if (*phinstDLL == NULL)
+            return FALSE;
+    }
+
+    *ppfn = (FARPROC)GetProcAddress(*phinstDLL, pszFuncName);
+    return *ppfn != NULL;
+}
+
+#define IMM32_GET_FN(ppfn, phinstDLL, dll_name, func_name) \
+    Imm32GetFn((FARPROC*)(ppfn), (phinstDLL), (dll_name), #func_name)
+
+/***********************************************************************
+ * OLE32.DLL
  */
 
-/*
+HINSTANCE g_hOle32 = NULL;
+
+#define OLE32_FN(name) g_pfnOLE32_##name
+
+typedef HRESULT (WINAPI *FN_CoInitializeEx)(LPVOID, DWORD);
+typedef VOID    (WINAPI *FN_CoUninitialize)(VOID);
+typedef HRESULT (WINAPI *FN_CoRegisterInitializeSpy)(IInitializeSpy*, 
ULARGE_INTEGER*);
+typedef HRESULT (WINAPI *FN_CoRevokeInitializeSpy)(ULARGE_INTEGER);
+
+FN_CoInitializeEx           OLE32_FN(CoInitializeEx)            = NULL;
+FN_CoUninitialize           OLE32_FN(CoUninitialize)            = NULL;
+FN_CoRegisterInitializeSpy  OLE32_FN(CoRegisterInitializeSpy)   = NULL;
+FN_CoRevokeInitializeSpy    OLE32_FN(CoRevokeInitializeSpy)     = NULL;
+
+#define Imm32GetOle32Fn(func_name) \
+    IMM32_GET_FN(&OLE32_FN(func_name), &g_hOle32, L"ole32.dll", #func_name)
+
+HRESULT Imm32CoInitializeEx(VOID)
+{
+    if (!Imm32GetOle32Fn(CoInitializeEx))
+        return E_FAIL;
+
+    return OLE32_FN(CoInitializeEx)(NULL, COINIT_APARTMENTTHREADED);
+}
+
+VOID Imm32CoUninitialize(VOID)
+{
+    if (!Imm32GetOle32Fn(CoUninitialize))
+        return;
+
+    OLE32_FN(CoUninitialize)();
+}
+
+HRESULT Imm32CoRegisterInitializeSpy(IInitializeSpy* spy, ULARGE_INTEGER* 
cookie)
+{
+    if (!Imm32GetOle32Fn(CoRegisterInitializeSpy))
+        return E_FAIL;
+
+    return OLE32_FN(CoRegisterInitializeSpy)(spy, cookie);
+}
+
+HRESULT Imm32CoRevokeInitializeSpy(ULARGE_INTEGER cookie)
+{
+    if (!Imm32GetOle32Fn(CoRevokeInitializeSpy))
+        return E_FAIL;
+
+    return OLE32_FN(CoRevokeInitializeSpy)(cookie);
+}
+
+/***********************************************************************
+ * MSCTF.DLL
+ */
+
+HINSTANCE g_hMsctf = NULL;
+
+#define MSCTF_FN(name) g_pfnMSCTF_##name
+
+typedef HRESULT (WINAPI *FN_TF_CreateLangBarMgr)(ITfLangBarMgr**);
+typedef VOID    (WINAPI *FN_TF_InvalidAssemblyListCacheIfExist)(VOID);
+
+FN_TF_CreateLangBarMgr                MSCTF_FN(TF_CreateLangBarMgr)            
    = NULL;
+FN_TF_InvalidAssemblyListCacheIfExist 
MSCTF_FN(TF_InvalidAssemblyListCacheIfExist) = NULL;
+
+#define Imm32GetMsctfFn(func_name) \
+    IMM32_GET_FN(&MSCTF_FN(func_name), &g_hMsctf, L"msctf.dll", #func_name)
+
+HRESULT Imm32TF_CreateLangBarMgr(_Inout_ ITfLangBarMgr **ppBarMgr)
+{
+    if (!Imm32GetMsctfFn(TF_CreateLangBarMgr))
+        return E_FAIL;
+
+    return MSCTF_FN(TF_CreateLangBarMgr)(ppBarMgr);
+}
+
+VOID Imm32TF_InvalidAssemblyListCacheIfExist(VOID)
+{
+    if (!Imm32GetMsctfFn(TF_InvalidAssemblyListCacheIfExist))
+        return;
+
+    MSCTF_FN(TF_InvalidAssemblyListCacheIfExist)();
+}
+
+/***********************************************************************
+ * CTF IME support
+ *
  * TSF stands for "Text Services Framework". "Cicero" is the code name of TSF.
  * CTF stands for "Cicero-aware Text Framework".
  *
@@ -385,22 +494,59 @@ CtfImmTIMActivate(_In_ HKL hKL)
 }
 
 /***********************************************************************
- *             CtfImmRestoreToolbarWnd(IMM32.@)
+ *             CtfImmHideToolbarWnd(IMM32.@)
+ *
+ * Used with CtfImmRestoreToolbarWnd.
  */
-VOID WINAPI
-CtfImmRestoreToolbarWnd(_In_ DWORD dwStatus)
+DWORD WINAPI
+CtfImmHideToolbarWnd(VOID)
 {
-    FIXME("(0x%lx)\n", dwStatus);
+    ITfLangBarMgr *pBarMgr;
+    DWORD dwShowFlags = 0;
+    BOOL bShown;
+
+    TRACE("()\n");
+
+    if (FAILED(Imm32TF_CreateLangBarMgr(&pBarMgr)))
+        return dwShowFlags;
+
+    if (SUCCEEDED(pBarMgr->lpVtbl->GetShowFloatingStatus(pBarMgr, 
&dwShowFlags)))
+    {
+        bShown = !(dwShowFlags & 0x800);
+        dwShowFlags &= 0xF;
+        if (bShown)
+            pBarMgr->lpVtbl->ShowFloating(pBarMgr, 8);
+    }
+
+    pBarMgr->lpVtbl->Release(pBarMgr);
+    return dwShowFlags;
 }
 
 /***********************************************************************
- *             CtfImmHideToolbarWnd(IMM32.@)
+ *             CtfImmRestoreToolbarWnd(IMM32.@)
+ *
+ * Used with CtfImmHideToolbarWnd.
  */
-DWORD WINAPI
-CtfImmHideToolbarWnd(VOID)
+VOID WINAPI
+CtfImmRestoreToolbarWnd(
+    _In_ LPVOID pUnused,
+    _In_ DWORD dwShowFlags)
 {
-    FIXME("()\n");
-    return 0;
+    HRESULT hr;
+    ITfLangBarMgr *pBarMgr;
+
+    UNREFERENCED_PARAMETER(pUnused);
+
+    TRACE("(%p, 0x%X)\n", pUnused, dwShowFlags);
+
+    hr = Imm32TF_CreateLangBarMgr(&pBarMgr);
+    if (FAILED(hr))
+        return;
+
+    if (dwShowFlags)
+        pBarMgr->lpVtbl->ShowFloating(pBarMgr, dwShowFlags);
+
+    pBarMgr->lpVtbl->Release(pBarMgr);
 }
 
 BOOL Imm32InsideLoaderLock(VOID)
diff --git a/dll/win32/imm32/imm32.spec b/dll/win32/imm32/imm32.spec
index 89293195098..3a706be14b4 100644
--- a/dll/win32/imm32/imm32.spec
+++ b/dll/win32/imm32/imm32.spec
@@ -5,7 +5,7 @@
 @ stdcall CtfImmIsCiceroStartedInThread()
 @ stdcall CtfImmIsTextFrameServiceDisabled()
 @ stdcall CtfImmTIMActivate(ptr)
-@ stdcall CtfImmRestoreToolbarWnd(long)
+@ stdcall CtfImmRestoreToolbarWnd(ptr long)
 @ stdcall CtfImmHideToolbarWnd()
 @ stdcall CtfImmDispatchDefImeMessage(ptr long ptr ptr)
 @ stdcall CtfImmIsGuidMapEnable(ptr)
diff --git a/sdk/include/reactos/imm32_undoc.h 
b/sdk/include/reactos/imm32_undoc.h
index d2622dd8423..61904db0b13 100644
--- a/sdk/include/reactos/imm32_undoc.h
+++ b/sdk/include/reactos/imm32_undoc.h
@@ -27,6 +27,8 @@ HRESULT WINAPI CtfAImmDeactivate(_In_ BOOL bDestroy);
 BOOL WINAPI CtfAImmIsIME(_In_ HKL hKL);
 BOOL WINAPI CtfImmIsCiceroStartedInThread(VOID);
 VOID WINAPI CtfImmSetAppCompatFlags(_In_ DWORD dwFlags);
+DWORD WINAPI CtfImmHideToolbarWnd(VOID);
+VOID WINAPI CtfImmRestoreToolbarWnd(_In_ LPVOID pUnused, _In_ DWORD 
dwShowFlags);
 
 LRESULT WINAPI
 CtfImmDispatchDefImeMessage(

Reply via email to