HvlStartBootLogicalProcessors

NTSTATUS __stdcall HvlStartBootLogicalProcessors(INT64 a1){
  unsigned int MaximumProcessorCount; 
  __int64 v3; 
  UINT64 v4; 
  UINT16 *IndependentPages; 
  UINT16 *v6; 
  NTSTATUS ApicIdAndNumaNode; 
  struct _KPRCB *CurrentPrcb; 
  unsigned int v9; 
  UINT16 *v10; 
  int v11; 
  char *v12; 
  _HVLP_LPCB *LpcbByApicId; 
  char v14; 
  int v15; 
  int *v16; 
  UINT64 v17; 
  _DWORD *v18; 
  __int16 v19; 
  __int16 v20; 
  INT64 *v21; 
  _BYTE PageInfo[40]; 
  __int64 v23[8]; 
  int Property[816]; 
  int v25; 

  v25 = a1;
  memset(v23, 0i64, sizeof(v23));
  if( (HvlpFlags & 2) == 0 )
    return 0;
  v25 = 0;
  if( ((int(__fastcall *)(__int64, __int64, __int64 *, int *))off_140C00A68[0])(11i64, 64i64, v23, &v25) >= 0
    && v25 == 64 )
  {
    HvlpQueryProcessorNode = v23[1];
    HvlpQueryProximityId = v23[5];
    HvlpQueryProximityNode = (__int64(__fastcall *)(_QWORD, _QWORD))v23[3];
    HvlpQueryNodeDistance = (__int64(__fastcall *)(_QWORD, _QWORD, _QWORD))v23[7];
  }
  else
  {
    HvlpQueryProcessorNode = 0i64;
    HvlpQueryProximityId = 0i64;
    HvlpQueryProximityNode = 0i64;
    HvlpQueryNodeDistance = 0i64;
  }
  MaximumProcessorCount = HalQueryMaximumProcessorCount();
  v3 = MaximumProcessorCount;
  v4 = 40 * MaximumProcessorCount;
  IndependentPages = (UINT16 *)MmAllocateIndependentPages(v4, 0xFFFFFFFFui64);
  v6 = IndependentPages;
  if( IndependentPages )
  {
    memset(IndependentPages, 0i64, v4);
    CurrentPrcb = KeGetCurrentPrcb();
    dword_140D032E4[0] = 0;
    ApicIdAndNumaNode = HvlpQueryApicIdAndNumaNode(0i64, &ApicId, &NodeNumber);
    if( ApicIdAndNumaNode < 0 )
      goto LABEL_39;
    word_140D032EE = *(_WORD *)(KeNodeBlock[NodeNumber] + 148);
    qword_140D03300 = (__int64)CurrentPrcb->StatisticsPage;
    dword_140D032F8 = CurrentPrcb->Number;
    HvlpCpuVendor = CurrentPrcb->CpuVendor;
    HvlpDiscoverTopologyLocal(
      (unsigned __int16)word_140D032EE,
      (unsigned int)ApicId,
      &PackageId,
      (UINT64 *)((char *)&PackageId + 4));
    HvlpLogicalProcessorCount = 1;
    LODWORD(HvlpLogicalProcessorRegions) = 1;
    ApicIdAndNumaNode = HvlpSelectLpSet(v3, (__int64)v6);
    if( ApicIdAndNumaNode < 0 )
      goto LABEL_39;
    v9 = 1;
    if( (unsigned int)v3 > 1 )
    {
      v10 = v6 + 24;
      do
      {
        if( *((_BYTE *)v10 - 7) )
        {
          if( HvlpEnableNextLogicalProcessor(*((unsigned int *)v10 - 1), *v10) < 0 )
            break;
          ++HvlpLogicalProcessorCount;
          *((_BYTE *)v10 - 6) = 1;
        }
        ++v9;
        v10 += 20;
      }
      while( v9 < (unsigned int)v3 );
    }
    ApicIdAndNumaNode = HvlpSelectVpSet((unsigned int)v3, (UINT64)v6);
    if( ApicIdAndNumaNode < 0 )
      goto LABEL_39;
    v11 = 0;
    if( (_DWORD)v3 )
    {
      v12 = (char *)v6 + 1;
      do
      {
        if( *v12 || v12[2] )
        {
          LpcbByApicId = HvlpGetLpcbByApicId(*(unsigned int *)(v12 + 3));
          if( v14 )
          {
            LpcbByApicId[12] = 1;
            ++v11;
          }
          if( v12[2] )
          {
            ++HvlpActiveProcessorCount;
            *((_BYTE *)LpcbByApicId + 112) = 1;
          }
        }
        v12 += 40;
        --v3;
      }
      while( v3 );
    }
    if( v11 == HvlpLogicalProcessorCount )
    {
      if( (HvlpRootFlags & 0x800) == 0 )
        goto LABEL_37;
    }
    else
    {
      qsort(
        (UINT64)&HvlpLogicalProcessorRegions,
        HvlpLogicalProcessorCount,
        0x78ui64,
        (INT64)HvlpCompareActiveLpcbs,
        v21,
        *(UINT64 *)PageInfo,
        *(UINT64 *)&PageInfo[8]);
      v15 = 0;
      if( HvlpLogicalProcessorCount )
      {
        do
        {
          memset(Property, 0i64, 0xCB8u);
          ApicIdAndNumaNode = 0;
          v16 = &dword_140D032E4[30 * v15];
          v17 = (unsigned int)*v16;
          if( (_DWORD)v17 != v15 )
          {
            Property[0] = v15;
            ApicIdAndNumaNode = HvlpSetLogicalProcessorProperty(
                                  v17,
                                  HvLogicalProcessorMachineCheckContextInfo|HvLogicalProcessorPccConfig,
                                  Property);
            if( ApicIdAndNumaNode >= 0 )
              *v16 = v15;
          }
          if( ApicIdAndNumaNode < 0 )
            goto LABEL_39;
        }
        while( ++v15 < HvlpLogicalProcessorCount );
      }
    }
    memset(&PageInfo[8], 0, 32);
    v18 = HvlpAcquireHypercallPage((PHYSICAL_ADDRESS *)&PageInfo[8], 1ui64, 0i64, 8ui64);
    v18[1] = HvlpActiveProcessorCount;
    *v18 = 5;
    HvcallInitiateHypercall();
    v20 = v19;
    HvlpReleaseHypercallPage((_HVLP_HYPERCALL_PAGE_INFO *)&PageInfo[8]);
    ApicIdAndNumaNode = v20 != 0 ? 0xC0000001 : 0;
    if( v20 )
    {
LABEL_39:
      MmFreeIndependentPages(v6, v4);
      return ApicIdAndNumaNode;
    }
LABEL_37:
    ApicIdAndNumaNode = 0;
    if( !KeDynamicPartitioningSupported )
      HvlNotifyAllProcessorsStarted();
    goto LABEL_39;
  }
  return -1073741670;
}

Referenced by:

KeStartAllProcessors