PpmPerfArbitratorApplyProcessorState
CHAR __stdcall PpmPerfArbitratorApplyProcessorState(INT64 a1, UINT8 a2, CHAR a3, INT64 a4){
__int64 v4;
_KPRCB *v5;
__int64 v6;
CHAR v8;
__int64 v10;
CHAR v12;
char v13;
signed int v14;
int v15;
_DWORD *v16;
_MI_SYSTEM_VA_TYPE v17;
int v19;
unsigned __int16 v20;
unsigned int v21;
__int64 v22;
unsigned __int64 v23;
v4 = *(_QWORD *)(a1 + 33136);
v5 = (_KPRCB *)(a1 + 33128);
v6 = *(_QWORD *)(a1 + 33128);
v8 = a3;
v10 = 0i64;
v12 = 1;
v13 = 0;
if( PpmPerfQosEnabled )
v14 = *(_DWORD *)(a1 + 33264);
else
v14 = 0;
v15 = *(_DWORD *)(v6 + 548);
if( v14 != *(_DWORD *)(a1 + 33268) )
{
if( !*(_BYTE *)(v6 + 355) || (struct _KPRCB *)a1 == KeGetCurrentPrcb() )
{
v19 = *(unsigned __int16 *)(a1 + 33272);
v16 = (_DWORD *)(v4 + 104);
if( !_bittest(&v19, v14) || *v16 != v15 )
{
*v16 = v15;
v8 = 1;
a2 = 1;
}
*(_DWORD *)(a1 + 33268) = v14;
v13 = 1;
goto LABEL_7;
}
return 0;
}
v16 = (_DWORD *)(v4 + 104);
if( *(_DWORD *)(v4 + 104) != v15 )
{
if( !v14 )
{
LABEL_6:
*v16 = v15;
v8 = 1;
goto LABEL_7;
}
if( !*(_BYTE *)(v6 + 355) || (struct _KPRCB *)a1 == KeGetCurrentPrcb() )
{
a2 = 1;
goto LABEL_6;
}
return 0;
}
LABEL_7:
if( v8 )
{
if( a3 )
*v16 = 0;
LOBYTE(a4) = a3;
*(_DWORD *)(v4 + 112) = *(_DWORD *)(v4 + 72);
LOBYTE(v10) = a2;
*(_DWORD *)(v4 + 108) = *(_DWORD *)(v4 + 76);
*(_OWORD *)(v4 + 64) = *(_OWORD *)(v6 + 40i64 * v14 + 552);
*(_OWORD *)(v4 + 80) = *(_OWORD *)(v6 + 40i64 * v14 + 568);
*(_QWORD *)(v4 + 96) = *(_QWORD *)(v6 + 40i64 * v14 + 584);
(*(void(__fastcall **)(_QWORD, __int64, __int64, INT64))(v6 + 288))(*(_QWORD *)(v4 + 8), v4 + 64, v10, a4);
if( PopHeteroSystem )
{
v20 = *(_WORD *)(v6 + 2i64 * v14 + 536);
v17 = *(unsigned __int16 *)(a1 + 33272);
if( v20 != (_WORD)v17 )
{
*(_WORD *)(a1 + 33272) = v20;
v21 = 0;
v22 = *(_QWORD *)(a1 + 192);
do
{
if( (v20 & 1) != (v17 & 1) )
{
v23 = *(unsigned __int8 *)(a1 + 209);
if( (v20 & 1) != 0 )
_interlockedbittestandset64((volatile signed __int32 *)(v22 + 8i64 * v21 + 304), v23);
else
_interlockedbittestandreset64((volatile signed __int32 *)(v22 + 8i64 * v21 + 304), v23);
}
v20 >>= 1;
++v21;
LOWORD(v17) = (unsigned __int16)v17 >> 1;
}
while( v21 < 5 );
}
}
KeUpdateQosGroupingSets((VOID *)a1, (unsigned int)v14, v17);
v5 = (_KPRCB *)(a1 + 33128);
if( !a3 )
v13 = 1;
}
if( v13 )
PpmEventProcessorPerfStateChange(v5, (_PROC_PERF_DOMAIN *)a2);
return v12;
}Referenced by:
PoSetProcessorQoS
PpmIdleExecuteTransition
PpmPerfApplyProcessorState