PopExecutePowerAction

VOID __stdcall PopExecutePowerAction(
        _POP_ACTION_TRIGGER *Trigger,
        UINT64 UserNotify,
        POWER_ACTION_POLICY *ActionPolicy,
        _SYSTEM_POWER_STATE LightestState,
        POP_SUBSTITUTION_POLICY SubstitutionPolicy){
  unsigned int v5; 
  unsigned int EventCode; 
  unsigned int v8; 
  char v10; 
  unsigned int Flags; 
  POWER_POLICY_DEVICE_TYPE Type; 
  REGHANDLE v13; 
  char v14; 
  POWER_ACTION v15; 
  unsigned __int32 v16; 
  unsigned int v17; 
  int v18; 
  _SYSTEM_POWER_STATE v19; 
  unsigned int v20; 
  int v21; 
  POWER_ACTION v22; 
  UINT64 v23; 
  int v24; 
  char v25; 
  _SYSTEM_POWER_STATE v26; 
  UINT8 v27; 
  UINT8 v28; 
  UINT64 v29; 
  UINT8 v30; 
  UINT64 v31; 
  UINT8 v32; 
  POWER_ACTION v33; 
  int v34; 
  POWER_ACTION v35; 
  POWER_ACTION v36; 
  char v37; 
  char v38; 
  UINT64 v39; 
  unsigned int v40; 
  _QWORD *v41; 
  _QWORD *v42; 
  INT64 v43; 
  POWER_POLICY_DEVICE_TYPE v44; 
  UINT64 FlagBit; 
  UINT64 FlagBita; 
  UINT64 FlagBitb; 
  UINT64 FlagBitc; 
  UINT64 FlagBitd; 
  UINT64 FlagBite; 
  UINT64 FlagBitf; 
  char Updates[8]; 
  _SYSTEM_POWER_STATE PowerState; 
  POWER_ACTION FutureAction[2]; 
  unsigned int v55; 
  POWER_POLICY_DEVICE_TYPE v56; 
  unsigned int v57; 
  unsigned int v58; 
  POWER_ACTION v59; 
  POWER_ACTION v60; 
  unsigned int v61; 
  _SYSTEM_POWER_STATE v62; 
  POP_SUBSTITUTION_POLICY v63; 
  _POP_ACTION_TRIGGER *v64; 
  POWER_ACTION v65; 
  _SYSTEM_POWER_STATE v66; 
  _POP_ACTION_TRIGGER **v67; 
  int v68; 
  int v69; 
  _EVENT_DATA_DESCRIPTOR UserData; 
  int *v71; 
  __int64 v72; 
  int *v73; 
  __int64 v74; 
  POWER_ACTION *v75; 
  __int64 v76; 
  POWER_ACTION *v77; 
  __int64 v78; 
  int *v79; 
  __int64 v80; 
  _SYSTEM_POWER_STATE *v81; 
  __int64 v82; 
  POP_SUBSTITUTION_POLICY *v83; 
  __int64 v84; 

  v5 = 0;
  EventCode = ActionPolicy->EventCode;
  v8 = UserNotify;
  *(_QWORD *)FutureAction = *(_QWORD *)&ActionPolicy->Action;
  PowerState = LightestState;
  v55 = EventCode;
  if( (xmmword_140CFB490 & 0x8000) != 0 )
  {
    v69 = 0;
    v67 = &v64;
    v65 = FutureAction[0];
    v66 = LightestState;
    v64 = Trigger;
    v68 = 16;
    EtwTraceKernelEvent((__int64)&v67, 1u, 0x80008000, 0x1222u, 0x401802u);
  }
  v61 = EventCode;
  v10 = 0;
  v62 = LightestState;
  Flags = Trigger->Flags;
  v60 = FutureAction[1];
  Type = Trigger->Type;
  v63 = SubstitutionPolicy;
  v59 = FutureAction[0];
  v58 = v8;
  v57 = Flags;
  v56 = Type;
  if( PopDiagHandleRegistered )
  {
    v13 = PopDiagHandle;
    if( EtwEventEnabled(PopDiagHandle, &POP_ETW_EVENT_EXECUTE_POWER_ACTION) )
    {
      *(_QWORD *)&UserData.Size = 4i64;
      UserData.Ptr = (unsigned __int64)&v56;
      v72 = 4i64;
      v71 = (int *)&v57;
      v74 = 4i64;
      v73 = (int *)&v58;
      v76 = 4i64;
      v75 = &v59;
      v78 = 4i64;
      v77 = &v60;
      v79 = (int *)&v61;
      v81 = &v62;
      v83 = &v63;
      v80 = 4i64;
      v82 = 4i64;
      v84 = 4i64;
      EtwWrite(v13, &POP_ETW_EVENT_EXECUTE_POWER_ACTION, 0, 8u, &UserData);
      Flags = Trigger->Flags;
    }
  }
  if( (Flags & 0x80u) == 0 )
  {
LABEL_53:
    v43 = 0i64;
LABEL_55:
    PopCompleteAction(Trigger, v43);
    return;
  }
  PopVerifySystemPowerState(&PowerState, SubstitutionPolicy);
  PopVerifyPowerActionPolicy();
  if( v14 )
  {
    v43 = 3221225659i64;
    goto LABEL_55;
  }
  v15 = FutureAction[0];
  v16 = FutureAction[1];
  if( (unsigned int)(FutureAction[0] - 2) <= 1 )
  {
    v16 = FutureAction[1] | 0x80000000;
    FutureAction[1] |= 0x80000000;
  }
  v17 = Trigger->Flags;
  if( (v17 & 2) == 0 )
  {
    v18 = 6;
    Trigger->Flags = v17 | 2;
    if( v15 == PowerActionShutdownOff && PsWin32CalloutsEstablished )
    {
      v44 = Trigger->Type;
      if( Trigger->Type == PolicyDeviceBattery )
      {
        FutureAction[0] = PowerActionNone;
        v15 = PowerActionNone;
        v5 = (v16 & 0x10) != 0 ? 16 : 32;
        goto LABEL_13;
      }
      if( v44 == PolicyDeviceSystemButton )
      {
        v15 = PowerActionNone;
        FutureAction[0] = PowerActionNone;
        v5 = *(&stru_140C23628 + 1820) != 0 ? 32 : 16;
        *(&stru_140C23628 + 597) = KeQueryPerformanceCounter(0i64);
LABEL_65:
        v18 = 6;
        goto LABEL_13;
      }
      if( v44 == PolicySystemInitiatedShutdown )
      {
        if( (v16 & 0x2000000) != 0 )
        {
          v5 = 16;
LABEL_64:
          PopDiagTraceShutdownAction(v15, v5, Trigger->Type);
          goto LABEL_65;
        }
        v5 = 32;
      }
    }
    if( (unsigned int)(v15 - 4) > 2 )
    {
LABEL_13:
      if( !byte_140C23261 )
        PopResetActionDefaults();
      if( v15 )
      {
        v19 = PowerState;
        Updates[0] = 0;
        v20 = v16 | 0x10000000;
        if( v15 != PowerActionWarmEject )
          v20 = v16;
        if( v15 == PowerActionHibernate )
          v19 = PowerSystemHibernate;
        if( v15 == PowerActionShutdown )
          v19 = v18;
        PowerState = v19;
        if( PopCompareActions(v15, SystemAction) < 0 )
        {
          v22 = PowerActionSleep;
        }
        else
        {
          LODWORD(FlagBit) = 1;
          PopPromoteActionFlag((UINT8 *)Updates, 1ui64, v20, 0, FlagBit);
          v22 = v21 + 2;
          LODWORD(FlagBita) = v21 + 2;
          PopPromoteActionFlag((UINT8 *)Updates, v23, v20, v21, FlagBita);
          LODWORD(FlagBitb) = 0x10000000;
          PopPromoteActionFlag((UINT8 *)Updates, (unsigned int)(v24 + 4), v20, v24, FlagBitb);
          if( v15 == v22 )
          {
            if( v26 < *(_DWORD *)(*(&stru_140C23628 + 232) + 68i64) )
              v26 = *(_DWORD *)(*(&stru_140C23628 + 232) + 68i64);
            PowerState = v26;
          }
          if( v26 > *(&SystemAction + 1) )
          {
            Updates[0] |= v25;
            *(&SystemAction + 1) = v26;
          }
        }
        LODWORD(FlagBit) = 4;
        PopPromoteActionFlag((UINT8 *)Updates, 1ui64, v20, 1u, FlagBit);
        LODWORD(FlagBitc) = 0x80000000;
        PopPromoteActionFlag((UINT8 *)Updates, 5ui64, v20, v27, FlagBitc);
        LODWORD(FlagBitd) = 0x40000000;
        PopPromoteActionFlag((UINT8 *)Updates, 0i64, v20, v28, FlagBitd);
        LODWORD(FlagBite) = v29 + 8;
        PopPromoteActionFlag((UINT8 *)Updates, v29, v20, v30, FlagBite);
        LODWORD(FlagBitf) = 32;
        PopPromoteActionFlag((UINT8 *)Updates, v31, v20, v32, FlagBitf);
        if( PopCompareActions(v15, SystemAction) <= 0 )
        {
          v38 = Updates[0];
        }
        else
        {
          PopCompareActions(v15, (POWER_ACTION)(v34 - 5));
          if( !PopCompareActions(v35, v36) )
            v37 |= v22;
          SystemAction = v15;
          v38 = v37 | 5;
          v33 = v15;
          SleepReason = Trigger->Type;
          LODWORD(dword_140C23278) = 0;
          Updates[0] = v38;
          if( Trigger->Type == PolicyDeviceSystemButton )
            LODWORD(dword_140C23278) = Trigger->Battery.PercentLevel;
        }
        if( v33 == PowerActionHibernate )
          SystemAction = v22;
        if( v38 )
        {
          if( TtmpEnabled == 1 )
            *(&stru_140C23628 + 2520) = 1;
          v10 = 1;
          if( (unsigned __int8)byte_140C23261 < (unsigned __int8)v22 )
          {
            PopSetPowerActionState(1u);
            v39 = (unsigned int)v22;
            HIDWORD(::Flags) = 0;
          }
          else
          {
            LOBYTE(PopAction) = v38 | PopAction;
            v39 = 1i64;
          }
          PopGetPolicyWorker(v39);
        }
      }
      goto LABEL_42;
    }
    goto LABEL_64;
  }
LABEL_42:
  v40 = Trigger->Flags;
  if( (v40 & 1) == 0 )
  {
    Trigger->Flags = v40 | 1;
    if( v5 == 32 )
    {
      if( !_InterlockedExchange(&PopShutdownEventCode, 32) )
        v8 |= 0x10u;
    }
    else if( v5 == 16 && !_InterlockedCompareExchange(&PopShutdownEventCode, 16, 0) )
    {
      v8 |= 0x10u;
    }
    PopSetNotificationWork(v8);
    v40 = Trigger->Flags;
  }
  if( (v40 & 0x20) != 0 )
  {
    if( v10 )
    {
      v41 = (_QWORD *)*(&stru_140C23628 + 180);
      v42 = (_QWORD *)((char *)Trigger->Wait + 32);
      if( (_UNKNOWN *)**(&stru_140C23628 + 180) != (_UNKNOWN *)((char *)&stru_140C23628 + 1432) )
        __fastfail(3u);
      *v42 = (char *)&stru_140C23628 + 1432;
      v42[1] = v41;
      *v41 = v42;
      *(&stru_140C23628 + 180) = v42;
      return;
    }
    goto LABEL_53;
  }
}

Referenced by:

CmCompleteRegistryInitialization
NtInitiatePowerAction
PdcPoSetPowerAction
PopBatteryApplyCompositeState
PopCheckAndHandleThermalConditions
PopCriticalShutdown
PopExecuteSystemIdleAction
PopIdleAoAcDozeToS4
PopPolicySystemIdle
PopStartStopTtmSxTranstion
PopTransitionSystemPowerStateEx