HvlpSelectLpSet

INT64 __fastcall HvlpSelectLpSet(UINT64 HalLpCount, UINT64 a2){
  unsigned int v3; 
  unsigned int v4; 
  int v5; 
  int v6; 
  unsigned int v7; 
  int v8; 
  unsigned int v9; 
  _WORD *v10; 
  NTSTATUS ApicIdAndNumaNode; 
  unsigned int v12; 
  __int64(__fastcall *v13)(__int64, int *, unsigned int *); 
  __int64 v14; 
  int v15; 
  int v16; 
  int v17; 
  int v18; 
  int v19; 
  int v20; 
  UINT64 v21; 
  __int64 v22; 
  __int64 v23; 
  UINT64 v24; 
  unsigned int i; 
  unsigned int v26; 
  _BYTE *v27; 
  unsigned int v28; 
  _BYTE *v29; 
  UINT64 v30; 
  unsigned int v31; 
  _BYTE *v32; 
  UINT64 v33; 
  INT64 v34; 
  _BYTE *v35; 
  unsigned int v36; 
  int v37; 
  _DWORD *v38; 
  unsigned int v39; 
  __int16 NodeNumber[2]; 
  __int16 v42; 
  int v43; 
  NTSTATUS v44; 
  unsigned int v45; 
  int v46; 
  int v47; 
  int v48; 
  INT32 v49[4]; 
  NodeNumber[0] = 0;
  v45 = 0;
  v42 = 0;
  v3 = HalLpCount;
  v47 = 0;
  v44 = 0;
  *(_OWORD *)v49 = 0i64;
  if( (HvlpRootFlags & 1) == 0 )
  {
    KeHypervisorNumprocSpecified = 0;
    KeRootProcSpecified = 0;
    KeRootProcNumaNodesSpecified = 0;
    KeRootProcPerNodeSpecified = 0;
    KeRootProcPerCoreSpecified = 0;
    KeRootProcNumaNodeLpsSpecified = 0;
  }
  if( (HvlpRootFlags & 0x800) != 0 )
  {
    KeRootProcSpecified = 0;
    KeRootProcNumaNodesSpecified = 0;
    KeRootProcPerNodeSpecified = 0;
    KeRootProcPerCoreSpecified = 1;
    KeRootProcNumaNodeLpsSpecified = 0;
  }
  HviGetImplementationLimits(v49);
  v4 = 64;
  v5 = ~(*((_DWORD *)KeGetCurrentPrcb() + 39) * *((_DWORD *)KeGetCurrentPrcb() + 38) - 1);
  if( v49[0] < 0x40u )
    v4 = v49[0];
  if( KeRootProcSpecified && KeRootProcSpecified < v4 && !KeRootProcNumaNodesSpecified )
    v4 = KeRootProcSpecified;
  v6 = HalEnumerateProcessors((unsigned int)KeRegisteredProcessors);
  v7 = 0;
  v43 = v6;
  v8 = v6;
  v9 = 0;
  if( v3 )
  {
    v10 = (_WORD *)(a2 + 10);
    do
    {
      *((_BYTE *)v10 - 10) = 1;
      ApicIdAndNumaNode = HvlpQueryApicIdAndNumaNode(v9, (UINT64 *)(v10 - 3), (UINT16 *)NodeNumber);
      v7 = 0;
      v44 = ApicIdAndNumaNode;
      v12 = ApicIdAndNumaNode;
      if( ApicIdAndNumaNode == -1073741275 )
      {
        v44 = 0;
        *((_BYTE *)v10 - 10) = 0;
      }
      else
      {
        if( ApicIdAndNumaNode < 0 )
          return v12;
        v13 = (__int64(__fastcall *)(__int64, int *, unsigned int *))HvlpQueryProximityId;
        v14 = (unsigned __int16)NodeNumber[0];
        *(v10 - 1) = NodeNumber[0];
        if( v13 )
        {
          v15 = v13(v14, &v47, &v45);
          LOWORD(v14) = NodeNumber[0];
          v7 = 0;
        }
        else
        {
          v15 = -1073741275;
        }
        if( v15 < 0
          || (!HvlpQueryProximityNode ? (v16 = -1073741275) : (v16 = HvlpQueryProximityNode(v45, &v42),
                                                               LOWORD(v14) = NodeNumber[0],
                                                               v7 = 0),
              v16 < 0) )
        {
          *v10 = v14;
        }
        else
        {
          *v10 = v42;
        }
        v10[1] = *v10;
      }
      ++v9;
      v10 += 20;
    }
    while( v9 < v3 );
    v8 = v43;
  }
  v17 = 1;
  *(_BYTE *)(a2 + 1) = 1;
  v18 = 1;
  v19 = 1;
  while( 1 )
  {
    v48 = v19;
    v20 = v17;
    v46 = v17;
    if( v3 )
    {
      v21 = a2;
      do
      {
        if( *(_BYTE *)v21 )
        {
          if( *(_BYTE *)(v21 + 1) )
            goto LABEL_58;
          v22 = *(unsigned __int16 *)(v21 + 8);
          if( (unsigned __int16)v22 >= (unsigned __int16)KeNumberNodes
            || (*(_BYTE *)(*((_QWORD *)&KeNodeBlock + v22) + 181i64) & 2) == 0
            || v18 == 1024
            || v18 == v8
            || (_DWORD)KeMaximumProcessors && v18 == (_DWORD)KeMaximumProcessors )
          {
            goto LABEL_58;
          }
          if( KeBootprocSpecified && v18 == KeBootprocSpecified
            || KeNumprocSpecified && v7 >= KeNumprocSpecified
            || KeHypervisorNumprocSpecified && v18 == KeHypervisorNumprocSpecified )
          {
            goto LABEL_58;
          }
          if( v19 == v4 )
          {
            v23 = 0i64;
            do
            {
              if( *(_WORD *)(a2 + 40 * v23 + 8) == (_WORD)v22 && *(_BYTE *)(a2 + 40 * v23 + 1) )
                break;
              v23 = (unsigned int)(v23 + 1);
            }
            while( (unsigned int)v23 < v3 );
            if( (_DWORD)v23 == v3 )
              goto LABEL_58;
          }
          if( v17 == (_DWORD)KeRegisteredProcessors )
          {
            v24 = a2 + 1;
            for( i = 0; i < v3; ++i )
            {
              if( (v5 & *(_DWORD *)(v21 + 4)) == (v5 & *(_DWORD *)(v24 + 3)) && *(_BYTE *)v24 )
                break;
              v24 += 40i64;
            }
            if( i == v3 )
LABEL_58:
              *(_BYTE *)v21 = 0;
          }
        }
        v8 = v43;
        ++v7;
        v21 += 40i64;
      }
      while( v7 < v3 );
      v20 = v17;
    }
    v7 = 0;
    v26 = 0;
    if( v3 )
    {
      v27 = (_BYTE *)a2;
      do
      {
        if( *v27 )
          break;
        ++v26;
        v27 += 40;
      }
      while( v26 < v3 );
    }
    if( v26 == v3 )
      return(unsigned int)v44;
    v28 = 0;
    if( v3 )
    {
      v29 = (_BYTE *)a2;
      do
      {
        if( *v29 )
        {
          HvlpComputeLpComparisonMetrics(v3, a2);
          v7 = 0;
        }
        ++v28;
        v29 += 40;
      }
      while( v28 < v3 );
      v20 = v46;
    }
    v30 = 0xFFFFFFFFi64;
    v31 = 0;
    if( v3 )
    {
      v32 = (_BYTE *)a2;
      while( !*v32 )
      {
        ++v31;
        v32 += 40;
        if( v31 >= v3 )
          goto LABEL_78;
      }
      v30 = v31;
    }
LABEL_78:
    v33 = (unsigned int)(v30 + 1);
    if( (unsigned int)v33 < v3 )
    {
      v34 = 5 * v33;
      v35 = (_BYTE *)(a2 + 40 * v33);
      do
      {
        if( *v35 )
        {
          if( (unsigned int)HvlpLpComparison(v34, a2, v33, v30) == -1 )
            v30 = (unsigned int)v33;
          v7 = 0;
        }
        v33 = (unsigned int)(v33 + 1);
        v35 += 40;
      }
      while( (unsigned int)v33 < v3 );
    }
    ++v18;
    v36 = 0;
    v37 = v5 & *(_DWORD *)(a2 + 40i64 * (unsigned int)v30 + 4);
    *(_BYTE *)(a2 + 40i64 * (unsigned int)v30 + 1) = 1;
    if( v3 )
    {
      v38 = (_DWORD *)(a2 + 4);
      do
      {
        if( v36 != (_DWORD)v30 && *((_BYTE *)v38 - 3) && (v5 & *v38) == v37 )
          break;
        ++v36;
        v38 += 10;
      }
      while( v36 < v3 );
    }
    v17 = v20 + 1;
    v39 = 0;
    if( v36 != v3 )
      v17 = v20;
    if( v3 )
    {
      do
      {
        if( v39 != (_DWORD)v30
          && *(_BYTE *)(a2 + 40i64 * v39 + 1)
          && *(_WORD *)(a2 + 40i64 * v39 + 8) == *(_WORD *)(a2 + 40i64 * (unsigned int)v30 + 8) )
        {
          break;
        }
        ++v39;
      }
      while( v39 < v3 );
    }
    v8 = v43;
    v19 = v48 + 1;
    if( v39 != v3 )
      v19 = v48;
  }
}

Referenced by:

HvlStartBootLogicalProcessors