EmpEvaluateNodeLink

__int64 __fastcall EmpEvaluateNodeLink(
        int *a1,
        __int64 a2,
        unsigned int a3,
        __int64 a4,
        int a5,
        __int64 a6,
        int a7,
        __int64 a8,
        int a9,
        UINT64 a10,
        UINT64 a11){
  unsigned int v13; 
  int v14; 
  __int64 v15; 
  _QWORD *v16; 
  unsigned int v17; 
  _QWORD *v18; 
  _DWORD *v19; 
  __int64 v20; 
  __int64 v21; 
  unsigned int v22; 
  unsigned int v23; 
  _QWORD *v24; 
  _DWORD *v25; 
  unsigned int v26; 
  _QWORD *v27; 
  unsigned int v28; 
  unsigned int v29; 
  __int64 v30; 
  int v31; 
  unsigned int v33; 
  int v34; 
  UINT64 v36; 
  UINT64 v37; 
  UINT64 v38; 
  unsigned int ullMultiplicand; 
  unsigned int v40; 
  int v41; 
  UINT64 pullResult; 
  UINT64 v43; 
  unsigned int *v44; 
  unsigned int v49; 

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