HvlStartBootLogicalProcessors

INT64 __fastcall HvlStartBootLogicalProcessors(INT64 a1){
  unsigned int MaximumProcessorCount; 
  __int64 v3; 
  UINT64 v4; 
  UINT64 v5; 
  UINT64 v6; 
  INT64 v7; 
  UINT16 *v8; 
  signed int ApicIdAndNumaNode; 
  struct _KPRCB *CurrentPrcb; 
  unsigned int v11; 
  UINT16 *v12; 
  int v13; 
  char *v14; 
  WCHAR *LpcbByApicId; 
  char v16; 
  int v17; 
  int *v18; 
  INT64 v19; 
  LONGLONG *v20; 
  __int16 v21; 
  __int16 v22; 
  _BYTE v23[40]; 
  INT64 result[8]; 
  UINT8 v25[3264]; 
  int v26; 
  v26 = a1;
  memset((INT64)result, 0i64);
  if( (HvlpFlags & 2) == 0 )
    return 0i64;
  v26 = 0;
  if( ((int(__fastcall *)(__int64, __int64, INT64 *, int *))off_140C00A68[0])(11i64, 64i64, result, &v26) >= 0
    && v26 == 64 )
  {
    HvlpQueryProcessorNode = result[1];
    HvlpQueryProximityId = result[5];
    HvlpQueryProximityNode = (__int64(__fastcall *)(_QWORD, _QWORD))result[3];
    HvlpQueryNodeDistance = (__int64(__fastcall *)(_QWORD, _QWORD, _QWORD))result[7];
  }
  else
  {
    HvlpQueryProcessorNode = 0i64;
    HvlpQueryProximityId = 0i64;
    HvlpQueryProximityNode = 0i64;
    HvlpQueryNodeDistance = 0i64;
  }
  MaximumProcessorCount = HalQueryMaximumProcessorCount();
  v3 = MaximumProcessorCount;
  v4 = 40 * MaximumProcessorCount;
  MmAllocateIndependentPages(v4, 0xFFFFFFFFui64, v5, v6);
  v8 = (UINT16 *)v7;
  if( v7 )
  {
    memset(v7, 0i64);
    CurrentPrcb = KeGetCurrentPrcb();
    dword_140D032E4[0] = 0;
    ApicIdAndNumaNode = HvlpQueryApicIdAndNumaNode(0i64, &ApicId, &NodeNumber);
    if( ApicIdAndNumaNode < 0 )
      goto LABEL_39;
    word_140D032EE = *(_WORD *)(*((_QWORD *)&KeNodeBlock + NodeNumber) + 148i64);
    qword_140D03300 = *((_QWORD *)CurrentPrcb + 4202);
    dword_140D032F8 = *((_DWORD *)CurrentPrcb + 9);
    HvlpCpuVendor = *((_BYTE *)CurrentPrcb + 141);
    HvlpDiscoverTopologyLocal((unsigned __int16)word_140D032EE, (unsigned int)ApicId, &PackageId, &CoreId);
    LODWORD(HvlpLogicalProcessorCount) = 1;
    *(_DWORD *)&HvlpLogicalProcessorRegions = 1;
    ApicIdAndNumaNode = HvlpSelectLpSet((unsigned int)v3, (UINT64)v8);
    if( ApicIdAndNumaNode < 0 )
      goto LABEL_39;
    v11 = 1;
    if( (unsigned int)v3 > 1 )
    {
      v12 = v8 + 24;
      do
      {
        if( *((_BYTE *)v12 - 7) )
        {
          if( (int)HvlpEnableNextLogicalProcessor(*((unsigned int *)v12 - 1), *v12) < 0 )
            break;
          LODWORD(HvlpLogicalProcessorCount) = HvlpLogicalProcessorCount + 1;
          *((_BYTE *)v12 - 6) = 1;
        }
        ++v11;
        v12 += 20;
      }
      while( v11 < (unsigned int)v3 );
    }
    ApicIdAndNumaNode = HvlpSelectVpSet((unsigned int)v3, (UINT64)v8);
    if( ApicIdAndNumaNode < 0 )
      goto LABEL_39;
    v13 = 0;
    if( (_DWORD)v3 )
    {
      v14 = (char *)v8 + 1;
      do
      {
        if( *v14 || v14[2] )
        {
          LpcbByApicId = HvlpGetLpcbByApicId(*(_DWORD *)(v14 + 3));
          if( v16 )
          {
            *((_DWORD *)LpcbByApicId + 12) = 1;
            ++v13;
          }
          if( v14[2] )
          {
            ++HvlpActiveProcessorCount;
            *((_BYTE *)LpcbByApicId + 112) = 1;
          }
        }
        v14 += 40;
        --v3;
      }
      while( v3 );
    }
    if( v13 == (_DWORD)HvlpLogicalProcessorCount )
    {
      if( (HvlpRootFlags & 0x800) == 0 )
        goto LABEL_37;
    }
    else
    {
      qsort(
        &HvlpLogicalProcessorRegions,
        (unsigned int)HvlpLogicalProcessorCount,
        (const WCHAR *)0x78,
        HvlpCompareActiveLpcbs);
      v17 = 0;
      if( (_DWORD)HvlpLogicalProcessorCount )
      {
        do
        {
          memset((INT64)v25, 0i64);
          ApicIdAndNumaNode = 0;
          v18 = &dword_140D032E4[30 * v17];
          v19 = (unsigned int)*v18;
          if( (_DWORD)v19 != v17 )
          {
            *(_DWORD *)v25 = v17;
            ApicIdAndNumaNode = HvlpSetLogicalProcessorProperty(v19, 6i64, v25);
            if( ApicIdAndNumaNode >= 0 )
              *v18 = v17;
          }
          if( ApicIdAndNumaNode < 0 )
            goto LABEL_39;
        }
        while( ++v17 < (unsigned int)HvlpLogicalProcessorCount );
      }
    }
    memset(&v23[8], 0, 32);
    v20 = HvlpAcquireHypercallPage((PHYSICAL_ADDRESS *)&v23[8], 1, 0i64, 8i64);
    *((_DWORD *)v20 + 1) = HvlpActiveProcessorCount;
    *(_DWORD *)v20 = 5;
    HvcallInitiateHypercall();
    v22 = v21;
    HvlpReleaseHypercallPage((unsigned int *)&v23[8]);
    ApicIdAndNumaNode = v22 != 0 ? 0xC0000001 : 0;
    if( v22 )
    {
LABEL_39:
      MmFreeIndependentPages(v8, v4);
      return(unsigned int)ApicIdAndNumaNode;
    }
LABEL_37:
    ApicIdAndNumaNode = 0;
    if( !KeDynamicPartitioningSupported )
      HvlNotifyAllProcessorsStarted();
    goto LABEL_39;
  }
  return(unsigned int)-1073741670;
}

Referenced by:

KeStartAllProcessors