KeSuspendThread
UINT64 __stdcall KeSuspendThread(_ETHREAD *Thread){
UINT8 OldIrql;
_KPRCB *CurrentPrcb;
volatile signed __int32 *v4;
unsigned int SuspendCount;
OldIrql = KeGetCurrentIrql();
__writecr8(2ui64);
CurrentPrcb = KeGetCurrentPrcb();
v4 = (volatile signed __int32 *)Thread->Tcb.gap2E0;
KiAcquireKobjectLockSafe(Thread->Tcb.gap2E0);
SuspendCount = Thread->Tcb.SuspendCount;
if( SuspendCount == 127 )
{
_InterlockedAnd(v4, 0xFFFFFF7F);
__writecr8(OldIrql);
RtlRaiseStatus(-1073741750);
}
++Thread->Tcb.SuspendCount;
if( !KiSuspendThread(&Thread->Tcb, CurrentPrcb) )
--Thread->Tcb.SuspendCount;
_InterlockedAnd(v4, 0xFFFFFF7F);
KiExitDispatcher(CurrentPrcb, 0i64, AdjustUnwait, 0i64, OldIrql);
return SuspendCount;
}Referenced by:
PopTransitionSystemPowerStateEx
PsSuspendThread
PspInsertThread