PsUpdateComponentPower
void __fastcall PsUpdateComponentPower(PEPROCESS a1, INT64 a2, unsigned __int64 a3){
struct _PO_PROCESS_ENERGY_CONTEXT *EnergyContext;
__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 == *(PEPROCESS *)&PsIdleProcess )
a1 = PsInitialSystemProcess;
EnergyContext = a1->EnergyContext;
if( !EnergyContext )
return;
if( (_DWORD)a2 == 1 )
{
if( !a3 )
return;
v4 = 280i64;
v5 = 64i64;
goto LABEL_7;
}
if( (_DWORD)a2 == 2 )
{
if( !a3 )
return;
_InterlockedExchangeAdd64((volatile signed __int64 *)EnergyContext + 9, HIDWORD(a3));
a3 = (unsigned int)a3;
v4 = 288i64;
v5 = 88i64;
goto LABEL_7;
}
if( (_DWORD)a2 != 3 )
{
PoEnergyContextUpdateComponentPower(a1, a2, a3);
return;
}
if( a3 )
{
_InterlockedExchangeAdd64((volatile signed __int64 *)EnergyContext + 10, HIDWORD(a3));
a3 = (unsigned int)a3;
v4 = 296i64;
v5 = 96i64;
LABEL_7:
v6 = (volatile signed __int64 *)((char *)EnergyContext + v4);
_InterlockedExchangeAdd64((volatile signed __int64 *)((char *)EnergyContext + v5), a3);
if( (struct _PO_PROCESS_ENERGY_CONTEXT *)((char *)EnergyContext + v4) )
{
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