PpmParkApplyPolicy
VOID __stdcall PpmParkApplyPolicy(){
int v0;
__int64 v1;
__int64 v2;
unsigned int v3;
int v4;
int v5;
unsigned int v6;
unsigned __int16 v7;
unsigned int v8;
int v9;
__int64 v10;
char v11;
unsigned __int8 v12;
int v13;
unsigned __int8 v14;
__int64 v15;
_QWORD *v16;
__int64 v17;
NPTEXTMETRIC *v18;
unsigned int v19;
__int64 v20;
int v21;
unsigned int v22;
unsigned __int8 v23;
unsigned int v24;
unsigned __int8 v25;
char v26;
unsigned __int8 v27;
unsigned __int16 v28;
int v29;
_KPRCB *Prcb;
unsigned __int16 v31;
__int64 v32;
int v33;
char v34;
unsigned __int8 v35;
unsigned __int8 v36;
char v37;
char v38;
char v39;
char v40;
char v41;
char v42;
char v43;
char v44;
unsigned __int16 v45;
__int64 v46;
unsigned __int8 v47;
int v48;
unsigned __int8 v49;
unsigned __int16 v50;
__int64 v51;
unsigned __int8 v52;
int v53;
unsigned __int8 v54;
char v55;
struct _KPRCB *CurrentPrcb;
UINT64 v57;
unsigned __int16 v58;
unsigned int v59;
UINT64 ProcIndex;
unsigned int v61;
unsigned int v62;
__int64 v63;
NPTEXTMETRIC *v64;
_QWORD *v65;
__int64 v66;
__int64 v67;
_KAFFINITY_ENUMERATION_CONTEXT Context;
char v69;
unsigned __int8 v70;
__int16 v71;
__int16 v72;
v0 = 0;
memset(&Context, 0, sizeof(Context));
LODWORD(ProcIndex) = 0;
if( PpmParkNodes )
{
v1 = *(&stru_140C00F40 + 365) + 2736i64 * *(&stru_140C23628 + 441);
v67 = v1;
v72 = *(_WORD *)(v1 + 180);
v71 = *(_WORD *)(v1 + 182);
LODWORD(v2) = 64;
if( !KeGetPrcb(0i64)->PowerState.CheckContext.Domain )
{
v34 = PpmParkInitialClass1UnParkCount;
if( (unsigned int)PpmParkInitialClass1UnParkCount > 0x40 )
v34 = 64;
HIBYTE(v72) = 0;
LOBYTE(v2) = v34;
}
v3 = PpmParkNumNodes;
v4 = *(&stru_140CF2E80 + 1951);
v5 = *(&stru_140CF2E80 + 1952);
HIDWORD(ProcIndex) = v2;
v58 = 0;
v6 = *(&stru_140CF2E80 + 1951) / (unsigned int)PpmParkNumNodes
- *(&stru_140CF2E80 + 1951) / (unsigned int)PpmParkNumNodes % (unsigned __int8)PpmParkGranularity;
v62 = v6;
v7 = 0;
v8 = *(&stru_140CF2E80 + 1952) / (unsigned int)PpmParkNumNodes
- *(&stru_140CF2E80 + 1952) / (unsigned int)PpmParkNumNodes % (unsigned __int8)PpmParkGranularity;
v61 = v8;
if( (_DWORD)PpmParkNumNodes )
{
do
{
v9 = (unsigned __int8)v6;
v10 = PpmParkNodes + 272i64 * v7;
v11 = PpmParkGranularity;
v12 = *(_BYTE *)(v10 + 6);
v13 = v12 - (unsigned __int8)PpmParkGranularity;
if( v9 > v13 )
LOBYTE(v9) = v12 - PpmParkGranularity;
*(_BYTE *)(v10 + 134) = v9;
v4 -= (unsigned __int8)v9;
v14 = v8;
if( (unsigned __int8)v8 > v13 )
v14 = v12 - v11;
v5 -= v14;
*(_BYTE *)(v10 + 136) = v14;
v69 = 0;
v15 = v10 - (_QWORD)&v71;
v63 = 0i64;
v16 = (_QWORD *)(v10 + 56);
v66 = v10 - (_QWORD)&v71;
v17 = 0i64;
v64 = 0i64;
v18 = 0i64;
v59 = 0;
v19 = 0;
v65 = (_QWORD *)(v10 + 56);
v20 = 0i64;
do
{
v21 = *((unsigned __int8 *)&v71 + v20 + v15 + 128);
if( (_BYTE)v21 )
{
v22 = (v21 * (unsigned int)*((unsigned __int8 *)&v71 + v20) + 50) / 0x64;
v23 = (v21 - (unsigned __int8)v22) % (unsigned __int8)PpmParkGranularity + v22;
v24 = (v21 * (unsigned int)*((unsigned __int8 *)&v72 + v20) + 50) / 0x64;
v25 = (v21 - (unsigned __int8)v24) % (unsigned __int8)PpmParkGranularity + v24;
if( v59 )
{
v35 = v23;
if( v23 >= (unsigned __int8)v2 )
v35 = v2;
v23 = v35;
}
if( v25 )
{
v26 = v25;
if( (unsigned __int8)PpmParkGranularity > v25 )
v26 = PpmParkGranularity;
v25 = v26;
}
v27 = v25;
v2 = 0i64;
Context.Affinity = 0i64;
if( v23 >= v25 )
v27 = v23;
v28 = *(_WORD *)(v10 + 4);
v70 = v27;
Context.CurrentMask = *(v16 - 5);
Context.CurrentIndex = v28;
while( 1 )
{
KeEnumerateNextProcessor(&ProcIndex, &Context);
if( v29 )
break;
Prcb = KeGetPrcb((unsigned int)ProcIndex);
if( Prcb->PowerState.HwFeedbackParkHint )
v2 |= Prcb->GroupSetMember;
}
v16 = v65;
v18 = (NPTEXTMETRIC *)(v2 | (unsigned __int64)v64);
v17 = *v65 | v63;
v69 += v25;
v15 = v66;
*v65 = v2;
LOBYTE(v2) = BYTE4(ProcIndex);
*(_BYTE *)(v10 + v20 + 132) = v70;
v19 = v59;
*(_BYTE *)(v10 + v20 + 130) = v25;
v63 = v17;
v64 = v18;
}
++v19;
++v16;
++v20;
v59 = v19;
v65 = v16;
}
while( v19 < 2 );
if( (NPTEXTMETRIC *)v17 != v18 )
PpmEventParkNodeParkHintChanged(*(_WORD *)(v10 + 4), *(_QWORD *)(v10 + 8), v18);
if( !v69 )
{
v36 = PpmParkGranularity;
*(_BYTE *)(v10 + 130) = PpmParkGranularity;
if( v36 <= *(_BYTE *)(v10 + 132) )
v36 = *(_BYTE *)(v10 + 132);
*(_BYTE *)(v10 + 132) = v36;
}
if( PpmHeteroPolicy == 2 )
{
v37 = *(_BYTE *)(v10 + 130);
v38 = 1;
*(_BYTE *)(v10 + 139) = 0;
*(_BYTE *)(v10 + 131) = 0;
if( (unsigned __int8)v37 > 1u )
v38 = v37;
*(_BYTE *)(v10 + 133) = 0;
v39 = *(_BYTE *)(v10 + 132);
*(_BYTE *)(v10 + 130) = v38;
v40 = 1;
if( (unsigned __int8)v39 > 1u )
v40 = v39;
*(_BYTE *)(v10 + 132) = v40;
*(_BYTE *)(v10 + 146) |= 4u;
}
else if( PpmHeteroPolicy == 3 && *(_BYTE *)(v10 + 129) )
{
v41 = *(_BYTE *)(v10 + 131);
v42 = 1;
*(_BYTE *)(v10 + 138) = 0;
*(_BYTE *)(v10 + 130) = 0;
if( (unsigned __int8)v41 > 1u )
v42 = v41;
*(_BYTE *)(v10 + 132) = 0;
v43 = *(_BYTE *)(v10 + 133);
*(_BYTE *)(v10 + 131) = v42;
v44 = 1;
if( (unsigned __int8)v43 > 1u )
v44 = v43;
*(_BYTE *)(v10 + 146) |= 2u;
*(_BYTE *)(v10 + 133) = v44;
}
v3 = PpmParkNumNodes;
v7 = v58 + 1;
LOBYTE(v8) = v61;
LOBYTE(v6) = v62;
++v58;
}
while( v58 < (unsigned int)PpmParkNumNodes );
v1 = v67;
}
do
{
LABEL_30:
if( !v4 )
goto LABEL_31;
v45 = 0;
}
while( !v3 );
while( v4 )
{
v46 = PpmParkNodes + 272i64 * v45;
v47 = *(_BYTE *)(v46 + 6);
if( v47 )
{
v48 = (unsigned __int8)PpmParkGranularity;
v49 = PpmParkGranularity + *(_BYTE *)(v46 + 134);
if( v49 < v47 )
{
*(_BYTE *)(v46 + 134) = v49;
v4 -= v48;
}
}
if( ++v45 >= v3 )
goto LABEL_30;
}
LABEL_31:
while( v5 )
{
v50 = 0;
if( v3 )
{
while( v5 )
{
v51 = PpmParkNodes + 272i64 * v50;
v52 = *(_BYTE *)(v51 + 6);
if( v52 )
{
v53 = (unsigned __int8)PpmParkGranularity;
v54 = PpmParkGranularity + *(_BYTE *)(v51 + 136);
if( v54 < v52 )
{
*(_BYTE *)(v51 + 136) = v54;
v5 -= v53;
}
}
if( ++v50 >= v3 )
goto LABEL_31;
}
break;
}
}
v31 = 0;
if( v3 )
{
do
{
v32 = PpmParkNodes + 272i64 * v31;
v33 = *(unsigned __int8 *)(v32 + 134);
if( *(unsigned __int8 *)(v32 + 135) != *(unsigned __int8 *)(v32 + 6) - v33
|| *(unsigned __int8 *)(v32 + 137) != *(unsigned __int8 *)(v32 + 6) - *(unsigned __int8 *)(v32 + 136) )
{
PpmEventParkNodeCapChange(*(_WORD *)(v32 + 4), *(_QWORD *)(v32 + 8), v33, *(_BYTE *)(v32 + 136));
v55 = *(_BYTE *)(v32 + 6) - *(_BYTE *)(v32 + 134);
*(_BYTE *)(v32 + 137) = *(_BYTE *)(v32 + 6) - *(_BYTE *)(v32 + 136);
*(_BYTE *)(v32 + 135) = v55;
}
++v31;
}
while( v31 < (unsigned int)PpmParkNumNodes );
}
if( *(_DWORD *)(v1 + 184) )
{
CurrentPrcb = KeGetCurrentPrcb();
v57 = *(unsigned int *)(v1 + 184);
PpmParkSoftParkingEnabled = 1;
v0 = PpmConvertTime(1000000i64 * CurrentPrcb->MHz, 0xF4240ui64, v57);
}
else
{
PpmParkSoftParkingEnabled = 0;
}
}
KeSoftParkedQueueThreshold = v0;
}Referenced by:
PpmParkApplyForcedMask
PpmParkClearForcedMask
PpmParkRegisterParking
PpmParkSetLpiCap
PpmReapplyPerfPolicy
PpmRegisterPerfStates