[NTUSER] Improve NtUserGetThreadState (#4300)

- Improve enum ThreadStateRoutines.
- Improve NtUserGetThreadState function.
- Improve CLIENTIMC structure.
- Improve imm32 code.
CORE-17732
This commit is contained in:
Katayama Hirofumi MZ 2022-01-20 11:49:27 +09:00 committed by GitHub
parent 2318f7f436
commit 41b87158ff
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 60 additions and 33 deletions

View file

@ -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);
}

View file

@ -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;

View file

@ -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

View file

@ -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;
}