NtTerminateProcess

NTSTATUS __stdcall NtTerminateProcess(PVOID ProcessHandle, INT64 ExitStatus){
  _ETHREAD *CurrentThread; 
  unsigned int v3; 
  unsigned int v4; 
  ULONG_PTR v5; 
  KPROCESSOR_MODE v6; 
  NTSTATUS result; 
  _EPROCESS *v8; 
  unsigned int v9; 
  unsigned int v10; 
  signed __int32 v11; 
  signed __int32 v12; 
  PVOID Object; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v3 = 0;
  Object = 0i64;
  v4 = ExitStatus;
  v5 = *((_QWORD *)CurrentThread + 23);
  v6 = *((_BYTE *)CurrentThread + 562);
  if( ProcessHandle )
  {
    result = ObReferenceObjectByHandleWithTag(
               ProcessHandle,
               1u,
               (POBJECT_TYPE)PsProcessType,
               v6,
               0x65547350u,
               &Object,
               0i64);
    if( result < 0 )
      return result;
    if( !v6 && (*(_BYTE *)(v5 + 992) & 1) == 0 )
      v3 = 1;
    v8 = (_EPROCESS *)Object;
  }
  else
  {
    Object = (PVOID)*((_QWORD *)CurrentThread + 23);
    v8 = (_EPROCESS *)v5;
    if( v6 != 1 && (*(_BYTE *)(v5 + 992) & 1) == 0 || (*(_DWORD *)(v5 + 2172) & 1) != 0 )
      return -1073741637;
    if( (*((_BYTE *)CurrentThread + 3) & 0x40) == 0 )
    {
      PspLockProcessExclusive(v5, (__int64)CurrentThread);
      _m_prefetchw((const void *)(v5 + 1124));
      v11 = *(_DWORD *)(v5 + 1124);
      do
      {
        v12 = v11;
        v11 = _InterlockedCompareExchange((volatile signed __int32 *)(v5 + 1124), v11 | 0x40000000, v11);
      }
      while( v12 != v11 );
      if( (v11 & 0x40000008) != 0 )
      {
        PspUnlockProcessExclusive(v5, (__int64)CurrentThread);
        PspTerminateThreadByPointer((ULONG_PTR)CurrentThread, v4, 1);
        return 0;
      }
      *((_DWORD *)CurrentThread + 325) |= 0x40u;
      if( *(_DWORD *)(v5 + 2004) == 259 )
        *(_DWORD *)(v5 + 2004) = v4;
      PspUnlockProcessExclusiveUnsafe(v5);
      v10 = PspTerminateAllThreads(v5, (ULONG_PTR)CurrentThread, v4, 0);
      goto LABEL_17;
    }
    ObfReferenceObjectWithTag((PVOID)v5, 0x65547350u);
  }
  v9 = *((_DWORD *)v8 + 272);
  --*((_WORD *)CurrentThread + 242);
  v10 = PspTerminateProcess(v8, CurrentThread, v4, v3);
  ObfDereferenceObjectWithTag(v8, 0x65547350ui64);
  if( v8 == (_EPROCESS *)v5 )
  {
    if( v6 == 1 || (*(_BYTE *)(v5 + 992) & 1) != 0 )
    {
      _InterlockedOr((volatile signed __int32 *)CurrentThread + 324, 1u);
      KeForceResumeThread((_KTHREAD *)CurrentThread);
      KeLeaveCriticalRegionThread((__int64)CurrentThread);
      PspExitThread(v4);
      __debugbreak();
    }
  }
  else
  {
    PspLogAuditTerminateRemoteProcessEvent(v9, v10);
  }
LABEL_17:
  KeLeaveCriticalRegionThread((__int64)CurrentThread);
  return v10;
}

Referenced by:

No references.