PspTerminateProcess

NTSTATUS __stdcall PspTerminateProcess(PVOID Process, PVOID CurrentThread, UINT64 Status, UINT64 Flags){
  int v4; 
  unsigned int v5; 
  ULONG_PTR v6; 
  signed __int32 v8; 
  int v9; 
  unsigned int v10; 
  NTSTATUS v11; 
  NTSTATUS v12; 

  v4 = Flags;
  v5 = Status;
  v6 = (unsigned int)CurrentThread;
  _m_prefetchw((char *)Process + 1124);
  v8 = _InterlockedOr((volatile signed __int32 *)Process + 281, 8u);
  if( (v8 & 8) != 0 )
  {
    v10 = Flags | 2;
  }
  else
  {
    KeSetProcessSchedulingGroup((_KPROCESS *)Process, 0i64);
    v9 = v4 | 4;
    if( (v8 & 0x40000000) == 0 )
      v9 = v4;
    v10 = v9;
    ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)Process + 135, 0i64);
    if( *((_DWORD *)Process + 380) && (v5 != -1073741749 || *((_DWORD *)Process + 501) == 259) )
      *((_DWORD *)Process + 501) = v5;
    if( (_InterlockedExchangeAdd64((volatile signed __int64 *)Process + 135, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((_EX_PUSH_LOCK *)Process + 135);
    KeAbPostRelease((char *)Process + 1080);
  }
  if( (*((_DWORD *)Process + 280) & 0x400) == 0 )
  {
    v11 = PspTerminateAllThreads((ULONG_PTR)Process, v6, v5, v10);
LABEL_12:
    v12 = v11;
    goto LABEL_13;
  }
  if( *((_QWORD *)&xmmword_140C1DE60 + 1) && (v10 & 8) == 0 )
  {
    v11 = (*((__int64(__fastcall **)(PVOID, _QWORD))&xmmword_140C1DE60 + 1))(Process, v5);
    goto LABEL_12;
  }
  v12 = 290;
  PspRundownSingleProcess((_EPROCESS *)Process, 0);
LABEL_13:
  if( (v8 & 8) == 0 )
    KeForceResumeProcess((_KPROCESS *)Process);
  return v12;
}

Referenced by:

NtTerminateProcess
PsTerminateProcess
PspTerminatePicoProcess