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.