Skip to content

Commit 06e01c8

Browse files
committed
[NtUser] Fix Crash in Win32k
Use strict thread and desktop verifying. See CORE-15092 and CORE-17133.
1 parent 5f076e5 commit 06e01c8

File tree

1 file changed

+15
-16
lines changed

1 file changed

+15
-16
lines changed

win32ss/user/ntuser/misc.c

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -377,8 +377,7 @@ NtUserGetGUIThreadInfo(
377377
GUITHREADINFO SafeGui;
378378
PDESKTOP Desktop;
379379
PUSER_MESSAGE_QUEUE MsgQueue;
380-
PTHREADINFO W32Thread;
381-
PETHREAD Thread = NULL;
380+
PTHREADINFO W32Thread, pti;
382381

383382
DECLARE_RETURN(BOOLEAN);
384383

@@ -400,23 +399,26 @@ NtUserGetGUIThreadInfo(
400399

401400
if (idThread)
402401
{
403-
Status = PsLookupThreadByThreadId((HANDLE)(DWORD_PTR)idThread, &Thread);
404-
if(!NT_SUCCESS(Status))
402+
pti = PsGetCurrentThreadWin32Thread();
403+
404+
// Validate Tread ID
405+
W32Thread = IntTID2PTI((HANDLE)idThread);
406+
407+
if ( !W32Thread )
405408
{
406-
EngSetLastError(ERROR_ACCESS_DENIED);
407-
RETURN( FALSE);
409+
EngSetLastError(ERROR_ACCESS_DENIED);
410+
RETURN( FALSE);
408411
}
409-
W32Thread = (PTHREADINFO)Thread->Tcb.Win32Thread;
412+
410413
Desktop = W32Thread->rpdesk;
411414

412-
if (!Thread || !Desktop )
415+
// Check Desktop and it must be the same as current.
416+
if ( !Desktop || Desktop != pti->rpdesk )
413417
{
414-
if(Thread)
415-
ObDereferenceObject(Thread);
416-
EngSetLastError(ERROR_ACCESS_DENIED);
417-
RETURN( FALSE);
418+
EngSetLastError(ERROR_ACCESS_DENIED);
419+
RETURN( FALSE);
418420
}
419-
421+
420422
if ( W32Thread->MessageQueue )
421423
MsgQueue = W32Thread->MessageQueue;
422424
else
@@ -480,9 +482,6 @@ NtUserGetGUIThreadInfo(
480482
SafeGui.rcCaret.right = SafeGui.rcCaret.left + CaretInfo->Size.cx;
481483
SafeGui.rcCaret.bottom = SafeGui.rcCaret.top + CaretInfo->Size.cy;
482484

483-
if (idThread)
484-
ObDereferenceObject(Thread);
485-
486485
Status = MmCopyToCaller(lpgui, &SafeGui, sizeof(GUITHREADINFO));
487486
if(!NT_SUCCESS(Status))
488487
{

0 commit comments

Comments
 (0)