HvlpComputeLpComparisonMetrics

NTSTATUS __stdcall HvlpComputeLpComparisonMetrics(UINT64 HalLpCount, UINT64 HalLpIndex){
  unsigned int v2; 
  unsigned int v3; 
  unsigned int v4; 
  unsigned int v6; 
  __int64 v7; 
  unsigned int v8; 
  NTSTATUS result; 
  int v10; 
  int v11; 
  int v12; 
  int v13; 
  int v14; 
  unsigned int v15; 
  UINT64 v16; 
  unsigned int v17; 
  __int64 v18; 
  __int64 v19; 
  unsigned int v20; 
  unsigned int v21; 
  int v22; 
  int v23; 
  v20 = HalLpCount;
  v3 = v2;
  v21 = 0;
  v4 = HalLpCount;
  v6 = 0;
  v7 = 5i64 * v2;
  *(_DWORD *)(HalLpIndex + 8 * v7 + 20) = -1;
  *(_DWORD *)(HalLpIndex + 8 * v7 + 16) = 0;
  *(_QWORD *)(HalLpIndex + 8 * v7 + 24) = 0i64;
  *(_QWORD *)(HalLpIndex + 8 * v7 + 32) = 0i64;
  v8 = *(_DWORD *)(HalLpIndex + 40i64 * v2 + 4);
  result = v8 >> 4;
  v10 = ~(*((_DWORD *)KeGetCurrentPrcb() + 39) * *((_DWORD *)KeGetCurrentPrcb() + 38) - 1);
  v11 = ~(*((_DWORD *)KeGetCurrentPrcb() + 39) - 1);
  v12 = (unsigned __int16)(v8 >> 4);
  v13 = v11 & v8;
  v23 = v12;
  v14 = v10 & v8;
  v22 = v13;
  if( (_DWORD)HalLpCount )
  {
    v15 = v21;
    v16 = HalLpIndex + 4;
    do
    {
      if( v6 != v3 )
      {
        result = *(unsigned __int16 *)(HalLpIndex + 8 * v7 + 8);
        if( *(_WORD *)(v16 + 4) == (_WORD)result && v6 < v3 )
          ++*(_DWORD *)(HalLpIndex + 8 * v7 + 36);
        if( *(_BYTE *)(v16 - 3) )
        {
          if( *(_WORD *)(v16 + 8) == *(_WORD *)(HalLpIndex + 8 * v7 + 12) )
            ++*(_DWORD *)(HalLpIndex + 8 * v7 + 16);
          v17 = *(_DWORD *)v16;
          if( (v10 & *(_DWORD *)v16) == v14 )
          {
            ++*(_DWORD *)(HalLpIndex + 8 * v7 + 24);
            v17 = *(_DWORD *)v16;
          }
          if( (v11 & v17) == v13 )
          {
            ++*(_DWORD *)(HalLpIndex + 8 * v7 + 28);
            v17 = *(_DWORD *)v16;
          }
          result = (unsigned __int16)(v17 >> 4);
          if( result == v12 )
            ++*(_DWORD *)(HalLpIndex + 8 * v7 + 32);
          v18 = *(unsigned __int16 *)(v16 + 6);
          v19 = *(unsigned __int16 *)(HalLpIndex + 8 * v7 + 10);
          if( (_WORD)v18 == (_WORD)v19
            || (!HvlpQueryNodeDistance ? (result = -1073741275) : (result = HvlpQueryNodeDistance(v19, v18, &v21),
                                                                   v15 = v21,
                                                                   v4 = v20,
                                                                   v12 = v23),
                result < 0) )
          {
            v13 = v22;
          }
          else
          {
            v13 = v22;
            if( v15 < *(_DWORD *)(HalLpIndex + 8 * v7 + 20) )
              *(_DWORD *)(HalLpIndex + 8 * v7 + 20) = v15;
          }
        }
      }
      ++v6;
      v16 += 40i64;
    }
    while( v6 < v4 );
  }
  return result;
}

Referenced by:

HvlpSelectLpSet
HvlpSelectVpSet