RtlValidAcl

UINT8 __stdcall RtlValidAcl(ACL *Acl){
  unsigned __int16 *p_AclSize; 
  unsigned int v3; 
  ACE_HEADER *v4; 
  int v5; 
  ACE_HEADER *v6; 
  WORD *p_AceSize; 
  unsigned __int64 v8; 
  unsigned int AceType; 
  __int64 AceFlags; 
  if( (unsigned __int8)(Acl->AclRevision - 2) <= 2u )
  {
    p_AclSize = &Acl->AclSize;
    if( (unsigned __int16 *)(((unsigned __int64)&Acl->AclSize + 1) & 0xFFFFFFFFFFFFFFFEui64) == &Acl->AclSize
      && *p_AclSize >= 8u )
    {
      v3 = 0;
      v4 = (ACE_HEADER *)&Acl[1];
      if( !Acl->AceCount )
        return 1;
      v5 = 1730063;
      while( 1 )
      {
        v6 = (ACE_HEADER *)((char *)Acl + *p_AclSize);
        if( &v4[1] >= v6 )
          break;
        p_AceSize = &v4->AceSize;
        if( (WORD *)(((unsigned __int64)&v4->AceSize + 1) & 0xFFFFFFFFFFFFFFFEui64) != &v4->AceSize )
          break;
        v8 = *p_AceSize;
        if( (ACE_HEADER *)((char *)v4 + v8) > v6 )
          break;
        AceType = v4->AceType;
        if( (unsigned __int8)AceType <= 0x14u && _bittest(&v5, AceType) )
        {
          if( ((v8 + 3) & 0xFFFFFFFFFFFFFFFCui64) != v8 )
            return 0;
          if( (unsigned int)v8 < 0x10 )
            return 0;
          if( v4[2].AceType != 1 )
            return 0;
          AceFlags = v4[2].AceFlags;
          if( (unsigned __int8)AceFlags > 0xFu || v8 < 4 * AceFlags + 16 )
            return 0;
        }
        else if( (_BYTE)AceType == 4 )
        {
          if( Acl->AclRevision < 3u || !RtlpValidCompoundAce(v4) )
            return 0;
        }
        else if( (unsigned __int8)(AceType - 5) <= 3u
               || (unsigned __int8)(AceType - 11) <= 1u
               || (unsigned __int8)(AceType - 15) <= 1u )
        {
          if( Acl->AclRevision < 4u || !RtlpValidObjectAce(v4) )
            return 0;
        }
        else if( (_BYTE)AceType == 18 )
        {
          if( !RtlpValidAttributeAce(v4) )
            return 0;
        }
        else if( (_BYTE)AceType == 21 )
        {
          if( !RtlpValidAccessFilterAce((INT64)v4) )
            return 0;
        }
        else if( (unsigned int)v8 < 4 )
        {
          return 0;
        }
        ++v3;
        v4 = (ACE_HEADER *)((char *)v4 + *p_AceSize);
        if( v3 >= Acl->AceCount )
          return 1;
      }
    }
  }
  return 0;
}

Referenced by:

CMFCreateSecurityDescriptor
RtlAddAccessFilterAce
RtlAddAce
RtlAddMandatoryAce
RtlAddProcessTrustLabelAce
RtlAddResourceAttributeAce
RtlDeleteAce
RtlValidRelativeSecurityDescriptor
RtlValidSecurityDescriptor
RtlpAddKnownAce
RtlpAddKnownObjectAce
SddlAddAccessFilterAce
SddlAddMandatoryAce
SddlAddProcessTrustLabelAce
SddlAddScopedPolicyIDAce
SeCaptureSecurityDescriptor
SeValidSecurityDescriptor
SepCheckAcl