KeForceResumeThread
VOID __fastcall KeForceResumeThread(_ETHREAD *Thread){
UINT8 OldIrql;
_KPRCB *CurrentPrcb;
volatile signed __int32 *v4;
OldIrql = KeGetCurrentIrql();
__writecr8(2ui64);
CurrentPrcb = KeGetCurrentPrcb();
v4 = (volatile signed __int32 *)Thread->Tcb.gap2E0;
KiAcquireKobjectLockSafe(Thread->Tcb.gap2E0);
if( Thread->Tcb.SuspendCount + (((unsigned int)*(&Thread->Tcb.MiscFlags + 1) >> 14) & 1) )
{
_interlockedbittestandreset((volatile signed __int32 *)&Thread->Tcb.116 + 1, 0xEu);
Thread->Tcb.SuspendCount = 0;
}
KiResumeThread(&Thread->Tcb, CurrentPrcb, 1u);
_InterlockedAnd(v4, 0xFFFFFF7F);
KiExitDispatcher(CurrentPrcb, 0i64, AdjustUnwait, 0i64, OldIrql);
}Referenced by:
KeRequestTerminationThread
KeRundownApcQueues
NtTerminateProcess
PspInsertThread