EmpEvaluatePermuteRuleEntries

UINT8 __stdcall EmpEvaluatePermuteRuleEntries(
        _EMP_RULE_DB_RECORD *RuleRecord,
        UINT64 NumberOfEntryTypesToPermute,
        _EMP_ENTRY_DB_RECORD *FixEntry,
        UINT8 Reset){
  UINT8 v4; 
  unsigned int i; 
  __int64 v8; 
  UINT64 v9; 
  __int64 v10; 
  UINT8 v11; 
  _QWORD *v12; 

  v4 = 0;
  if( !(_DWORD)NumberOfEntryTypesToPermute )
    return 1;
  if( !Reset )
  {
    v9 = (unsigned int)(NumberOfEntryTypesToPermute - 1);
    v10 = *(_QWORD *)(*((_QWORD *)RuleRecord + 7) + 8i64 * (unsigned int)v9);
    if( (_DWORD)v9 )
      v11 = EmpEvaluatePermuteRuleEntries(RuleRecord, v9, FixEntry, 0);
    else
      v11 = 1;
    if( (_EMP_ENTRY_DB_RECORD *)v10 != FixEntry )
    {
      if( !v11 )
        return v4;
      v12 = *(_QWORD **)(v10 + 32);
      if( *v12 != v10 + 40 )
      {
        *(_QWORD *)(v10 + 32) = *v12;
        return v4;
      }
      *(_QWORD *)(v10 + 32) = *(_QWORD *)(v10 + 40);
    }
    if( !v11 )
      return v4;
    return 1;
  }
  for( i = 0; i < RuleRecord[12]; ++i )
  {
    v8 = *(_QWORD *)(*((_QWORD *)RuleRecord + 7) + 8i64 * i);
    if( (_EMP_ENTRY_DB_RECORD *)v8 != FixEntry )
      *(_QWORD *)(v8 + 32) = *(_QWORD *)(v8 + 40);
  }
  return v4;
}

Referenced by:

EmpEvaluatePermuteRuleEntries
EmpEvaluateUpdateRuleEvalState