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