mirror of
https://github.com/reactos/reactos.git
synced 2025-05-27 13:08:23 +00:00
[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:
parent
a114169c4d
commit
eb4d13c823
3 changed files with 167 additions and 19 deletions
|
@ -6,18 +6,127 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "precomp.h"
|
#include "precomp.h"
|
||||||
|
#include <msctf.h>
|
||||||
|
#include <ctfutb.h>
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(imm);
|
WINE_DEFAULT_DEBUG_CHANNEL(imm);
|
||||||
|
|
||||||
/*
|
BOOL
|
||||||
* NOTE: Microsoft CTF protocol has vulnerability.
|
Imm32GetFn(
|
||||||
* If insecure, we don't follow the dangerous design.
|
_Inout_opt_ FARPROC *ppfn,
|
||||||
*
|
_Inout_ HINSTANCE *phinstDLL,
|
||||||
* https://www.zdnet.com/article/vulnerability-in-microsoft-ctf-protocol-goes-back-to-windows-xp/
|
_In_ LPCWSTR pszDllName,
|
||||||
* https://googleprojectzero.blogspot.com/2019/08/down-rabbit-hole.html
|
_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.
|
* TSF stands for "Text Services Framework". "Cicero" is the code name of TSF.
|
||||||
* CTF stands for "Cicero-aware Text Framework".
|
* CTF stands for "Cicero-aware Text Framework".
|
||||||
*
|
*
|
||||||
|
@ -384,23 +493,60 @@ CtfImmTIMActivate(_In_ HKL hKL)
|
||||||
return E_NOTIMPL;
|
return E_NOTIMPL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
* CtfImmRestoreToolbarWnd(IMM32.@)
|
|
||||||
*/
|
|
||||||
VOID WINAPI
|
|
||||||
CtfImmRestoreToolbarWnd(_In_ DWORD dwStatus)
|
|
||||||
{
|
|
||||||
FIXME("(0x%lx)\n", dwStatus);
|
|
||||||
}
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* CtfImmHideToolbarWnd(IMM32.@)
|
* CtfImmHideToolbarWnd(IMM32.@)
|
||||||
|
*
|
||||||
|
* Used with CtfImmRestoreToolbarWnd.
|
||||||
*/
|
*/
|
||||||
DWORD WINAPI
|
DWORD WINAPI
|
||||||
CtfImmHideToolbarWnd(VOID)
|
CtfImmHideToolbarWnd(VOID)
|
||||||
{
|
{
|
||||||
FIXME("()\n");
|
ITfLangBarMgr *pBarMgr;
|
||||||
return 0;
|
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)
|
BOOL Imm32InsideLoaderLock(VOID)
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
@ stdcall CtfImmIsCiceroStartedInThread()
|
@ stdcall CtfImmIsCiceroStartedInThread()
|
||||||
@ stdcall CtfImmIsTextFrameServiceDisabled()
|
@ stdcall CtfImmIsTextFrameServiceDisabled()
|
||||||
@ stdcall CtfImmTIMActivate(ptr)
|
@ stdcall CtfImmTIMActivate(ptr)
|
||||||
@ stdcall CtfImmRestoreToolbarWnd(long)
|
@ stdcall CtfImmRestoreToolbarWnd(ptr long)
|
||||||
@ stdcall CtfImmHideToolbarWnd()
|
@ stdcall CtfImmHideToolbarWnd()
|
||||||
@ stdcall CtfImmDispatchDefImeMessage(ptr long ptr ptr)
|
@ stdcall CtfImmDispatchDefImeMessage(ptr long ptr ptr)
|
||||||
@ stdcall CtfImmIsGuidMapEnable(ptr)
|
@ stdcall CtfImmIsGuidMapEnable(ptr)
|
||||||
|
|
|
@ -27,6 +27,8 @@ HRESULT WINAPI CtfAImmDeactivate(_In_ BOOL bDestroy);
|
||||||
BOOL WINAPI CtfAImmIsIME(_In_ HKL hKL);
|
BOOL WINAPI CtfAImmIsIME(_In_ HKL hKL);
|
||||||
BOOL WINAPI CtfImmIsCiceroStartedInThread(VOID);
|
BOOL WINAPI CtfImmIsCiceroStartedInThread(VOID);
|
||||||
VOID WINAPI CtfImmSetAppCompatFlags(_In_ DWORD dwFlags);
|
VOID WINAPI CtfImmSetAppCompatFlags(_In_ DWORD dwFlags);
|
||||||
|
DWORD WINAPI CtfImmHideToolbarWnd(VOID);
|
||||||
|
VOID WINAPI CtfImmRestoreToolbarWnd(_In_ LPVOID pUnused, _In_ DWORD dwShowFlags);
|
||||||
|
|
||||||
LRESULT WINAPI
|
LRESULT WINAPI
|
||||||
CtfImmDispatchDefImeMessage(
|
CtfImmDispatchDefImeMessage(
|
||||||
|
|
Loading…
Reference in a new issue