KeForceResumeProcess
VOID __stdcall KeForceResumeProcess(_EPROCESS *TargetProcess){
_LIST_ENTRY *p_ThreadListHead;
UINT8 OldIrql;
_KPRCB *CurrentPrcb;
unsigned int *p_ProcessLock;
_LIST_ENTRY *i;
p_ThreadListHead = &TargetProcess->Pcb.ThreadListHead;
OldIrql = KeGetCurrentIrql();
__writecr8(2ui64);
CurrentPrcb = KeGetCurrentPrcb();
p_ProcessLock = &TargetProcess->Pcb.ProcessLock;
ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)&TargetProcess->Pcb.ProcessLock);
if( TargetProcess->Pcb.FreezeCount + (((unsigned __int32)TargetProcess->Pcb._bf_0 >> 3) & 1) )
{
_interlockedbittestandreset(&TargetProcess->Pcb.ProcessFlags, 3u);
TargetProcess->Pcb.FreezeCount = 0;
for( i = p_ThreadListHead->Flink; i != p_ThreadListHead; i = i->Flink )
KiThawSingleThread(CurrentPrcb, (_KTHREAD *)&i[-48].Blink, 1u);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)p_ProcessLock);
KiExitDispatcher(CurrentPrcb, 0i64, AdjustUnwait, 0i64, OldIrql);
}
else
{
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&TargetProcess->Pcb.ProcessLock);
__writecr8(OldIrql);
}
}Referenced by:
MiReAcquireCommitFailWorker
PsFreezeProcess
PspExitThread
PspTerminateProcess