PpmIdleGuestPreselect
UINT64 __stdcall PpmIdleGuestPreselect(VOID *Context, _PROCESSOR_IDLE_CONSTRAINTS *Constraints){
struct _KPRCB *CurrentPrcb;
unsigned __int64 *StatisticsPage;
unsigned __int64 TotalTime;
unsigned __int64 IdleTime;
unsigned int OverrideState;
__int64 DemotePercent;
__int64 PromotePercent;
unsigned __int64 v9;
UINT64 result;
unsigned __int64 v11;
unsigned __int64 v12;
CurrentPrcb = KeGetCurrentPrcb();
if( CurrentPrcb->PowerState.Hypervisor < ProcHypervisorPower )
{
TotalTime = Constraints->TotalTime;
IdleTime = Constraints->IdleTime;
}
else
{
StatisticsPage = CurrentPrcb->StatisticsPage;
TotalTime = StatisticsPage[(unsigned int)xmmword_140CED0E0];
IdleTime = TotalTime - StatisticsPage[DWORD1(xmmword_140CED0E0)];
}
OverrideState = Constraints->OverrideState;
if( OverrideState != -1 )
{
if( OverrideState < 2 )
{
LABEL_12:
CurrentPrcb->PowerState.HvIdleCheck.Time = TotalTime;
CurrentPrcb->PowerState.HvIdleCheck.Idle = IdleTime;
goto LABEL_8;
}
LABEL_20:
OverrideState = 1;
goto LABEL_12;
}
if( Constraints->Parked && CurrentPrcb->PowerState.Hypervisor < ProcHypervisorPower )
goto LABEL_20;
DemotePercent = Constraints->DemotePercent;
if( !(_BYTE)DemotePercent )
goto LABEL_20;
PromotePercent = Constraints->PromotePercent;
if( !(_BYTE)PromotePercent )
goto LABEL_20;
v9 = TotalTime - CurrentPrcb->PowerState.HvIdleCheck.Time;
OverrideState = CurrentPrcb->PowerState.HvTargetState;
if( v9 >= Constraints->TimeCheck )
{
v11 = IdleTime - CurrentPrcb->PowerState.HvIdleCheck.Idle;
v12 = v9 * PromotePercent / 0x64;
if( v11 < (unsigned int)(v9 * DemotePercent / 0x64) && CurrentPrcb->PowerState.HvTargetState )
{
--OverrideState;
CurrentPrcb->PowerState.HvIdleCheck.Time = TotalTime;
CurrentPrcb->PowerState.HvIdleCheck.Idle = IdleTime;
goto LABEL_8;
}
if( v11 >= (unsigned int)v12 && OverrideState + 1 < 2 )
{
++OverrideState;
CurrentPrcb->PowerState.HvIdleCheck.Time = TotalTime;
CurrentPrcb->PowerState.HvIdleCheck.Idle = IdleTime;
goto LABEL_8;
}
goto LABEL_12;
}
LABEL_8:
result = OverrideState;
CurrentPrcb->PowerState.HvTargetState = OverrideState;
return result;
}Referenced by:
No references.