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