From 41b87158ffe9be1a2fcbdd164c4e6bc5988fcc0f Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Thu, 20 Jan 2022 11:49:27 +0900 Subject: [PATCH] [NTUSER] Improve NtUserGetThreadState (#4300) - Improve enum ThreadStateRoutines. - Improve NtUserGetThreadState function. - Improve CLIENTIMC structure. - Improve imm32 code. CORE-17732 --- dll/win32/imm32/ime.c | 5 ++-- dll/win32/imm32/imm.c | 12 ++++------ win32ss/include/ntuser.h | 29 +++++++++++++++-------- win32ss/user/ntuser/misc.c | 47 ++++++++++++++++++++++++++++---------- 4 files changed, 60 insertions(+), 33 deletions(-) diff --git a/dll/win32/imm32/ime.c b/dll/win32/imm32/ime.c index 4866bd00f5f..853951b352b 100644 --- a/dll/win32/imm32/ime.c +++ b/dll/win32/imm32/ime.c @@ -49,7 +49,7 @@ BOOL APIENTRY Imm32InquireIme(PIMEDPI pImeDpi) DWORD dwSysInfoFlags = 0; LPIMEINFO pImeInfo = &pImeDpi->ImeInfo; - if (NtUserGetThreadState(16)) + if (NtUserGetThreadState(THREADSTATE_ISWINLOGON2)) dwSysInfoFlags |= IME_SYSINFO_WINLOGON; if (IS_IME_HKL(pImeDpi->hKL)) @@ -633,9 +633,8 @@ HWND WINAPI ImmGetDefaultIMEWnd(HWND hWnd) if (!Imm32IsImmMode()) return NULL; - // FIXME: NtUserGetThreadState and enum ThreadStateRoutines are broken. if (hWnd == NULL) - return (HWND)NtUserGetThreadState(3); + return (HWND)NtUserGetThreadState(THREADSTATE_DEFAULTIMEWINDOW); return (HWND)NtUserQueryWindow(hWnd, QUERY_WINDOW_DEFAULT_IME); } diff --git a/dll/win32/imm32/imm.c b/dll/win32/imm32/imm.c index e916d44480f..b965e0d3093 100644 --- a/dll/win32/imm32/imm.c +++ b/dll/win32/imm32/imm.c @@ -606,8 +606,7 @@ HIMC WINAPI ImmCreateContext(void) RtlInitializeCriticalSection(&pClientImc->cs); - // FIXME: NtUserGetThreadState and enum ThreadStateRoutines are broken. - pClientImc->unknown = NtUserGetThreadState(13); + pClientImc->dwCompatFlags = (DWORD)NtUserGetThreadState(THREADSTATE_IMECOMPATFLAGS); return hIMC; } @@ -925,8 +924,7 @@ PCLIENTIMC WINAPI ImmLockClientImc(HIMC hImc) RtlInitializeCriticalSection(&pClientImc->cs); - // FIXME: NtUserGetThreadState and enum ThreadStateRoutines are broken. - pClientImc->unknown = NtUserGetThreadState(13); + pClientImc->dwCompatFlags = (DWORD)NtUserGetThreadState(THREADSTATE_IMECOMPATFLAGS); if (!NtUserUpdateInputContext(hImc, UIC_CLIENTIMCDATA, (DWORD_PTR)pClientImc)) { @@ -979,8 +977,7 @@ static HIMC APIENTRY Imm32GetContextEx(HWND hWnd, DWORD dwContextFlags) if (!hWnd) { - // FIXME: NtUserGetThreadState and enum ThreadStateRoutines are broken. - hIMC = (HIMC)NtUserGetThreadState(4); + hIMC = (HIMC)NtUserGetThreadState(THREADSTATE_DEFAULTINPUTCONTEXT); goto Quit; } @@ -1275,8 +1272,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) return TRUE; hKL = GetKeyboardLayout(0); - // FIXME: NtUserGetThreadState and enum ThreadStateRoutines are broken. - hIMC = (HIMC)NtUserGetThreadState(4); + hIMC = (HIMC)NtUserGetThreadState(THREADSTATE_DEFAULTINPUTCONTEXT); Imm32CleanupContext(hIMC, hKL, TRUE); break; diff --git a/win32ss/include/ntuser.h b/win32ss/include/ntuser.h index e6db897fa4b..dab6b267781 100644 --- a/win32ss/include/ntuser.h +++ b/win32ss/include/ntuser.h @@ -1294,7 +1294,7 @@ typedef struct tagCLIENTIMC HANDLE hInputContext; /* LocalAlloc'ed LHND */ LONG cLockObj; DWORD dwFlags; - DWORD unknown; + DWORD dwCompatFlags; RTL_CRITICAL_SECTION cs; UINT uCodePage; HKL hKL; @@ -1305,6 +1305,7 @@ typedef struct tagCLIENTIMC C_ASSERT(offsetof(CLIENTIMC, hInputContext) == 0x0); C_ASSERT(offsetof(CLIENTIMC, cLockObj) == 0x4); C_ASSERT(offsetof(CLIENTIMC, dwFlags) == 0x8); +C_ASSERT(offsetof(CLIENTIMC, dwCompatFlags) == 0xc); C_ASSERT(offsetof(CLIENTIMC, cs) == 0x10); C_ASSERT(offsetof(CLIENTIMC, uCodePage) == 0x28); C_ASSERT(offsetof(CLIENTIMC, hKL) == 0x2c); @@ -2550,20 +2551,28 @@ NtUserGetThreadDesktop( enum ThreadStateRoutines { - THREADSTATE_GETTHREADINFO, - THREADSTATE_INSENDMESSAGE, - THREADSTATE_FOCUSWINDOW, + THREADSTATE_FOCUSWINDOW = 0, THREADSTATE_ACTIVEWINDOW, THREADSTATE_CAPTUREWINDOW, - THREADSTATE_PROGMANWINDOW, - THREADSTATE_TASKMANWINDOW, - THREADSTATE_GETMESSAGETIME, + THREADSTATE_DEFAULTIMEWINDOW, + THREADSTATE_DEFAULTINPUTCONTEXT, THREADSTATE_GETINPUTSTATE, - THREADSTATE_UPTIMELASTREAD, - THREADSTATE_FOREGROUNDTHREAD, THREADSTATE_GETCURSOR, + THREADSTATE_CHANGEBITS, + THREADSTATE_UPTIMELASTREAD, THREADSTATE_GETMESSAGEEXTRAINFO, - THREADSTATE_UNKNOWN13 + THREADSTATE_INSENDMESSAGE, + THREADSTATE_GETMESSAGETIME, + THREADSTATE_FOREGROUNDTHREAD, + THREADSTATE_IMECOMPATFLAGS, + THREADSTATE_OLDKEYBOARDLAYOUT, + THREADSTATE_ISWINLOGON, + THREADSTATE_ISWINLOGON2, + THREADSTATE_UNKNOWN17, + THREADSTATE_UNKNOWN18, + THREADSTATE_GETTHREADINFO = 100, /* FIXME: Delete this HACK */ + THREADSTATE_PROGMANWINDOW, /* FIXME: Delete this HACK */ + THREADSTATE_TASKMANWINDOW, /* FIXME: Delete this HACK */ }; DWORD_PTR diff --git a/win32ss/user/ntuser/misc.c b/win32ss/user/ntuser/misc.c index 10fa0144f16..00393431603 100644 --- a/win32ss/user/ntuser/misc.c +++ b/win32ss/user/ntuser/misc.c @@ -232,6 +232,7 @@ NtUserGetThreadState( DWORD Routine) { DWORD_PTR ret = 0; + PTHREADINFO pti; TRACE("Enter NtUserGetThreadState\n"); if (Routine != THREADSTATE_GETTHREADINFO) @@ -243,9 +244,11 @@ NtUserGetThreadState( UserEnterExclusive(); } + pti = PsGetCurrentThreadWin32Thread(); + switch (Routine) { - case THREADSTATE_GETTHREADINFO: + case THREADSTATE_GETTHREADINFO: /* FIXME: Delete this HACK */ GetW32ThreadInfo(); break; case THREADSTATE_FOCUSWINDOW: @@ -255,10 +258,10 @@ NtUserGetThreadState( /* FIXME: Should use UserEnterShared */ ret = (DWORD_PTR)IntGetCapture(); break; - case THREADSTATE_PROGMANWINDOW: + case THREADSTATE_PROGMANWINDOW: /* FIXME: Delete this HACK */ ret = (DWORD_PTR)GetW32ThreadInfo()->pDeskInfo->hProgmanWindow; break; - case THREADSTATE_TASKMANWINDOW: + case THREADSTATE_TASKMANWINDOW: /* FIXME: Delete this HACK */ ret = (DWORD_PTR)GetW32ThreadInfo()->pDeskInfo->hTaskManWindow; break; case THREADSTATE_ACTIVEWINDOW: @@ -293,12 +296,8 @@ NtUserGetThreadState( break; case THREADSTATE_UPTIMELASTREAD: - { - PTHREADINFO pti; - pti = PsGetCurrentThreadWin32Thread(); - pti->pcti->timeLastRead = EngGetTickCount32(); - break; - } + pti->pcti->timeLastRead = EngGetTickCount32(); + break; case THREADSTATE_GETINPUTSTATE: ret = LOWORD(IntGetQueueStatus(QS_POSTMESSAGE|QS_TIMER|QS_PAINT|QS_SENDMESSAGE|QS_INPUT)) & (QS_KEY | QS_MOUSEBUTTON); @@ -313,9 +312,33 @@ NtUserGetThreadState( break; case THREADSTATE_GETMESSAGEEXTRAINFO: ret = (DWORD_PTR)MsqGetMessageExtraInfo(); - break; - case THREADSTATE_UNKNOWN13: - ret = FALSE; /* FIXME: See imm32 */ + break; + case THREADSTATE_DEFAULTIMEWINDOW: + if (pti->spwndDefaultIme) + ret = (ULONG_PTR)UserHMGetHandle(pti->spwndDefaultIme); + break; + case THREADSTATE_DEFAULTINPUTCONTEXT: + if (pti->spDefaultImc) + ret = (ULONG_PTR)UserHMGetHandle(pti->spDefaultImc); + break; + case THREADSTATE_CHANGEBITS: + ret = pti->pcti->fsChangeBits; + break; + case THREADSTATE_IMECOMPATFLAGS: + ret = pti->ppi->dwImeCompatFlags; + break; + case THREADSTATE_OLDKEYBOARDLAYOUT: + ret = (ULONG_PTR)pti->hklPrev; + break; + case THREADSTATE_ISWINLOGON: + case THREADSTATE_ISWINLOGON2: + ret = (gpidLogon == PsGetCurrentProcessId()); + break; + case THREADSTATE_UNKNOWN17: + /* FIXME */ + break; + case THREADSTATE_UNKNOWN18: + ret = TRUE; break; }