Skip to content

Commit c876fe3

Browse files
authored
[IMM32][NTUSER] Strictly check Cicero IME (reactos#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.
1 parent 7ce90a0 commit c876fe3

File tree

4 files changed

+56
-77
lines changed

4 files changed

+56
-77
lines changed

dll/win32/imm32/ctf.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -929,7 +929,7 @@ HRESULT
929929
CtfImmTIMDestroyInputContext(
930930
_In_ HIMC hIMC)
931931
{
932-
if (!IS_CICERO_MODE() || (GetWin32ClientInfo()->dwCompatFlags2 & 2))
932+
if (!IS_CICERO_MODE() || IS_CICERO_COMPAT_DISABLED())
933933
return E_NOINTERFACE;
934934

935935
return CtfImeDestroyInputContext(hIMC);

dll/win32/imm32/ime.c

Lines changed: 41 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
* Copyright 2002, 2003, 2007 CodeWeavers, Aric Stewart
77
* Copyright 2017 James Tabor <[email protected]>
88
* Copyright 2018 Amine Khaldi <[email protected]>
9-
* Copyright 2020-2022 Katayama Hirofumi MZ <[email protected]>
9+
* Copyright 2020-2025 Katayama Hirofumi MZ <[email protected]>
1010
*/
1111

1212
#include "precomp.h"
@@ -194,7 +194,6 @@ BOOL APIENTRY Imm32InquireIme(PIMEDPI pImeDpi)
194194
#include <imetable.h>
195195
#undef DEFINE_IME_ENTRY
196196

197-
// Win: LoadIME
198197
BOOL APIENTRY Imm32LoadIME(PIMEINFOEX pImeInfoEx, PIMEDPI pImeDpi)
199198
{
200199
WCHAR szPath[MAX_PATH];
@@ -230,6 +229,23 @@ BOOL APIENTRY Imm32LoadIME(PIMEINFOEX pImeInfoEx, PIMEDPI pImeDpi)
230229
#include <imetable.h>
231230
#undef DEFINE_IME_ENTRY
232231

232+
/* Check for Cicero IMEs */
233+
if (!IS_IME_HKL(pImeDpi->hKL) && IS_CICERO_MODE() && !IS_CICERO_COMPAT_DISABLED())
234+
{
235+
#define CHECK_IME_FN(name) do { \
236+
if (!pImeDpi->name) { \
237+
ERR("'%s' not found in Cicero IME module '%S'.\n", #name, szPath); \
238+
goto Failed; \
239+
} \
240+
} while(0)
241+
CHECK_IME_FN(CtfImeInquireExW);
242+
CHECK_IME_FN(CtfImeSelectEx);
243+
CHECK_IME_FN(CtfImeEscapeEx);
244+
CHECK_IME_FN(CtfImeGetGuidAtom);
245+
CHECK_IME_FN(CtfImeIsGuidMapEnable);
246+
#undef CHECK_IME_FN
247+
}
248+
233249
if (Imm32InquireIme(pImeDpi))
234250
{
235251
ret = TRUE;
@@ -263,7 +279,6 @@ BOOL APIENTRY Imm32LoadIME(PIMEINFOEX pImeInfoEx, PIMEDPI pImeDpi)
263279
return ret;
264280
}
265281

266-
// Win: LoadImeDpi
267282
PIMEDPI APIENTRY Imm32LoadImeDpi(HKL hKL, BOOL bLock)
268283
{
269284
IMEINFOEX ImeInfoEx;
@@ -272,12 +287,6 @@ PIMEDPI APIENTRY Imm32LoadImeDpi(HKL hKL, BOOL bLock)
272287
UINT uCodePage;
273288
LCID lcid;
274289

275-
if (!IS_IME_HKL(hKL))
276-
{
277-
TRACE("\n");
278-
return NULL;
279-
}
280-
281290
if (!ImmGetImeInfoEx(&ImeInfoEx, ImeInfoExKeyboardLayout, &hKL))
282291
{
283292
ERR("\n");
@@ -608,45 +617,38 @@ BOOL WINAPI ImmNotifyIME(HIMC hIMC, DWORD dwAction, DWORD dwIndex, DWORD_PTR dwV
608617
BOOL WINAPI
609618
ImmGetImeInfoEx(PIMEINFOEX pImeInfoEx, IMEINFOEXCLASS SearchType, PVOID pvSearchKey)
610619
{
611-
HKL hKL;
612-
if (SearchType == ImeInfoExKeyboardLayout || SearchType == ImeInfoExKeyboardLayoutTFS)
620+
BOOL bTextServiceDisabled = FALSE;
621+
622+
if (SearchType == ImeInfoExKeyboardLayoutTFS)
613623
{
614-
hKL = *(HKL*)pvSearchKey;
615-
pImeInfoEx->hkl = hKL;
624+
SearchType = ImeInfoExKeyboardLayout;
625+
bTextServiceDisabled = CtfImmIsTextFrameServiceDisabled();
626+
}
616627

617-
if (SearchType == ImeInfoExKeyboardLayoutTFS)
618-
{
619-
if (!IS_IME_HKL(hKL))
620-
{
621-
if (CtfImmIsTextFrameServiceDisabled() || !IS_CICERO_MODE() || IS_16BIT_MODE())
622-
{
623-
TRACE("\n");
624-
return FALSE;
625-
}
626-
}
628+
if (SearchType == ImeInfoExKeyboardLayout)
629+
{
630+
HKL hKL = *(HKL *)pvSearchKey;
631+
pImeInfoEx->hkl = hKL;
627632

628-
SearchType = ImeInfoExKeyboardLayout;
629-
}
630-
else
633+
if (!IS_IME_HKL(hKL) &&
634+
(!IS_CICERO_MODE() || IS_CICERO_COMPAT_DISABLED() || bTextServiceDisabled))
631635
{
632-
if (!IS_IME_HKL(hKL))
633-
{
634-
TRACE("\n");
635-
return FALSE;
636-
}
636+
TRACE("IME is disabled\n");
637+
return FALSE;
637638
}
639+
640+
return NtUserGetImeInfoEx(pImeInfoEx, SearchType);
638641
}
639-
else if (SearchType == ImeInfoExImeFileName)
640-
{
641-
StringCchCopyW(pImeInfoEx->wszImeFile, _countof(pImeInfoEx->wszImeFile),
642-
pvSearchKey);
643-
}
644-
else
642+
643+
if (SearchType == ImeInfoExImeFileName)
645644
{
646-
return FALSE;
645+
StringCchCopyW(pImeInfoEx->wszImeFile, _countof(pImeInfoEx->wszImeFile), pvSearchKey);
646+
return NtUserGetImeInfoEx(pImeInfoEx, SearchType);
647647
}
648648

649-
return NtUserGetImeInfoEx(pImeInfoEx, SearchType);
649+
/* NOTE: ImeInfoExImeWindow is ignored */
650+
ERR("SearchType: %d\n", SearchType);
651+
return FALSE;
650652
}
651653

652654
/***********************************************************************
@@ -763,12 +765,6 @@ UINT WINAPI ImmGetDescriptionA(HKL hKL, LPSTR lpszDescription, UINT uBufLen)
763765

764766
TRACE("(%p,%p,%d)\n", hKL, lpszDescription, uBufLen);
765767

766-
if (!IS_IME_HKL(hKL))
767-
{
768-
TRACE("\n");
769-
return 0;
770-
}
771-
772768
if (!ImmGetImeInfoEx(&info, ImeInfoExKeyboardLayout, &hKL))
773769
{
774770
ERR("\n");
@@ -793,12 +789,6 @@ UINT WINAPI ImmGetDescriptionW(HKL hKL, LPWSTR lpszDescription, UINT uBufLen)
793789

794790
TRACE("(%p, %p, %d)\n", hKL, lpszDescription, uBufLen);
795791

796-
if (!IS_IME_HKL(hKL))
797-
{
798-
TRACE("\n");
799-
return 0;
800-
}
801-
802792
if (!ImmGetImeInfoEx(&info, ImeInfoExKeyboardLayout, &hKL))
803793
{
804794
ERR("\n");
@@ -823,14 +813,6 @@ UINT WINAPI ImmGetIMEFileNameA( HKL hKL, LPSTR lpszFileName, UINT uBufLen)
823813

824814
TRACE("(%p, %p, %u)\n", hKL, lpszFileName, uBufLen);
825815

826-
if (!IS_IME_HKL(hKL))
827-
{
828-
TRACE("\n");
829-
if (uBufLen > 0)
830-
lpszFileName[0] = 0;
831-
return 0;
832-
}
833-
834816
if (!ImmGetImeInfoEx(&info, ImeInfoExKeyboardLayout, &hKL))
835817
{
836818
ERR("\n");
@@ -863,14 +845,6 @@ UINT WINAPI ImmGetIMEFileNameW(HKL hKL, LPWSTR lpszFileName, UINT uBufLen)
863845

864846
TRACE("(%p, %p, %u)\n", hKL, lpszFileName, uBufLen);
865847

866-
if (!IS_IME_HKL(hKL))
867-
{
868-
TRACE("\n");
869-
if (uBufLen > 0)
870-
lpszFileName[0] = 0;
871-
return 0;
872-
}
873-
874848
if (!ImmGetImeInfoEx(&info, ImeInfoExKeyboardLayout, &hKL))
875849
{
876850
ERR("\n");
@@ -904,12 +878,6 @@ DWORD WINAPI ImmGetProperty(HKL hKL, DWORD fdwIndex)
904878

905879
TRACE("(%p, %lu)\n", hKL, fdwIndex);
906880

907-
if (!IS_IME_HKL(hKL))
908-
{
909-
TRACE("\n");
910-
return FALSE;
911-
}
912-
913881
if (!ImmGetImeInfoEx(&ImeInfoEx, ImeInfoExKeyboardLayout, &hKL))
914882
{
915883
ERR("\n");

win32ss/include/ntuser.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1206,9 +1206,14 @@ typedef struct tagCURSORDATA
12061206
#define CURSORF_LINKED 0x0100
12071207
#define CURSORF_CURRENT 0x0200
12081208

1209+
/* Flags for dwCompatFlags2 */
1210+
#define COMPAT_FLAG_2_CICERO_DISABLED 2
1211+
12091212
#define IS_IMM_MODE() (gpsi && (gpsi->dwSRVIFlags & SRVINFO_IMM32))
12101213
#define IS_CICERO_MODE() (gpsi && (gpsi->dwSRVIFlags & SRVINFO_CICERO_ENABLED))
12111214
#define IS_16BIT_MODE() (GetWin32ClientInfo()->dwTIFlags & TIF_16BIT)
1215+
#define IS_CICERO_COMPAT_DISABLED() \
1216+
(GetWin32ClientInfo()->dwCompatFlags2 & COMPAT_FLAG_2_CICERO_DISABLED)
12121217

12131218
typedef struct tagIMEUI
12141219
{

win32ss/user/ntuser/ime.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -946,7 +946,6 @@ NtUserGetAppImeLevel(HWND hWnd)
946946
return ret;
947947
}
948948

949-
// Win: GetImeInfoEx
950949
BOOL FASTCALL
951950
UserGetImeInfoEx(
952951
_Inout_ PWINSTATION_OBJECT pWinSta,
@@ -1006,8 +1005,8 @@ UserGetImeInfoEx(
10061005
BOOL
10071006
NTAPI
10081007
NtUserGetImeInfoEx(
1009-
PIMEINFOEX pImeInfoEx,
1010-
IMEINFOEXCLASS SearchType)
1008+
_Inout_ PIMEINFOEX pImeInfoEx,
1009+
_In_ IMEINFOEXCLASS SearchType)
10111010
{
10121011
IMEINFOEX ImeInfoEx;
10131012
BOOL ret = FALSE;
@@ -1018,6 +1017,7 @@ NtUserGetImeInfoEx(
10181017
if (!IS_IMM_MODE())
10191018
{
10201019
ERR("!IS_IMM_MODE()\n");
1020+
EngSetLastError(ERROR_CALL_NOT_IMPLEMENTED);
10211021
goto Quit;
10221022
}
10231023

@@ -1824,6 +1824,12 @@ NtUserQueryInputContext(HIMC hIMC, DWORD dwType)
18241824
if (ptiIMC->spDefaultImc)
18251825
ret = (DWORD_PTR)UserHMGetHandle(ptiIMC->spDefaultImc);
18261826
break;
1827+
1828+
default:
1829+
{
1830+
FIXME("dwType: %ld\n", dwType);
1831+
break;
1832+
}
18271833
}
18281834

18291835
Quit:

0 commit comments

Comments
 (0)