RtlpGenerateInheritedAce
INT64 __stdcall RtlpGenerateInheritedAce(
_ACE_HEADER *OldAce,
UINT8 IsDirectoryObject,
UINT8 AutoInherit,
PVOID ClientOwnerSid,
PVOID ClientGroupSid,
PVOID ServerOwnerSid,
PVOID ServerGroupSid,
_GENERIC_MAPPING *GenericMapping,
_GUID **pNewObjectType,
UINT64 GuidCount,
UINT64 *NewAceLength,
_ACL *NewAcl,
UINT64 *NewAceExtraLength,
UINT8 *ObjectAceInherited){
UINT8 *v14;
unsigned int v15;
UINT8 v16;
unsigned int v18;
unsigned int v19;
unsigned int v20;
UINT8 v21;
_ACL *v22;
unsigned int v23;
_ACL *v24;
BYTE v25;
BYTE AceFlags;
unsigned int AceSize;
__int64 v29;
unsigned __int8 v30;
UINT64 v31;
UINT8 EffectiveAceMapped;
unsigned int v33;
UINT8 *dst;
_ACL *v35;
UINT8 AclOverflowed;
UINT8 v37;
VOID *ClientOwnerSida;
ClientOwnerSida = ClientOwnerSid;
v37 = AutoInherit;
v14 = ObjectAceInherited;
v15 = 0;
v16 = 0;
v35 = 0i64;
v33 = 0;
EffectiveAceMapped = 0;
*ObjectAceInherited = 0;
v18 = 0;
AclOverflowed = 0;
v19 = 0;
v20 = 0;
v21 = 0;
if( IsDirectoryObject )
{
AceFlags = OldAce->AceFlags;
if( (AceFlags & 4) == 0 && ((AceFlags & 1) != 0 || (AceFlags & 2) != 0) )
v21 = 1;
}
v22 = NewAcl;
v23 = 0;
dst = 0i64;
v24 = NewAcl + 1;
if( NewAcl->AceCount )
{
while( v24 < (_ACL *)((char *)NewAcl + NewAcl->AclSize) )
{
++v23;
v24 = (_ACL *)((char *)v24 + v24->AclSize);
if( v23 >= NewAcl->AceCount )
{
v14 = ObjectAceInherited;
goto LABEL_7;
}
}
return 3221225597i64;
}
LABEL_7:
if( v24 > (_ACL *)((char *)NewAcl + NewAcl->AclSize) )
return 3221225597i64;
dst = (UINT8 *)v24;
if( !v24 )
return 3221225597i64;
v25 = OldAce->AceFlags;
if( IsDirectoryObject )
{
if( (v25 & 2) == 0 )
goto LABEL_11;
}
else if( (v25 & 1) == 0 )
{
goto LABEL_11;
}
LODWORD(v31) = GuidCount;
v35 = v24;
if( !RtlpCopyEffectiveAce(
OldAce,
v37,
v21,
ClientOwnerSida,
ClientGroupSid,
ServerOwnerSid,
ServerGroupSid,
GenericMapping,
pNewObjectType,
v31,
(VOID **)&dst,
(UINT64 *)&v33,
NewAcl,
v14,
&EffectiveAceMapped,
&AclOverflowed) )
return 3221225597i64;
v20 = v33;
if( !AclOverflowed && v33 )
{
if( RtlpIsDuplicateAce((INT64)v22, (UINT8 *)v24) )
{
v19 = v33;
v20 = 0;
--v22->AceCount;
v18 = 0;
v16 = EffectiveAceMapped;
v33 = 0;
dst = (UINT8 *)v24;
goto LABEL_11;
}
v20 = v33;
}
v16 = EffectiveAceMapped;
v18 = v20;
LABEL_11:
if( v21 )
{
if( v20 && !v16 )
{
if( !AclOverflowed )
{
v29 = (__int64)v35;
v30 = v35->Sbz1 | OldAce->AceFlags & 3;
v35->Sbz1 = v30;
if( v37 )
*(_BYTE *)(v29 + 1) = v30 | 0x10;
}
goto LABEL_12;
}
if( OldAce->AceType > 8u || *(_DWORD *)&OldAce[1] )
{
v18 += OldAce->AceSize;
if( v18 <= 0xFFFF )
{
if( OldAce->AceSize > (__int64)v22 + v22->AclSize - (_QWORD)dst )
{
AclOverflowed = 1;
}
else if( !AclOverflowed )
{
memmove(dst, &OldAce->AceType, OldAce->AceSize);
dst[1] |= 8u;
++v22->AceCount;
if( v37 )
{
dst[1] |= 0x10u;
if( RtlpIsDuplicateAce((INT64)v22, dst) )
{
--v22->AceCount;
AceSize = OldAce->AceSize;
v18 -= AceSize;
if( v19 > AceSize )
AceSize = v19;
v19 = AceSize;
}
}
}
goto LABEL_12;
}
return 3221225597i64;
}
}
LABEL_12:
*(_DWORD *)NewAceLength = v18;
*(_DWORD *)NewAceExtraLength = v19;
if( AclOverflowed )
return(unsigned int)-1073741789;
return v15;
}Referenced by:
RtlpGenerateInheritAcl