RtlpComputeMergedAcl2
NTSTATUS __stdcall RtlpComputeMergedAcl2(
_BYTE *CurrentAcl,
UINT64 CurrentGenericControl,
_ACL *ModificationAcl,
UINT64 ModificationGenericControl,
VOID *ClientOwnerSid,
VOID *ClientGroupSid,
_GENERIC_MAPPING *GenericMapping,
_SEP_ACL_TYPE AclType,
UINT64 *AclBufferSize,
PACL AclBuffer,
UINT64 *NewGenericControl){
__int16 v12;
UINT64 *v13;
PACL NewAcl;
__int16 v15;
char v16;
char v17;
unsigned int AclRevision;
UINT64 *v19;
NTSTATUS result;
_SEP_ACL_TYPE v21;
bool v22;
unsigned int v23;
unsigned int v24;
__int64 v25[9];
UINT64 NewAclSizeParam;
LODWORD(NewAclSizeParam) = 0;
LODWORD(v25[0]) = 0;
v12 = CurrentGenericControl;
v13 = AclBufferSize;
NewAcl = AclBuffer;
v15 = ModificationGenericControl;
v16 = 0;
v17 = 1;
AclRevision = 2;
RtlCreateAcl(AclBuffer, (_ACL)*(unsigned int *)AclBufferSize, 2ui64, ModificationGenericControl);
v19 = NewGenericControl;
*(_DWORD *)NewGenericControl = 1024;
if( (v15 & 0x1000) != 0 )
{
*(_DWORD *)v19 = 5120;
if( ModificationAcl )
{
if( ModificationAcl->AclRevision >= 2u )
LOBYTE(AclRevision) = ModificationAcl->AclRevision;
result = RtlpCopyAces(
ModificationAcl,
GenericMapping,
2,
0x10u,
1u,
ClientOwnerSid,
ClientGroupSid,
ClientOwnerSid,
ClientGroupSid,
1u,
0,
AclType,
&NewAclSizeParam,
NewAcl);
LABEL_6:
if( result == -1073741789 )
{
v16 = 1;
result = 0;
}
if( result < 0 )
return result;
v17 = 0;
goto LABEL_30;
}
goto LABEL_30;
}
if( (v12 & 0x1000) == 0 )
{
v21 = AclType;
v22 = AclType != SepAclTypeDacl;
if( ModificationAcl )
{
if( ModificationAcl->AclRevision >= 2u )
AclRevision = ModificationAcl->AclRevision;
result = RtlpCopyAces(
ModificationAcl,
GenericMapping,
1,
0,
1u,
ClientOwnerSid,
ClientGroupSid,
ClientOwnerSid,
ClientGroupSid,
1u,
0,
AclType,
&NewAclSizeParam,
NewAcl);
if( result == -1073741789 )
{
v16 = 1;
result = 0;
}
if( result < 0 )
return result;
v17 = ModificationAcl->AceCount != 0 && v22;
}
else
{
v17 = AclType != SepAclTypeDacl;
if( AclType == SepAclTypeDacl )
return -1073741705;
}
if( CurrentAcl )
{
if( AclRevision <= (unsigned __int8)*CurrentAcl )
LOBYTE(AclRevision) = *CurrentAcl;
result = RtlpCopyAces(
(_ACL *)CurrentAcl,
GenericMapping,
0,
0,
0,
0i64,
0i64,
0i64,
0i64,
1u,
0,
v21,
(UINT64 *)v25,
NewAcl);
if( result == -1073741789 )
{
v16 = 1;
result = 0;
}
if( result < 0 )
return result;
}
goto LABEL_30;
}
if( ModificationAcl )
{
if( ModificationAcl->AclRevision >= 2u )
LOBYTE(AclRevision) = ModificationAcl->AclRevision;
result = RtlpCopyAces(
ModificationAcl,
GenericMapping,
2,
0,
1u,
ClientOwnerSid,
ClientGroupSid,
ClientOwnerSid,
ClientGroupSid,
1u,
1u,
AclType,
&NewAclSizeParam,
NewAcl);
goto LABEL_6;
}
if( AclType == SepAclTypeDacl )
return -1073741705;
LABEL_30:
v23 = NewAclSizeParam + LODWORD(v25[0]);
if( (_DWORD)NewAclSizeParam + LODWORD(v25[0]) || !v17 )
{
if( (unsigned __int64)v23 + 8 > 0xFFFF )
return -1073741699;
v24 = v23 + 8;
*(_DWORD *)v13 = v24;
if( v16 )
return -1073741789;
NewAcl->AclSize = v24;
NewAcl->AclRevision = AclRevision;
}
else
{
*(_DWORD *)v13 = 0;
}
return 0;
}Referenced by:
RtlpComputeMergedAcl