KeThawProcess
VOID __stdcall KeThawProcess(_EPROCESS *TargetProcess, UINT8 DeepFreeze){
_LIST_ENTRY *p_ThreadListHead;
UINT8 OldIrql;
unsigned int *p_ProcessLock;
UINT64 v7;
unsigned int FreezeCount;
unsigned __int32 v9;
_LIST_ENTRY *i;
_LIST_ENTRY *j;
_LIST_ENTRY **p_Blink;
struct _KPRCB *Prcb;
p_ThreadListHead = &TargetProcess->Pcb.ThreadListHead;
OldIrql = KeGetCurrentIrql();
__writecr8(2ui64);
p_ProcessLock = &TargetProcess->Pcb.ProcessLock;
Prcb = KeGetCurrentPrcb();
v7 = 0i64;
ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)&TargetProcess->Pcb.ProcessLock);
FreezeCount = TargetProcess->Pcb.FreezeCount;
v9 = FreezeCount + (((unsigned __int32)TargetProcess->Pcb._bf_0 >> 3) & 1);
if( v9 )
{
if( DeepFreeze )
{
_interlockedbittestandreset(&TargetProcess->Pcb.ProcessFlags, 3u);
v7 = KiQueryUnbiasedInterruptTime(0) - TargetProcess->Pcb.DeepFreezeStartTime;
}
else
{
TargetProcess->Pcb.FreezeCount = FreezeCount - 1;
}
}
if( DeepFreeze && (TargetProcess->Pcb._bf_0 & 0x10) != 0 )
{
for( i = p_ThreadListHead->Flink; i != p_ThreadListHead; i = i->Flink )
i[-32].Flink = (_LIST_ENTRY *)((char *)i[-32].Flink + v7);
}
if( v9 == 1 )
{
for( j = p_ThreadListHead->Flink; j != p_ThreadListHead; j = j->Flink )
{
p_Blink = &j[-48].Blink;
if( DeepFreeze || (*((_DWORD *)p_Blink + 29) & 0x200000) == 0 )
KiThawSingleThread(Prcb, (_KTHREAD *)p_Blink, 0);
}
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)p_ProcessLock);
KiExitDispatcher(Prcb, 0i64, AdjustUnwait, 0i64, OldIrql);
}
else
{
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&TargetProcess->Pcb.ProcessLock);
__writecr8(OldIrql);
}
}Referenced by:
PsThawProcess