@@ -377,8 +377,7 @@ NtUserGetGUIThreadInfo(
377
377
GUITHREADINFO SafeGui ;
378
378
PDESKTOP Desktop ;
379
379
PUSER_MESSAGE_QUEUE MsgQueue ;
380
- PTHREADINFO W32Thread ;
381
- PETHREAD Thread = NULL ;
380
+ PTHREADINFO W32Thread , pti ;
382
381
383
382
DECLARE_RETURN (BOOLEAN );
384
383
@@ -400,23 +399,26 @@ NtUserGetGUIThreadInfo(
400
399
401
400
if (idThread )
402
401
{
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 )
405
408
{
406
- EngSetLastError (ERROR_ACCESS_DENIED );
407
- RETURN ( FALSE);
409
+ EngSetLastError (ERROR_ACCESS_DENIED );
410
+ RETURN ( FALSE);
408
411
}
409
- W32Thread = ( PTHREADINFO ) Thread -> Tcb . Win32Thread ;
412
+
410
413
Desktop = W32Thread -> rpdesk ;
411
414
412
- if (!Thread || !Desktop )
415
+ // Check Desktop and it must be the same as current.
416
+ if ( !Desktop || Desktop != pti -> rpdesk )
413
417
{
414
- if (Thread )
415
- ObDereferenceObject (Thread );
416
- EngSetLastError (ERROR_ACCESS_DENIED );
417
- RETURN ( FALSE);
418
+ EngSetLastError (ERROR_ACCESS_DENIED );
419
+ RETURN ( FALSE);
418
420
}
419
-
421
+
420
422
if ( W32Thread -> MessageQueue )
421
423
MsgQueue = W32Thread -> MessageQueue ;
422
424
else
@@ -480,9 +482,6 @@ NtUserGetGUIThreadInfo(
480
482
SafeGui .rcCaret .right = SafeGui .rcCaret .left + CaretInfo -> Size .cx ;
481
483
SafeGui .rcCaret .bottom = SafeGui .rcCaret .top + CaretInfo -> Size .cy ;
482
484
483
- if (idThread )
484
- ObDereferenceObject (Thread );
485
-
486
485
Status = MmCopyToCaller (lpgui , & SafeGui , sizeof (GUITHREADINFO ));
487
486
if (!NT_SUCCESS (Status ))
488
487
{
0 commit comments