- Use desktop thread list to search for related active desktop threads. See CORE-11983.

svn path=/trunk/; revision=72699
This commit is contained in:
James Tabor 2016-09-16 23:58:51 +00:00
parent 6e3b5e1ee2
commit cb199a866c

View file

@ -450,31 +450,37 @@ HKL FASTCALL
UserGetKeyboardLayout( UserGetKeyboardLayout(
DWORD dwThreadId) DWORD dwThreadId)
{ {
NTSTATUS Status;
PETHREAD pThread;
PTHREADINFO pti; PTHREADINFO pti;
PLIST_ENTRY ListEntry;
PKL pKl; PKL pKl;
HKL hKl;
pti = PsGetCurrentThreadWin32Thread();
if (!dwThreadId) if (!dwThreadId)
{ {
pti = PsGetCurrentThreadWin32Thread();
pKl = pti->KeyboardLayout; pKl = pti->KeyboardLayout;
return pKl ? pKl->hkl : NULL; return pKl ? pKl->hkl : NULL;
} }
Status = PsLookupThreadByThreadId((HANDLE)(DWORD_PTR)dwThreadId, &pThread); ListEntry = pti->rpdesk->PtiList.Flink;
if (!NT_SUCCESS(Status))
//
// Search the Desktop Thread list for related Desktop active Threads.
//
while(ListEntry != &pti->rpdesk->PtiList)
{ {
EngSetLastError(ERROR_INVALID_PARAMETER); pti = CONTAINING_RECORD(ListEntry, THREADINFO, PtiLink);
return NULL;
if (PsGetThreadId(pti->pEThread) == UlongToHandle(dwThreadId))
{
pKl = pti->KeyboardLayout;
return pKl ? pKl->hkl : NULL;
} }
pti = PsGetThreadWin32Thread(pThread); ListEntry = ListEntry->Flink;
pKl = pti->KeyboardLayout; }
hKl = pKl ? pKl->hkl : NULL;
ObDereferenceObject(pThread); return NULL;
return hKl;
} }
/* /*