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