[NTUSER] ime.c: Add SAL2 annotations and tracing (#8070)

Refactoring and improving trace.
JIRA issue: CORE-19455
- Add SAL2 annotations to
  function parameters.
- Add and improve tracing
  (TRACE and ERR) for easier
  debugging.
This commit is contained in:
Katayama Hirofumi MZ 2025-06-04 05:47:54 +09:00 committed by GitHub
parent 0947a64a90
commit 67a4cf93be
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 277 additions and 151 deletions

View file

@ -1244,11 +1244,18 @@ typedef struct _IMEWND
DWORD DWORD
NTAPI NTAPI
NtUserAssociateInputContext(HWND hWnd, HIMC hIMC, DWORD dwFlags); NtUserAssociateInputContext(
_In_ HWND hWnd,
_In_opt_ HIMC hIMC,
_In_ DWORD dwFlags);
NTSTATUS NTSTATUS
NTAPI NTAPI
NtUserBuildHimcList(DWORD dwThreadId, DWORD dwCount, HIMC *phList, LPDWORD pdwCount); NtUserBuildHimcList(
_In_ DWORD dwThreadId,
_In_ DWORD dwCount,
_Out_ HIMC *phList,
_Out_ PDWORD pdwCount);
DWORD DWORD
NTAPI NTAPI
@ -1768,8 +1775,8 @@ NtUserCheckWindowThreadDesktop(
DWORD DWORD
NTAPI NTAPI
NtUserCheckImeHotKey( NtUserCheckImeHotKey(
UINT uVirtualKey, _In_ UINT uVirtualKey,
LPARAM lParam); _In_ LPARAM lParam);
HWND NTAPI HWND NTAPI
NtUserChildWindowFromPointEx( NtUserChildWindowFromPointEx(
@ -1861,7 +1868,7 @@ NtUserCreateDesktop(
HIMC HIMC
NTAPI NTAPI
NtUserCreateInputContext(ULONG_PTR dwClientImcData); NtUserCreateInputContext(_In_ ULONG_PTR dwClientImcData);
NTSTATUS NTSTATUS
NTAPI NTAPI
@ -1955,7 +1962,7 @@ NtUserDestroyCursor(
BOOL BOOL
NTAPI NTAPI
NtUserDestroyInputContext(HIMC hIMC); NtUserDestroyInputContext(_In_ HIMC hIMC);
BOOLEAN BOOLEAN
NTAPI NTAPI
@ -1965,7 +1972,7 @@ NtUserDestroyWindow(
BOOL BOOL
NTAPI NTAPI
NtUserDisableThreadIme( NtUserDisableThreadIme(
DWORD dwThreadID); _In_ DWORD dwThreadID);
LRESULT LRESULT
NTAPI NTAPI
@ -2148,7 +2155,7 @@ NtUserGetAncestor(
DWORD DWORD
NTAPI NTAPI
NtUserGetAppImeLevel(HWND hWnd); NtUserGetAppImeLevel(_In_ HWND hWnd);
SHORT SHORT
NTAPI NTAPI
@ -2312,16 +2319,17 @@ NtUserGetIconSize(
BOOL BOOL
NTAPI NTAPI
NtUserGetImeHotKey(DWORD dwHotKeyId, NtUserGetImeHotKey(
LPUINT lpuModifiers, _In_ DWORD dwHotKeyId,
LPUINT lpuVirtualKey, _Out_ PUINT lpuModifiers,
LPHKL lphKL); _Out_ PUINT lpuVirtualKey,
_Out_ LPHKL lphKL);
BOOL BOOL
NTAPI NTAPI
NtUserGetImeInfoEx( NtUserGetImeInfoEx(
PIMEINFOEX pImeInfoEx, _Inout_ PIMEINFOEX pImeInfoEx,
IMEINFOEXCLASS SearchType); _In_ IMEINFOEXCLASS SearchType);
DWORD DWORD
NTAPI NTAPI
@ -2703,7 +2711,10 @@ NtUserMoveWindow(
DWORD DWORD
NTAPI NTAPI
NtUserNotifyIMEStatus(HWND hwnd, BOOL fOpen, DWORD dwConversion); NtUserNotifyIMEStatus(
_In_ HWND hwnd,
_In_ BOOL fOpen,
_In_ DWORD dwConversion);
BOOL BOOL
NTAPI NTAPI
@ -3120,20 +3131,20 @@ NtUserSetFocus(
BOOL BOOL
NTAPI NTAPI
NtUserSetImeHotKey( NtUserSetImeHotKey(
DWORD dwHotKeyId, _In_ DWORD dwHotKeyId,
UINT uModifiers, _In_ UINT uModifiers,
UINT uVirtualKey, _In_ UINT uVirtualKey,
HKL hKL, _In_ HKL hKL,
DWORD dwAction); _In_ DWORD dwAction);
BOOL BOOL
NTAPI NTAPI
NtUserSetImeInfoEx( NtUserSetImeInfoEx(
PIMEINFOEX pImeInfoEx); _In_ const IMEINFOEX *pImeInfoEx);
BOOL BOOL
NTAPI NTAPI
NtUserSetImeOwnerWindow(HWND hImeWnd, HWND hwndFocus); NtUserSetImeOwnerWindow(_In_ HWND hImeWnd, _In_opt_ HWND hwndFocus);
DWORD DWORD
NTAPI NTAPI
@ -3257,7 +3268,9 @@ NtUserSetSystemTimer(
DWORD DWORD
NTAPI NTAPI
NtUserSetThreadLayoutHandles(HKL hNewKL, HKL hOldKL); NtUserSetThreadLayoutHandles(
_In_ HKL hNewKL,
_In_ HKL hOldKL);
UINT_PTR UINT_PTR
NTAPI NTAPI

View file

@ -37,11 +37,11 @@ typedef struct tagIMEHOTKEY
HKL hKL; HKL hKL;
} IMEHOTKEY, *PIMEHOTKEY; } IMEHOTKEY, *PIMEHOTKEY;
PIMEHOTKEY gpImeHotKeyList = NULL; // Win: gpImeHotKeyListHeader PIMEHOTKEY gpImeHotKeyList = NULL;
LCID glcidSystem = 0; // Win: glcidSystem LCID glcidSystem = 0;
// Win: GetAppImeCompatFlags static DWORD FASTCALL
DWORD FASTCALL IntGetImeCompatFlags(PTHREADINFO pti) IntGetImeCompatFlags(_In_opt_ PTHREADINFO pti)
{ {
if (!pti) if (!pti)
pti = PsGetCurrentThreadWin32Thread(); pti = PsGetCurrentThreadWin32Thread();
@ -49,8 +49,10 @@ DWORD FASTCALL IntGetImeCompatFlags(PTHREADINFO pti)
return pti->ppi->dwImeCompatFlags; return pti->ppi->dwImeCompatFlags;
} }
// Win: GetLangIdMatchLevel UINT FASTCALL
UINT FASTCALL IntGetImeHotKeyLanguageScore(HKL hKL, LANGID HotKeyLangId) IntGetImeHotKeyLanguageScore(
_In_ HKL hKL,
_In_ LANGID HotKeyLangId)
{ {
LCID lcid; LCID lcid;
@ -63,7 +65,7 @@ UINT FASTCALL IntGetImeHotKeyLanguageScore(HKL hKL, LANGID HotKeyLangId)
} }
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{ {
ERR("%p\n", NtCurrentTeb()); ERR("Exception in IntGetImeHotKeyLanguageScore: TEB=%p, hKL=%p, HotKeyLangId=0x%04x\n", NtCurrentTeb(), hKL, HotKeyLangId);
lcid = MAKELCID(LANGID_NEUTRAL, SORT_DEFAULT); lcid = MAKELCID(LANGID_NEUTRAL, SORT_DEFAULT);
} }
_SEH2_END; _SEH2_END;
@ -80,8 +82,8 @@ UINT FASTCALL IntGetImeHotKeyLanguageScore(HKL hKL, LANGID HotKeyLangId)
return 0; return 0;
} }
// Win: GetActiveHKL HKL FASTCALL
HKL FASTCALL IntGetActiveKeyboardLayout(VOID) IntGetActiveKeyboardLayout(VOID)
{ {
PTHREADINFO pti; PTHREADINFO pti;
@ -95,8 +97,8 @@ HKL FASTCALL IntGetActiveKeyboardLayout(VOID)
return UserGetKeyboardLayout(0); return UserGetKeyboardLayout(0);
} }
// Win: GetHotKeyLangID static LANGID FASTCALL
static LANGID FASTCALL IntGetImeHotKeyLangId(DWORD dwHotKeyId) IntGetImeHotKeyLangId(_In_ DWORD dwHotKeyId)
{ {
#define IME_CHOTKEY 0x10 #define IME_CHOTKEY 0x10
#define IME_JHOTKEY 0x30 #define IME_JHOTKEY 0x30
@ -121,8 +123,10 @@ static LANGID FASTCALL IntGetImeHotKeyLangId(DWORD dwHotKeyId)
return LANGID_NEUTRAL; return LANGID_NEUTRAL;
} }
// Win: AddImeHotKey static VOID FASTCALL
static VOID FASTCALL IntAddImeHotKey(PIMEHOTKEY *ppList, PIMEHOTKEY pHotKey) IntAddImeHotKey(
_In_ PIMEHOTKEY *ppList,
_In_ PIMEHOTKEY pHotKey)
{ {
PIMEHOTKEY pNode; PIMEHOTKEY pNode;
@ -142,8 +146,10 @@ static VOID FASTCALL IntAddImeHotKey(PIMEHOTKEY *ppList, PIMEHOTKEY pHotKey)
} }
} }
// Win: FindImeHotKeyByID static PIMEHOTKEY FASTCALL
static PIMEHOTKEY FASTCALL IntGetImeHotKeyById(PIMEHOTKEY pList, DWORD dwHotKeyId) IntGetImeHotKeyById(
_In_ PIMEHOTKEY pList,
_In_ DWORD dwHotKeyId)
{ {
PIMEHOTKEY pNode; PIMEHOTKEY pNode;
for (pNode = pList; pNode; pNode = pNode->pNext) for (pNode = pList; pNode; pNode = pNode->pNext)
@ -154,10 +160,13 @@ static PIMEHOTKEY FASTCALL IntGetImeHotKeyById(PIMEHOTKEY pList, DWORD dwHotKeyI
return NULL; return NULL;
} }
// Win: FindImeHotKeyByKeyWithLang
static PIMEHOTKEY APIENTRY static PIMEHOTKEY APIENTRY
IntGetImeHotKeyByKeyAndLang(PIMEHOTKEY pList, UINT uModKeys, UINT uLeftRight, IntGetImeHotKeyByKeyAndLang(
UINT uVirtualKey, LANGID TargetLangId) _In_ PIMEHOTKEY pList,
_In_ UINT uModKeys,
_In_ UINT uLeftRight,
_In_ UINT uVirtualKey,
_In_ LANGID TargetLangId)
{ {
PIMEHOTKEY pNode; PIMEHOTKEY pNode;
LANGID LangID; LANGID LangID;
@ -186,8 +195,10 @@ IntGetImeHotKeyByKeyAndLang(PIMEHOTKEY pList, UINT uModKeys, UINT uLeftRight,
return NULL; return NULL;
} }
// Win: DeleteImeHotKey static VOID FASTCALL
static VOID FASTCALL IntDeleteImeHotKey(PIMEHOTKEY *ppList, PIMEHOTKEY pHotKey) IntDeleteImeHotKey(
_Inout_ PIMEHOTKEY *ppList,
_In_ PIMEHOTKEY pHotKey)
{ {
PIMEHOTKEY pNode; PIMEHOTKEY pNode;
@ -209,9 +220,12 @@ static VOID FASTCALL IntDeleteImeHotKey(PIMEHOTKEY *ppList, PIMEHOTKEY pHotKey)
} }
} }
// Win: FindImeHotKeyByKey static PIMEHOTKEY
PIMEHOTKEY IntGetImeHotKeyByKey(
IntGetImeHotKeyByKey(PIMEHOTKEY pList, UINT uModKeys, UINT uLeftRight, UINT uVirtualKey) _In_ PIMEHOTKEY pList,
_In_ UINT uModKeys,
_In_ UINT uLeftRight,
_In_ UINT uVirtualKey)
{ {
PIMEHOTKEY pNode, ret = NULL; PIMEHOTKEY pNode, ret = NULL;
PTHREADINFO pti = GetW32ThreadInfo(); PTHREADINFO pti = GetW32ThreadInfo();
@ -271,8 +285,11 @@ IntGetImeHotKeyByKey(PIMEHOTKEY pList, UINT uModKeys, UINT uLeftRight, UINT uVir
return ret; return ret;
} }
// Win: CheckImeHotKey static PIMEHOTKEY
PIMEHOTKEY IntCheckImeHotKey(PUSER_MESSAGE_QUEUE MessageQueue, UINT uVirtualKey, LPARAM lParam) IntCheckImeHotKey(
_In_ const USER_MESSAGE_QUEUE *MessageQueue,
_In_ UINT uVirtualKey,
_In_ LPARAM lParam)
{ {
PIMEHOTKEY pHotKey; PIMEHOTKEY pHotKey;
UINT uModifiers; UINT uModifiers;
@ -322,8 +339,8 @@ PIMEHOTKEY IntCheckImeHotKey(PUSER_MESSAGE_QUEUE MessageQueue, UINT uVirtualKey,
return NULL; return NULL;
} }
// Win: FreeImeHotKeys VOID FASTCALL
VOID FASTCALL IntFreeImeHotKeys(VOID) IntFreeImeHotKeys(VOID)
{ {
PIMEHOTKEY pNode, pNext; PIMEHOTKEY pNode, pNext;
for (pNode = gpImeHotKeyList; pNode; pNode = pNext) for (pNode = gpImeHotKeyList; pNode; pNode = pNext)
@ -334,9 +351,13 @@ VOID FASTCALL IntFreeImeHotKeys(VOID)
gpImeHotKeyList = NULL; gpImeHotKeyList = NULL;
} }
// Win: SetImeHotKey
static BOOL APIENTRY static BOOL APIENTRY
IntSetImeHotKey(DWORD dwHotKeyId, UINT uModifiers, UINT uVirtualKey, HKL hKL, DWORD dwAction) IntSetImeHotKey(
_In_ DWORD dwHotKeyId,
_In_ UINT uModifiers,
_In_ UINT uVirtualKey,
_In_ HKL hKL,
_In_ DWORD dwAction)
{ {
PIMEHOTKEY pNode; PIMEHOTKEY pNode;
LANGID LangId; LANGID LangId;
@ -403,7 +424,11 @@ IntSetImeHotKey(DWORD dwHotKeyId, UINT uModifiers, UINT uVirtualKey, HKL hKL, DW
} }
BOOL NTAPI BOOL NTAPI
NtUserGetImeHotKey(DWORD dwHotKeyId, LPUINT lpuModifiers, LPUINT lpuVirtualKey, LPHKL lphKL) NtUserGetImeHotKey(
_In_ DWORD dwHotKeyId,
_Out_ PUINT lpuModifiers,
_Out_ PUINT lpuVirtualKey,
_Out_ LPHKL lphKL)
{ {
PIMEHOTKEY pNode = NULL; PIMEHOTKEY pNode = NULL;
@ -418,7 +443,7 @@ NtUserGetImeHotKey(DWORD dwHotKeyId, LPUINT lpuModifiers, LPUINT lpuVirtualKey,
} }
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{ {
ERR("%p, %p, %p\n", lpuModifiers, lpuVirtualKey, lphKL); ERR("Exception in NtUserGetImeHotKey: %p, %p, %p\n", lpuModifiers, lpuVirtualKey, lphKL);
_SEH2_YIELD(goto Quit); _SEH2_YIELD(goto Quit);
} }
_SEH2_END; _SEH2_END;
@ -436,7 +461,7 @@ NtUserGetImeHotKey(DWORD dwHotKeyId, LPUINT lpuModifiers, LPUINT lpuVirtualKey,
} }
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{ {
ERR("%p, %p, %p, %p\n", pNode, lpuModifiers, lpuVirtualKey, lphKL); ERR("Exception in NtUserGetImeHotKey: %p, %p, %p, %p\n", pNode, lpuModifiers, lpuVirtualKey, lphKL);
pNode = NULL; pNode = NULL;
} }
_SEH2_END; _SEH2_END;
@ -449,11 +474,11 @@ Quit:
BOOL BOOL
NTAPI NTAPI
NtUserSetImeHotKey( NtUserSetImeHotKey(
DWORD dwHotKeyId, _In_ DWORD dwHotKeyId,
UINT uModifiers, _In_ UINT uModifiers,
UINT uVirtualKey, _In_ UINT uVirtualKey,
HKL hKL, _In_ HKL hKL,
DWORD dwAction) _In_ DWORD dwAction)
{ {
BOOL ret; BOOL ret;
UserEnterExclusive(); UserEnterExclusive();
@ -464,7 +489,9 @@ NtUserSetImeHotKey(
DWORD DWORD
NTAPI NTAPI
NtUserCheckImeHotKey(UINT uVirtualKey, LPARAM lParam) NtUserCheckImeHotKey(
_In_ UINT uVirtualKey,
_In_ LPARAM lParam)
{ {
PIMEHOTKEY pNode; PIMEHOTKEY pNode;
DWORD ret = INVALID_HOTKEY; DWORD ret = INVALID_HOTKEY;
@ -483,8 +510,8 @@ Quit:
return ret; return ret;
} }
// Win: GetTopLevelWindow PWND FASTCALL
PWND FASTCALL IntGetTopLevelWindow(PWND pwnd) IntGetTopLevelWindow(_In_ PWND pwnd)
{ {
if (!pwnd) if (!pwnd)
return NULL; return NULL;
@ -495,8 +522,8 @@ PWND FASTCALL IntGetTopLevelWindow(PWND pwnd)
return pwnd; return pwnd;
} }
// Win: AssociateInputContext static HIMC FASTCALL
HIMC FASTCALL IntAssociateInputContext(PWND pWnd, PIMC pImc) IntAssociateInputContext(_Inout_ PWND pWnd, _In_ PIMC pImc)
{ {
HIMC hOldImc = pWnd->hImc; HIMC hOldImc = pWnd->hImc;
pWnd->hImc = (pImc ? UserHMGetHandle(pImc) : NULL); pWnd->hImc = (pImc ? UserHMGetHandle(pImc) : NULL);
@ -505,7 +532,9 @@ HIMC FASTCALL IntAssociateInputContext(PWND pWnd, PIMC pImc)
DWORD DWORD
NTAPI NTAPI
NtUserSetThreadLayoutHandles(HKL hNewKL, HKL hOldKL) NtUserSetThreadLayoutHandles(
_In_ HKL hNewKL,
_In_ HKL hOldKL)
{ {
PTHREADINFO pti; PTHREADINFO pti;
PKL pOldKL, pNewKL; PKL pOldKL, pNewKL;
@ -532,8 +561,11 @@ Quit:
return 0; return 0;
} }
// Win: BuildHimcList DWORD FASTCALL
DWORD FASTCALL UserBuildHimcList(PTHREADINFO pti, DWORD dwCount, HIMC *phList) UserBuildHimcList(
_Inout_ PTHREADINFO pti,
_In_ DWORD dwCount,
_Inout_ HIMC *phList)
{ {
PIMC pIMC; PIMC pIMC;
DWORD dwRealCount = 0; DWORD dwRealCount = 0;
@ -566,8 +598,12 @@ DWORD FASTCALL UserBuildHimcList(PTHREADINFO pti, DWORD dwCount, HIMC *phList)
} }
UINT FASTCALL UINT FASTCALL
IntImmProcessKey(PUSER_MESSAGE_QUEUE MessageQueue, PWND pWnd, UINT uMsg, IntImmProcessKey(
WPARAM wParam, LPARAM lParam) _In_ PUSER_MESSAGE_QUEUE MessageQueue,
_In_ PWND pWnd,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam)
{ {
UINT uVirtualKey, ret; UINT uVirtualKey, ret;
DWORD dwHotKeyId; DWORD dwHotKeyId;
@ -626,7 +662,12 @@ IntImmProcessKey(PUSER_MESSAGE_QUEUE MessageQueue, PWND pWnd, UINT uMsg,
} }
if (!IS_IMM_MODE()) if (!IS_IMM_MODE())
{
if (dwHotKeyId != INVALID_HOTKEY)
WARN("!IS_IMM_MODE(): dwHotKeyId 0x%X\n", dwHotKeyId);
return 0; return 0;
}
if (dwHotKeyId == INVALID_HOTKEY) if (dwHotKeyId == INVALID_HOTKEY)
{ {
@ -687,7 +728,11 @@ IntImmProcessKey(PUSER_MESSAGE_QUEUE MessageQueue, PWND pWnd, UINT uMsg,
NTSTATUS NTSTATUS
NTAPI NTAPI
NtUserBuildHimcList(DWORD dwThreadId, DWORD dwCount, HIMC *phList, LPDWORD pdwCount) NtUserBuildHimcList(
_In_ DWORD dwThreadId,
_In_ DWORD dwCount,
_Out_ HIMC *phList,
_Out_ PDWORD pdwCount)
{ {
NTSTATUS ret = STATUS_UNSUCCESSFUL; NTSTATUS ret = STATUS_UNSUCCESSFUL;
DWORD dwRealCount; DWORD dwRealCount;
@ -725,7 +770,7 @@ NtUserBuildHimcList(DWORD dwThreadId, DWORD dwCount, HIMC *phList, LPDWORD pdwCo
} }
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{ {
ERR("%p, %p\n", phList, pdwCount); ERR("Exception in NtUserBuildHimcList: %p, %p\n", phList, pdwCount);
_SEH2_YIELD(goto Quit); _SEH2_YIELD(goto Quit);
} }
_SEH2_END; _SEH2_END;
@ -740,8 +785,8 @@ Quit:
return ret; return ret;
} }
// Win: SetConvMode static VOID FASTCALL
static VOID FASTCALL UserSetImeConversionKeyState(PTHREADINFO pti, DWORD dwConversion) UserSetImeConversionKeyState(PTHREADINFO pti, DWORD dwConversion)
{ {
HKL hKL; HKL hKL;
LANGID LangID; LANGID LangID;
@ -800,7 +845,10 @@ static VOID FASTCALL UserSetImeConversionKeyState(PTHREADINFO pti, DWORD dwConve
DWORD DWORD
NTAPI NTAPI
NtUserNotifyIMEStatus(HWND hwnd, BOOL fOpen, DWORD dwConversion) NtUserNotifyIMEStatus(
_In_ HWND hwnd,
_In_ BOOL fOpen,
_In_ DWORD dwConversion)
{ {
PWND pwnd; PWND pwnd;
PTHREADINFO pti; PTHREADINFO pti;
@ -816,7 +864,10 @@ NtUserNotifyIMEStatus(HWND hwnd, BOOL fOpen, DWORD dwConversion)
pwnd = ValidateHwndNoErr(hwnd); pwnd = ValidateHwndNoErr(hwnd);
if (!pwnd) if (!pwnd)
{
ERR("Invalid HWND %p\n", hwnd);
goto Quit; goto Quit;
}
pti = pwnd->head.pti; pti = pwnd->head.pti;
if (!pti || !gptiForeground) if (!pti || !gptiForeground)
@ -849,8 +900,7 @@ Quit:
BOOL BOOL
NTAPI NTAPI
NtUserDisableThreadIme( NtUserDisableThreadIme(_In_ DWORD dwThreadID)
DWORD dwThreadID)
{ {
PTHREADINFO pti, ptiCurrent; PTHREADINFO pti, ptiCurrent;
PPROCESSINFO ppi; PPROCESSINFO ppi;
@ -918,7 +968,7 @@ Quit:
DWORD DWORD
NTAPI NTAPI
NtUserGetAppImeLevel(HWND hWnd) NtUserGetAppImeLevel(_In_ HWND hWnd)
{ {
DWORD ret = 0; DWORD ret = 0;
PWND pWnd; PWND pWnd;
@ -928,7 +978,10 @@ NtUserGetAppImeLevel(HWND hWnd)
pWnd = ValidateHwndNoErr(hWnd); pWnd = ValidateHwndNoErr(hWnd);
if (!pWnd) if (!pWnd)
{
ERR("Invalid HWND %p\n", hWnd);
goto Quit; goto Quit;
}
if (!IS_IMM_MODE()) if (!IS_IMM_MODE())
{ {
@ -955,7 +1008,10 @@ UserGetImeInfoEx(
PKL pkl, pklHead; PKL pkl, pklHead;
if (!pWinSta || !gspklBaseLayout) if (!pWinSta || !gspklBaseLayout)
{
ERR("pWinSta:%p, gspklBaseLayout:%p\n", pWinSta, gspklBaseLayout);
return FALSE; return FALSE;
}
pkl = pklHead = gspklBaseLayout; pkl = pklHead = gspklBaseLayout;
@ -978,6 +1034,8 @@ UserGetImeInfoEx(
pkl = pkl->pklNext; pkl = pkl->pklNext;
} while (pkl != pklHead); } while (pkl != pklHead);
ERR("HKL not found: %p\n", pInfoEx->hkl);
} }
else if (SearchType == ImeInfoExImeFileName) else if (SearchType == ImeInfoExImeFileName)
{ {
@ -993,6 +1051,8 @@ UserGetImeInfoEx(
pkl = pkl->pklNext; pkl = pkl->pklNext;
} while (pkl != pklHead); } while (pkl != pklHead);
ERR("wszImeFile not found: '%S'\n", pInfoEx->wszImeFile);
} }
else else
{ {
@ -1028,7 +1088,7 @@ NtUserGetImeInfoEx(
} }
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{ {
ERR("%p\n", pImeInfoEx); ERR("Exception in NtUserGetImeInfoEx: %p\n", pImeInfoEx);
_SEH2_YIELD(goto Quit); _SEH2_YIELD(goto Quit);
} }
_SEH2_END; _SEH2_END;
@ -1045,7 +1105,7 @@ NtUserGetImeInfoEx(
} }
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{ {
ERR("%p\n", pImeInfoEx); ERR("Exception in NtUserGetImeInfoEx: %p\n", pImeInfoEx);
ret = FALSE; ret = FALSE;
} }
_SEH2_END; _SEH2_END;
@ -1057,7 +1117,9 @@ Quit:
BOOL BOOL
NTAPI NTAPI
NtUserSetAppImeLevel(HWND hWnd, DWORD dwLevel) NtUserSetAppImeLevel(
_In_ HWND hWnd,
_In_ DWORD dwLevel)
{ {
BOOL ret = FALSE; BOOL ret = FALSE;
PWND pWnd; PWND pWnd;
@ -1074,7 +1136,10 @@ NtUserSetAppImeLevel(HWND hWnd, DWORD dwLevel)
pWnd = ValidateHwndNoErr(hWnd); pWnd = ValidateHwndNoErr(hWnd);
if (!pWnd) if (!pWnd)
{
ERR("Invalid HWND: %p\n", hWnd);
goto Quit; goto Quit;
}
pti = PsGetCurrentThreadWin32Thread(); pti = PsGetCurrentThreadWin32Thread();
if (pWnd->head.pti->ppi == pti->ppi) if (pWnd->head.pti->ppi == pti->ppi)
@ -1085,7 +1150,6 @@ Quit:
return ret; return ret;
} }
// Win: SetImeInfoEx
BOOL FASTCALL BOOL FASTCALL
UserSetImeInfoEx( UserSetImeInfoEx(
_Inout_ PWINSTATION_OBJECT pWinSta, _Inout_ PWINSTATION_OBJECT pWinSta,
@ -1094,7 +1158,10 @@ UserSetImeInfoEx(
PKL pklHead, pkl; PKL pklHead, pkl;
if (!pWinSta || !gspklBaseLayout) if (!pWinSta || !gspklBaseLayout)
{
ERR("pWinSta:%p, gspklBaseLayout:%p\n", pWinSta, gspklBaseLayout);
return FALSE; return FALSE;
}
pkl = pklHead = gspklBaseLayout; pkl = pklHead = gspklBaseLayout;
@ -1118,12 +1185,13 @@ UserSetImeInfoEx(
return TRUE; return TRUE;
} while (pkl != pklHead); } while (pkl != pklHead);
ERR("HKL not found: %p\n", pImeInfoEx->hkl);
return FALSE; return FALSE;
} }
BOOL BOOL
NTAPI NTAPI
NtUserSetImeInfoEx(PIMEINFOEX pImeInfoEx) NtUserSetImeInfoEx(_In_ const IMEINFOEX *pImeInfoEx)
{ {
BOOL ret = FALSE; BOOL ret = FALSE;
IMEINFOEX ImeInfoEx; IMEINFOEX ImeInfoEx;
@ -1144,7 +1212,7 @@ NtUserSetImeInfoEx(PIMEINFOEX pImeInfoEx)
} }
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{ {
ERR("%p\n", pImeInfoEx); ERR("Exception in NtUserSetImeInfoEx: pImeInfoEx=%p\n", pImeInfoEx);
_SEH2_YIELD(goto Quit); _SEH2_YIELD(goto Quit);
} }
_SEH2_END; _SEH2_END;
@ -1158,8 +1226,8 @@ Quit:
} }
// Choose the preferred owner of the IME window. // Choose the preferred owner of the IME window.
// Win: ImeSetFutureOwner VOID FASTCALL
VOID FASTCALL IntImeSetFutureOwner(PWND pImeWnd, PWND pwndOwner) IntImeSetFutureOwner(PWND pImeWnd, PWND pwndOwner)
{ {
PWND pwndNode, pwndNextOwner, pwndParent, pwndSibling; PWND pwndNode, pwndNextOwner, pwndParent, pwndSibling;
PTHREADINFO pti = pImeWnd->head.pti; PTHREADINFO pti = pImeWnd->head.pti;
@ -1215,8 +1283,8 @@ VOID FASTCALL IntImeSetFutureOwner(PWND pImeWnd, PWND pwndOwner)
} }
// Get the last non-IME-like top-most window on the desktop. // Get the last non-IME-like top-most window on the desktop.
// Win: GetLastTopMostWindowNoIME static PWND FASTCALL
PWND FASTCALL IntGetLastTopMostWindowNoIME(PWND pImeWnd) IntGetLastTopMostWindowNoIME(_In_ PWND pImeWnd)
{ {
PWND pwndNode, pwndOwner, pwndLastTopMost = NULL; PWND pwndNode, pwndOwner, pwndLastTopMost = NULL;
BOOL bFound; BOOL bFound;
@ -1252,8 +1320,8 @@ PWND FASTCALL IntGetLastTopMostWindowNoIME(PWND pImeWnd)
} }
// Adjust the ordering of the windows around the IME window. // Adjust the ordering of the windows around the IME window.
// Win: ImeSetTopMost static VOID FASTCALL
VOID FASTCALL IntImeSetTopMost(PWND pImeWnd, BOOL bTopMost, PWND pwndInsertBefore) IntImeSetTopMost(_In_ PWND pImeWnd, _In_ BOOL bTopMost, _In_ PWND pwndInsertBefore)
{ {
PWND pwndParent, pwndChild, pwndNode, pwndNext, pwndInsertAfter = NULL; PWND pwndParent, pwndChild, pwndNode, pwndNext, pwndInsertAfter = NULL;
PWND pwndInsertAfterSave; PWND pwndInsertAfterSave;
@ -1342,8 +1410,8 @@ VOID FASTCALL IntImeSetTopMost(PWND pImeWnd, BOOL bTopMost, PWND pwndInsertBefor
} }
// Make the IME window top-most if necessary. // Make the IME window top-most if necessary.
// Win: ImeCheckTopmost static VOID FASTCALL
VOID FASTCALL IntImeCheckTopmost(PWND pImeWnd) IntImeCheckTopmost(_In_ PWND pImeWnd)
{ {
BOOL bTopMost; BOOL bTopMost;
PWND pwndOwner = pImeWnd->spwndOwner, pwndInsertBefore = NULL; PWND pwndOwner = pImeWnd->spwndOwner, pwndInsertBefore = NULL;
@ -1359,7 +1427,9 @@ VOID FASTCALL IntImeCheckTopmost(PWND pImeWnd)
} }
BOOL NTAPI BOOL NTAPI
NtUserSetImeOwnerWindow(HWND hImeWnd, HWND hwndFocus) NtUserSetImeOwnerWindow(
_In_ HWND hImeWnd,
_In_opt_ HWND hwndFocus)
{ {
BOOL ret = FALSE; BOOL ret = FALSE;
PWND pImeWnd, pwndFocus, pwndTopLevel, pwndNode, pwndActive; PWND pImeWnd, pwndFocus, pwndTopLevel, pwndNode, pwndActive;
@ -1375,7 +1445,10 @@ NtUserSetImeOwnerWindow(HWND hImeWnd, HWND hwndFocus)
pImeWnd = ValidateHwndNoErr(hImeWnd); pImeWnd = ValidateHwndNoErr(hImeWnd);
if (!pImeWnd || pImeWnd->fnid != FNID_IME) if (!pImeWnd || pImeWnd->fnid != FNID_IME)
{
ERR("Not IME window: %p\n", hImeWnd);
goto Quit; goto Quit;
}
pwndFocus = ValidateHwndNoErr(hwndFocus); pwndFocus = ValidateHwndNoErr(hwndFocus);
if (pwndFocus) if (pwndFocus)
@ -1425,10 +1498,11 @@ Quit:
} }
PVOID PVOID
AllocInputContextObject(PDESKTOP pDesk, AllocInputContextObject(
PTHREADINFO pti, _In_ PDESKTOP pDesk,
SIZE_T Size, _In_ PTHREADINFO pti,
PVOID* HandleOwner) _In_ SIZE_T Size,
_Out_ PVOID* HandleOwner)
{ {
PTHRDESKHEAD ObjHead; PTHRDESKHEAD ObjHead;
@ -1454,7 +1528,8 @@ AllocInputContextObject(PDESKTOP pDesk,
return ObjHead; return ObjHead;
} }
VOID UserFreeInputContext(PVOID Object) VOID
UserFreeInputContext(_In_opt_ PVOID Object)
{ {
PTHRDESKHEAD ObjHead = Object; PTHRDESKHEAD ObjHead = Object;
PDESKTOP pDesk = ObjHead->rpdesk; PDESKTOP pDesk = ObjHead->rpdesk;
@ -1481,7 +1556,8 @@ VOID UserFreeInputContext(PVOID Object)
IntDereferenceThreadInfo(pti); IntDereferenceThreadInfo(pti);
} }
BOOLEAN UserDestroyInputContext(PVOID Object) BOOLEAN
UserDestroyInputContext(_In_opt_ PVOID Object)
{ {
PIMC pIMC = Object; PIMC pIMC = Object;
if (!pIMC) if (!pIMC)
@ -1492,8 +1568,8 @@ BOOLEAN UserDestroyInputContext(PVOID Object)
return TRUE; return TRUE;
} }
// Win: DestroyInputContext static BOOL
BOOL IntDestroyInputContext(PIMC pIMC) IntDestroyInputContext(_In_ PIMC pIMC)
{ {
HIMC hIMC = UserHMGetHandle(pIMC); HIMC hIMC = UserHMGetHandle(pIMC);
PTHREADINFO pti = pIMC->head.pti; PTHREADINFO pti = pIMC->head.pti;
@ -1532,7 +1608,8 @@ BOOL IntDestroyInputContext(PIMC pIMC)
return TRUE; return TRUE;
} }
BOOL NTAPI NtUserDestroyInputContext(HIMC hIMC) BOOL NTAPI
NtUserDestroyInputContext(_In_ HIMC hIMC)
{ {
BOOL ret = FALSE; BOOL ret = FALSE;
PIMC pIMC; PIMC pIMC;
@ -1554,8 +1631,8 @@ Quit:
return ret; return ret;
} }
// Win: CreateInputContext PIMC FASTCALL
PIMC FASTCALL UserCreateInputContext(ULONG_PTR dwClientImcData) UserCreateInputContext(_In_ ULONG_PTR dwClientImcData)
{ {
PIMC pIMC; PIMC pIMC;
PTHREADINFO pti = PsGetCurrentThreadWin32Thread(); PTHREADINFO pti = PsGetCurrentThreadWin32Thread();
@ -1603,7 +1680,7 @@ PIMC FASTCALL UserCreateInputContext(ULONG_PTR dwClientImcData)
HIMC HIMC
NTAPI NTAPI
NtUserCreateInputContext(ULONG_PTR dwClientImcData) NtUserCreateInputContext(_In_ ULONG_PTR dwClientImcData)
{ {
PIMC pIMC; PIMC pIMC;
HIMC ret = NULL; HIMC ret = NULL;
@ -1632,8 +1709,8 @@ Quit:
return ret; return ret;
} }
// Win: AssociateInputContextEx static DWORD FASTCALL
DWORD FASTCALL IntAssociateInputContextEx(PWND pWnd, PIMC pIMC, DWORD dwFlags) IntAssociateInputContextEx(_In_ PWND pWnd, _In_ PIMC pIMC, _In_ DWORD dwFlags)
{ {
DWORD ret = 0; DWORD ret = 0;
PWINDOWLIST pwl; PWINDOWLIST pwl;
@ -1699,7 +1776,10 @@ DWORD FASTCALL IntAssociateInputContextEx(PWND pWnd, PIMC pIMC, DWORD dwFlags)
DWORD DWORD
NTAPI NTAPI
NtUserAssociateInputContext(HWND hWnd, HIMC hIMC, DWORD dwFlags) NtUserAssociateInputContext(
_In_ HWND hWnd,
_In_opt_ HIMC hIMC,
_In_ DWORD dwFlags)
{ {
DWORD ret = 2; DWORD ret = 2;
PWND pWnd; PWND pWnd;
@ -1715,7 +1795,10 @@ NtUserAssociateInputContext(HWND hWnd, HIMC hIMC, DWORD dwFlags)
pWnd = ValidateHwndNoErr(hWnd); pWnd = ValidateHwndNoErr(hWnd);
if (!pWnd) if (!pWnd)
{
ERR("Invalid HWND: %p\n", hWnd);
goto Quit; goto Quit;
}
pIMC = (hIMC ? UserGetObjectNoErr(gHandleTable, hIMC, TYPE_INPUTCONTEXT) : NULL); pIMC = (hIMC ? UserGetObjectNoErr(gHandleTable, hIMC, TYPE_INPUTCONTEXT) : NULL);
ret = IntAssociateInputContextEx(pWnd, pIMC, dwFlags); ret = IntAssociateInputContextEx(pWnd, pIMC, dwFlags);
@ -1725,8 +1808,8 @@ Quit:
return ret; return ret;
} }
// Win: UpdateInputContext static BOOL FASTCALL
BOOL FASTCALL UserUpdateInputContext(PIMC pIMC, DWORD dwType, DWORD_PTR dwValue) UserUpdateInputContext(_In_ PIMC pIMC, _In_ DWORD dwType, _In_ DWORD_PTR dwValue)
{ {
PTHREADINFO pti = GetW32ThreadInfo(); PTHREADINFO pti = GetW32ThreadInfo();
PTHREADINFO ptiIMC = pIMC->head.pti; PTHREADINFO ptiIMC = pIMC->head.pti;
@ -1751,6 +1834,7 @@ BOOL FASTCALL UserUpdateInputContext(PIMC pIMC, DWORD dwType, DWORD_PTR dwValue)
break; break;
default: default:
ERR("Unhandled dwType: %lu\n", dwType);
return FALSE; return FALSE;
} }
@ -1777,7 +1861,10 @@ NtUserUpdateInputContext(
pIMC = UserGetObject(gHandleTable, hIMC, TYPE_INPUTCONTEXT); pIMC = UserGetObject(gHandleTable, hIMC, TYPE_INPUTCONTEXT);
if (!pIMC) if (!pIMC)
{
ERR("Invalid HIMC %p\n", hIMC);
goto Quit; goto Quit;
}
ret = UserUpdateInputContext(pIMC, dwType, dwValue); ret = UserUpdateInputContext(pIMC, dwType, dwValue);
@ -1801,7 +1888,10 @@ NtUserQueryInputContext(HIMC hIMC, DWORD dwType)
pIMC = UserGetObject(gHandleTable, hIMC, TYPE_INPUTCONTEXT); pIMC = UserGetObject(gHandleTable, hIMC, TYPE_INPUTCONTEXT);
if (!pIMC) if (!pIMC)
{
ERR("Invalid HIMC %p\n", hIMC);
goto Quit; goto Quit;
}
ptiIMC = pIMC->head.pti; ptiIMC = pIMC->head.pti;
@ -1839,8 +1929,6 @@ Quit:
// Searchs a non-IME-related window of the same thread of pwndTarget, // Searchs a non-IME-related window of the same thread of pwndTarget,
// other than pwndTarget, around pwndParent. Returns TRUE if found. // other than pwndTarget, around pwndParent. Returns TRUE if found.
//
// Win: IsChildSameThread
BOOL IntFindNonImeRelatedWndOfSameThread(PWND pwndParent, PWND pwndTarget) BOOL IntFindNonImeRelatedWndOfSameThread(PWND pwndParent, PWND pwndTarget)
{ {
PWND pwnd, pwndOwner, pwndNode; PWND pwnd, pwndOwner, pwndNode;
@ -1916,8 +2004,8 @@ BOOL IntFindNonImeRelatedWndOfSameThread(PWND pwndParent, PWND pwndTarget)
} }
// Determines whether the target window needs the IME window. // Determines whether the target window needs the IME window.
// Win: WantImeWindow(pwndParent, pwndTarget) BOOL FASTCALL
BOOL FASTCALL IntWantImeWindow(PWND pwndTarget) IntWantImeWindow(_In_ PWND pwndTarget)
{ {
PDESKTOP rpdesk; PDESKTOP rpdesk;
PWINSTATION_OBJECT rpwinstaParent; PWINSTATION_OBJECT rpwinstaParent;
@ -1956,8 +2044,10 @@ BOOL FASTCALL IntWantImeWindow(PWND pwndTarget)
} }
// Create the default IME window for the target window. // Create the default IME window for the target window.
// Win: xxxCreateDefaultImeWindow(pwndTarget, ATOM, hInst) PWND FASTCALL
PWND FASTCALL co_IntCreateDefaultImeWindow(PWND pwndTarget, HINSTANCE hInst) co_IntCreateDefaultImeWindow(
_In_ PWND pwndTarget,
_In_ HINSTANCE hInst)
{ {
LARGE_UNICODE_STRING WindowName; LARGE_UNICODE_STRING WindowName;
UNICODE_STRING ClassName; UNICODE_STRING ClassName;
@ -2009,7 +2099,7 @@ PWND FASTCALL co_IntCreateDefaultImeWindow(PWND pwndTarget, HINSTANCE hInst)
} }
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{ {
ERR("%p\n", pimeui); ERR("Exception in co_IntCreateDefaultImeWindow: %p\n", pimeui);
} }
_SEH2_END; _SEH2_END;
} }
@ -2019,8 +2109,10 @@ PWND FASTCALL co_IntCreateDefaultImeWindow(PWND pwndTarget, HINSTANCE hInst)
} }
// Determines whether the system can destroy the default IME window for the target child window. // Determines whether the system can destroy the default IME window for the target child window.
// Win: ImeCanDestroyDefIMEforChild BOOL FASTCALL
BOOL FASTCALL IntImeCanDestroyDefIMEforChild(PWND pImeWnd, PWND pwndTarget) IntImeCanDestroyDefIMEforChild(
_In_ PWND pImeWnd,
_In_ PWND pwndTarget)
{ {
PWND pwndNode; PWND pwndNode;
PIMEUI pimeui; PIMEUI pimeui;
@ -2040,7 +2132,7 @@ BOOL FASTCALL IntImeCanDestroyDefIMEforChild(PWND pImeWnd, PWND pwndTarget)
} }
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{ {
ERR("%p\n", pimeui); ERR("Exception in IntImeCanDestroyDefIMEforChild: %p\n", pimeui);
} }
_SEH2_END; _SEH2_END;
@ -2064,8 +2156,10 @@ BOOL FASTCALL IntImeCanDestroyDefIMEforChild(PWND pImeWnd, PWND pwndTarget)
} }
// Determines whether the system can destroy the default IME window for the non-child target window. // Determines whether the system can destroy the default IME window for the non-child target window.
// Win: ImeCanDestroyDefIME BOOL FASTCALL
BOOL FASTCALL IntImeCanDestroyDefIME(PWND pImeWnd, PWND pwndTarget) IntImeCanDestroyDefIME(
_In_ PWND pImeWnd,
_In_ PWND pwndTarget)
{ {
PWND pwndNode; PWND pwndNode;
PIMEUI pimeui; PIMEUI pimeui;
@ -2085,7 +2179,7 @@ BOOL FASTCALL IntImeCanDestroyDefIME(PWND pImeWnd, PWND pwndTarget)
} }
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{ {
ERR("%p\n", pimeui); ERR("Exception in IntImeCanDestroyDefIME: %p\n", pimeui);
} }
_SEH2_END; _SEH2_END;
@ -2128,8 +2222,10 @@ BOOL FASTCALL IntImeCanDestroyDefIME(PWND pImeWnd, PWND pwndTarget)
} }
// Update IMEUI.fShowStatus flags and Send the WM_IME_NOTIFY messages. // Update IMEUI.fShowStatus flags and Send the WM_IME_NOTIFY messages.
// Win: xxxCheckImeShowStatus BOOL FASTCALL
BOOL FASTCALL IntCheckImeShowStatus(PWND pwndIme, PTHREADINFO pti) IntCheckImeShowStatus(
_In_ PWND pwndIme,
_In_ PTHREADINFO pti)
{ {
BOOL ret = FALSE, bDifferent; BOOL ret = FALSE, bDifferent;
PWINDOWLIST pwl; PWINDOWLIST pwl;
@ -2194,7 +2290,7 @@ BOOL FASTCALL IntCheckImeShowStatus(PWND pwndIme, PTHREADINFO pti)
} }
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{ {
ERR("%p\n", pimeui); ERR("Exception in IntCheckImeShowStatus: %p\n", pimeui);
pwndIMC = NULL; pwndIMC = NULL;
} }
_SEH2_END; _SEH2_END;
@ -2225,7 +2321,12 @@ BOOL FASTCALL IntCheckImeShowStatus(PWND pwndIme, PTHREADINFO pti)
// Send a UI message. // Send a UI message.
LRESULT FASTCALL LRESULT FASTCALL
IntSendMessageToUI(PTHREADINFO ptiIME, PIMEUI pimeui, UINT uMsg, WPARAM wParam, LPARAM lParam) IntSendMessageToUI(
_In_ PTHREADINFO ptiIME,
_In_ PIMEUI pimeui,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam)
{ {
PWND pwndUI; PWND pwndUI;
LRESULT ret = 0; LRESULT ret = 0;
@ -2249,7 +2350,7 @@ IntSendMessageToUI(PTHREADINFO ptiIME, PIMEUI pimeui, UINT uMsg, WPARAM wParam,
} }
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{ {
ERR("%p\n", pimeui); ERR("Exception in IntSendMessageToUI: %p\n", pimeui);
pwndUI = NULL; pwndUI = NULL;
} }
_SEH2_END; _SEH2_END;
@ -2266,7 +2367,7 @@ IntSendMessageToUI(PTHREADINFO ptiIME, PIMEUI pimeui, UINT uMsg, WPARAM wParam,
} }
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{ {
ERR("%p\n", pimeui); ERR("Exception in IntSendMessageToUI: %p\n", pimeui);
_SEH2_YIELD(goto Quit); _SEH2_YIELD(goto Quit);
} }
_SEH2_END; _SEH2_END;
@ -2291,7 +2392,7 @@ IntSendMessageToUI(PTHREADINFO ptiIME, PIMEUI pimeui, UINT uMsg, WPARAM wParam,
} }
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{ {
ERR("%p\n", pimeui); ERR("Exception in IntSendMessageToUI: %p\n", pimeui);
_SEH2_YIELD(goto Quit); _SEH2_YIELD(goto Quit);
} }
_SEH2_END; _SEH2_END;
@ -2305,7 +2406,6 @@ Quit:
} }
// Send the open status notification. // Send the open status notification.
// Win: xxxSendOpenStatusNotify
VOID FASTCALL VOID FASTCALL
IntSendOpenStatusNotify(PTHREADINFO ptiIME, PIMEUI pimeui, PWND pWnd, BOOL bOpen) IntSendOpenStatusNotify(PTHREADINFO ptiIME, PIMEUI pimeui, PWND pWnd, BOOL bOpen)
{ {
@ -2326,7 +2426,8 @@ IntSendOpenStatusNotify(PTHREADINFO ptiIME, PIMEUI pimeui, PWND pWnd, BOOL bOpen
} }
// Update the IME status and send a notification. // Update the IME status and send a notification.
VOID FASTCALL IntNotifyImeShowStatus(PWND pImeWnd) VOID FASTCALL
IntNotifyImeShowStatus(_In_ PWND pImeWnd)
{ {
PIMEUI pimeui; PIMEUI pimeui;
PWND pWnd; PWND pWnd;
@ -2365,7 +2466,8 @@ VOID FASTCALL IntNotifyImeShowStatus(PWND pImeWnd)
} }
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{ {
ERR("%p, %p\n", pImeWnd, pimeui); ERR("Exception in IntNotifyImeShowStatus: %p, %p, %p, %d, %d\n",
pImeWnd, pimeui, ptiIME, SafeImeUI.fCtrlShowStatus, gfIMEShowStatus);
if (pti != ptiIME) if (pti != ptiIME)
KeDetachProcess(); KeDetachProcess();
@ -2385,8 +2487,10 @@ VOID FASTCALL IntNotifyImeShowStatus(PWND pImeWnd)
IntCheckImeShowStatus(pImeWnd, NULL); IntCheckImeShowStatus(pImeWnd, NULL);
} }
// Win: xxxBroadcastImeShowStatusChange BOOL FASTCALL
BOOL FASTCALL IntBroadcastImeShowStatusChange(PWND pImeWnd, BOOL bShow) IntBroadcastImeShowStatusChange(
_In_ PWND pImeWnd,
_In_ BOOL bShow)
{ {
if (gfIMEShowStatus == bShow || !IS_IMM_MODE()) if (gfIMEShowStatus == bShow || !IS_IMM_MODE())
return TRUE; return TRUE;
@ -2396,11 +2500,9 @@ BOOL FASTCALL IntBroadcastImeShowStatusChange(PWND pImeWnd, BOOL bShow)
return TRUE; return TRUE;
} }
/* Win: xxxCheckImeShowStatusInThread */ VOID FASTCALL
VOID FASTCALL IntCheckImeShowStatusInThread(PWND pImeWnd) IntCheckImeShowStatusInThread(_In_ PWND pImeWnd)
{ {
if (IS_IMM_MODE() && !(pImeWnd->state2 & WNDS2_INDESTROY)) if (IS_IMM_MODE() && !(pImeWnd->state2 & WNDS2_INDESTROY))
IntCheckImeShowStatus(pImeWnd, pImeWnd->head.pti); IntCheckImeShowStatus(pImeWnd, pImeWnd->head.pti);
} }
/* EOF */

View file

@ -83,7 +83,12 @@ VOID NTAPI UserProcessMouseInput(PMOUSE_INPUT_DATA pMouseInputData);
BOOL NTAPI UserSendMouseInput(MOUSEINPUT *pMouseInput, BOOL bInjected); BOOL NTAPI UserSendMouseInput(MOUSEINPUT *pMouseInput, BOOL bInjected);
/* IMM */ /* IMM */
UINT FASTCALL IntImmProcessKey(PUSER_MESSAGE_QUEUE, PWND, UINT, WPARAM, LPARAM); UINT FASTCALL IntImmProcessKey(
_In_ PUSER_MESSAGE_QUEUE MessageQueue,
_In_ PWND pWnd,
_In_ UINT uMsg,
_In_ WPARAM wParam,
_In_ LPARAM lParam);
VOID FASTCALL IntFreeImeHotKeys(VOID); VOID FASTCALL IntFreeImeHotKeys(VOID);
extern DWORD gSystemFS; extern DWORD gSystemFS;

View file

@ -170,9 +170,15 @@ BOOL FASTCALL GetLayeredStatus(PWND pWnd);
/************** INPUT CONTEXT **************/ /************** INPUT CONTEXT **************/
PIMC FASTCALL UserCreateInputContext(ULONG_PTR dwClientImcData); PIMC FASTCALL UserCreateInputContext(_In_ ULONG_PTR dwClientImcData);
VOID UserFreeInputContext(PVOID Object); VOID UserFreeInputContext(_In_opt_ PVOID Object);
BOOLEAN UserDestroyInputContext(PVOID Object); BOOLEAN UserDestroyInputContext(_In_opt_ PVOID Object);
PVOID AllocInputContextObject(PDESKTOP pDesk, PTHREADINFO pti, SIZE_T Size, PVOID* HandleOwner);
PVOID
AllocInputContextObject(
_In_ PDESKTOP pDesk,
_In_ PTHREADINFO pti,
_In_ SIZE_T Size,
_Out_ PVOID* HandleOwner);
/* EOF */ /* EOF */

View file

@ -117,13 +117,13 @@ HWND FASTCALL IntFindWindow(PWND Parent, PWND ChildAfter, RTL_ATOM ClassAtom,
extern BOOL gfIMEShowStatus; extern BOOL gfIMEShowStatus;
BOOL FASTCALL IntWantImeWindow(PWND pwndTarget); BOOL FASTCALL IntWantImeWindow(_In_ PWND pwndTarget);
PWND FASTCALL co_IntCreateDefaultImeWindow(PWND pwndTarget, HINSTANCE hInst); PWND FASTCALL co_IntCreateDefaultImeWindow(_In_ PWND pwndTarget, _In_ HINSTANCE hInst);
BOOL FASTCALL IntImeCanDestroyDefIMEforChild(PWND pImeWnd, PWND pwndTarget); BOOL FASTCALL IntImeCanDestroyDefIMEforChild(_In_ PWND pImeWnd, _In_ PWND pwndTarget);
BOOL FASTCALL IntImeCanDestroyDefIME(PWND pImeWnd, PWND pwndTarget); BOOL FASTCALL IntImeCanDestroyDefIME(_In_ PWND pImeWnd, _In_ PWND pwndTarget);
BOOL FASTCALL IntBroadcastImeShowStatusChange(PWND pImeWnd, BOOL bShow); BOOL FASTCALL IntBroadcastImeShowStatusChange(_In_ PWND pImeWnd, _In_ BOOL bShow);
VOID FASTCALL IntNotifyImeShowStatus(PWND pImeWnd); VOID FASTCALL IntNotifyImeShowStatus(_In_ PWND pImeWnd);
VOID FASTCALL IntCheckImeShowStatusInThread(PWND pImeWnd); VOID FASTCALL IntCheckImeShowStatusInThread(_In_ PWND pImeWnd);
static inline static inline
VOID VOID