mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 05:32:55 +00:00
[IMM32][NTUSER] Strictly check Cicero IME (#8009)
This PR enhances Cicero IME support. JIRA issue: CORE-19268 - Add null checks for the functions of Cicero IMEs in Imm32LoadIME function. - Add and use IS_CICERO_COMPAT_DISABLED macro in win32ss/include/ntuser.h. - Fix ImmGetImeInfoEx, Imm32LoadImeDpi, ImmGetDescriptionA, ImmGetDescriptionW, ImmGetIMEFileNameA, ImmGetIMEFileNameW, and ImmGetProperty functions for Cicero IME support. - Set last error in NtUserGetImeInfoEx.
This commit is contained in:
parent
7ce90a0399
commit
c876fe350d
4 changed files with 58 additions and 79 deletions
|
@ -929,7 +929,7 @@ HRESULT
|
|||
CtfImmTIMDestroyInputContext(
|
||||
_In_ HIMC hIMC)
|
||||
{
|
||||
if (!IS_CICERO_MODE() || (GetWin32ClientInfo()->dwCompatFlags2 & 2))
|
||||
if (!IS_CICERO_MODE() || IS_CICERO_COMPAT_DISABLED())
|
||||
return E_NOINTERFACE;
|
||||
|
||||
return CtfImeDestroyInputContext(hIMC);
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
* Copyright 2002, 2003, 2007 CodeWeavers, Aric Stewart
|
||||
* Copyright 2017 James Tabor <james.tabor@reactos.org>
|
||||
* Copyright 2018 Amine Khaldi <amine.khaldi@reactos.org>
|
||||
* Copyright 2020-2022 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
|
||||
* Copyright 2020-2025 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
|
||||
*/
|
||||
|
||||
#include "precomp.h"
|
||||
|
@ -194,7 +194,6 @@ BOOL APIENTRY Imm32InquireIme(PIMEDPI pImeDpi)
|
|||
#include <imetable.h>
|
||||
#undef DEFINE_IME_ENTRY
|
||||
|
||||
// Win: LoadIME
|
||||
BOOL APIENTRY Imm32LoadIME(PIMEINFOEX pImeInfoEx, PIMEDPI pImeDpi)
|
||||
{
|
||||
WCHAR szPath[MAX_PATH];
|
||||
|
@ -230,6 +229,23 @@ BOOL APIENTRY Imm32LoadIME(PIMEINFOEX pImeInfoEx, PIMEDPI pImeDpi)
|
|||
#include <imetable.h>
|
||||
#undef DEFINE_IME_ENTRY
|
||||
|
||||
/* Check for Cicero IMEs */
|
||||
if (!IS_IME_HKL(pImeDpi->hKL) && IS_CICERO_MODE() && !IS_CICERO_COMPAT_DISABLED())
|
||||
{
|
||||
#define CHECK_IME_FN(name) do { \
|
||||
if (!pImeDpi->name) { \
|
||||
ERR("'%s' not found in Cicero IME module '%S'.\n", #name, szPath); \
|
||||
goto Failed; \
|
||||
} \
|
||||
} while(0)
|
||||
CHECK_IME_FN(CtfImeInquireExW);
|
||||
CHECK_IME_FN(CtfImeSelectEx);
|
||||
CHECK_IME_FN(CtfImeEscapeEx);
|
||||
CHECK_IME_FN(CtfImeGetGuidAtom);
|
||||
CHECK_IME_FN(CtfImeIsGuidMapEnable);
|
||||
#undef CHECK_IME_FN
|
||||
}
|
||||
|
||||
if (Imm32InquireIme(pImeDpi))
|
||||
{
|
||||
ret = TRUE;
|
||||
|
@ -263,7 +279,6 @@ Failed:
|
|||
return ret;
|
||||
}
|
||||
|
||||
// Win: LoadImeDpi
|
||||
PIMEDPI APIENTRY Imm32LoadImeDpi(HKL hKL, BOOL bLock)
|
||||
{
|
||||
IMEINFOEX ImeInfoEx;
|
||||
|
@ -272,12 +287,6 @@ PIMEDPI APIENTRY Imm32LoadImeDpi(HKL hKL, BOOL bLock)
|
|||
UINT uCodePage;
|
||||
LCID lcid;
|
||||
|
||||
if (!IS_IME_HKL(hKL))
|
||||
{
|
||||
TRACE("\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!ImmGetImeInfoEx(&ImeInfoEx, ImeInfoExKeyboardLayout, &hKL))
|
||||
{
|
||||
ERR("\n");
|
||||
|
@ -608,47 +617,40 @@ BOOL WINAPI ImmNotifyIME(HIMC hIMC, DWORD dwAction, DWORD dwIndex, DWORD_PTR dwV
|
|||
BOOL WINAPI
|
||||
ImmGetImeInfoEx(PIMEINFOEX pImeInfoEx, IMEINFOEXCLASS SearchType, PVOID pvSearchKey)
|
||||
{
|
||||
HKL hKL;
|
||||
if (SearchType == ImeInfoExKeyboardLayout || SearchType == ImeInfoExKeyboardLayoutTFS)
|
||||
{
|
||||
hKL = *(HKL*)pvSearchKey;
|
||||
pImeInfoEx->hkl = hKL;
|
||||
BOOL bTextServiceDisabled = FALSE;
|
||||
|
||||
if (SearchType == ImeInfoExKeyboardLayoutTFS)
|
||||
{
|
||||
if (!IS_IME_HKL(hKL))
|
||||
{
|
||||
if (CtfImmIsTextFrameServiceDisabled() || !IS_CICERO_MODE() || IS_16BIT_MODE())
|
||||
{
|
||||
TRACE("\n");
|
||||
return FALSE;
|
||||
}
|
||||
SearchType = ImeInfoExKeyboardLayout;
|
||||
bTextServiceDisabled = CtfImmIsTextFrameServiceDisabled();
|
||||
}
|
||||
|
||||
SearchType = ImeInfoExKeyboardLayout;
|
||||
}
|
||||
else
|
||||
if (SearchType == ImeInfoExKeyboardLayout)
|
||||
{
|
||||
if (!IS_IME_HKL(hKL))
|
||||
{
|
||||
TRACE("\n");
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (SearchType == ImeInfoExImeFileName)
|
||||
{
|
||||
StringCchCopyW(pImeInfoEx->wszImeFile, _countof(pImeInfoEx->wszImeFile),
|
||||
pvSearchKey);
|
||||
}
|
||||
else
|
||||
HKL hKL = *(HKL *)pvSearchKey;
|
||||
pImeInfoEx->hkl = hKL;
|
||||
|
||||
if (!IS_IME_HKL(hKL) &&
|
||||
(!IS_CICERO_MODE() || IS_CICERO_COMPAT_DISABLED() || bTextServiceDisabled))
|
||||
{
|
||||
TRACE("IME is disabled\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return NtUserGetImeInfoEx(pImeInfoEx, SearchType);
|
||||
}
|
||||
|
||||
if (SearchType == ImeInfoExImeFileName)
|
||||
{
|
||||
StringCchCopyW(pImeInfoEx->wszImeFile, _countof(pImeInfoEx->wszImeFile), pvSearchKey);
|
||||
return NtUserGetImeInfoEx(pImeInfoEx, SearchType);
|
||||
}
|
||||
|
||||
/* NOTE: ImeInfoExImeWindow is ignored */
|
||||
ERR("SearchType: %d\n", SearchType);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* ImmLockImeDpi (IMM32.@)
|
||||
*/
|
||||
|
@ -763,12 +765,6 @@ UINT WINAPI ImmGetDescriptionA(HKL hKL, LPSTR lpszDescription, UINT uBufLen)
|
|||
|
||||
TRACE("(%p,%p,%d)\n", hKL, lpszDescription, uBufLen);
|
||||
|
||||
if (!IS_IME_HKL(hKL))
|
||||
{
|
||||
TRACE("\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!ImmGetImeInfoEx(&info, ImeInfoExKeyboardLayout, &hKL))
|
||||
{
|
||||
ERR("\n");
|
||||
|
@ -793,12 +789,6 @@ UINT WINAPI ImmGetDescriptionW(HKL hKL, LPWSTR lpszDescription, UINT uBufLen)
|
|||
|
||||
TRACE("(%p, %p, %d)\n", hKL, lpszDescription, uBufLen);
|
||||
|
||||
if (!IS_IME_HKL(hKL))
|
||||
{
|
||||
TRACE("\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!ImmGetImeInfoEx(&info, ImeInfoExKeyboardLayout, &hKL))
|
||||
{
|
||||
ERR("\n");
|
||||
|
@ -823,14 +813,6 @@ UINT WINAPI ImmGetIMEFileNameA( HKL hKL, LPSTR lpszFileName, UINT uBufLen)
|
|||
|
||||
TRACE("(%p, %p, %u)\n", hKL, lpszFileName, uBufLen);
|
||||
|
||||
if (!IS_IME_HKL(hKL))
|
||||
{
|
||||
TRACE("\n");
|
||||
if (uBufLen > 0)
|
||||
lpszFileName[0] = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!ImmGetImeInfoEx(&info, ImeInfoExKeyboardLayout, &hKL))
|
||||
{
|
||||
ERR("\n");
|
||||
|
@ -863,14 +845,6 @@ UINT WINAPI ImmGetIMEFileNameW(HKL hKL, LPWSTR lpszFileName, UINT uBufLen)
|
|||
|
||||
TRACE("(%p, %p, %u)\n", hKL, lpszFileName, uBufLen);
|
||||
|
||||
if (!IS_IME_HKL(hKL))
|
||||
{
|
||||
TRACE("\n");
|
||||
if (uBufLen > 0)
|
||||
lpszFileName[0] = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!ImmGetImeInfoEx(&info, ImeInfoExKeyboardLayout, &hKL))
|
||||
{
|
||||
ERR("\n");
|
||||
|
@ -904,12 +878,6 @@ DWORD WINAPI ImmGetProperty(HKL hKL, DWORD fdwIndex)
|
|||
|
||||
TRACE("(%p, %lu)\n", hKL, fdwIndex);
|
||||
|
||||
if (!IS_IME_HKL(hKL))
|
||||
{
|
||||
TRACE("\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!ImmGetImeInfoEx(&ImeInfoEx, ImeInfoExKeyboardLayout, &hKL))
|
||||
{
|
||||
ERR("\n");
|
||||
|
|
|
@ -1206,9 +1206,14 @@ typedef struct tagCURSORDATA
|
|||
#define CURSORF_LINKED 0x0100
|
||||
#define CURSORF_CURRENT 0x0200
|
||||
|
||||
/* Flags for dwCompatFlags2 */
|
||||
#define COMPAT_FLAG_2_CICERO_DISABLED 2
|
||||
|
||||
#define IS_IMM_MODE() (gpsi && (gpsi->dwSRVIFlags & SRVINFO_IMM32))
|
||||
#define IS_CICERO_MODE() (gpsi && (gpsi->dwSRVIFlags & SRVINFO_CICERO_ENABLED))
|
||||
#define IS_16BIT_MODE() (GetWin32ClientInfo()->dwTIFlags & TIF_16BIT)
|
||||
#define IS_CICERO_COMPAT_DISABLED() \
|
||||
(GetWin32ClientInfo()->dwCompatFlags2 & COMPAT_FLAG_2_CICERO_DISABLED)
|
||||
|
||||
typedef struct tagIMEUI
|
||||
{
|
||||
|
|
|
@ -946,7 +946,6 @@ Quit:
|
|||
return ret;
|
||||
}
|
||||
|
||||
// Win: GetImeInfoEx
|
||||
BOOL FASTCALL
|
||||
UserGetImeInfoEx(
|
||||
_Inout_ PWINSTATION_OBJECT pWinSta,
|
||||
|
@ -1006,8 +1005,8 @@ UserGetImeInfoEx(
|
|||
BOOL
|
||||
NTAPI
|
||||
NtUserGetImeInfoEx(
|
||||
PIMEINFOEX pImeInfoEx,
|
||||
IMEINFOEXCLASS SearchType)
|
||||
_Inout_ PIMEINFOEX pImeInfoEx,
|
||||
_In_ IMEINFOEXCLASS SearchType)
|
||||
{
|
||||
IMEINFOEX ImeInfoEx;
|
||||
BOOL ret = FALSE;
|
||||
|
@ -1018,6 +1017,7 @@ NtUserGetImeInfoEx(
|
|||
if (!IS_IMM_MODE())
|
||||
{
|
||||
ERR("!IS_IMM_MODE()\n");
|
||||
EngSetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
||||
goto Quit;
|
||||
}
|
||||
|
||||
|
@ -1824,6 +1824,12 @@ NtUserQueryInputContext(HIMC hIMC, DWORD dwType)
|
|||
if (ptiIMC->spDefaultImc)
|
||||
ret = (DWORD_PTR)UserHMGetHandle(ptiIMC->spDefaultImc);
|
||||
break;
|
||||
|
||||
default:
|
||||
{
|
||||
FIXME("dwType: %ld\n", dwType);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Quit:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue