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