RtlpCopyAces

NTSTATUS __stdcall RtlpCopyAces(
        _ACL *Acl,
        _GENERIC_MAPPING *GenericMapping,
        _ACE_TYPE_TO_COPY AceTypeToCopy,
        UINT8 AceFlagsToReset,
        UINT8 MapSids,
        VOID *ClientOwnerSid,
        VOID *ClientGroupSid,
        VOID *ServerOwnerSid,
        VOID *ServerGroupSid,
        UINT8 IsDirectoryObject,
        UINT8 RetainInheritedAceBit,
        _SEP_ACL_TYPE AclType,
        UINT64 *NewAclSizeParam,
        _ACL *NewAcl){
  char v14; 
  _ACE_TYPE_TO_COPY v15; 
  _GENERIC_MAPPING *v16; 
  _ACL *v17; 
  unsigned __int8 v18; 
  _ACL *v19; 
  unsigned int v20; 
  int *i; 
  _ACL *v22; 
  unsigned int v23; 
  unsigned int v24; 
  _SEP_ACL_TYPE v25; 
  __int64 AclSize; 
  int v27; 
  _GENERIC_MAPPING *v28; 
  int v29; 
  unsigned int v30; 
  int v31; 
  int GenericAll; 
  int v34; 
  unsigned __int8 Sbz1; 
  VOID *v36; 
  bool v37; 
  bool v38; 
  UINT8 v39; 
  int v40; 
  size_t v41; 
  UINT64 GuidCount; 
  char v43; 
  UINT8 AclOverflowed; 
  UINT8 EffectiveAceMapped; 
  char NewAceLength[12]; 
  VOID *AcePosition; 
  _GENERIC_MAPPING *v49; 
  _ACE_TYPE_TO_COPY v50; 
  VOID *v51; 
  VOID *v52; 
  VOID *v53; 
  VOID *v54; 
  UINT64 *v55; 
  int v56; 
  unsigned __int16 v57; 

  v14 = 0;
  v15 = AceTypeToCopy;
  v54 = ClientOwnerSid;
  v16 = GenericMapping;
  v17 = Acl;
  v53 = ClientGroupSid;
  v52 = ServerOwnerSid;
  v51 = ServerGroupSid;
  v55 = NewAclSizeParam;
  v18 = NewAcl->AclRevision - 2;
  v50 = AceTypeToCopy;
  v49 = GenericMapping;
  *(_QWORD *)&NewAceLength[4] = Acl;
  v43 = 0;
  if( v18 > 2u )
    return -1073741736;
  v19 = NewAcl + 1;
  v20 = 0;
  for( i = 0i64; v20 < NewAcl->AceCount; v19 = (_ACL *)((char *)v19 + v19->AclSize) )
  {
    if( v19 >= (_ACL *)((char *)NewAcl + NewAcl->AclSize) )
      return -1073741699;
    ++v20;
  }
  if( v19 <= (_ACL *)((char *)NewAcl + NewAcl->AclSize) )
    i = (int *)v19;
  v22 = v17 + 1;
  v23 = 0;
  v24 = 0;
  if( !v17->AceCount )
  {
LABEL_37:
    *(_DWORD *)v55 = v23;
    return v14 != 0 ? 0xC0000023 : 0;
  }
  v25 = AclType;
  while( v22->AclRevision != 17 )
  {
    if( v25 == SepAclTypeMacl )
      goto LABEL_34;
LABEL_9:
    switch( v15 )
    {
      case 0:
        if( (v22->Sbz1 & 0x10) == 0 )
          break;
LABEL_12:
        if( !MapSids )
        {
          AclSize = v22->AclSize;
          if( !i || AclSize > (__int64)NewAcl + NewAcl->AclSize - (_QWORD)i )
          {
            v14 = 1;
            v43 = 1;
            i = (int *)((char *)NewAcl + NewAcl->AclSize);
            goto LABEL_33;
          }
          if( !v14 )
          {
            memmove(i, v22, v22->AclSize);
            if( (*(_BYTE *)i < 0xBu || (unsigned __int8)(*(_BYTE *)i - 13) <= 1u) && (*((_BYTE *)i + 1) & 8) == 0 )
            {
              v27 = i[1];
              v28 = v49;
              if( v27 < 0 )
              {
                v27 |= v49->GenericRead;
                i[1] = v27;
              }
              if( (v27 & 0x40000000) != 0 )
              {
                v27 |= v28->GenericWrite;
                i[1] = v27;
              }
              if( (v27 & 0x20000000) != 0 )
              {
                v27 |= v28->GenericExecute;
                i[1] = v27;
              }
              if( (v27 & 0x10000000) != 0 )
                v27 |= v28->GenericAll;
              v29 = v27 & 0xFFFFFFF;
              i[1] = v29;
              v30 = *(unsigned __int8 *)i;
              if( (unsigned __int8)v30 <= 0xAu && (v31 = 1651, _bittest(&v31, v30)) )
                GenericAll = v28->GenericAll;
              else
                GenericAll = v28->GenericAll | 0x1000000;
              i[1] = v29 & GenericAll;
            }
            *((_BYTE *)i + 1) &= ~AceFlagsToReset;
            goto LABEL_31;
          }
LABEL_63:
          i = (int *)((char *)NewAcl + NewAcl->AclSize);
          goto LABEL_33;
        }
        v34 = 0;
        Sbz1 = v22->Sbz1;
        v36 = i;
        *(_DWORD *)NewAceLength = 0;
        LODWORD(AclSize) = 0;
        EffectiveAceMapped = 0;
        AcePosition = i;
        v37 = IsDirectoryObject && (Sbz1 & 3) != 0;
        if( (Sbz1 & 8) == 0 )
        {
          v38 = 0;
          AclOverflowed = 0;
          if( RetainInheritedAceBit )
            v38 = (Sbz1 & 0x10) != 0;
          LODWORD(GuidCount) = 0;
          if( !RtlpCopyEffectiveAce(
                  (_ACE_HEADER *)v22,
                  v38,
                  v37,
                  v54,
                  v53,
                  v52,
                  v51,
                  v16,
                  0i64,
                  GuidCount,
                  &AcePosition,
                  (UINT64 *)NewAceLength,
                  NewAcl,
                  0i64,
                  &EffectiveAceMapped,
                  &AclOverflowed) )
            return -1073741699;
          if( AclOverflowed )
          {
            v14 = 1;
            v43 = 1;
          }
          else
          {
            v14 = v43;
          }
          v34 = *(_DWORD *)NewAceLength;
          LODWORD(AclSize) = *(_DWORD *)NewAceLength;
          if( !v14 && *(_DWORD *)NewAceLength )
          {
            v39 = AceFlagsToReset;
            *((_BYTE *)i + 1) &= ~AceFlagsToReset;
            v36 = AcePosition;
            v34 = *(_DWORD *)NewAceLength;
            if( !v37 )
              goto LABEL_50;
LABEL_49:
            v40 = *(_DWORD *)&v22[1].AclSize;
            v56 = 0;
            v57 = 768;
            if( !v40 )
              v40 = v22[1].Sbz2 - v57;
            if( v34 && !EffectiveAceMapped )
            {
              v17 = *(_ACL **)&NewAceLength[4];
              if( !v14 )
              {
                *((_BYTE *)i + 1) = ~v39 & (*((_BYTE *)i + 1) | v22->Sbz1 & 0x1F);
                goto LABEL_32;
              }
              goto LABEL_63;
            }
            if( v22->AclRevision > 8u || *(_DWORD *)&v22->AceCount || !v40 )
            {
              v41 = v22->AclSize;
              LODWORD(AclSize) = v41 + AclSize;
              if( (unsigned int)AclSize > 0xFFFF )
                return -1073741699;
              if( v22->AclSize > (__int64)NewAcl + NewAcl->AclSize - (_QWORD)v36 )
              {
                v14 = 1;
                v43 = 1;
              }
              else if( !v14 )
              {
                memmove(v36, v22, v41);
                v17 = *(_ACL **)&NewAceLength[4];
                *((_BYTE *)AcePosition + 1) |= 8u;
                *((_BYTE *)AcePosition + 1) &= ~AceFlagsToReset;
LABEL_31:
                v14 = v43;
                ++NewAcl->AceCount;
LABEL_32:
                i = (int *)((char *)i + (unsigned int)AclSize);
LABEL_33:
                v23 += AclSize;
                v15 = v50;
                break;
              }
            }
            else
            {
LABEL_50:
              if( !v14 )
              {
                v17 = *(_ACL **)&NewAceLength[4];
                goto LABEL_32;
              }
            }
            v17 = *(_ACL **)&NewAceLength[4];
            goto LABEL_63;
          }
          v36 = AcePosition;
        }
        v39 = AceFlagsToReset;
        goto LABEL_49;
      case 1:
        if( (v22->Sbz1 & 0x10) != 0 )
          break;
        goto LABEL_12;
      case 2:
        goto LABEL_12;
    }
LABEL_34:
    v16 = v49;
    v22 = (_ACL *)((char *)v22 + v22->AclSize);
    ++v24;
    v25 = AclType;
    if( v24 >= v17->AceCount )
      goto LABEL_35;
  }
  if( v25 != SepAclTypeMacl )
    goto LABEL_34;
  if( !RtlFindAceByType(NewAcl, 0x11ui64, 0i64) )
  {
    v14 = v43;
    v16 = v49;
    goto LABEL_9;
  }
LABEL_35:
  if( v23 <= 0xFFFF )
  {
    v14 = v43;
    goto LABEL_37;
  }
  return -1073741699;
}

Referenced by:

RtlpComputeMergedAcl2
RtlpInheritAcl2