From 5af1d7c6b14349700b93b6e7140752314a3558f3 Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Mon, 26 May 2025 07:22:41 +0900 Subject: [PATCH] [MSCTF][SDK][CTFMON][MSCTFIME][MSUTB] Add msctf.dll stubs (#8026) Some baby steps to msctf.dll for CTF. JIRA issue: CORE-19361 - Add all the export functions of msctf.dll. - Modify msctf.spec. - Modify sdk/include/psdk/msctf.idl and sdk/include/psdk/inputscope.idl. - Add sdk/include/reactos/msctf_undoc.h. - Include in ctfmon, msctfime, and msutb. --- base/applications/ctfmon/precomp.h | 1 + dll/ime/msctfime/msctfime.h | 1 + dll/win32/msctf/mlng.cpp | 1 + dll/win32/msctf/mlng.h | 2 + dll/win32/msctf/msctf.spec | 47 +++--- dll/win32/msctf/utils.cpp | 236 ++++++++++++++++++++++++++++- dll/win32/msutb/precomp.h | 1 + sdk/include/psdk/inputscope.idl | 2 +- sdk/include/psdk/msctf.idl | 18 --- sdk/include/reactos/msctf_undoc.h | 57 +++++++ 10 files changed, 323 insertions(+), 43 deletions(-) create mode 100644 sdk/include/reactos/msctf_undoc.h diff --git a/base/applications/ctfmon/precomp.h b/base/applications/ctfmon/precomp.h index 44344559440..c9133946f57 100644 --- a/base/applications/ctfmon/precomp.h +++ b/base/applications/ctfmon/precomp.h @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include diff --git a/dll/ime/msctfime/msctfime.h b/dll/ime/msctfime/msctfime.h index 60440f5a92e..1674ea07ee2 100644 --- a/dll/ime/msctfime/msctfime.h +++ b/dll/ime/msctfime/msctfime.h @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include diff --git a/dll/win32/msctf/mlng.cpp b/dll/win32/msctf/mlng.cpp index 6ec66d099f4..c8440500dfe 100644 --- a/dll/win32/msctf/mlng.cpp +++ b/dll/win32/msctf/mlng.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include diff --git a/dll/win32/msctf/mlng.h b/dll/win32/msctf/mlng.h index e55e8b1ed7a..83f8f2ac6d6 100644 --- a/dll/win32/msctf/mlng.h +++ b/dll/win32/msctf/mlng.h @@ -7,6 +7,8 @@ #pragma once +#define CTF_COMPAT_DELAY_FIRST_ACTIVATE 2 + struct MLNGINFO { HKL m_hKL; diff --git a/dll/win32/msctf/msctf.spec b/dll/win32/msctf/msctf.spec index 6b036567346..2bfba97dd3a 100644 --- a/dll/win32/msctf/msctf.spec +++ b/dll/win32/msctf/msctf.spec @@ -1,38 +1,39 @@ +@ stdcall TF_GetLangIcon(long ptr long) +@ stdcall TF_GetMlngHKL(long ptr ptr long) +@ stdcall TF_GetMlngIconIndex(long) +@ stdcall TF_GetThreadFlags(long ptr ptr ptr) +@ stdcall TF_InatExtractIcon(long) +@ stdcall TF_InitMlngInfo() +@ stdcall TF_IsInMarshaling(long) +@ stdcall TF_MlngInfoCount() +@ stdcall TF_RunInputCPL() @ stdcall -private DllCanUnloadNow() @ stdcall -private DllGetClassObject(ptr ptr ptr) @ stdcall -private DllRegisterServer() @ stdcall -private DllUnregisterServer() @ stdcall SetInputScope(long long) -@ stub SetInputScopeXML +@ stdcall SetInputScopeXML(ptr ptr) @ stdcall SetInputScopes(long ptr long ptr long wstr wstr) -@ stub TF_CUASAppFix -@ stdcall -stub TF_CheckThreadInputIdle(long long) -@ stub TF_ClearLangBarAddIns -@ stdcall -stub TF_CreateCategoryMgr(ptr) -@ stdcall -stub TF_CreateCicLoadMutex(ptr) -@ stdcall -stub TF_CreateDisplayAttributeMgr(ptr) +@ stdcall TF_CUASAppFix(str) +@ stdcall TF_CheckThreadInputIdle(long long) +@ stdcall TF_ClearLangBarAddIns(ptr) +@ stdcall TF_CreateCategoryMgr(ptr) +@ stdcall TF_CreateCicLoadMutex(ptr) +@ stdcall TF_CreateDisplayAttributeMgr(ptr) @ stdcall TF_CreateInputProcessorProfiles(ptr) @ stdcall TF_CreateLangBarItemMgr(ptr) @ stdcall TF_CreateLangBarMgr(ptr) @ stdcall TF_CreateThreadMgr(ptr) -@ stdcall -stub TF_DllDetachInOther() -@ stdcall -stub TF_GetGlobalCompartment(ptr) -@ stub TF_GetInputScope -@ stdcall -stub TF_GetLangIcon(long ptr long) -@ stdcall TF_GetMlngHKL(long ptr ptr long) -@ stdcall TF_GetMlngIconIndex(long) -@ stdcall -stub TF_GetThreadFlags(long ptr ptr ptr) +@ stdcall TF_DllDetachInOther() +@ stdcall TF_GetGlobalCompartment(ptr) +@ stdcall TF_GetInputScope(ptr ptr) @ stdcall TF_GetThreadMgr(ptr) -@ stdcall TF_InatExtractIcon(long) -@ stdcall TF_InitMlngInfo() -@ stdcall -stub TF_InitSystem() -@ stdcall -stub TF_UninitSystem() -@ stdcall -stub TF_InvalidAssemblyListCache() +@ stdcall TF_InitSystem() +@ stdcall TF_InvalidAssemblyListCache() @ stdcall TF_InvalidAssemblyListCacheIfExist() @ stdcall TF_IsCtfmonRunning() -@ stdcall -stub TF_IsInMarshaling(long) -@ stdcall TF_MlngInfoCount() -@ stdcall TF_RunInputCPL() -@ stdcall -stub TF_PostAllThreadMsg(long long) +@ stdcall TF_IsFullScreenWindowAcitvated() ; Yes, Microsoft really misspelled this one! +@ stdcall TF_PostAllThreadMsg(ptr long) @ stdcall TF_RegisterLangBarAddIn(ptr wstr long) +@ stdcall TF_UninitSystem() @ stdcall TF_UnregisterLangBarAddIn(ptr long) diff --git a/dll/win32/msctf/utils.cpp b/dll/win32/msctf/utils.cpp index ccecab6f07d..673d3e0c071 100644 --- a/dll/win32/msctf/utils.cpp +++ b/dll/win32/msctf/utils.cpp @@ -2,7 +2,7 @@ * PROJECT: ReactOS msctf.dll * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) * PURPOSE: Text Framework Services - * COPYRIGHT: Copyright 2023 Katayama Hirofumi MZ + * COPYRIGHT: Copyright 2023-2025 Katayama Hirofumi MZ */ #include @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include @@ -49,6 +50,7 @@ BOOL gfSharedMemory = FALSE; LONG g_cRefDll = -1; BOOL g_fCUAS = FALSE; TCHAR g_szCUASImeFile[16] = { 0 }; +DWORD g_dwAppCompatibility = 0; BOOL g_fNoITextStoreAnchor = TRUE; // Messages @@ -236,6 +238,238 @@ RunCPLSetting(LPCTSTR pszCmdLine) return FullPathExec(TEXT("rundll32.exe"), pszCmdLine, SW_SHOWMINNOACTIVE, FALSE); } +/*********************************************************************** + * TF_GetThreadFlags (MSCTF.@) + * + * @unimplemented + */ +EXTERN_C BOOL WINAPI +TF_GetThreadFlags( + _In_ DWORD dwThreadId, + _Out_ LPDWORD pdwFlags1, + _Out_ LPDWORD pdwFlags2, + _Out_ LPDWORD pdwFlags3) +{ + FIXME("(%lu, %p, %p, %p)\n", dwThreadId, pdwFlags1, pdwFlags2, pdwFlags3); + *pdwFlags1 = *pdwFlags2 = *pdwFlags3 = 0; + return FALSE; +} + +/*********************************************************************** + * TF_CreateCategoryMgr (MSCTF.@) + * + * @unimplemented + */ +EXTERN_C HRESULT WINAPI +TF_CreateCategoryMgr(_Out_ ITfCategoryMgr **ppcat) +{ + FIXME("(%p)\n", ppcat); + if (ppcat) + *ppcat = NULL; + return E_NOTIMPL; +} + +/*********************************************************************** + * TF_CreateCicLoadMutex (MSCTF.@) + * + * @unimplemented + */ +EXTERN_C HANDLE WINAPI +TF_CreateCicLoadMutex(_Out_ LPBOOL pfWinLogon) +{ + FIXME("(%p)\n", pfWinLogon); + if (pfWinLogon == NULL) + return NULL; + *pfWinLogon = FALSE; + return NULL; +} + +/*********************************************************************** + * TF_CreateDisplayAttributeMgr (MSCTF.@) + * + * @unimplemented + */ +EXTERN_C HRESULT WINAPI +TF_CreateDisplayAttributeMgr(_Out_ ITfDisplayAttributeMgr **ppdam) +{ + FIXME("(%p)\n", ppdam); + *ppdam = NULL; + return E_NOTIMPL; +} + +/*********************************************************************** + * TF_DllDetachInOther (MSCTF.@) + * + * @unimplemented + */ +EXTERN_C BOOL WINAPI +TF_DllDetachInOther(VOID) +{ + FIXME("()\n"); + return TRUE; +} + +/*********************************************************************** + * TF_GetGlobalCompartment (MSCTF.@) + * + * @unimplemented + */ +EXTERN_C HRESULT WINAPI +TF_GetGlobalCompartment(_Out_ ITfCompartmentMgr **ppCompMgr) +{ + FIXME("(%p)\n", ppCompMgr); + *ppCompMgr = NULL; + return E_NOTIMPL; +} + +/*********************************************************************** + * TF_GetLangIcon (MSCTF.@) + * + * @unimplemented + */ +EXTERN_C HICON WINAPI +TF_GetLangIcon(_In_ LANGID LangID, _Out_ PWSTR pszText, _In_ INT cchText) +{ + FIXME("(0x%X, %p, %d)\n", LangID, pszText, cchText); + return NULL; +} + +/*********************************************************************** + * TF_IsFullScreenWindowAcitvated (MSCTF.@) + * + * Yes, this function name is misspelled by MS. + * @unimplemented + */ +EXTERN_C BOOL WINAPI +TF_IsFullScreenWindowAcitvated(VOID) +{ + FIXME("()\n"); + return FALSE; +} + +/*********************************************************************** + * TF_GetInputScope (MSCTF.@) + * + * @unimplemented + */ +EXTERN_C HRESULT WINAPI +TF_GetInputScope(_In_opt_ HWND hWnd, _Out_ ITfInputScope **ppInputScope) +{ + FIXME("(%p, %p)\n", hWnd, ppInputScope); + *ppInputScope = NULL; + return E_NOTIMPL; +} + +/*********************************************************************** + * SetInputScopeXML (MSCTF.@) + * + * @unimplemented + */ +EXTERN_C HRESULT WINAPI +SetInputScopeXML(_In_opt_ HWND hwnd, _In_opt_ PCWSTR pszXML) +{ + FIXME("(%p, %p)\n", hwnd, pszXML); + return E_NOTIMPL; +} + +/*********************************************************************** + * TF_CUASAppFix (MSCTF.@) + * + * @implemented + */ +EXTERN_C HRESULT WINAPI +TF_CUASAppFix(_In_ LPCSTR pszName) +{ + if (!pszName || lstrcmpiA(pszName, "DelayFirstActivateKeyboardLayout") != 0) + return E_INVALIDARG; + g_dwAppCompatibility |= CTF_COMPAT_DELAY_FIRST_ACTIVATE; + return S_OK; +} + +/*********************************************************************** + * TF_CheckThreadInputIdle (MSCTF.@) + * + * @unimplemented + */ +EXTERN_C LONG WINAPI +TF_CheckThreadInputIdle(_In_ DWORD dwThreadId, _In_ DWORD dwMilliseconds) +{ + FIXME("(%lu, %lu)\n", dwThreadId, dwMilliseconds); + return -1; +} + +/*********************************************************************** + * TF_ClearLangBarAddIns (MSCTF.@) + * + * @unimplemented + */ +EXTERN_C HRESULT WINAPI +TF_ClearLangBarAddIns(_In_ REFGUID guid) +{ + FIXME("(%p)\n", guid); + return E_NOTIMPL; +} + +/*********************************************************************** + * TF_InvalidAssemblyListCache (MSCTF.@) + * + * @unimplemented + */ +EXTERN_C HRESULT WINAPI +TF_InvalidAssemblyListCache(VOID) +{ + FIXME("()\n"); + return E_NOTIMPL; +} + +/*********************************************************************** + * TF_IsInMarshaling (MSCTF.@) + * + * @unimplemented + */ +EXTERN_C BOOL WINAPI +TF_IsInMarshaling(_In_ DWORD dwThreadId) +{ + FIXME("(%lu)\n", dwThreadId); + return FALSE; +} + +/*********************************************************************** + * TF_PostAllThreadMsg (MSCTF.@) + * + * @unimplemented + */ +EXTERN_C HRESULT WINAPI +TF_PostAllThreadMsg(_In_opt_ WPARAM wParam, _In_ DWORD dwFlags) +{ + FIXME("(%p, 0x%X)\n", wParam, dwFlags); + return E_NOTIMPL; +} + +/*********************************************************************** + * TF_InitSystem (MSCTF.@) + * + * @unimplemented + */ +EXTERN_C BOOL WINAPI +TF_InitSystem(VOID) +{ + FIXME("()\n"); + return FALSE; +} + +/*********************************************************************** + * TF_UninitSystem (MSCTF.@) + * + * @unimplemented + */ +EXTERN_C BOOL WINAPI +TF_UninitSystem(VOID) +{ + FIXME("()\n"); + return FALSE; +} + /*********************************************************************** * TF_RegisterLangBarAddIn (MSCTF.@) * diff --git a/dll/win32/msutb/precomp.h b/dll/win32/msutb/precomp.h index c2e3415a56d..58813d2e285 100644 --- a/dll/win32/msutb/precomp.h +++ b/dll/win32/msutb/precomp.h @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include diff --git a/sdk/include/psdk/inputscope.idl b/sdk/include/psdk/inputscope.idl index 059b6f8c810..933f1a5229f 100644 --- a/sdk/include/psdk/inputscope.idl +++ b/sdk/include/psdk/inputscope.idl @@ -74,7 +74,7 @@ typedef enum { cpp_quote("HRESULT WINAPI SetInputScope(HWND hwnd,InputScope inputscope);") cpp_quote("HRESULT WINAPI SetInputScopes(HWND hwnd,const InputScope *pInputScopes,UINT cInputScopes,WCHAR **ppszPhraseList,UINT cPhrases,WCHAR *pszRegExp,WCHAR *pszSRGS);") -cpp_quote("HRESULT WINAPI SetInputScopeXML(HWND hwnd,WCHAR *pszXML);") +cpp_quote("HRESULT WINAPI SetInputScopeXML(_In_opt_ HWND hwnd, _In_opt_ PCWSTR pszXML);") cpp_quote("DEFINE_GUID(GUID_PROP_INPUTSCOPE,0x1713dd5a,0x68e7,0x4a5b,0x9a,0xf6,0x59,0x2a,0x59,0x5c,0x77,0x8d);") diff --git a/sdk/include/psdk/msctf.idl b/sdk/include/psdk/msctf.idl index 787c3d88d1c..27c28303d52 100644 --- a/sdk/include/psdk/msctf.idl +++ b/sdk/include/psdk/msctf.idl @@ -46,31 +46,13 @@ cpp_quote("#define TF_E_STACKFULL MAKE_HRESULT(SEVERITY_ERROR, FACILI cpp_quote("#define TF_E_SYNCHRONOUS MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0208)") cpp_quote("#define TF_S_ASYNC MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_ITF, 0x0300)") -cpp_quote("EXTERN_C HRESULT WINAPI TF_InitSystem(VOID);") -cpp_quote("EXTERN_C HRESULT WINAPI TF_UninitSystem(VOID);") -cpp_quote("EXTERN_C HRESULT WINAPI TF_GetGlobalCompartment(_Out_ ITfCompartmentMgr **ppCompMgr);") -cpp_quote("EXTERN_C HRESULT WINAPI TF_PostAllThreadMsg(DWORD dwUnknown1, DWORD dwUnknown2);") cpp_quote("EXTERN_C HRESULT WINAPI TF_CreateThreadMgr(_Out_ ITfThreadMgr **pptim);") cpp_quote("EXTERN_C HRESULT WINAPI TF_GetThreadMgr(_Out_ ITfThreadMgr **pptim);") cpp_quote("EXTERN_C HRESULT WINAPI TF_CreateInputProcessorProfiles(_Out_ ITfInputProcessorProfiles **ppipr);") cpp_quote("EXTERN_C HRESULT WINAPI TF_CreateLangBarMgr(_Out_ ITfLangBarMgr **pppbm);") cpp_quote("EXTERN_C HRESULT WINAPI TF_CreateLangBarItemMgr(_Out_ ITfLangBarItemMgr **pplbim);") -cpp_quote("EXTERN_C HANDLE WINAPI TF_CreateCicLoadMutex(_Out_ LPBOOL pfWinLogon);") -cpp_quote("EXTERN_C HRESULT WINAPI TF_InvalidAssemblyListCache(VOID);") -cpp_quote("EXTERN_C HRESULT WINAPI TF_InvalidAssemblyListCacheIfExist(VOID);") -cpp_quote("EXTERN_C HRESULT WINAPI TF_DllDetachInOther(VOID);") cpp_quote("EXTERN_C HRESULT WINAPI TF_CreateCategoryMgr(_Out_ ITfCategoryMgr **ppcat);") cpp_quote("EXTERN_C HRESULT WINAPI TF_CreateDisplayAttributeMgr(_Out_ ITfDisplayAttributeMgr **ppdam);") -cpp_quote("EXTERN_C HICON WINAPI TF_GetLangIcon(_In_ LANGID LangID, _Out_ LPWSTR pszText, _In_ INT cchText);") -cpp_quote("EXTERN_C VOID WINAPI TF_InitMlngInfo(VOID);") -cpp_quote("EXTERN_C INT WINAPI TF_MlngInfoCount(VOID);") -cpp_quote("EXTERN_C BOOL WINAPI TF_GetMlngHKL(_In_ INT iKL, _Out_opt_ HKL *phKL, _Out_opt_ LPWSTR pszText, _In_ INT cchText);") -cpp_quote("EXTERN_C INT WINAPI TF_GetMlngIconIndex(_In_ INT iKL);") -cpp_quote("EXTERN_C HICON WINAPI TF_InatExtractIcon(_In_ INT iKL);") -cpp_quote("EXTERN_C HRESULT WINAPI TF_RunInputCPL(VOID);") -cpp_quote("EXTERN_C BOOL WINAPI TF_GetThreadFlags(_In_ DWORD dwThreadId, _Out_ LPDWORD pdwFlags1, _Out_ LPDWORD pdwFlags2, _Out_ LPDWORD pdwFlags3);") -cpp_quote("EXTERN_C LONG WINAPI TF_CheckThreadInputIdle(_In_ DWORD dwThreadId, _In_ DWORD dwMilliseconds);") -cpp_quote("EXTERN_C BOOL WINAPI TF_IsInMarshaling(_In_ DWORD dwThreadId);") cpp_quote("EXTERN_C const GUID GUID_PROP_TEXTOWNER;") cpp_quote("EXTERN_C const GUID GUID_PROP_ATTRIBUTE;") diff --git a/sdk/include/reactos/msctf_undoc.h b/sdk/include/reactos/msctf_undoc.h new file mode 100644 index 00000000000..845904c2956 --- /dev/null +++ b/sdk/include/reactos/msctf_undoc.h @@ -0,0 +1,57 @@ +/* + * PROJECT: ReactOS Kernel + * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) + * PURPOSE: Private header for msctf.dll + * COPYRIGHT: Copyright 2025 Katayama Hirofumi MZ + */ + +#pragma once + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +BOOL WINAPI TF_InitSystem(VOID); +BOOL WINAPI TF_UninitSystem(VOID); +HRESULT WINAPI TF_GetGlobalCompartment(_Out_ ITfCompartmentMgr **ppCompMgr); +HRESULT WINAPI TF_PostAllThreadMsg(_In_opt_ WPARAM wParam, _In_ DWORD dwFlags); +HANDLE WINAPI TF_CreateCicLoadMutex(_Out_ LPBOOL pfWinLogon); +HRESULT WINAPI TF_InvalidAssemblyListCache(VOID); +HRESULT WINAPI TF_InvalidAssemblyListCacheIfExist(VOID); +HICON WINAPI TF_GetLangIcon(_In_ LANGID LangID, _Out_writes_(cchText) PWSTR pszText, _In_ INT cchText); +VOID WINAPI TF_InitMlngInfo(VOID); +INT WINAPI TF_MlngInfoCount(VOID); +INT WINAPI TF_GetMlngIconIndex(_In_ INT iKL); +HICON WINAPI TF_InatExtractIcon(_In_ INT iKL); +HRESULT WINAPI TF_RunInputCPL(VOID); +LONG WINAPI TF_CheckThreadInputIdle(_In_ DWORD dwThreadId, _In_ DWORD dwMilliseconds); +BOOL WINAPI TF_IsInMarshaling(_In_ DWORD dwThreadId); + +// This is intentionally misspelled to match the original name: +BOOL WINAPI TF_IsFullScreenWindowAcitvated(VOID); + +HRESULT WINAPI TF_CUASAppFix(_In_ LPCSTR pszName); +HRESULT WINAPI TF_ClearLangBarAddIns(_In_ REFGUID rguid); +HRESULT WINAPI TF_GetInputScope(_In_opt_ HWND hWnd, _Out_ ITfInputScope **ppInputScope); +BOOL WINAPI TF_DllDetachInOther(VOID); + +BOOL WINAPI +TF_GetMlngHKL( + _In_ INT iKL, + _Out_opt_ HKL *phKL, + _Out_writes_opt_(cchText) LPWSTR pszText, + _In_ INT cchText); + +BOOL WINAPI +TF_GetThreadFlags( + _In_ DWORD dwThreadId, + _Out_ LPDWORD pdwFlags1, + _Out_ LPDWORD pdwFlags2, + _Out_ LPDWORD pdwFlags3); + +#ifdef __cplusplus +} // extern "C" +#endif