PsSuspendThread
__int64 __fastcall PsSuspendThread(__int64 a1, _DWORD *a2){
_ETHREAD *CurrentThread;
struct _EX_RUNDOWN_REF *v5;
unsigned int v6;
int v8;
v8 = 0;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
v5 = (struct _EX_RUNDOWN_REF *)(a1 + 1272);
if( ExAcquireRundownProtection((PEX_RUNDOWN_REF)(a1 + 1272)) )
{
if( (*(_DWORD *)(a1 + 1296) & 1) != 0 )
{
v6 = -1073741749;
}
else
{
v8 = KeSuspendThread(a1);
v6 = 0;
}
ExReleaseRundownProtection(v5);
}
else
{
v6 = -1073741749;
}
if( a2 )
{
*a2 = v8;
if( !v8 && (*(_DWORD *)(*(_QWORD *)(a1 + 544) + 2172i64) & 0x100000) != 0 )
EtwTiLogSuspendResumeThread(v6, (INT64)CurrentThread, a1, 1);
}
KeLeaveCriticalRegionThread((__int64)CurrentThread);
return v6;
}Referenced by:
DbgkQueueUserExceptionReport
DbgkpPostFakeThreadMessages
NtSuspendThread
PsSuspendProcess