From cb199a866c01c5ac5d93b9648e165fb415eb1ac1 Mon Sep 17 00:00:00 2001 From: James Tabor Date: Fri, 16 Sep 2016 23:58:51 +0000 Subject: [PATCH] [NtUser] - Use desktop thread list to search for related active desktop threads. See CORE-11983. svn path=/trunk/; revision=72699 --- reactos/win32ss/user/ntuser/kbdlayout.c | 32 +++++++++++++++---------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/reactos/win32ss/user/ntuser/kbdlayout.c b/reactos/win32ss/user/ntuser/kbdlayout.c index b903b5f0f4d..bda95cc592d 100644 --- a/reactos/win32ss/user/ntuser/kbdlayout.c +++ b/reactos/win32ss/user/ntuser/kbdlayout.c @@ -450,31 +450,37 @@ HKL FASTCALL UserGetKeyboardLayout( DWORD dwThreadId) { - NTSTATUS Status; - PETHREAD pThread; PTHREADINFO pti; + PLIST_ENTRY ListEntry; PKL pKl; - HKL hKl; + + pti = PsGetCurrentThreadWin32Thread(); if (!dwThreadId) { - pti = PsGetCurrentThreadWin32Thread(); 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; + return NULL; } /*