SeExchangePrimaryToken

NTSTATUS __stdcall SeExchangePrimaryToken(_EPROCESS *Process, VOID *NewAccessToken, VOID **OldAccessToken){
  bool v4; 
  _ADAPTER_OBJECT *SessionObjectById; 
  unsigned int SessionId; 
  NTSTATUS v9; 
  _ETHREAD *CurrentThread; 
  unsigned int v11; 
  INT64 v12; 
  int v13; 
  VOID *v14; 
  UINT64 v15; 
  _QWORD *v16; 
  INT64 v17; 
  _ETHREAD *v18; 
  NTSTATUS result; 
  _ADAPTER_OBJECT *v20; 
  UINT64 v21; 
  VOID *v22; 
  signed __int32 v23[8]; 
  UINT8 TokenChanged; 
  PADAPTER_OBJECT DmaAdapter; 

  v4 = *((_DWORD *)NewAccessToken + 48) == 1;
  DmaAdapter = 0i64;
  SessionObjectById = 0i64;
  TokenChanged = 0;
  if( !v4 )
    return -1073741656;
  SessionId = MmGetSessionIdEx(Process);
  if( SessionId != -1 && !SeTokenDoesNotTrackSessionObject )
    SessionObjectById = (_ADAPTER_OBJECT *)MmGetSessionObjectById(SessionId);
  v9 = MmGetSessionId(Process);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v11 = v9;
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquireResourceExclusiveLite(*((_QWORD *)NewAccessToken + 6), 1, v12);
  _InterlockedOr(v23, 0);
  if( *((_BYTE *)NewAccessToken + 204) )
  {
    _InterlockedOr(v23, 0);
    ExReleaseResourceLite(*((PERESOURCE *)NewAccessToken + 6));
    KeLeaveCriticalRegionThread(KeGetCurrentThread());
    if( SessionObjectById )
      HalPutDmaAdapter(SessionObjectById);
    return -1073741525;
  }
  else
  {
    *((_BYTE *)NewAccessToken + 204) = 1;
    v13 = SepSetTrustLevelForProcessToken(NewAccessToken, Process, &TokenChanged);
    if( v13 < 0 )
    {
      _InterlockedOr(v23, 0);
      ExReleaseResourceLite(*((PERESOURCE *)NewAccessToken + 6));
      KeLeaveCriticalRegionThread(KeGetCurrentThread());
      if( !SessionObjectById )
        return v13;
      v20 = SessionObjectById;
LABEL_21:
      HalPutDmaAdapter(v20);
      return v13;
    }
    if( (*((_DWORD *)NewAccessToken + 50) & 0x4000) != 0 )
    {
      v21 = *((unsigned int *)NewAccessToken + 30);
      if( (_DWORD)v21 != v11 )
      {
        SepDereferenceLowBoxNumberEntry(v21, *((PVOID *)NewAccessToken + 135));
        *((_QWORD *)NewAccessToken + 135) = 0i64;
        SepSetTokenSessionById((__int64)NewAccessToken, v11, 1, (__int64)SessionObjectById, &DmaAdapter);
        v22 = (VOID *)*((_QWORD *)NewAccessToken + 98);
        *((_DWORD *)NewAccessToken + 30) = v11;
        v13 = SepSetTokenLowboxNumber((_TOKEN *)NewAccessToken, v22);
        if( v13 < 0 )
        {
          _InterlockedOr(v23, 0);
          ExReleaseResourceLite(*((PERESOURCE *)NewAccessToken + 6));
          KeLeaveCriticalRegionThread(KeGetCurrentThread());
          v20 = DmaAdapter;
          if( !DmaAdapter )
            return v13;
          goto LABEL_21;
        }
      }
    }
    SepSetTokenSessionById((__int64)NewAccessToken, v11, 1, (__int64)SessionObjectById, &DmaAdapter);
    *((_DWORD *)NewAccessToken + 30) = v11;
    _InterlockedOr(v23, 0);
    ExReleaseResourceLite(*((PERESOURCE *)NewAccessToken + 6));
    KeLeaveCriticalRegionThread(KeGetCurrentThread());
    if( DmaAdapter )
      HalPutDmaAdapter(DmaAdapter);
    if( SeAuditingWithTokenForSubcategory(133i64, 0i64) )
      SepAuditAssignPrimaryToken(Process, NewAccessToken, v14);
    ObfReferenceObject(NewAccessToken);
    v16 = ObFastReplaceObject(&Process->Token, NewAccessToken, v15);
    if( v16 )
    {
      v18 = (_ETHREAD *)KeGetCurrentThread();
      --v18->Tcb.KernelApcDisable;
      ExAcquireResourceExclusiveLite(v16[6], 1, v17);
      _InterlockedOr(v23, 0);
      *((_BYTE *)v16 + 204) = 0;
      _InterlockedOr(v23, 0);
      ExReleaseResourceLite((PERESOURCE)v16[6]);
      KeLeaveCriticalRegionThread(KeGetCurrentThread());
      result = 0;
      *OldAccessToken = v16;
    }
    else
    {
      return -1073741700;
    }
  }
  return result;
}

Referenced by:

PspAssignPrimaryToken