HvlpSelectVpSet

INT64 __fastcall HvlpSelectVpSet(UINT64 HalLpCount, UINT64 HalLpIndex){
  __int64 v2; 
  __int64 v3; 
  char v4; 
  _WORD *v6; 
  __int64 v7; 
  char v8; 
  unsigned int v9; 
  _DWORD *v10; 
  unsigned int v11; 
  unsigned int v12; 
  unsigned int v13; 
  unsigned int v14; 
  __int16 *v15; 
  __int64 v16; 
  unsigned int v17; 
  unsigned __int16 *v18; 
  char v19; 
  __int64 v20; 
  unsigned int v21; 
  int v22; 
  unsigned int *v23; 
  UINT64 v24; 
  int v25; 
  UINT64 v26; 
  int v27; 
  _WORD *v28; 
  __int64 v29; 
  _DWORD *v30; 
  int v31; 
  __int64 v32; 
  int v33; 
  __int64 v34; 
  __int64 v35; 
  unsigned int v36; 
  _BYTE *v37; 
  unsigned int v38; 
  _BYTE *v39; 
  UINT64 v40; 
  unsigned int v41; 
  _BYTE *v42; 
  UINT64 v43; 
  INT64 v44; 
  _BYTE *v45; 
  __int64 v46; 
  char v47; 
  unsigned int v48; 
  char v49; 
  int v50; 
  _WORD *i; 
  unsigned int v52; 
  INT32 v54[4]; 
  INT64 result[8]; 
  LODWORD(v2) = 0;
  v3 = (unsigned int)HalLpCount;
  HvlpMinrootConfigurationError = 0;
  *(_OWORD *)v54 = 0i64;
  v4 = 0;
  HviGetImplementationLimits(v54);
  if( (_DWORD)v3 )
  {
    v6 = (_WORD *)(HalLpIndex + 8);
    v7 = (unsigned int)v3;
    do
    {
      v6[2] = *v6;
      v8 = 0;
      *(v6 - 4) = 1;
      if( (HvlpRootFlags & 0x800) == 0 )
        v8 = *((_BYTE *)v6 - 6);
      *((_BYTE *)v6 - 5) = v8;
      v6 += 20;
      --v7;
    }
    while( v7 );
  }
  if( (HvlpFlags & 0x800000) == 0 )
    goto LABEL_59;
  if( (HvlpRootFlags & 0x800) != 0 )
    goto LABEL_59;
  v9 = 0;
  if( !(_DWORD)v3 )
    goto LABEL_59;
  v10 = (_DWORD *)(HalLpIndex + 28);
  while( !*((_BYTE *)v10 - 26) || !*v10 )
  {
    ++v9;
    v10 += 10;
    if( v9 >= (unsigned int)v3 )
      goto LABEL_59;
  }
  v4 = 1;
  if( (KeRootProcPerNodeSpecified & 1) != 0 )
  {
    KeRootProcPerNodeSpecified = 0;
    HvlpMinrootConfigurationError = 1;
  }
  if( (KeRootProcPerCoreSpecified & 1) != 0 )
  {
    KeRootProcPerCoreSpecified = 0;
    HvlpMinrootConfigurationError = 1;
  }
  if( (KeRootProcSpecified & 1) != 0 )
  {
    KeRootProcSpecified = 0;
    HvlpMinrootConfigurationError = 1;
  }
  v11 = KeRootProcNumaNodesSpecified;
  if( KeRootProcNumaNodesSpecified )
  {
    v12 = 0;
    do
    {
      if( KeRootProcNumaNodes[v12] == *(_WORD *)(HalLpIndex + 8) )
        break;
      ++v12;
    }
    while( v12 < KeRootProcNumaNodesSpecified );
    if( v12 == KeRootProcNumaNodesSpecified )
    {
      v11 = 0;
      KeRootProcNumaNodesSpecified = 0;
      HvlpMinrootConfigurationError = 1;
    }
  }
  if( !KeRootProcSpecified )
    goto LABEL_48;
  memset((INT64)result, 0i64);
  v13 = 0;
  if( !v11 )
    v11 = (unsigned __int16)KeNumberNodes;
  v14 = 0;
  if( !v11 )
  {
LABEL_44:
    if( KeRootProcNumaNodesSpecified )
    {
      KeRootProcNumaNodesSpecified = 0;
      HvlpMinrootConfigurationError = 1;
    }
    goto LABEL_48;
  }
  v15 = KeRootProcNumaNodes;
  do
  {
    if( KeRootProcNumaNodesSpecified )
    {
      v16 = (unsigned __int16)*v15;
      if( (unsigned int)v16 >= 0x40 || *((_BYTE *)result + v16) )
        goto LABEL_42;
      *((_BYTE *)result + v16) = 1;
    }
    else
    {
      LODWORD(v16) = v14;
    }
    v17 = 0;
    v18 = (unsigned __int16 *)(HalLpIndex + 8);
    while( !*((_BYTE *)v18 - 6) || *v18 != (_DWORD)v16 )
    {
      ++v17;
      v18 += 20;
      if( v17 >= (unsigned int)v3 )
        goto LABEL_42;
    }
    ++v13;
LABEL_42:
    ++v14;
    ++v15;
  }
  while( v14 < v11 );
  if( !v13 )
    goto LABEL_44;
  if( KeRootProcSpecified <= v13 )
  {
    KeRootProcSpecified = 0;
    HvlpMinrootConfigurationError = 1;
  }
LABEL_48:
  v19 = KeRootProcNumaNodeLpsSpecified;
  if( KeRootProcNumaNodeLpsSpecified )
  {
    v20 = KeRootProcNumaNodeLps[*(unsigned __int16 *)(HalLpIndex + 8)];
    if( (v20 & 1) == 0 )
    {
      v19 = 0;
      HvlpMinrootConfigurationError = 1;
      KeRootProcNumaNodeLpsSpecified = 0;
    }
    if( v19 )
    {
      v21 = 1;
      v22 = ~(*((_DWORD *)KeGetCurrentPrcb() + 39) - 1);
      if( (unsigned int)v3 > 1 )
      {
        v23 = (unsigned int *)(HalLpIndex + 76);
        while( (v22 & *(v23 - 8)) != (v22 & *(_DWORD *)(HalLpIndex + 4)) || _bittest64(&v20, *v23) )
        {
          ++v21;
          v23 += 10;
          if( v21 >= (unsigned int)v3 )
            goto LABEL_59;
        }
        KeRootProcNumaNodeLpsSpecified = 0;
        HvlpMinrootConfigurationError = 1;
      }
    }
  }
LABEL_59:
  v24 = HalLpIndex + 1;
  *(_BYTE *)(HalLpIndex + 3) = 1;
  *(_BYTE *)(HalLpIndex + 1) = 1;
  v25 = 1;
  while( 2 )
  {
    if( (_DWORD)v3 )
    {
      v26 = HalLpIndex;
      v2 = v3;
      while( !*(_BYTE *)v26 )
      {
LABEL_90:
        v26 += 40i64;
        if( !--v2 )
          goto LABEL_91;
      }
      if( !*(_BYTE *)(v26 + 1) && *(_BYTE *)(v26 + 2) && v25 != v54[0] )
      {
        if( !KeRootProcPerNodeSpecified )
          goto LABEL_73;
        v27 = 0;
        v28 = (_WORD *)(HalLpIndex + 8);
        v29 = v3;
        do
        {
          if( *((_BYTE *)v28 - 7) && *v28 == *(_WORD *)(v26 + 8) )
            ++v27;
          v28 += 20;
          --v29;
        }
        while( v29 );
        if( v27 != KeRootProcPerNodeSpecified )
        {
LABEL_73:
          if( !KeRootProcPerCoreSpecified )
            goto LABEL_80;
          v30 = (_DWORD *)(HalLpIndex + 4);
          v31 = 0;
          v32 = v3;
          v33 = ~(*((_DWORD *)KeGetCurrentPrcb() + 39) - 1);
          do
          {
            if( *((_BYTE *)v30 - 3) && (v33 & *v30) == (v33 & *(_DWORD *)(v26 + 4)) )
              ++v31;
            v30 += 10;
            --v32;
          }
          while( v32 );
          if( v31 != KeRootProcPerCoreSpecified )
          {
LABEL_80:
            if( KeRootProcNumaNodesSpecified )
            {
              v34 = 0i64;
              if( KeRootProcNumaNodesSpecified )
              {
                while( KeRootProcNumaNodes[v34] != *(_WORD *)(v26 + 12) )
                {
                  v34 = (unsigned int)(v34 + 1);
                  if( (unsigned int)v34 >= KeRootProcNumaNodesSpecified )
                    goto LABEL_89;
                }
                goto LABEL_85;
              }
            }
            else
            {
LABEL_85:
              if( !KeRootProcSpecified || v25 != KeRootProcSpecified )
              {
                if( !KeRootProcNumaNodeLpsSpecified )
                  goto LABEL_90;
                v35 = KeRootProcNumaNodeLps[*(unsigned __int16 *)(v26 + 8)];
                if( _bittest64(&v35, *(unsigned int *)(v26 + 36)) )
                  goto LABEL_90;
              }
            }
          }
        }
      }
LABEL_89:
      *(_BYTE *)v26 = 0;
      goto LABEL_90;
    }
LABEL_91:
    v36 = v2;
    if( (_DWORD)v3 )
    {
      v37 = (_BYTE *)HalLpIndex;
      do
      {
        if( *v37 != (_BYTE)v2 )
          break;
        ++v36;
        v37 += 40;
      }
      while( v36 < (unsigned int)v3 );
    }
    if( v36 != (_DWORD)v3 )
    {
      v38 = v2;
      if( (_DWORD)v3 )
      {
        v39 = (_BYTE *)HalLpIndex;
        do
        {
          if( *v39 )
            HvlpComputeLpComparisonMetrics((unsigned int)v3, HalLpIndex);
          ++v38;
          v39 += 40;
        }
        while( v38 < (unsigned int)v3 );
        LODWORD(v2) = 0;
      }
      v40 = 0xFFFFFFFFi64;
      v41 = v2;
      if( (_DWORD)v3 )
      {
        v42 = (_BYTE *)HalLpIndex;
        while( *v42 == (_BYTE)v2 )
        {
          ++v41;
          v42 += 40;
          if( v41 >= (unsigned int)v3 )
            goto LABEL_108;
        }
        v40 = v41;
      }
LABEL_108:
      v43 = (unsigned int)(v40 + 1);
      if( (unsigned int)v43 < (unsigned int)v3 )
      {
        v44 = 5 * v43;
        v45 = (_BYTE *)(HalLpIndex + 40 * v43);
        do
        {
          if( *v45 != (_BYTE)v2 && (unsigned int)HvlpLpComparison(v44, HalLpIndex, v43, v40) == -1 )
            v40 = (unsigned int)v43;
          v43 = (unsigned int)(v43 + 1);
          v45 += 40;
        }
        while( (unsigned int)v43 < (unsigned int)v3 );
      }
      ++v25;
      v46 = 5i64 * (unsigned int)v40;
      *(_BYTE *)(HalLpIndex + 8 * v46 + 1) = 1;
      *(_BYTE *)(HalLpIndex + 8 * v46 + 3) = 1;
      continue;
    }
    break;
  }
  v47 = 0;
  if( v4 )
  {
    v48 = v2;
    if( (_DWORD)v3 )
    {
      do
      {
        if( *(_BYTE *)v24 != (_BYTE)v2 )
        {
          HvlpComputeLpComparisonMetrics((unsigned int)v3, HalLpIndex);
          if( *(_DWORD *)(v24 + 27) == (_DWORD)v2 )
          {
            *(_BYTE *)v24 = v2;
            v49 = v2;
            if( (HvlpRootFlags & 0x800) == 0 )
              v49 = *(_BYTE *)(v24 + 1);
            *(_BYTE *)(v24 + 2) = v49;
            v47 = 1;
            HvlpMinrootConfigurationError = 1;
          }
        }
        ++v48;
        v24 += 40i64;
      }
      while( v48 < (unsigned int)v3 );
    }
  }
  if( KeRootProcNumaNodesSpecified != (_DWORD)v2 )
    return 0i64;
  if( KeRootProcNumaNodeLpsSpecified != (_BYTE)v2 )
    return 0i64;
  if( v47 )
    return 0i64;
  v50 = v2;
  if( !(_DWORD)v3 )
    return 0i64;
  for( i = (_WORD *)(HalLpIndex + 8); ; i += 20 )
  {
    if( *((_BYTE *)i - 6) != (_BYTE)v2 )
    {
      v52 = v2;
      do
      {
        if( *(_WORD *)(HalLpIndex + 40i64 * v52 + 8) == *i && *(_BYTE *)(HalLpIndex + 40i64 * v52 + 1) != (_BYTE)v2 )
          break;
        ++v52;
      }
      while( v52 < (unsigned int)v3 );
      if( v52 == (_DWORD)v3 )
        break;
    }
    if( ++v50 >= (unsigned int)v3 )
      return 0i64;
  }
  return 3221225473i64;
}

Referenced by:

HvlStartBootLogicalProcessors