PsSuspendProcess

INT64 __stdcall PsSuspendProcess(_EPROCESS *Process){
  _ETHREAD *CurrentThread; 
  struct _EX_RUNDOWN_REF *v3; 
  _QWORD *NextProcessThread; 
  unsigned int v5; 
  _QWORD *v6; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  v3 = (struct _EX_RUNDOWN_REF *)((char *)Process + 1112);
  if( ExAcquireRundownProtection((PEX_RUNDOWN_REF)Process + 139) )
  {
    NextProcessThread = PsGetNextProcessThread((__int64)Process, 0i64);
    v5 = 0;
    while( 1 )
    {
      v6 = NextProcessThread;
      if( !NextProcessThread )
        break;
      if( (*((_DWORD *)NextProcessThread + 29) & 0x200000) == 0 )
        PsSuspendThread((__int64)NextProcessThread, 0i64);
      NextProcessThread = PsGetNextProcessThread((__int64)Process, v6);
    }
    ExReleaseRundownProtection(v3);
  }
  else
  {
    v5 = -1073741558;
  }
  if( (*((_DWORD *)Process + 543) & 0x80000) != 0 )
    EtwTiLogSuspendResumeProcess(v5, (INT64)CurrentThread, (INT64)Process, 0i64);
  KeLeaveCriticalRegionThread((__int64)CurrentThread);
  return v5;
}

Referenced by:

NtSuspendProcess
PspFreezeProcessWorker