PsUpdateComponentPower
void __fastcall PsUpdateComponentPower(_EPROCESS *a1, int a2, unsigned __int64 a3){
__int64 v3;
__int64 v4;
__int64 v5;
volatile signed __int64 *v6;
signed __int64 v7;
unsigned int v8;
bool v9;
signed __int64 v10;
signed __int64 v11;
if( !a1 || a1 == PsIdleProcess )
a1 = (_EPROCESS *)PsInitialSystemProcess;
v3 = *((_QWORD *)a1 + 285);
if( !v3 )
return;
if( a2 == 1 )
{
if( !a3 )
return;
v4 = 280i64;
v5 = 64i64;
goto LABEL_7;
}
if( a2 == 2 )
{
if( !a3 )
return;
_InterlockedExchangeAdd64((volatile signed __int64 *)(v3 + 72), HIDWORD(a3));
a3 = (unsigned int)a3;
v4 = 288i64;
v5 = 88i64;
goto LABEL_7;
}
if( a2 != 3 )
{
PoEnergyContextUpdateComponentPower(a1, a2, a3);
return;
}
if( a3 )
{
_InterlockedExchangeAdd64((volatile signed __int64 *)(v3 + 80), HIDWORD(a3));
a3 = (unsigned int)a3;
v4 = 296i64;
v5 = 96i64;
LABEL_7:
v6 = (volatile signed __int64 *)(v4 + v3);
_InterlockedExchangeAdd64((volatile signed __int64 *)(v5 + v3), a3);
if( v4 + v3 )
{
v7 = *v6;
v8 = KiTimelineBitmapTime;
v9 = KiTimelineBitmapTime <= (unsigned int)*v6;
if( KiTimelineBitmapTime != (unsigned int)*v6 )
goto LABEL_18;
if( (v7 & 0x100000000i64) == 0 )
{
do
{
v9 = v8 <= (unsigned int)v7;
LABEL_18:
if( v9 )
{
if( (unsigned int)v7 - v8 >= 0x20 )
return;
HIDWORD(v11) = HIDWORD(v7) | (1 << (v7 - v8));
if( HIDWORD(v11) == HIDWORD(v7) )
return;
LODWORD(v11) = v7;
}
else
{
if( v8 - (unsigned int)v7 >= 0x20 )
HIDWORD(v11) = 1;
else
HIDWORD(v11) = (HIDWORD(v7) << (v8 - v7)) | 1;
LODWORD(v11) = v8;
}
v10 = v7;
v7 = _InterlockedCompareExchange64(v6, v11, v7);
}
while( v10 != v7 );
}
}
}
}Referenced by:
PspApplyJobChainLimitsToProcess