PpmHeteroUpdateHgsConfiguration
CHAR __stdcall PpmHeteroUpdateHgsConfiguration(){
CHAR v0;
__int64 v2;
__int64 v3;
char v4;
int *v5;
_BYTE *v6;
int IsEmptyAffinity;
_BYTE *v8;
unsigned int v9;
int v10;
char v11;
__int64 v12;
unsigned int v13;
__int64 v14;
__int64 v15;
__int64 v16;
unsigned int v17;
int v18;
char v19;
unsigned int v20;
__int64 v21;
__int64 v22;
__int64 v23;
UINT64 ProcessorNumber;
unsigned __int16 *v25;
__int64 v26;
__int16 v27;
int v28;
__int16 v29;
unsigned __int64 v30;
_KAFFINITY_EX v31;
int v32;
_DWORD result[43];
v28 = 0;
v29 = 0;
LODWORD(ProcessorNumber) = 0;
memset((INT64)&result[1], 0i64);
memset((INT64)v31.Bitmap, 0i64);
v0 = 0;
if( PpmHeteroHgsEnabled )
{
if( !(unsigned int)KeIsEmptyAffinityEx(&PpmCheckRegistered) )
{
v30 = __readmsr(0x1B1u);
if( (v30 & 0x4000000) != 0 )
{
v32 = 1310721;
PpmHeteroHgsPopulated = 1;
memset((INT64)result, 0i64);
*(_DWORD *)&v31.Count = 1310721;
memset((INT64)&v31.Reserved, 0i64);
v26 = qword_140C11268[0];
v27 = 0;
v25 = (unsigned __int16 *)&PpmCheckRegistered;
while( !(unsigned int)KeEnumerateNextProcessor(&ProcessorNumber, &v25) )
{
KeGetPrcb((unsigned int)ProcessorNumber);
v3 = *(unsigned __int16 *)(v2 + 33274);
if( !*(_BYTE *)(PpmHeteroHgsInterface + 8 * v3 + 16)
|| (v4 = *(_BYTE *)(PpmHeteroHgsInterface + 8 * v3 + 17), v5 = (int *)&v31, !v4) )
{
v5 = &v32;
}
KeAddProcessorAffinityEx(v5, ProcessorNumber);
}
if( (unsigned int)KeIsEmptyAffinityEx(&v31) )
{
v26 = qword_140C11268[0];
v27 = 0;
v25 = (unsigned __int16 *)&PpmCheckRegistered;
while( !(unsigned int)KeEnumerateNextProcessor(&ProcessorNumber, &v25) )
{
KeGetPrcb((unsigned int)ProcessorNumber);
if( v6[33278] )
{
v0 = 1;
v6[33278] = 0;
}
if( v6[33277] )
{
v0 = 1;
v6[33277] = 0;
}
if( v6[33276] )
{
v0 = 1;
v6[33276] = 0;
}
}
}
else
{
IsEmptyAffinity = KeIsEmptyAffinityEx(&v32);
v27 = 0;
v25 = (unsigned __int16 *)&v32;
v26 = *(_QWORD *)&result[1];
while( !(unsigned int)KeEnumerateNextProcessor(&ProcessorNumber, &v25) )
{
KeGetPrcb((unsigned int)ProcessorNumber);
if( v8[33278] )
{
v0 = 1;
v8[33278] = 0;
}
if( v8[33277] )
{
v0 = 1;
v8[33277] = 0;
}
if( v8[33276] != 1 )
{
v0 = 1;
v8[33276] = 1;
}
}
v9 = -1;
v10 = KeCountSetBitsAffinityEx(&v31);
if( v10 )
{
v11 = IsEmptyAffinity == 0;
do
{
v26 = v31.Bitmap[0];
v25 = (unsigned __int16 *)&v31;
v27 = 0;
while( !(unsigned int)KeEnumerateNextProcessor(&ProcessorNumber, &v25) )
{
KeGetPrcb((unsigned int)ProcessorNumber);
if( *(_BYTE *)(v12 + 33276) )
{
v0 = 1;
*(_BYTE *)(v12 + 33276) = 0;
}
}
v13 = -1;
v26 = v31.Bitmap[0];
v25 = (unsigned __int16 *)&v31;
v27 = 0;
while( !(unsigned int)KeEnumerateNextProcessor(&ProcessorNumber, &v25) )
{
KeGetPrcb((unsigned int)ProcessorNumber);
v15 = *(unsigned __int16 *)(v14 + 33274);
if( (v9 == -1 || *(unsigned __int8 *)(PpmHeteroHgsInterface + 8 * v15 + 16) > v9)
&& v13 >= *(unsigned __int8 *)(PpmHeteroHgsInterface + 8 * v15 + 16) )
{
v13 = *(unsigned __int8 *)(PpmHeteroHgsInterface + 8 * v15 + 16);
}
}
v26 = v31.Bitmap[0];
v25 = (unsigned __int16 *)&v31;
v27 = 0;
while( !(unsigned int)KeEnumerateNextProcessor(&ProcessorNumber, &v25) )
{
KeGetPrcb((unsigned int)ProcessorNumber);
if( *(unsigned __int8 *)(PpmHeteroHgsInterface + 8i64 * *(unsigned __int16 *)(v16 + 33274) + 16) == v13 )
{
if( *(_BYTE *)(v16 + 33277) != v11 )
{
v0 = 1;
*(_BYTE *)(v16 + 33277) = v11;
}
--v10;
}
}
v9 = v13;
++v11;
}
while( v10 );
}
v17 = -1;
v18 = KeCountSetBitsAffinityEx(&v31);
if( v18 )
{
v19 = IsEmptyAffinity == 0;
do
{
v26 = v31.Bitmap[0];
v20 = -1;
v25 = (unsigned __int16 *)&v31;
v27 = 0;
while( !(unsigned int)KeEnumerateNextProcessor(&ProcessorNumber, &v25) )
{
KeGetPrcb((unsigned int)ProcessorNumber);
v22 = *(unsigned __int16 *)(v21 + 33274);
if( (v17 == -1 || *(unsigned __int8 *)(PpmHeteroHgsInterface + 8 * v22 + 17) > v17)
&& v20 >= *(unsigned __int8 *)(PpmHeteroHgsInterface + 8 * v22 + 17) )
{
v20 = *(unsigned __int8 *)(PpmHeteroHgsInterface + 8 * v22 + 17);
}
}
v26 = v31.Bitmap[0];
v25 = (unsigned __int16 *)&v31;
v27 = 0;
while( !(unsigned int)KeEnumerateNextProcessor(&ProcessorNumber, &v25) )
{
KeGetPrcb((unsigned int)ProcessorNumber);
if( *(unsigned __int8 *)(PpmHeteroHgsInterface + 8i64 * *(unsigned __int16 *)(v23 + 33274) + 17) == v20 )
{
if( *(_BYTE *)(v23 + 33278) != v19 )
{
v0 = 1;
*(_BYTE *)(v23 + 33278) = v19;
}
--v18;
}
}
++v19;
v17 = v20;
}
while( v18 );
}
}
v30 = __readmsr(0x1B1u) & 0xFFFFFFFFFBFFFFFFui64;
__writemsr(0x1B1u, v30);
}
}
}
return v0;
}Referenced by:
PopInitializeHeteroProcessors