PopVerifySystemPowerPolicy

NTSTATUS __stdcall PopVerifySystemPowerPolicy(_SYSTEM_POWER_POLICY *InputPolicy, _SYSTEM_POWER_POLICY *PowerPolicy){
  __int128 v3; 
  POWER_ACTION_POLICY *p_PowerPolicy; 
  unsigned int v5; 
  _SYSTEM_POWER_STATE *p_MinSleep; 
  _SYSTEM_POWER_STATE MinSleep; 
  _SYSTEM_POWER_STATE *p_MaxSleep; 
  _SYSTEM_POWER_STATE MaxSleep; 
  unsigned int VideoTimeout; 
  unsigned int SpindownTimeout; 
  _SYSTEM_POWER_STATE *p_ReducedLatencySleep; 
  _SYSTEM_POWER_STATE *p_MinSystemState; 
  POWER_ACTION_POLICY *v14; 
  int Action; 
  unsigned int Flags; 
  unsigned int v17; 
  unsigned int DozeS4Timeout; 
  unsigned int IdleTimeout; 
  int v20; 
  unsigned __int8 IdleSensitivity; 
  _SYSTEM_POWER_STATE v22; 

  *(_OWORD *)&PowerPolicy->Revision = *(_OWORD *)&InputPolicy->Revision;
  *(_OWORD *)&PowerPolicy->SleepButton.Action = *(_OWORD *)&InputPolicy->SleepButton.Action;
  *(_OWORD *)&PowerPolicy->LidClose.Flags = *(_OWORD *)&InputPolicy->LidClose.Flags;
  *(_OWORD *)&PowerPolicy->Idle.Action = *(_OWORD *)&InputPolicy->Idle.Action;
  *(_OWORD *)&PowerPolicy->IdleSensitivity = *(_OWORD *)&InputPolicy->IdleSensitivity;
  *(_OWORD *)&PowerPolicy->WinLogonFlags = *(_OWORD *)&InputPolicy->WinLogonFlags;
  *(_OWORD *)&PowerPolicy->DischargePolicy[0].Enable = *(_OWORD *)&InputPolicy->DischargePolicy[0].Enable;
  v3 = *(_OWORD *)&InputPolicy->DischargePolicy[0].PowerPolicy.EventCode;
  p_PowerPolicy = &InputPolicy->DischargePolicy[1].PowerPolicy;
  *(_OWORD *)&PowerPolicy->DischargePolicy[0].PowerPolicy.EventCode = v3;
  *(_OWORD *)&PowerPolicy->DischargePolicy[1].PowerPolicy.Action = *(_OWORD *)&p_PowerPolicy->Action;
  *(_OWORD *)&PowerPolicy->DischargePolicy[2].Enable = *(_OWORD *)&p_PowerPolicy[1].Flags;
  *(_OWORD *)&PowerPolicy->DischargePolicy[2].PowerPolicy.EventCode = *(_OWORD *)&p_PowerPolicy[2].EventCode;
  *(_OWORD *)&PowerPolicy->DischargePolicy[3].PowerPolicy.Action = *(_OWORD *)&p_PowerPolicy[4].Action;
  *(_OWORD *)&PowerPolicy->VideoTimeout = *(_OWORD *)&p_PowerPolicy[5].Flags;
  *(_OWORD *)&PowerPolicy->VideoReserved[2] = *(_OWORD *)&p_PowerPolicy[6].EventCode;
  *(_QWORD *)&PowerPolicy->OverThrottled.Flags = *(_QWORD *)&p_PowerPolicy[8].Action;
  if( PowerPolicy->Revision != 1 )
    return -1073741811;
  v5 = 0;
  if( *(&stru_140C23628 + 2077) )
  {
    PowerPolicy->MaxSleep = PowerSystemSleeping3;
  }
  else if( *(&stru_140C23628 + 2076) )
  {
    PowerPolicy->MaxSleep = PowerSystemSleeping2;
  }
  else if( *(&stru_140C23628 + 2075) )
  {
    PowerPolicy->MaxSleep = PowerSystemSleeping1;
  }
  p_MinSleep = &PowerPolicy->MinSleep;
  MinSleep = PowerPolicy->MinSleep;
  if( MinSleep < PowerSystemSleeping1 )
  {
    *p_MinSleep = PowerSystemSleeping1;
    MinSleep = PowerSystemSleeping1;
  }
  if( MinSleep > PowerSystemSleeping3 )
  {
    *p_MinSleep = PowerSystemSleeping3;
    MinSleep = PowerSystemSleeping3;
  }
  p_MaxSleep = &PowerPolicy->MaxSleep;
  MaxSleep = PowerPolicy->MaxSleep;
  if( MaxSleep < PowerSystemSleeping1 )
  {
    *p_MaxSleep = PowerSystemSleeping1;
    MaxSleep = PowerSystemSleeping1;
  }
  if( MaxSleep > PowerSystemSleeping3 )
  {
    *p_MaxSleep = PowerSystemSleeping3;
    MaxSleep = PowerSystemSleeping3;
  }
  if( MaxSleep < MinSleep )
  {
    *p_MaxSleep = MinSleep;
    MaxSleep = MinSleep;
  }
  if( MinSleep < *(&stru_140C23628 + 374) )
    *p_MinSleep = *((_SYSTEM_POWER_STATE *)&stru_140C23628 + 374);
  if( MaxSleep > *(&stru_140C23628 + 375) )
    *p_MaxSleep = *((_SYSTEM_POWER_STATE *)&stru_140C23628 + 375);
  VideoTimeout = PowerPolicy->VideoTimeout;
  if( VideoTimeout < *(&stru_140C23628 + 376) )
  {
    PowerPolicy->VideoTimeout = *(&stru_140C23628 + 376);
    VideoTimeout = *(&stru_140C23628 + 376);
  }
  if( VideoTimeout > *(&stru_140C23628 + 377) )
    PowerPolicy->VideoTimeout = *(&stru_140C23628 + 377);
  SpindownTimeout = PowerPolicy->SpindownTimeout;
  if( SpindownTimeout < *(&stru_140C23628 + 378) )
  {
    PowerPolicy->SpindownTimeout = *(&stru_140C23628 + 378);
    SpindownTimeout = *(&stru_140C23628 + 378);
  }
  if( SpindownTimeout > *(&stru_140C23628 + 379) )
    PowerPolicy->SpindownTimeout = *(&stru_140C23628 + 379);
  PopVerifyPowerActionPolicy();
  PopVerifyPowerActionPolicy();
  PopVerifyPowerActionPolicy();
  PopVerifyPowerActionPolicy();
  PopVerifySystemPowerState(&PowerPolicy->LidOpenWake, SubstituteLightestOverallDownwardBounded);
  PopVerifySystemPowerState(&PowerPolicy->MinSleep, SubstituteLightestOverallDownwardBounded);
  PopVerifySystemPowerState(&PowerPolicy->MaxSleep, SubstituteLightestOverallDownwardBounded);
  p_ReducedLatencySleep = &PowerPolicy->ReducedLatencySleep;
  PopVerifySystemPowerState(&PowerPolicy->ReducedLatencySleep, SubstituteLightestOverallDownwardBounded);
  p_MinSystemState = &PowerPolicy->DischargePolicy[0].MinSystemState;
  v14 = &PowerPolicy->DischargePolicy[0].PowerPolicy;
  do
  {
    Action = v14->Action;
    PopVerifyPowerActionPolicy();
    if( Action == 3 && v14->Action < PowerActionHibernate )
    {
      v14->Action = PowerActionShutdownOff;
      PopVerifyPowerActionPolicy();
    }
    PopVerifySystemPowerState(p_MinSystemState, SubstituteLightestOverallDownwardBounded);
    if( v14->Action == PowerActionSleep && v14[1].Action > PowerActionShutdown )
    {
      v14[1].Action = PowerActionShutdown;
      PopVerifySystemPowerState(p_MinSystemState, SubstituteLightestOverallDownwardBounded);
    }
    if( v5 )
    {
      Flags = v14->Flags;
      if( v14->Action == PowerActionShutdownOff )
        v17 = Flags | 0x10;
      else
        v17 = Flags & 0xFFFFFFEF;
      v14->Flags = v17;
    }
    if( v14[-1].EventCode > 0x64 )
      v14[-1].EventCode = 100;
    ++v5;
    p_MinSystemState += 6;
    v14 += 2;
  }
  while( v5 < 4 );
  PopVerifyPowerActionPolicy();
  if( !PowerPolicy->BroadcastCapacityResolution )
    PowerPolicy->BroadcastCapacityResolution = 1;
  DozeS4Timeout = PowerPolicy->DozeS4Timeout;
  if( DozeS4Timeout && !*(&stru_140C23628 + 2079) )
  {
    PowerPolicy->DozeS4Timeout = 0;
    DozeS4Timeout = 0;
  }
  IdleTimeout = PowerPolicy->IdleTimeout;
  v20 = IdleTimeout;
  if( IdleTimeout && IdleTimeout < 0x3C )
  {
    PowerPolicy->IdleTimeout = 60;
    v20 = 60;
  }
  if( DozeS4Timeout - 1 <= 0x3A )
    PowerPolicy->DozeS4Timeout = 60;
  IdleSensitivity = PowerPolicy->IdleSensitivity;
  if( IdleSensitivity > 0x5Au )
  {
    PowerPolicy->IdleSensitivity = 90;
    IdleSensitivity = 90;
  }
  if( v20 && !IdleSensitivity )
    PowerPolicy->IdleSensitivity = 90;
  v22 = *p_MinSleep;
  if( *p_MaxSleep < *p_MinSleep )
    *p_MaxSleep = v22;
  if( *p_ReducedLatencySleep > v22 )
    *p_ReducedLatencySleep = v22;
  return 0;
}

Referenced by:

PopApplyPolicy