KeFreezeProcess

VOID __stdcall KeFreezeProcess(_EPROCESS *TargetProcess, UINT8 DeepFreeze){
  UINT8 OldIrql; 
  _KPRCB *CurrentPrcb; 
  unsigned int *p_ProcessLock; 
  unsigned int FreezeCount; 
  unsigned __int32 v8; 
  _LIST_ENTRY *p_ThreadListHead; 
  _LIST_ENTRY *i; 
  _LIST_ENTRY **p_Blink; 

  OldIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  CurrentPrcb = KeGetCurrentPrcb();
  p_ProcessLock = &TargetProcess->Pcb.ProcessLock;
  ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)&TargetProcess->Pcb.ProcessLock);
  FreezeCount = TargetProcess->Pcb.FreezeCount;
  v8 = FreezeCount + (((unsigned __int32)TargetProcess->Pcb._bf_0 >> 3) & 1);
  if( DeepFreeze )
  {
    TargetProcess->Pcb.DeepFreezeStartTime = KiQueryUnbiasedInterruptTime(0);
    _interlockedbittestandset(&TargetProcess->Pcb.ProcessFlags, 3u);
  }
  else
  {
    TargetProcess->Pcb.FreezeCount = FreezeCount + 1;
  }
  if( v8 )
  {
    ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&TargetProcess->Pcb.ProcessLock);
    __writecr8(OldIrql);
  }
  else
  {
    p_ThreadListHead = &TargetProcess->Pcb.ThreadListHead;
    for( i = TargetProcess->Pcb.ThreadListHead.Flink; i != p_ThreadListHead; i = i->Flink )
    {
      p_Blink = &i[-48].Blink;
      if( DeepFreeze || (*((_DWORD *)p_Blink + 29) & 0x200000) == 0 )
        KiFreezeSingleThread(CurrentPrcb, (_KTHREAD *)p_Blink);
    }
    ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)p_ProcessLock);
    KiExitDispatcher(CurrentPrcb, 0i64, AdjustUnwait, 0i64, OldIrql);
  }
}

Referenced by:

MiReAcquireOutSwappedProcessCommit
PsFreezeProcess