RtlpCopyAces

__int64 __fastcall RtlpCopyAces(
        __int64 a1,
        struct _GENERIC_MAPPING *a2,
        int a3,
        char a4,
        char a5,
        __int64 a6,
        __int64 a7,
        __int64 a8,
        __int64 a9,
        char a10,
        char a11,
        int a12,
        unsigned int *a13,
        __int64 a14){
  char v14; 
  int v15; 
  _GENERIC_MAPPING *GenericMapping; 
  __int64 v17; 
  unsigned __int8 v18; 
  unsigned __int64 v19; 
  unsigned int v20; 
  unsigned __int8 *i; 
  __int64 v22; 
  unsigned int v23; 
  unsigned int v24; 
  int v25; 
  __int64 v26; 
  int v27; 
  struct _GENERIC_MAPPING *v28; 
  int v29; 
  unsigned int v30; 
  int v31; 
  int GenericAll; 
  int v34; 
  char v35; 
  UINT8 *v36; 
  bool v37; 
  bool v38; 
  char v39; 
  __int64 v40; 
  int v41; 
  UINT64 GuidCount; 
  char v43; 
  UINT8 NewAceLength[14]; 
  UINT8 *dst; 
  struct _GENERIC_MAPPING *v47; 
  int v48; 
  VOID *ServerGroupSid; 
  VOID *ServerOwnerSid; 
  VOID *ClientGroupSid; 
  VOID *ClientOwnerSid; 
  unsigned int *v53; 
  int v54; 
  unsigned __int16 v55; 
  v14 = 0;
  v15 = a3;
  ClientOwnerSid = (VOID *)a6;
  GenericMapping = a2;
  v17 = a1;
  ClientGroupSid = (VOID *)a7;
  ServerOwnerSid = (VOID *)a8;
  ServerGroupSid = (VOID *)a9;
  v53 = a13;
  v18 = *(_BYTE *)a14 - 2;
  v48 = a3;
  v47 = a2;
  *(_QWORD *)&NewAceLength[6] = a1;
  v43 = 0;
  if( v18 > 2u )
    return 3221225560i64;
  v19 = a14 + 8;
  v20 = 0;
  for( i = 0i64; v20 < *(unsigned __int16 *)(a14 + 4); v19 += *(unsigned __int16 *)(v19 + 2) )
  {
    if( v19 >= a14 + (unsigned __int64)*(unsigned __int16 *)(a14 + 2) )
      return 3221225597i64;
    ++v20;
  }
  if( v19 <= a14 + (unsigned __int64)*(unsigned __int16 *)(a14 + 2) )
    i = (unsigned __int8 *)v19;
  v22 = v17 + 8;
  v23 = 0;
  v24 = 0;
  if( !*(_WORD *)(v17 + 4) )
  {
LABEL_37:
    *v53 = v23;
    return v14 != 0 ? 0xC0000023 : 0;
  }
  v25 = a12;
  while( *(_BYTE *)v22 != 17 )
  {
    if( v25 == 3 )
      goto LABEL_34;
LABEL_9:
    switch( v15 )
    {
      case 0:
        if( (*(_BYTE *)(v22 + 1) & 0x10) == 0 )
          break;
LABEL_12:
        if( !a5 )
        {
          v26 = *(unsigned __int16 *)(v22 + 2);
          if( !i || v26 > a14 + *(unsigned __int16 *)(a14 + 2) - (_QWORD)i )
          {
            v14 = 1;
            v43 = 1;
            i = (unsigned __int8 *)(a14 + *(unsigned __int16 *)(a14 + 2));
            goto LABEL_33;
          }
          if( !v14 )
          {
            memmove(i, (UINT8 *)v22, *(unsigned __int16 *)(v22 + 2));
            if( (*i < 0xBu || (unsigned __int8)(*i - 13) <= 1u) && (i[1] & 8) == 0 )
            {
              v27 = *((_DWORD *)i + 1);
              v28 = v47;
              if( v27 < 0 )
              {
                v27 |= v47->GenericRead;
                *((_DWORD *)i + 1) = v27;
              }
              if( (v27 & 0x40000000) != 0 )
              {
                v27 |= v28->GenericWrite;
                *((_DWORD *)i + 1) = v27;
              }
              if( (v27 & 0x20000000) != 0 )
              {
                v27 |= v28->GenericExecute;
                *((_DWORD *)i + 1) = v27;
              }
              if( (v27 & 0x10000000) != 0 )
                v27 |= v28->GenericAll;
              v29 = v27 & 0xFFFFFFF;
              *((_DWORD *)i + 1) = v29;
              v30 = *i;
              if( (unsigned __int8)v30 <= 0xAu && (v31 = 1651, _bittest(&v31, v30)) )
                GenericAll = v28->GenericAll;
              else
                GenericAll = v28->GenericAll | 0x1000000;
              *((_DWORD *)i + 1) = v29 & GenericAll;
            }
            i[1] &= ~a4;
            goto LABEL_31;
          }
LABEL_63:
          i = (unsigned __int8 *)(a14 + *(unsigned __int16 *)(a14 + 2));
          goto LABEL_33;
        }
        v34 = 0;
        v35 = *(_BYTE *)(v22 + 1);
        v36 = i;
        *(_DWORD *)&NewAceLength[2] = 0;
        LODWORD(v26) = 0;
        NewAceLength[1] = 0;
        dst = i;
        v37 = a10 && (v35 & 3) != 0;
        if( (v35 & 8) == 0 )
        {
          v38 = 0;
          NewAceLength[0] = 0;
          if( a11 )
            v38 = (v35 & 0x10) != 0;
          LODWORD(GuidCount) = 0;
          if( !RtlpCopyEffectiveAce(
                  (_ACE_HEADER *)v22,
                  v38,
                  v37,
                  ClientOwnerSid,
                  ClientGroupSid,
                  ServerOwnerSid,
                  ServerGroupSid,
                  GenericMapping,
                  0i64,
                  GuidCount,
                  (VOID **)&dst,
                  (UINT64 *)&NewAceLength[2],
                  (_ACL *)a14,
                  0i64,
                  &NewAceLength[1],
                  NewAceLength) )
            return 3221225597i64;
          if( NewAceLength[0] )
          {
            v14 = 1;
            v43 = 1;
          }
          else
          {
            v14 = v43;
          }
          v34 = *(_DWORD *)&NewAceLength[2];
          LODWORD(v26) = *(_DWORD *)&NewAceLength[2];
          if( !v14 && *(_DWORD *)&NewAceLength[2] )
          {
            v39 = a4;
            i[1] &= ~a4;
            v36 = dst;
            v34 = *(_DWORD *)&NewAceLength[2];
            if( !v37 )
              goto LABEL_50;
LABEL_49:
            v41 = *(_DWORD *)(v22 + 10);
            v54 = 0;
            v55 = 768;
            if( !v41 )
              v41 = *(unsigned __int16 *)(v22 + 14) - v55;
            if( v34 && !NewAceLength[1] )
            {
              v17 = *(_QWORD *)&NewAceLength[6];
              if( !v14 )
              {
                i[1] = ~v39 & (i[1] | *(_BYTE *)(v22 + 1) & 0x1F);
                goto LABEL_32;
              }
              goto LABEL_63;
            }
            if( *(_BYTE *)v22 > 8u || *(_DWORD *)(v22 + 4) || !v41 )
            {
              LODWORD(v26) = *(unsigned __int16 *)(v22 + 2) + (_DWORD)v26;
              if( (unsigned int)v26 > 0xFFFF )
                return 3221225597i64;
              if( *(unsigned __int16 *)(v22 + 2) > a14 + *(unsigned __int16 *)(a14 + 2) - (_QWORD)v36 )
              {
                v14 = 1;
                v43 = 1;
              }
              else if( !v14 )
              {
                memmove(v36, (UINT8 *)v22, *(unsigned __int16 *)(v22 + 2));
                v17 = *(_QWORD *)&NewAceLength[6];
                dst[1] |= 8u;
                dst[1] &= ~a4;
LABEL_31:
                v14 = v43;
                ++*(_WORD *)(a14 + 4);
LABEL_32:
                i += (unsigned int)v26;
LABEL_33:
                v23 += v26;
                v15 = v48;
                break;
              }
            }
            else
            {
LABEL_50:
              if( !v14 )
              {
                v17 = *(_QWORD *)&NewAceLength[6];
                goto LABEL_32;
              }
            }
            v17 = *(_QWORD *)&NewAceLength[6];
            goto LABEL_63;
          }
          v36 = dst;
        }
        v39 = a4;
        goto LABEL_49;
      case 1:
        if( (*(_BYTE *)(v22 + 1) & 0x10) != 0 )
          break;
        goto LABEL_12;
      case 2:
        goto LABEL_12;
    }
LABEL_34:
    GenericMapping = v47;
    v22 += *(unsigned __int16 *)(v22 + 2);
    ++v24;
    v25 = a12;
    if( v24 >= *(unsigned __int16 *)(v17 + 4) )
      goto LABEL_35;
  }
  if( v25 != 3 )
    goto LABEL_34;
  LODWORD(v40) = RtlFindAceByType((ACL *)a14, 0x11ui64, 0i64);
  if( !v40 )
  {
    v14 = v43;
    GenericMapping = v47;
    goto LABEL_9;
  }
LABEL_35:
  if( v23 <= 0xFFFF )
  {
    v14 = v43;
    goto LABEL_37;
  }
  return 3221225597i64;
}

Referenced by:

RtlpComputeMergedAcl2
RtlpInheritAcl2