RtlpInheritAcl2
NTSTATUS __stdcall RtlpInheritAcl2(
_ACL *DirectoryAcl,
_ACL *ChildAcl,
UINT64 ChildGenericControl,
UINT8 IsDirectoryObject,
UINT8 AutoInherit,
UINT8 DefaultDescriptorForObject,
VOID *OwnerSid,
VOID *GroupSid,
VOID *ServerOwnerSid,
VOID *ServerGroupSid,
_GENERIC_MAPPING *GenericMapping,
_SEP_ACL_TYPE AclType,
_GUID **pNewObjectType,
UINT64 GuidCount,
UINT64 *AclBufferSize,
UINT8 *AclBuffer,
UINT8 *NewAclExplicitlyAssigned,
UINT64 *NewGenericControl){
char v18;
int v19;
_ACE_TYPE_TO_COPY v20;
size_t v21;
__int16 v22;
_ACL *v23;
int v24;
int v25;
UINT8 *v26;
int v27;
UINT8 v28;
UINT8 MapSids;
NTSTATUS result;
UINT8 v31;
_SEP_ACL_TYPE v32;
int v33;
UINT8 v34;
__int64 v35;
unsigned int AclRevision;
int v37;
UINT64 IsDirectoryObjecta;
UINT8 ObjectAceInherited;
char v40;
__int16 v41;
UINT64 NewAclSizeParam;
char v43[12];
VOID *FirstFree;
char v47;
v18 = 0;
v19 = 0;
NewAclSizeParam = 0x200000000i64;
memset(v43, 0, sizeof(v43));
v20 = 2;
v21 = *(_DWORD *)AclBufferSize;
v22 = ChildGenericControl;
FirstFree = 0i64;
v23 = ChildAcl;
v24 = 0;
ObjectAceInherited = 0;
v25 = 0;
v41 = 0;
v47 = 0;
v40 = 1;
if( v21 - 8 <= 0xFFF4 )
{
memset(AclBuffer, 0i64, v21);
v24 = NewAclSizeParam;
v23 = ChildAcl;
*((_WORD *)AclBuffer + 1) = v21 & 0xFFFC;
v18 = 0;
*(_WORD *)AclBuffer = 2;
*((_DWORD *)AclBuffer + 1) = 0;
}
v26 = NewAclExplicitlyAssigned;
v27 = AutoInherit != 0 ? 0x400 : 0;
*NewAclExplicitlyAssigned = 0;
*(_DWORD *)NewGenericControl = v27;
if( (v22 & 8) != 0 )
goto LABEL_40;
if( (v22 & 0x1000) != 0 )
{
v18 = 1;
v47 = 1;
*(_DWORD *)NewGenericControl = v27 | 0x1000;
}
if( (v22 & 0x1004) == 0 )
{
LABEL_40:
v31 = 0;
goto LABEL_21;
}
if( v23 )
{
if( v23->AclRevision >= 2u )
HIDWORD(NewAclSizeParam) = v23->AclRevision;
v40 = 0;
if( AutoInherit )
{
if( (v22 & 0x1000) != 0 )
{
v28 = 16;
}
else
{
v20 = 1;
v28 = 0;
}
MapSids = 1;
}
else
{
v28 = 0;
MapSids = 0;
}
result = RtlpCopyAces(
v23,
GenericMapping,
v20,
v28,
MapSids,
OwnerSid,
GroupSid,
ServerOwnerSid,
ServerGroupSid,
IsDirectoryObject,
0,
AclType,
&NewAclSizeParam,
(_ACL *)AclBuffer);
v24 = NewAclSizeParam;
v19 = NewAclSizeParam;
if( result == -1073741789 )
{
v31 = 1;
}
else
{
if( result < 0 )
return result;
v31 = 0;
}
if( DefaultDescriptorForObject && (_DWORD)NewAclSizeParam )
{
v41 = *((_WORD *)AclBuffer + 2);
if( !RtlFirstFreeAce((_ACL *)AclBuffer, &FirstFree) )
return -1073741699;
v24 = NewAclSizeParam;
}
v23 = ChildAcl;
v26 = NewAclExplicitlyAssigned;
v18 = v47;
}
else
{
if( AutoInherit )
{
v32 = AclType;
if( AclType == SepAclTypeDacl )
{
if( (v22 & 0x1004) == 4 )
return -1073741705;
v31 = 0;
goto LABEL_46;
}
v31 = 0;
goto LABEL_20;
}
v31 = 0;
}
v32 = AclType;
if( AclType == SepAclTypeDacl )
goto LABEL_46;
LABEL_20:
if( v32 != SepAclTypeSacl )
goto LABEL_21;
if( v24 || v18 )
{
LABEL_46:
*v26 = 1;
goto LABEL_21;
}
if( v23 && !v23->AceCount )
*v26 = 1;
LABEL_21:
if( (AutoInherit || (v22 & 4) != 0) && (v22 & 8) == 0 && (!AutoInherit || v18) || !DirectoryAcl )
{
v33 = NewAclSizeParam;
v34 = BYTE4(NewAclSizeParam);
LABEL_27:
v35 = (unsigned int)(v25 + v19);
if( !(_DWORD)v35 )
{
if( !*NewAclExplicitlyAssigned )
{
*(_DWORD *)AclBufferSize = 0;
return -2147483637;
}
if( v40 )
{
*(_DWORD *)AclBufferSize = 0;
return 0;
}
}
if( (unsigned __int64)(v35 + 8) <= 0xFFFF )
{
*(_DWORD *)AclBufferSize = v25 + v33 + 8;
if( v31 )
return -1073741789;
*AclBuffer = v34;
*((_WORD *)AclBuffer + 1) = v25 + v19 + 8;
return 0;
}
return -1073741699;
}
AclRevision = DirectoryAcl->AclRevision;
if( (unsigned __int8)(AclRevision - 2) > 2u )
return -1073741736;
v34 = BYTE4(NewAclSizeParam);
if( HIDWORD(NewAclSizeParam) <= AclRevision )
{
HIDWORD(NewAclSizeParam) = DirectoryAcl->AclRevision;
v34 = AclRevision;
}
LODWORD(IsDirectoryObjecta) = GuidCount;
result = RtlpGenerateInheritAcl(
DirectoryAcl,
IsDirectoryObject,
AutoInherit,
OwnerSid,
GroupSid,
ServerOwnerSid,
ServerGroupSid,
GenericMapping,
pNewObjectType,
IsDirectoryObjecta,
AclType,
v31,
(UINT64 *)v43,
(_ACL *)AclBuffer,
&ObjectAceInherited);
if( result == -1073741789 )
{
v31 = 1;
LABEL_38:
v33 = NewAclSizeParam;
if( DefaultDescriptorForObject && (_DWORD)NewAclSizeParam && ObjectAceInherited && !v31 )
{
if( !RtlFirstFreeAce((_ACL *)AclBuffer, (VOID **)&v43[4]) )
return -1073741699;
v37 = *(_DWORD *)&v43[4];
if( !*(_QWORD *)&v43[4] )
v37 = (_DWORD)AclBuffer + *((unsigned __int16 *)AclBuffer + 1);
memmove(AclBuffer + 8, FirstFree, v37 - (_DWORD)FirstFree);
*((_WORD *)AclBuffer + 2) -= v41;
v19 = 0;
}
v25 = *(_DWORD *)v43;
goto LABEL_27;
}
if( result >= 0 )
goto LABEL_38;
return result;
}Referenced by:
RtlpNewSecurityObject