RtlpComputeMergedAcl

NTSTATUS __stdcall RtlpComputeMergedAcl(
        _BYTE *CurrentAcl,
        UINT64 CurrentGenericControl,
        _ACL *ModificationAcl,
        UINT64 ModificationGenericControl,
        VOID *ClientOwnerSid,
        VOID *ClientGroupSid,
        _GENERIC_MAPPING *GenericMapping,
        _SEP_ACL_TYPE AclType,
        _ACL **NewAcl,
        UINT64 *NewGenericControl){
  unsigned int v10; 
  unsigned int v11; 
  unsigned int v13; 
  int v15; 
  VOID **AclBuffer; 
  int v17; 
  __int64 AclBufferSize[2]; 

  v10 = 1024;
  v11 = ModificationGenericControl;
  LODWORD(AclBufferSize[0]) = 1024;
  v13 = CurrentGenericControl;
  v15 = 0;
  while( 1 )
  {
    AclBuffer = ExAllocatePoolWithTag(1ui64, v10, 1665230163i64);
    *NewAcl = (_ACL *)AclBuffer;
    if( !AclBuffer )
      break;
    v17 = RtlpComputeMergedAcl2(
            CurrentAcl,
            v13,
            ModificationAcl,
            v11,
            ClientOwnerSid,
            ClientGroupSid,
            GenericMapping,
            AclType,
            (UINT64 *)AclBufferSize,
            (PACL)AclBuffer,
            NewGenericControl);
    if( v17 >= 0 )
    {
      if( !LODWORD(AclBufferSize[0]) )
      {
        ExFreePoolWithTag(*NewAcl, 0);
        *NewAcl = 0i64;
      }
      return v17;
    }
    ExFreePoolWithTag(*NewAcl, 0);
    *NewAcl = 0i64;
    if( v17 != -1073741789 )
      return v17;
    if( (unsigned int)++v15 >= 2 )
      return v17;
    v10 = AclBufferSize[0];
  }
  return -1073741801;
}

Referenced by:

RtlpNewSecurityObject
RtlpSetSecurityObject