PopInitializeHeteroProcessors
VOID __stdcall PopInitializeHeteroProcessors(){
CHAR v0;
CHAR v1;
char v2;
char v3;
char v4;
unsigned __int8 v5;
char *v6;
unsigned int v7;
__int64 v8;
unsigned __int8 v9;
__int64 v10;
unsigned __int8 v11;
int v12;
__int64 v13;
__int64 v14;
__int64 v15;
char v16;
unsigned int ActiveProcessorCount;
_BYTE *v18;
signed __int64 v19;
__int64 v20;
CHAR v21;
EVENT_DESCRIPTOR *v22;
UINT64 *v23;
_WORD *v24;
__int64 v25;
__int64 v26;
__int16 v27;
UINT8 MostFavoredClass[4];
__int16 v29;
unsigned int ProcessorNumber;
unsigned int ProcessorNumber_4;
unsigned __int16 *v32[2];
__int16 v33;
int v34;
__int16 v35;
unsigned __int16 *v36[2];
__int16 v37;
int v38;
__int16 v39;
EVENT_DATA_DESCRIPTOR UserData;
__int64 v41;
__int64 v42;
__int64 v43;
__int64 v44;
__int64 v45;
__int64 v46;
__int64 v47;
__int64 v48;
v1 = v0;
v2 = 0;
v3 = 1;
if( (PpmBackgroundProfile || PpmEntryLevelPerfProfile || PpmMultimediaQosProfile)
&& PpmPerfSchedulerDirectedPerfStatesSupported
&& (unsigned int)KeQueryActiveProcessorCountEx(0) >= 2 )
{
v2 = 1;
}
v4 = v2;
if( PpmPerfVmQosSupported )
v4 = 1;
if( !v4 || (v5 = 1, PpmPerfQosGroupPolicyDisable) )
v5 = 0;
if( v1 )
{
v6 = (char *)PpmHeteroCapabilityTest;
v7 = 0;
if( *(_DWORD *)PpmHeteroCapabilityTest )
{
do
{
v8 = v7++;
*(_WORD *)&v6[2 * v8 + 7 + v8] = 0;
}
while( v7 < *(_DWORD *)v6 );
}
PpmHeteroComputeRelativePerformance();
PpmHeteroUpdateHgsConfiguration();
v9 = PopDetectSimulatedHeteroProcessors((__int64)v6);
*(_DWORD *)MostFavoredClass = v9;
v10 = v9 != 0;
if( !v9 )
{
v11 = PpmHeteroDetectHgsCores((INT64)v6);
*(_DWORD *)MostFavoredClass = v11;
if( v11 )
{
LODWORD(v10) = 5;
}
else
{
v34 = 0;
v35 = 0;
ProcessorNumber = 0;
if( (unsigned __int8)PpmHeteroNominalPerformanceClasses > 1u
|| (unsigned __int8)PpmHeteroHighestPerformanceClasses > 1u )
{
v32[1] = (unsigned __int16 *)PpmPerfStatesRegistered.Bitmap[0];
v33 = 0;
v32[0] = (unsigned __int16 *)&PpmPerfStatesRegistered;
if( !(unsigned int)KeEnumerateNextProcessor(&ProcessorNumber, v32) )
{
do
{
v13 = ProcessorNumber;
KeGetPrcb(ProcessorNumber);
v15 = *(_QWORD *)(v14 + 33128);
if( (unsigned __int8)PpmHeteroNominalPerformanceClasses <= 1u )
v16 = *(_BYTE *)(v15 + 206);
else
v16 = *(_BYTE *)(v15 + 205);
v6[2 * v13 + 8 + v13] = v16;
}
while( !(unsigned int)KeEnumerateNextProcessor(&ProcessorNumber, v32) );
v3 = 1;
}
v6[5] = 1;
v12 = 1;
}
else
{
v12 = 0;
}
*(_DWORD *)MostFavoredClass = v12;
if( v12 )
{
LODWORD(v10) = 3;
}
else if( v5 )
{
*(_DWORD *)MostFavoredClass = 1;
LODWORD(v10) = 4;
}
}
}
if( (_DWORD)v10 == PopHeteroSystem )
{
v3 = 0;
ActiveProcessorCount = KeQueryActiveProcessorCountEx(0xFFFFu);
if( ActiveProcessorCount )
{
v18 = v6 + 7;
v19 = (_BYTE *)PpmHeteroCapability - v6;
v20 = ActiveProcessorCount;
do
{
if( v18[v19] != *v18 || v18[v19 + 1] != v18[1] )
v3 = 1;
v18 += 3;
--v20;
}
while( v20 );
}
}
}
else
{
LODWORD(v10) = PopHeteroSystem;
v6 = (char *)PpmHeteroCapability;
v3 = 0;
*(_DWORD *)MostFavoredClass = PopHeteroSystem != 0;
}
v21 = PopConfigureHeteroPolicies((unsigned int)v10, v1);
if( (v3 || (_DWORD)v10 && v21 || PpmPerfQosSupportedAndAllowed != v5)
&& (unsigned int)KeConfigureHeteroProcessors((_KAFFINITY_EX *)v6, v5, (UINT8)MostFavoredClass, v23) )
{
PsEnumProcesses((__int64(__fastcall *)(unsigned __int64, __int64))PopUpdateSingleProcessHeteroPolicies, 0i64);
}
if( *(_DWORD *)MostFavoredClass )
{
PopHeteroSystem = v10;
if( v6 != PpmHeteroCapability )
memmove((UINT8 *)PpmHeteroCapability, (UINT8 *)v6, 3 * (*(_DWORD *)v6 + 2));
if( v5 )
PpmIdleEnableIdleDurationExpirationTimeout();
goto LABEL_56;
}
v24 = PpmHeteroCapability;
v22 = 0i64;
PopHeteroSystem = 0;
if( *(_DWORD *)PpmHeteroCapability )
{
do
{
v25 = (unsigned int)v22;
v22 = (EVENT_DESCRIPTOR *)(unsigned int)((_DWORD)v22 + 1);
*(_WORD *)((char *)&v24[v25 + 3] + v25 + 1) = 0;
*((_BYTE *)&v24[v25 + 3] + v25) = 0;
v24[2] = 0;
}
while( (unsigned int)v22 < *(_DWORD *)v24 );
}
if( v4 )
LABEL_56:
PpmPerfQosSupportedAndConfigured = 1;
if( ((PopHeteroSystem - 1) & 0xFFFFFFFA) != 0 || PopHeteroSystem == 6 )
PpmHeteroPolicy = 0;
else
PpmHeteroPolicy = PpmHeteroDesiredPolicy;
if( PpmPerfArtificialDomainSetting == -1 )
PpmPerfArtificialDomainEnabled = PopHeteroSystem != 0;
v38 = 0;
v39 = 0;
ProcessorNumber_4 = 0;
if( PpmEtwRegistered && EtwEventEnabled(PpmEtwHandle, (EVENT_DESCRIPTOR *)&PPM_ETW_PROCESSOR_CLASS_UPDATE, v22) )
{
v36[1] = (unsigned __int16 *)qword_140C11268[0];
v36[0] = (unsigned __int16 *)&PpmCheckRegistered;
v37 = 0;
while( !(unsigned int)KeEnumerateNextProcessor(&ProcessorNumber_4, v36) )
{
KeGetPrcb(ProcessorNumber_4);
v27 = *(unsigned __int8 *)(v26 + 208);
UserData.Ptr = (unsigned __int64)&v29;
v29 = v27;
v45 = v26 + 33209;
v41 = v26 + 209;
v47 = v26 + 33210;
v43 = v26 + 33208;
*(_QWORD *)&UserData.Size = 2i64;
v42 = 1i64;
v44 = 1i64;
v46 = 1i64;
v48 = 1i64;
EtwWrite(PpmEtwHandle, (EVENT_DESCRIPTOR *)&PPM_ETW_PROCESSOR_CLASS_UPDATE, 0i64, 5ui64, &UserData);
}
}
PpmEventHeteroPolicy(0);
PpmPerfQosSupportedAndAllowed = v5;
}Referenced by:
PoInitSystem
PpmReapplyPerfPolicy