HalpQueryMaximumRegisteredProcessorCount

NTSTATUS __stdcall HalpQueryMaximumRegisteredProcessorCount(INT64 result){
  NTSTATUS v1; 
  NTSTATUS v2; 
  unsigned int MaximumProcessorCount; 
  WCHAR v4; 
  struct _KPRCB *CurrentPrcb; 
  struct _UNICODE_STRING DestinationString; 
  unsigned int Data; 
  UINT64 ResultDataSize; 
  UINT64 Type; 
  LODWORD(ResultDataSize) = 0;
  LODWORD(Type) = 0;
  Data = 0;
  DestinationString = 0i64;
  _m_prefetchw(&dword_140CED530);
  v1 = dword_140CED530;
  do
  {
    v2 = v1;
    v1 = _InterlockedCompareExchange(&dword_140CED530, v1, v1);
  }
  while( v2 != v1 );
  if( !v1 )
  {
    MaximumProcessorCount = HalQueryMaximumProcessorCount();
    if( MaximumProcessorCount > 0x500 )
      MaximumProcessorCount = 1280;
    RtlInitUnicodeString(&DestinationString, L"Kernel-RegisteredProcessors", v4);
    if( ZwQueryLicenseValue(&DestinationString, &Type, &Data, 4ui64, &ResultDataSize) >= 0
      && (_DWORD)ResultDataSize == 4
      && (_DWORD)Type == 4 )
    {
      CurrentPrcb = KeGetCurrentPrcb();
      Data *= *((_DWORD *)CurrentPrcb + 38) * *((_DWORD *)CurrentPrcb + 39);
      if( MaximumProcessorCount > Data )
        MaximumProcessorCount = Data;
    }
    v1 = MaximumProcessorCount;
    _InterlockedExchange(&dword_140CED530, MaximumProcessorCount);
  }
  return v1;
}

Referenced by:

Amd64InitializeProfiling
EmonAllocateResources
EmonCompleteInitializeProfiling
HalEnumerateProcessors
HalStartDynamicProcessor
HalStartNextProcessor
HalpAllocateCR3Root
HalpDpStartProcessor
HalpHvInitMcaStatusMsrCache
HalpInterruptGetNextProcessorLocalId
HalpMcaInitializePcrContext
HalpPreAllocateKInterrupts
HalpPteReserveResources
HalpTimerSelectRoles
HalpTscReportSyncStatus
HalpTscReserveResources