RtlpApplyAclToObject

VOID __stdcall RtlpApplyAclToObject(_ACL *Acl, _GENERIC_MAPPING *GenericMapping, _GENERIC_MAPPING *ptr32){
  unsigned int v5; 
  _ACL *v6; 
  int v7; 
  int v8; 
  int v9; 
  unsigned int AclRevision; 
  unsigned int GenericAll; 

  if( Acl )
  {
    v5 = 0;
    v6 = Acl + 1;
    if( Acl->AceCount )
    {
      v7 = 1651;
      do
      {
        if( (v6->AclRevision < 0xBu || (unsigned __int8)(v6->AclRevision - 13) <= 1u) && (v6->Sbz1 & 8) == 0 )
        {
          v8 = *(_DWORD *)&v6->AceCount;
          if( v8 < 0 )
          {
            v8 |= GenericMapping->GenericRead;
            *(_DWORD *)&v6->AceCount = v8;
          }
          if( (v8 & 0x40000000) != 0 )
          {
            v8 |= GenericMapping->GenericWrite;
            *(_DWORD *)&v6->AceCount = v8;
          }
          if( (v8 & 0x20000000) != 0 )
          {
            v8 |= GenericMapping->GenericExecute;
            *(_DWORD *)&v6->AceCount = v8;
          }
          if( (v8 & 0x10000000) != 0 )
            v8 |= GenericMapping->GenericAll;
          v9 = v8 & 0xFFFFFFF;
          *(_DWORD *)&v6->AceCount = v9;
          AclRevision = v6->AclRevision;
          if( (unsigned __int8)AclRevision <= 0xAu && _bittest(&v7, AclRevision) )
            GenericAll = GenericMapping->GenericAll;
          else
            GenericAll = GenericMapping->GenericAll | 0x1000000;
          *(_DWORD *)&v6->AceCount = v9 & GenericAll;
        }
        ++v5;
        v6 = (_ACL *)((char *)v6 + v6->AclSize);
      }
      while( v5 < Acl->AceCount );
    }
  }
}

Referenced by:

ExpWnfSpecializeSecurityDescriptor
RtlpNewSecurityObject
RtlpSetSecurityObject