SepCreateClientSecurityEx

NTSTATUS __fastcall SepCreateClientSecurityEx(
        VOID *Token,
        __int64 a2,
        char a3,
        int a4,
        char a5,
        int a6,
        char a7,
        __int64 a8,
        char a9,
        VOID **a10,
        __int64 a11){
  char v12; 
  _QWORD *SourceName; 
  int v15; 
  __int64 v16; 
  char v17; 
  NTSTATUS result; 
  bool v19; 
  UINT8 v20; 
  _ETHREAD *CurrentThread; 
  _EPROCESS *Process; 
  _ADAPTER_OBJECT *v23; 
  _ADAPTER_OBJECT *v24; 
  _TOKEN *v25; 
  NTSTATUS AnonymousToken; 
  __int64 v27; 
  UINT8 v28; 
  _EJOB *CurrentServerSilo; 
  VOID **DuplicateToken; 
  VOID *v31; 
  _EJOB *ServerSilo; 
  _TOKEN *DesiredAnonymousLowboxToken; 

  v12 = 0;
  v31 = 0i64;
  DesiredAnonymousLowboxToken = 0i64;
  SourceName = Token;
  if( *(_BYTE *)(a2 + 8) >= 2u )
    return -1073741811;
  v15 = *(_DWORD *)(a2 + 4);
  if( (unsigned int)v15 > 3 )
    return -1073741659;
  if( a4 == 2 )
  {
    if( v15 > a6 )
    {
      if( !a7 )
        return -1073741659;
      v12 = 1;
    }
    if( (unsigned int)a6 > 1 && (!a3 || a6 == 3) )
    {
      v19 = a5 || *(_BYTE *)(a2 + 9);
      v16 = a11;
      *(_BYTE *)(a11 + 25) = v19;
      if( !v12 )
        goto LABEL_5;
LABEL_28:
      if( (*((_DWORD *)Token + 50) & 0x4000) == 0 )
      {
        if( a8 )
        {
          CurrentThread = (_ETHREAD *)KeGetCurrentThread();
          if( (_ETHREAD *)a8 == CurrentThread )
            Process = CurrentThread->Tcb.ApcState.Process;
          else
            Process = *(_EPROCESS **)(a8 + 544);
          v23 = (_ADAPTER_OBJECT *)PsReferencePrimaryToken(Process);
          v24 = v23;
          if( ((__int64)v23->WaitQueueEntry[2].Blink & 0x4000) != 0 )
            v25 = (_TOKEN *)v23;
          else
            v25 = 0i64;
          AnonymousToken = SepGetAnonymousToken(v25, &DesiredAnonymousLowboxToken);
          HalPutDmaAdapter(v24);
LABEL_35:
          if( AnonymousToken < 0 )
            return AnonymousToken;
          SourceName = DesiredAnonymousLowboxToken->TokenSource.SourceName;
          LODWORD(DuplicateToken) = 0;
          result = ObInsertObjectEx(DesiredAnonymousLowboxToken, 0i64, 0i64, 0i64, (UINT64)DuplicateToken, 0i64, 0i64);
          if( result >= 0 )
          {
            *(_QWORD *)v16 = 12i64;
            *(_BYTE *)(v16 + 8) = 0;
            v17 = *(_BYTE *)(a2 + 9);
            *(_BYTE *)(v16 + 24) = 0;
            goto LABEL_9;
          }
          return result;
        }
        Token = 0i64;
      }
      AnonymousToken = SepGetAnonymousToken((_TOKEN *)Token, &DesiredAnonymousLowboxToken);
      goto LABEL_35;
    }
    if( a7 )
    {
      v16 = a11;
      goto LABEL_28;
    }
    return -1073741659;
  }
  v16 = a11;
  *(_BYTE *)(a11 + 25) = *(_BYTE *)(a2 + 9);
LABEL_5:
  if( *(_BYTE *)(a2 + 8) )
  {
    *(_BYTE *)(v16 + 24) = 1;
    if( a3 )
      SeGetTokenControlInformation(Token, (_TOKEN_CONTROL *)(v16 + 28));
LABEL_8:
    *(_DWORD *)v16 = 12;
    *(_DWORD *)(v16 + 4) = *(_DWORD *)(a2 + 4);
    *(_BYTE *)(v16 + 8) = *(_BYTE *)(a2 + 8);
    v17 = *(_BYTE *)(a2 + 9);
LABEL_9:
    *(_QWORD *)(v16 + 16) = SourceName;
    *(_BYTE *)(v16 + 9) = v17;
    result = 0;
    *(_BYTE *)(v16 + 26) = a3;
    return result;
  }
  *(_BYTE *)(v16 + 24) = 0;
  if( PsIsCurrentThreadInServerSilo() )
  {
    v27 = SourceName[3];
    ServerSilo = 0i64;
    if( SeQueryServerSiloToken(SourceName, (PFLUSH_ADAPTER_BUFFERS_EX *)&ServerSilo) >= 0
      && PsIsHostSilo(ServerSilo)
      && v27 == 999 )
    {
      CurrentServerSilo = PsGetCurrentServerSilo();
      result = SepCopyClientTokenAndSetSilo(
                 SourceName,
                 *(_SECURITY_IMPERSONATION_LEVEL *)(a2 + 4),
                 CurrentServerSilo,
                 &v31);
    }
    else
    {
      result = SeCopyClientToken(SourceName, *(_SECURITY_IMPERSONATION_LEVEL *)(a2 + 4), v28, 0i64, 0i64);
    }
  }
  else
  {
    result = SeCopyClientToken(
               SourceName,
               *(_SECURITY_IMPERSONATION_LEVEL *)(a2 + 4),
               v20,
               (VOID *)(unsigned __int8)a9,
               a10);
  }
  SourceName = v31;
  if( result >= 0 )
    goto LABEL_8;
  return result;
}

Referenced by:

SeCreateClientSecurity
SeCreateClientSecurityEx
SeCreateClientSecurityFromSubjectContext
SeCreateClientSecurityFromSubjectContextEx