EmpEvaluateTargetRule

__int64 __fastcall EmpEvaluateTargetRule(__int64 a1, __int64 a2, int a3){
  _QWORD *v4; 
  VOID *v5; 
  unsigned int v6; 
  int v7; 
  unsigned int v8; 
  unsigned int v9; 
  VOID **v10; 
  _QWORD *v11; 
  VOID *v12; 
  unsigned int v13; 
  unsigned int v14; 
  unsigned int v15; 
  _QWORD *v16; 
  __int64 v17; 
  unsigned int i; 
  int v19; 
  __int64 v20; 
  UINT64 v22; 
  unsigned int v23; 
  __int64 v24; 
  __int64 v25; 
  VOID **PoolWithTag; 
  unsigned int v27; 
  unsigned int v30; 

  v4 = 0i64;
  v25 = *(_QWORD *)(a1 + 8);
  v5 = 0i64;
  v6 = *(_DWORD *)(v25 + 40);
  v7 = *(_DWORD *)(v25 + 44);
  v8 = 1;
  v24 = *(_QWORD *)(a1 + 16);
  v9 = 0;
  PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x1000ui64, 1986350405i64);
  v10 = PoolWithTag;
  if( PoolWithTag )
    v9 = 4096;
  v23 = v9;
  v27 = v9;
  if( !v6 && !v7 )
  {
    v30 = 1;
    goto LABEL_9;
  }
  v30 = *(_DWORD *)(a1 + 24) / (v7 + v6);
  if( v6 )
  {
    LODWORD(v11) = EmpAllocatePool(8 * v6);
    v4 = v11;
    if( !v11 )
      goto LABEL_22;
  }
  if( !v7 || (LODWORD(v12) = EmpAllocatePool(4 * v7), (v5 = v12) != 0i64) )
  {
    if( !v30 )
    {
LABEL_18:
      if( v5 )
        EmpFreePool(v5, (UINT64)v10, v9);
      goto LABEL_20;
    }
LABEL_9:
    v13 = v7 + v6;
    v14 = 0;
    do
    {
      v15 = 0;
      if( v6 )
      {
        v16 = v4;
        do
        {
          v17 = v14 * v13 + v15++;
          *v16++ = *((_QWORD *)qword_140C50898 + *(unsigned int *)(v24 + 4 * v17));
        }
        while( v15 < v6 );
      }
      for( i = v6; i < v13; *((_DWORD *)v5 + v20) = v19 )
      {
        v19 = *(_DWORD *)(v24 + 4i64 * (v14 * v13 + i));
        v20 = i - v6;
        ++i;
      }
      LODWORD(v22) = v27;
      v8 = EmpEvaluateNodeLink(
             *(int **)(v25 + 96),
             (__int64)v4,
             v6,
             (__int64)v5,
             v7,
             a2,
             a3,
             0i64,
             0,
             (UINT64)PoolWithTag,
             v22);
      if( v8 - 1 <= 1 )
        break;
      ++v14;
    }
    while( v14 < v30 );
    v10 = PoolWithTag;
    v9 = v23;
    goto LABEL_18;
  }
LABEL_20:
  if( v4 )
    EmpFreePool(v4, (UINT64)v10, v9);
LABEL_22:
  if( v10 )
    ExFreePoolWithTag(v10, 0x76654D45u);
  return v8;
}

Referenced by:

EmClientRuleEvaluate
EmpEvaluateUpdateRuleEvalState