EmpEvaluateNodeLink

__int64 __fastcall EmpEvaluateNodeLink(
        __int64 a1,
        __int64 a2,
        unsigned int a3,
        __int64 a4,
        int a5,
        __int64 a6,
        int a7,
        __int64 a8,
        int a9,
        ULONGLONG a10,
        int a11){
  unsigned int v13; 
  int v14; 
  __int64 v15; 
  _QWORD *Pool; 
  unsigned int v17; 
  _QWORD *v18; 
  _DWORD *v19; 
  __int64 v20; 
  __int64 v21; 
  unsigned int v22; 
  unsigned int v23; 
  unsigned int v24; 
  unsigned int v25; 
  unsigned int v26; 
  __int64 v27; 
  int v28; 
  unsigned int v30; 
  int v31; 
  unsigned int ullMultiplicand; 
  unsigned int v34; 
  int v35; 
  ULONGLONG pullResult; 
  ULONGLONG v37; 
  unsigned int *v38; 
  unsigned int v43; 
  v37 = a10;
  v13 = a3;
  pullResult = 0i64;
  v14 = *(_DWORD *)a1;
  v15 = 0i64;
  Pool = 0i64;
  v17 = 1;
  v18 = 0i64;
  v19 = 0i64;
  v20 = 0i64;
  if( *(_DWORD *)a1 > 1u )
  {
    if( v14 != 2 )
      return v17;
    v27 = *(_QWORD *)(a1 + 8);
    v28 = EmpEvaluateNodeLink(
            *(_QWORD *)(v27 + 8),
            a2,
            a3,
            a4,
            a5,
            a6,
            a7,
            *(_QWORD *)(v27 + 24),
            *(_DWORD *)(v27 + 16),
            a10,
            a11);
    if( v28 == 1 )
      return v17;
    if( *(_BYTE *)v27 == 38 )
    {
      if( !v28 )
        return 0;
    }
    else if( v28 == 2 && *(_BYTE *)v27 == 124 )
    {
      return 2;
    }
    v31 = EmpEvaluateNodeLink(
            *(_QWORD *)(v27 + 32),
            a2,
            a3,
            a4,
            a5,
            a6,
            a7,
            *(_QWORD *)(v27 + 48),
            *(_DWORD *)(v27 + 40),
            a10,
            a11);
    if( v31 == 1 )
      return v17;
    if( *(_BYTE *)v27 == 38 )
    {
      if( v28 && v31 )
        return 2;
      v17 = 0;
    }
    if( *(_BYTE *)v27 != 124 )
      return v17;
    if( !v28 && !v31 )
      return 0;
    return 2;
  }
  v21 = *(_QWORD *)(a1 + 8);
  if( v14 )
  {
    v15 = *(_QWORD *)(a1 + 8);
    if( !*(_BYTE *)(v21 + 20) )
      return v17;
    v30 = *(_DWORD *)(v21 + 48);
    v23 = *(_DWORD *)(v21 + 40);
    v22 = *(_DWORD *)(v15 + 44);
    v43 = v30;
    v13 = a3;
  }
  else
  {
    v20 = *(_QWORD *)(a1 + 8);
    if( !*(_QWORD *)(v21 + 16) )
      return v17;
    v22 = *(_DWORD *)(v21 + 60);
    v43 = *(_DWORD *)(v21 + 64);
    v23 = *(_DWORD *)(v21 + 56);
  }
  ullMultiplicand = v22;
  v34 = v23;
  v35 = *(_DWORD *)(a1 + 16);
  if( v35 && (v38 = *(unsigned int **)(a1 + 24)) != 0i64 || (v38 = (unsigned int *)a8, v35 = a9, a8) )
  {
    if( v23 )
    {
      if( RtlULongLongMult(v23, 8ui64, &pullResult) < 0 )
        return v17;
      Pool = (_QWORD *)EmpAllocatePool(pullResult);
      if( !Pool )
        return v17;
    }
    if( ullMultiplicand )
    {
      if( RtlULongLongMult(ullMultiplicand, 4ui64, &pullResult) < 0 )
        goto LABEL_25;
      v19 = (_DWORD *)EmpAllocatePool(pullResult);
      if( !v19 )
        goto LABEL_25;
    }
    v24 = v43;
    if( v43 )
    {
      if( RtlULongLongMult(v43, 8ui64, &pullResult) < 0 || (v18 = (_QWORD *)EmpAllocatePool(pullResult)) == 0i64 )
      {
        v26 = a11;
LABEL_23:
        if( v19 )
          EmpFreePool(v19, a10, v26);
LABEL_25:
        if( Pool )
          EmpFreePool(Pool, a10, (unsigned int)a11);
        return v17;
      }
      v24 = v43;
    }
    if( EmpEvaluateParseNodeMapping(v38, v35, a2, a3, a4, a5, a6, a7, Pool, v34, v19, ullMultiplicand, v18, v24) )
    {
      if( *(_DWORD *)a1 )
        v25 = EmpEvaluateNodeLink(
                *(_QWORD *)(v15 + 96),
                (__int64)Pool,
                v34,
                (__int64)v19,
                ullMultiplicand,
                (__int64)v18,
                v43,
                0i64,
                0,
                v37,
                a11);
      else
        v25 = (*(__int64(__fastcall **)(_QWORD *, _QWORD, _QWORD *, _QWORD, _DWORD *, unsigned int, _QWORD))(v20 + 16))(
                v18,
                v43,
                Pool,
                v34,
                v19,
                ullMultiplicand,
                *(_QWORD *)(v20 + 32));
      v17 = v25;
    }
    v26 = a11;
    if( v18 )
      EmpFreePool(v18, a10, (unsigned int)a11);
    goto LABEL_23;
  }
  if( v14 )
    return(unsigned int)EmpEvaluateNodeLink(*(_QWORD *)(v15 + 96), a2, v13, a4, a5, a6, a7, 0i64, 0, a10, a11);
  else
    return(unsigned int)(*(__int64(__fastcall **)(__int64, _QWORD, __int64, _QWORD, __int64, int, _QWORD))(v20 + 16))(
                           a6,
                           (unsigned int)a7,
                           a2,
                           a3,
                           a4,
                           a5,
                           *(_QWORD *)(v20 + 32));
}

Referenced by:

EmpEvaluateNodeLink
EmpEvaluateTargetRule