- Use desktop thread list to search for related active desktop threads. See CORE-11983.
svn path=/trunk/; revision=72699
UserGetKeyboardLayout(
DWORD dwThreadId)
{
UserGetKeyboardLayout(
DWORD dwThreadId)
{
- NTSTATUS Status;
- PETHREAD pThread;
+
+ pti = PsGetCurrentThreadWin32Thread();
- pti = PsGetCurrentThreadWin32Thread();
pKl = pti->KeyboardLayout;
return pKl ? pKl->hkl : NULL;
}
pKl = pti->KeyboardLayout;
return pKl ? pKl->hkl : NULL;
}
- Status = PsLookupThreadByThreadId((HANDLE)(DWORD_PTR)dwThreadId, &pThread);
- if (!NT_SUCCESS(Status))
+ ListEntry = pti->rpdesk->PtiList.Flink;
+
+ //
+ // Search the Desktop Thread list for related Desktop active Threads.
+ //
+ while(ListEntry != &pti->rpdesk->PtiList)
- EngSetLastError(ERROR_INVALID_PARAMETER);
- return NULL;
+ pti = CONTAINING_RECORD(ListEntry, THREADINFO, PtiLink);
+
+ if (PsGetThreadId(pti->pEThread) == UlongToHandle(dwThreadId))
+ {
+ pKl = pti->KeyboardLayout;
+ return pKl ? pKl->hkl : NULL;
+ }
+
+ ListEntry = ListEntry->Flink;
- pti = PsGetThreadWin32Thread(pThread);
- pKl = pti->KeyboardLayout;
- hKl = pKl ? pKl->hkl : NULL;
- ObDereferenceObject(pThread);
- return hKl;