[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
This commit is contained in:
Katayama Hirofumi MZ 2023-11-03 22:45:51 +09:00 committed by GitHub
parent a114169c4d
commit eb4d13c823
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 167 additions and 19 deletions

View file

@ -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".
*
@ -384,23 +493,60 @@ CtfImmTIMActivate(_In_ HKL hKL)
return E_NOTIMPL;
}
/***********************************************************************
* CtfImmRestoreToolbarWnd(IMM32.@)
*/
VOID WINAPI
CtfImmRestoreToolbarWnd(_In_ DWORD dwStatus)
{
FIXME("(0x%lx)\n", dwStatus);
}
/***********************************************************************
* CtfImmHideToolbarWnd(IMM32.@)
*
* Used with CtfImmRestoreToolbarWnd.
*/
DWORD WINAPI
CtfImmHideToolbarWnd(VOID)
{
FIXME("()\n");
return 0;
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;
}
/***********************************************************************
* CtfImmRestoreToolbarWnd(IMM32.@)
*
* Used with CtfImmHideToolbarWnd.
*/
VOID WINAPI
CtfImmRestoreToolbarWnd(
_In_ LPVOID pUnused,
_In_ DWORD dwShowFlags)
{
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)

View file

@ -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)

View file

@ -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(