mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 16:32:57 +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(
|
CtfImmTIMDestroyInputContext(
|
||||||
_In_ HIMC hIMC)
|
_In_ HIMC hIMC)
|
||||||
{
|
{
|
||||||
if (!IS_CICERO_MODE() || (GetWin32ClientInfo()->dwCompatFlags2 & 2))
|
if (!IS_CICERO_MODE() || IS_CICERO_COMPAT_DISABLED())
|
||||||
return E_NOINTERFACE;
|
return E_NOINTERFACE;
|
||||||
|
|
||||||
return CtfImeDestroyInputContext(hIMC);
|
return CtfImeDestroyInputContext(hIMC);
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
* Copyright 2002, 2003, 2007 CodeWeavers, Aric Stewart
|
* Copyright 2002, 2003, 2007 CodeWeavers, Aric Stewart
|
||||||
* Copyright 2017 James Tabor <james.tabor@reactos.org>
|
* Copyright 2017 James Tabor <james.tabor@reactos.org>
|
||||||
* Copyright 2018 Amine Khaldi <amine.khaldi@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"
|
#include "precomp.h"
|
||||||
|
@ -194,7 +194,6 @@ BOOL APIENTRY Imm32InquireIme(PIMEDPI pImeDpi)
|
||||||
#include <imetable.h>
|
#include <imetable.h>
|
||||||
#undef DEFINE_IME_ENTRY
|
#undef DEFINE_IME_ENTRY
|
||||||
|
|
||||||
// Win: LoadIME
|
|
||||||
BOOL APIENTRY Imm32LoadIME(PIMEINFOEX pImeInfoEx, PIMEDPI pImeDpi)
|
BOOL APIENTRY Imm32LoadIME(PIMEINFOEX pImeInfoEx, PIMEDPI pImeDpi)
|
||||||
{
|
{
|
||||||
WCHAR szPath[MAX_PATH];
|
WCHAR szPath[MAX_PATH];
|
||||||
|
@ -230,6 +229,23 @@ BOOL APIENTRY Imm32LoadIME(PIMEINFOEX pImeInfoEx, PIMEDPI pImeDpi)
|
||||||
#include <imetable.h>
|
#include <imetable.h>
|
||||||
#undef DEFINE_IME_ENTRY
|
#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))
|
if (Imm32InquireIme(pImeDpi))
|
||||||
{
|
{
|
||||||
ret = TRUE;
|
ret = TRUE;
|
||||||
|
@ -263,7 +279,6 @@ Failed:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Win: LoadImeDpi
|
|
||||||
PIMEDPI APIENTRY Imm32LoadImeDpi(HKL hKL, BOOL bLock)
|
PIMEDPI APIENTRY Imm32LoadImeDpi(HKL hKL, BOOL bLock)
|
||||||
{
|
{
|
||||||
IMEINFOEX ImeInfoEx;
|
IMEINFOEX ImeInfoEx;
|
||||||
|
@ -272,12 +287,6 @@ PIMEDPI APIENTRY Imm32LoadImeDpi(HKL hKL, BOOL bLock)
|
||||||
UINT uCodePage;
|
UINT uCodePage;
|
||||||
LCID lcid;
|
LCID lcid;
|
||||||
|
|
||||||
if (!IS_IME_HKL(hKL))
|
|
||||||
{
|
|
||||||
TRACE("\n");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ImmGetImeInfoEx(&ImeInfoEx, ImeInfoExKeyboardLayout, &hKL))
|
if (!ImmGetImeInfoEx(&ImeInfoEx, ImeInfoExKeyboardLayout, &hKL))
|
||||||
{
|
{
|
||||||
ERR("\n");
|
ERR("\n");
|
||||||
|
@ -608,47 +617,40 @@ BOOL WINAPI ImmNotifyIME(HIMC hIMC, DWORD dwAction, DWORD dwIndex, DWORD_PTR dwV
|
||||||
BOOL WINAPI
|
BOOL WINAPI
|
||||||
ImmGetImeInfoEx(PIMEINFOEX pImeInfoEx, IMEINFOEXCLASS SearchType, PVOID pvSearchKey)
|
ImmGetImeInfoEx(PIMEINFOEX pImeInfoEx, IMEINFOEXCLASS SearchType, PVOID pvSearchKey)
|
||||||
{
|
{
|
||||||
HKL hKL;
|
BOOL bTextServiceDisabled = FALSE;
|
||||||
if (SearchType == ImeInfoExKeyboardLayout || SearchType == ImeInfoExKeyboardLayoutTFS)
|
|
||||||
{
|
|
||||||
hKL = *(HKL*)pvSearchKey;
|
|
||||||
pImeInfoEx->hkl = hKL;
|
|
||||||
|
|
||||||
if (SearchType == ImeInfoExKeyboardLayoutTFS)
|
if (SearchType == ImeInfoExKeyboardLayoutTFS)
|
||||||
{
|
{
|
||||||
if (!IS_IME_HKL(hKL))
|
SearchType = ImeInfoExKeyboardLayout;
|
||||||
{
|
bTextServiceDisabled = CtfImmIsTextFrameServiceDisabled();
|
||||||
if (CtfImmIsTextFrameServiceDisabled() || !IS_CICERO_MODE() || IS_16BIT_MODE())
|
|
||||||
{
|
|
||||||
TRACE("\n");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SearchType = ImeInfoExKeyboardLayout;
|
if (SearchType == ImeInfoExKeyboardLayout)
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
if (!IS_IME_HKL(hKL))
|
HKL hKL = *(HKL *)pvSearchKey;
|
||||||
{
|
pImeInfoEx->hkl = hKL;
|
||||||
TRACE("\n");
|
|
||||||
return FALSE;
|
if (!IS_IME_HKL(hKL) &&
|
||||||
}
|
(!IS_CICERO_MODE() || IS_CICERO_COMPAT_DISABLED() || bTextServiceDisabled))
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (SearchType == ImeInfoExImeFileName)
|
|
||||||
{
|
|
||||||
StringCchCopyW(pImeInfoEx->wszImeFile, _countof(pImeInfoEx->wszImeFile),
|
|
||||||
pvSearchKey);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
|
TRACE("IME is disabled\n");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NtUserGetImeInfoEx(pImeInfoEx, SearchType);
|
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.@)
|
* ImmLockImeDpi (IMM32.@)
|
||||||
*/
|
*/
|
||||||
|
@ -763,12 +765,6 @@ UINT WINAPI ImmGetDescriptionA(HKL hKL, LPSTR lpszDescription, UINT uBufLen)
|
||||||
|
|
||||||
TRACE("(%p,%p,%d)\n", hKL, lpszDescription, uBufLen);
|
TRACE("(%p,%p,%d)\n", hKL, lpszDescription, uBufLen);
|
||||||
|
|
||||||
if (!IS_IME_HKL(hKL))
|
|
||||||
{
|
|
||||||
TRACE("\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ImmGetImeInfoEx(&info, ImeInfoExKeyboardLayout, &hKL))
|
if (!ImmGetImeInfoEx(&info, ImeInfoExKeyboardLayout, &hKL))
|
||||||
{
|
{
|
||||||
ERR("\n");
|
ERR("\n");
|
||||||
|
@ -793,12 +789,6 @@ UINT WINAPI ImmGetDescriptionW(HKL hKL, LPWSTR lpszDescription, UINT uBufLen)
|
||||||
|
|
||||||
TRACE("(%p, %p, %d)\n", hKL, lpszDescription, uBufLen);
|
TRACE("(%p, %p, %d)\n", hKL, lpszDescription, uBufLen);
|
||||||
|
|
||||||
if (!IS_IME_HKL(hKL))
|
|
||||||
{
|
|
||||||
TRACE("\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ImmGetImeInfoEx(&info, ImeInfoExKeyboardLayout, &hKL))
|
if (!ImmGetImeInfoEx(&info, ImeInfoExKeyboardLayout, &hKL))
|
||||||
{
|
{
|
||||||
ERR("\n");
|
ERR("\n");
|
||||||
|
@ -823,14 +813,6 @@ UINT WINAPI ImmGetIMEFileNameA( HKL hKL, LPSTR lpszFileName, UINT uBufLen)
|
||||||
|
|
||||||
TRACE("(%p, %p, %u)\n", hKL, lpszFileName, 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))
|
if (!ImmGetImeInfoEx(&info, ImeInfoExKeyboardLayout, &hKL))
|
||||||
{
|
{
|
||||||
ERR("\n");
|
ERR("\n");
|
||||||
|
@ -863,14 +845,6 @@ UINT WINAPI ImmGetIMEFileNameW(HKL hKL, LPWSTR lpszFileName, UINT uBufLen)
|
||||||
|
|
||||||
TRACE("(%p, %p, %u)\n", hKL, lpszFileName, 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))
|
if (!ImmGetImeInfoEx(&info, ImeInfoExKeyboardLayout, &hKL))
|
||||||
{
|
{
|
||||||
ERR("\n");
|
ERR("\n");
|
||||||
|
@ -904,12 +878,6 @@ DWORD WINAPI ImmGetProperty(HKL hKL, DWORD fdwIndex)
|
||||||
|
|
||||||
TRACE("(%p, %lu)\n", hKL, fdwIndex);
|
TRACE("(%p, %lu)\n", hKL, fdwIndex);
|
||||||
|
|
||||||
if (!IS_IME_HKL(hKL))
|
|
||||||
{
|
|
||||||
TRACE("\n");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ImmGetImeInfoEx(&ImeInfoEx, ImeInfoExKeyboardLayout, &hKL))
|
if (!ImmGetImeInfoEx(&ImeInfoEx, ImeInfoExKeyboardLayout, &hKL))
|
||||||
{
|
{
|
||||||
ERR("\n");
|
ERR("\n");
|
||||||
|
|
|
@ -1206,9 +1206,14 @@ typedef struct tagCURSORDATA
|
||||||
#define CURSORF_LINKED 0x0100
|
#define CURSORF_LINKED 0x0100
|
||||||
#define CURSORF_CURRENT 0x0200
|
#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_IMM_MODE() (gpsi && (gpsi->dwSRVIFlags & SRVINFO_IMM32))
|
||||||
#define IS_CICERO_MODE() (gpsi && (gpsi->dwSRVIFlags & SRVINFO_CICERO_ENABLED))
|
#define IS_CICERO_MODE() (gpsi && (gpsi->dwSRVIFlags & SRVINFO_CICERO_ENABLED))
|
||||||
#define IS_16BIT_MODE() (GetWin32ClientInfo()->dwTIFlags & TIF_16BIT)
|
#define IS_16BIT_MODE() (GetWin32ClientInfo()->dwTIFlags & TIF_16BIT)
|
||||||
|
#define IS_CICERO_COMPAT_DISABLED() \
|
||||||
|
(GetWin32ClientInfo()->dwCompatFlags2 & COMPAT_FLAG_2_CICERO_DISABLED)
|
||||||
|
|
||||||
typedef struct tagIMEUI
|
typedef struct tagIMEUI
|
||||||
{
|
{
|
||||||
|
|
|
@ -946,7 +946,6 @@ Quit:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Win: GetImeInfoEx
|
|
||||||
BOOL FASTCALL
|
BOOL FASTCALL
|
||||||
UserGetImeInfoEx(
|
UserGetImeInfoEx(
|
||||||
_Inout_ PWINSTATION_OBJECT pWinSta,
|
_Inout_ PWINSTATION_OBJECT pWinSta,
|
||||||
|
@ -1006,8 +1005,8 @@ UserGetImeInfoEx(
|
||||||
BOOL
|
BOOL
|
||||||
NTAPI
|
NTAPI
|
||||||
NtUserGetImeInfoEx(
|
NtUserGetImeInfoEx(
|
||||||
PIMEINFOEX pImeInfoEx,
|
_Inout_ PIMEINFOEX pImeInfoEx,
|
||||||
IMEINFOEXCLASS SearchType)
|
_In_ IMEINFOEXCLASS SearchType)
|
||||||
{
|
{
|
||||||
IMEINFOEX ImeInfoEx;
|
IMEINFOEX ImeInfoEx;
|
||||||
BOOL ret = FALSE;
|
BOOL ret = FALSE;
|
||||||
|
@ -1018,6 +1017,7 @@ NtUserGetImeInfoEx(
|
||||||
if (!IS_IMM_MODE())
|
if (!IS_IMM_MODE())
|
||||||
{
|
{
|
||||||
ERR("!IS_IMM_MODE()\n");
|
ERR("!IS_IMM_MODE()\n");
|
||||||
|
EngSetLastError(ERROR_CALL_NOT_IMPLEMENTED);
|
||||||
goto Quit;
|
goto Quit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1824,6 +1824,12 @@ NtUserQueryInputContext(HIMC hIMC, DWORD dwType)
|
||||||
if (ptiIMC->spDefaultImc)
|
if (ptiIMC->spDefaultImc)
|
||||||
ret = (DWORD_PTR)UserHMGetHandle(ptiIMC->spDefaultImc);
|
ret = (DWORD_PTR)UserHMGetHandle(ptiIMC->spDefaultImc);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
FIXME("dwType: %ld\n", dwType);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Quit:
|
Quit:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue