PpmUpdateProcessorIdleAccounting
VOID __stdcall PpmUpdateProcessorIdleAccounting(_PROCESSOR_POWER_STATE *PpmState){
_PPM_IDLE_STATES *IdleStates;
unsigned __int64 IdleTimeLast;
__int64 ActualState;
char *v4;
unsigned __int64 *v5;
__int64 v6;
__int64 v7;
IdleStates = PpmState->IdleStates;
if( PpmState->IdleStates->UnaccountedTransition )
{
IdleTimeLast = PpmState->IdleTimeLast;
PpmState->IdleTimeLast = 0i64;
ActualState = IdleStates->ActualState;
PpmState->IdleTimeTotal += IdleTimeLast;
v4 = (char *)PpmState->IdleAccounting + 1000 * ActualState;
*((_QWORD *)v4 + 5) += IdleTimeLast;
if( IdleStates->PreviousCancelReason == 3 )
{
if( IdleStates->PreviousStatus < 0 )
{
++*((_DWORD *)v4 + 13);
}
else
{
++*((_DWORD *)v4 + 14);
v5 = (unsigned __int64 *)&PpmIdleIntervalLimits;
v6 = 0i64;
do
{
if( IdleTimeLast < *v5 )
break;
v6 = (unsigned int)(v6 + 1);
v5 += 3;
}
while( (unsigned int)v6 < 0x1A );
if( (unsigned int)v6 >= 0x1A )
{
++*((_DWORD *)v4 + 15);
}
else
{
v7 = 32 * v6;
*(_QWORD *)&v4[v7 + 208] += IdleTimeLast;
++*(_DWORD *)&v4[v7 + 232];
if( IdleTimeLast < *(_QWORD *)&v4[v7 + 216] )
*(_QWORD *)&v4[v7 + 216] = IdleTimeLast;
if( IdleTimeLast > *(_QWORD *)&v4[v7 + 224] )
*(_QWORD *)&v4[v7 + 224] = IdleTimeLast;
}
if( IdleTimeLast < *((_QWORD *)v4 + 8) )
*((_QWORD *)v4 + 8) = IdleTimeLast;
if( IdleTimeLast > *((_QWORD *)v4 + 9) )
*((_QWORD *)v4 + 9) = IdleTimeLast;
}
}
else
{
++*((_DWORD *)v4 + 12);
}
}
IdleStates->PreviousStatus = 0;
IdleStates->PreviousCancelReason = 3;
IdleStates->UnaccountedTransition = 0;
}Referenced by:
PpmInstallNewIdleStates
PpmTranslateIdleAccounting