PpmParkDistributeUtility
NTSTATUS __stdcall PpmParkDistributeUtility(){
unsigned __int64 v0;
__int64 v1;
int CurrentIndex;
unsigned __int8 v3;
unsigned int v4;
unsigned __int16 v5;
unsigned __int8 v6;
unsigned __int8 v7;
char v8;
char v9;
unsigned __int64 v10;
unsigned __int64 v11;
unsigned __int64 CurrentMask;
unsigned __int64 v13;
__int64 v14;
unsigned int v15;
int v16;
int v17;
unsigned int v18;
unsigned int v19;
int v20;
int v21;
unsigned __int64 v22;
unsigned __int64 v23;
__int64 v24;
unsigned int v25;
unsigned int v26;
unsigned int v27;
unsigned int v28;
int v29;
unsigned __int64 v30;
__int64 v31;
unsigned int v32;
int v33;
NTSTATUS result;
_KPRCB *Prcb;
UINT64 v36;
unsigned __int8 v37;
int v38;
_KPRCB *v39;
unsigned int v40;
__int64 v41;
unsigned int v42;
unsigned int v43;
unsigned int v44;
_KPRCB *v45;
unsigned int Utility;
_KPRCB *v47;
UINT64 ProcIndex;
unsigned __int64 v49;
_KAFFINITY_ENUMERATION_CONTEXT Context;
unsigned __int64 v51;
unsigned __int64 v52;
unsigned __int16 v53;
char v54;
char v55;
unsigned int v56;
int v57;
_DWORD *v58;
v53 = CurrentIndex;
v52 = v0;
v4 = v56;
v5 = CurrentIndex;
Context.CurrentIndex = CurrentIndex;
*(_DWORD *)(&Context.CurrentIndex + 1) = 0;
v6 = v3;
*(&Context.CurrentIndex + 3) = 0;
v7 = 0;
LODWORD(ProcIndex) = 0;
v8 = 0;
v51 = v0 ^ v1;
v9 = 0;
v57 = (unsigned __int16)CurrentIndex;
v10 = 0i64;
Context.Affinity = 0i64;
v11 = v0 ^ v1;
CurrentMask = v0 ^ v1;
CurrentIndex = (unsigned __int16)CurrentIndex;
while( CurrentMask )
{
LABEL_3:
CurrentIndex = Context.CurrentIndex;
_BitScanForward64(&v13, CurrentMask);
Context.CurrentMask = CurrentMask & ~(1i64 << v13);
LODWORD(ProcIndex) = KiProcessorNumberToIndexMappingTable[64 * Context.CurrentIndex + (unsigned __int8)v13];
if( (unsigned int)ProcIndex >= (unsigned int)KeNumberProcessors_0 )
v14 = 0i64;
else
v14 = (__int64)*(&KiProcessorBlock + (unsigned int)ProcIndex);
if( *(_BYTE *)(v14 + 33208) )
{
++v9;
v10 |= *(_QWORD *)(v14 + 200);
}
else
{
++v8;
}
v15 = *(_DWORD *)(v14 + 33168);
if( PpmHeteroImplementationGeneration )
{
v16 = *(_DWORD *)(v14 + 33184);
if( v16 )
v15 = (v16 * v15) >> 16;
}
CurrentMask = Context.CurrentMask;
++v7;
v4 += v15;
}
while( ++Context.CurrentIndex < (unsigned int)(CurrentIndex + 1) )
{
Context.CurrentMask = *(_QWORD *)(8i64 * Context.CurrentIndex + 8);
CurrentMask = Context.CurrentMask;
if( Context.CurrentMask )
goto LABEL_3;
}
Context.CurrentMask = v52;
v49 = v10;
v54 = v9;
Context.CurrentIndex = v5;
while( 1 )
{
KeEnumerateNextProcessor(&ProcIndex, &Context);
if( v17 )
break;
Prcb = KeGetPrcb((unsigned int)ProcIndex);
v36 = Prcb->PowerState.CheckContext.Utility - Prcb->PowerState.CheckContext.AffinitizedUtility;
if( PpmHeteroImplementationGeneration )
LODWORD(v36) = PpmHeteroUtilityToNormalizedUtility((INT64)&Prcb->PowerState.CheckContext, v36);
v4 += v36;
}
if( v7 <= 1u )
v7 = 1;
if( v6 >= v7 )
v6 = v7;
if( v6 <= 1u )
v6 = 1;
v18 = v4 / v7;
v19 = v4 / v6;
if( v8 )
{
v20 = 0;
if( v54 )
{
Context.CurrentIndex = v53;
Context.CurrentMask = v49;
Context.Affinity = 0i64;
while( 1 )
{
v37 = v6;
KeEnumerateNextProcessor(&ProcIndex, &Context);
if( v38 )
break;
v39 = KeGetPrcb((unsigned int)ProcIndex);
v11 ^= v39->GroupSetMember;
v40 = PpmHeteroNormalizedUtilityToUtility((INT64)&v39->PowerState.CheckContext, v19);
v42 = v40;
if( v40 <= *(_DWORD *)(v41 + 40) )
{
if( v55 )
{
v43 = *(_DWORD *)(v41 + 44);
if( v43 <= v42 )
v43 = v42;
*(_DWORD *)(v41 + 40) = v43;
}
}
else
{
*(_DWORD *)(v41 + 40) = v40;
}
--v6;
if( !v37 )
v6 = 0;
}
}
}
else
{
v20 = 0;
}
v21 = v57;
v22 = v11;
Context.CurrentIndex = v53;
while( v22 )
{
LABEL_24:
v21 = Context.CurrentIndex;
_BitScanForward64(&v23, v22);
Context.CurrentMask = v22 & ~(1i64 << v23);
LODWORD(ProcIndex) = KiProcessorNumberToIndexMappingTable[64 * Context.CurrentIndex + (unsigned __int8)v23];
if( (unsigned int)ProcIndex >= (unsigned int)KeNumberProcessors_0 )
v24 = 0i64;
else
v24 = (__int64)*(&KiProcessorBlock + (unsigned int)ProcIndex);
v25 = *(_DWORD *)(v24 + 33184);
v26 = *(_DWORD *)(v24 + 33168);
if( v25 )
v27 = (v26 * v25) >> 16;
else
v27 = *(_DWORD *)(v24 + 33168);
if( v18 <= v27 )
{
v11 ^= *(_QWORD *)(v24 + 200);
v28 = v19;
if( v25 )
{
if( v25 == 0x10000 )
v28 = (unsigned __int16)v19;
else
v28 = (v19 << 16) / v25;
}
if( v28 <= v26 )
{
if( !v55 )
goto LABEL_29;
v44 = *(_DWORD *)(v24 + 33172);
v22 = Context.CurrentMask;
if( v44 <= v28 )
v44 = v28;
*(_DWORD *)(v24 + 33168) = v44;
}
else
{
v22 = Context.CurrentMask;
*(_DWORD *)(v24 + 33168) = v28;
}
}
else
{
LABEL_29:
v22 = Context.CurrentMask;
}
}
while( ++Context.CurrentIndex < (unsigned int)(v21 + 1) )
{
Context.CurrentMask = *(_QWORD *)(8i64 * Context.CurrentIndex + 8);
v22 = Context.CurrentMask;
if( Context.CurrentMask )
goto LABEL_24;
}
v29 = v57;
Context.CurrentIndex = v53;
Context.Affinity = 0i64;
while( v11 )
{
LABEL_38:
v29 = Context.CurrentIndex;
_BitScanForward64(&v30, v11);
Context.CurrentMask = v11 & ~(1i64 << v30);
LODWORD(ProcIndex) = KiProcessorNumberToIndexMappingTable[64 * Context.CurrentIndex + (unsigned __int8)v30];
if( (unsigned int)ProcIndex >= (unsigned int)KeNumberProcessors_0 )
v31 = 0i64;
else
v31 = (__int64)*(&KiProcessorBlock + (unsigned int)ProcIndex);
v32 = *(_DWORD *)(v31 + 33184);
v33 = v18;
if( v32 )
{
if( v32 == 0x10000 )
v33 = (unsigned __int16)v18;
else
v33 = (v18 << 16) / v32;
}
v11 = Context.CurrentMask;
*(_DWORD *)(v31 + 33168) = v33;
}
while( 1 )
{
result = Context.CurrentIndex;
LOWORD(result) = ++Context.CurrentIndex;
if( Context.CurrentIndex >= (unsigned int)(v29 + 1) )
break;
Context.CurrentMask = *(_QWORD *)(8i64 * Context.CurrentIndex + 8);
v11 = Context.CurrentMask;
if( Context.CurrentMask )
goto LABEL_38;
}
if( v58 )
{
Context.CurrentMask = v51;
Context.Affinity = 0i64;
Context.CurrentIndex = v53;
while( 1 )
{
KeEnumerateNextProcessor(&ProcIndex, &Context);
if( result )
break;
v45 = KeGetPrcb((unsigned int)ProcIndex);
Utility = v45->PowerState.CheckContext.Utility;
if( Utility > 0x2710 )
v20 += PpmHeteroUtilityToNormalizedUtility((INT64)&v45->PowerState.CheckContext, Utility - 10000);
}
*v58 = v20;
}
if( v55 )
{
Context.CurrentMask = v52;
Context.CurrentIndex = v53;
Context.Affinity = 0i64;
while( 1 )
{
KeEnumerateNextProcessor(&ProcIndex, &Context);
if( result )
break;
v47 = KeGetPrcb((unsigned int)ProcIndex);
v47->PowerState.CheckContext.Utility = v47->PowerState.CheckContext.AffinitizedUtility;
}
}
return result;
}Referenced by:
PpmHeteroDistributeUtility
PpmParkDistributeAllUtility