PoSetProcessorQoS
CHAR __fastcall PoSetProcessorQoS(INT64 a1, UINT64 a2, INT64 a3, INT64 a4){
bool v4;
char v5;
signed int v6;
CHAR v8;
__int64 v9;
int v10;
unsigned __int64 v11;
signed int v12;
bool v13;
UINT64 v14;
bool v15;
__int16 v17;
v4 = 0;
v5 = 0;
v6 = a2;
v8 = 1;
if( (_DWORD)a2 == *(_DWORD *)(a1 + 33264) )
return v8;
v9 = *(_QWORD *)(a1 + 33136);
if( v9 && *(_BYTE *)(v9 + 125) )
{
v5 = 1;
_disable();
v4 = (v17 & 0x200) != 0;
KxAcquireSpinLock((UINT64 *)(v9 + 128));
}
v10 = *(unsigned __int16 *)(a1 + 33272);
if( _bittest(&v10, v6) )
goto LABEL_19;
v11 = __rdtsc();
a2 = v11 - *(_QWORD *)(a1 + 33248);
v12 = *(_DWORD *)(a1 + 33264);
v13 = v6 == 3 || v12 == 3;
if( v6 == 4 && v12 || !v6 || v6 <= v12 && !v13 || a2 >= *(_QWORD *)(a1 + 33256) || *(_BYTE *)(a1 + 33213) )
{
v14 = 2i64 * *(_QWORD *)(a1 + 33256);
*(_QWORD *)(a1 + 33248) = v11;
*(_BYTE *)(a1 + 33213) = a2 >= v14;
LABEL_19:
v15 = PpmPerfVmQosSupported == 0;
*(_DWORD *)(a1 + 33264) = v6;
if( v15 )
PpmPerfArbitratorApplyProcessorState(a1, 1u, 0, a4);
else
PpmHvSetVirtualProcessorQos(a1, a2);
*(_BYTE *)(a1 + 236) = v6;
goto LABEL_23;
}
v8 = 0;
LABEL_23:
if( v5 )
{
KxReleaseSpinLock((UINT64 *)(v9 + 128));
if( v4 )
_enable();
}
return v8;
}Referenced by:
KeCheckAndApplyBamQos
KeClockInterruptNotify