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

View file

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

View file

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

View file

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