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