CmpBuildAdminInformation

INT64 __stdcall CmpBuildAdminInformation(TOKEN_ACCESS_INFORMATION **AdminInformation){
  INT64 *v1; 
  VOID *v2; 
  unsigned int v3; 
  _DWORD **v4; 
  unsigned int v5; 
  unsigned int v6; 
  unsigned int v7; 
  unsigned int v8; 
  int v9; 
  __int64 v10; 
  void *v11; 
  unsigned int v12; 
  unsigned int v13; 
  int v14; 
  unsigned int v15; 
  size_t v16; 
  char *TransientPoolWithTag; 
  char *v18; 
  unsigned int *v19; 
  unsigned int v20; 
  __int64 v21; 
  __int64 v22; 
  UINT64 v23; 
  __int64 v25; 
  __int64 v26; 
  _SID_AND_ATTRIBUTES *v27; 
  VOID *TokenInformation; 
  VOID *NextTargetSid; 
  PSE_EXPORTS v30; 
  _SID_AND_ATTRIBUTES Source[2]; 
  UINT64 TargetSidBufferSize; 
  NTSTATUS v34; 

  NextTargetSid = 0i64;
  LODWORD(TargetSidBufferSize) = 0;
  TokenInformation = 0i64;
  v2 = (VOID *)CmpEffectiveTokenForSubject(v1, 0i64);
  v34 = SeQueryInformationToken(v2, TokenAccessInformation, &TokenInformation);
  v3 = v34;
  if( v34 >= 0 )
  {
    v4 = (_DWORD **)TokenInformation;
    v5 = 0;
    v6 = -1;
    v7 = -1;
    v8 = **(_DWORD **)TokenInformation;
    v9 = 16 * v8;
    if( v8 )
    {
      v10 = *(_QWORD *)(*(_QWORD *)TokenInformation + 8i64);
      v30 = SeExports;
      do
      {
        v11 = *(void **)v10;
        NextTargetSid = *(VOID **)v10;
        v9 += RtlLengthSid((INT64)NextTargetSid);
        if( v6 == -1 && RtlEqualSid(v30->SeAliasAdminsSid, v11) )
        {
          v6 = v5;
        }
        else if( v7 == -1 && (*(_BYTE *)(v10 + 8) & 0x60) == 96 )
        {
          v7 = v5;
        }
        ++v5;
        v10 += 16i64;
      }
      while( v5 < v8 );
      v4 = (_DWORD **)TokenInformation;
    }
    v12 = 0;
    if( v6 == -1 )
    {
      v12 = 1;
      Source[0].Attributes = 7;
      Source[0].Sid = SeExports->SeAliasAdminsSid;
    }
    if( v7 == -1 )
    {
      v25 = v12++;
      Source[v25].Sid = SeExports->SeHighMandatorySid;
      Source[v25].Attributes = 96;
    }
    if( v12 )
    {
      v26 = v12;
      v27 = Source;
      v9 += 16 * v12;
      do
      {
        v9 += RtlLengthSid((INT64)v27->Sid);
        ++v27;
        --v26;
      }
      while( v26 );
    }
    v13 = (v9 + 7) & 0xFFFFFFF8;
    v14 = 12 * *v4[2];
    v15 = v14 + v13 + 920 - 12;
    if( !v14 )
      v15 = v13 + 920;
    v16 = v15;
    TransientPoolWithTag = (char *)CmpAllocateTransientPoolWithTag(1ui64, v15);
    v18 = TransientPoolWithTag;
    if( TransientPoolWithTag )
    {
      memset(TransientPoolWithTag, 0i64, v16);
      v19 = (unsigned int *)(v18 + 88);
      *((_QWORD *)v18 + 3) = *((_QWORD *)TokenInformation + 3);
      *((_DWORD *)v18 + 8) = *((_DWORD *)TokenInformation + 8);
      *((_DWORD *)v18 + 9) = *((_DWORD *)TokenInformation + 9);
      *((_DWORD *)v18 + 10) = *((_DWORD *)TokenInformation + 10);
      *((_DWORD *)v18 + 11) = *((_DWORD *)TokenInformation + 11) & 0xFFFF9FFF | 0x2000;
      v20 = v12 + **(_DWORD **)TokenInformation;
      *((_QWORD *)v18 + 12) = v18 + 360;
      *((_DWORD *)v18 + 22) = v20;
      RtlCopySidAndAttributesArray(
        **(unsigned int **)TokenInformation,
        *(_SID_AND_ATTRIBUTES **)(*(_QWORD *)TokenInformation + 8i64),
        v13 - 16 * v20,
        (_SID_AND_ATTRIBUTES *)(v18 + 360),
        &v18[16 * v20 + 360],
        &NextTargetSid,
        &TargetSidBufferSize);
      if( v6 != -1 )
        *(_DWORD *)(*((_QWORD *)v18 + 12) + 16i64 * v6 + 8) = 7;
      if( v7 != -1 )
        *(_DWORD *)(*((_QWORD *)v18 + 12) + 16i64 * v7 + 8) = 96;
      if( v12 )
        RtlCopySidAndAttributesArray(
          v12,
          Source,
          (unsigned int)TargetSidBufferSize,
          (_SID_AND_ATTRIBUTES *)(*((_QWORD *)v18 + 12) + 16i64 * **(unsigned int **)TokenInformation),
          NextTargetSid,
          &NextTargetSid,
          &TargetSidBufferSize);
      RtlSidHashInitialize(*((_SID_AND_ATTRIBUTES **)v18 + 12), *v19, (_SID_AND_ATTRIBUTES_HASH *)(v18 + 88));
      *(_QWORD *)v18 = v19;
      v21 = *((_QWORD *)v18 + 12) + v13;
      *(_DWORD *)v21 = 0;
      *(_QWORD *)(v21 + 8) = 0i64;
      *((_QWORD *)v18 + 1) = v21;
      v21 += 272i64;
      *(_DWORD *)v21 = 0;
      v22 = v21 + 272;
      *(_QWORD *)(v21 + 8) = 0i64;
      *((_QWORD *)v18 + 8) = v21;
      *((_QWORD *)v18 + 7) = 0i64;
      v23 = **((unsigned int **)TokenInformation + 2);
      *(_DWORD *)(v21 + 272) = v23;
      RtlCopyLuidAndAttributesArray(v23, *((_QWORD *)TokenInformation + 2) + 4i64, v21 + 276);
      *((_QWORD *)v18 + 2) = v22;
      v3 = v34;
      *AdminInformation = (TOKEN_ACCESS_INFORMATION *)v18;
    }
    else
    {
      v3 = -1073741670;
    }
  }
  if( TokenInformation )
    ExFreePoolWithTag(TokenInformation, 0);
  return v3;
}

Referenced by:

CmpCheckAdminAccess