PopExecutePowerAction

INT64 __fastcall PopExecutePowerAction(INT64 a1, UINT64 a2, INT64 a3, INT64 a4, UINT64 a5){
  unsigned int v5; 
  int v6; 
  int v7; 
  unsigned int v8; 
  char v10; 
  int v11; 
  int v12; 
  UINT64 v13; 
  char v14; 
  POWER_ACTION v15; 
  unsigned __int32 v16; 
  int v17; 
  int v18; 
  int v19; 
  unsigned int v20; 
  int v21; 
  POWER_ACTION v22; 
  UINT64 v23; 
  int v24; 
  char v25; 
  POWER_ACTION 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; 
  INT64 result; 
  INT64 *v41; 
  INT64 v42; 
  int v43; 
  PEVENT_DATA_DESCRIPTOR UserData; 
  PEVENT_DATA_DESCRIPTOR UserDataa; 
  PEVENT_DATA_DESCRIPTOR UserDatab; 
  PEVENT_DATA_DESCRIPTOR UserDatac; 
  PEVENT_DATA_DESCRIPTOR UserDatad; 
  PEVENT_DATA_DESCRIPTOR UserDatae; 
  PEVENT_DATA_DESCRIPTOR UserDataf; 
  char Updates[8]; 
  INT64 v52; 
  POWER_ACTION FutureAction[2]; 
  int v54; 
  int v55; 
  int v56; 
  unsigned int v57; 
  POWER_ACTION v58; 
  POWER_ACTION v59; 
  int v60; 
  int v61; 
  int v62; 
  INT64 v63; 
  POWER_ACTION v64; 
  int v65; 
  EVENT_DATA_DESCRIPTOR EventData; 
  EVENT_DATA_DESCRIPTOR v67; 
  int *v68; 
  __int64 v69; 
  int *v70; 
  __int64 v71; 
  POWER_ACTION *v72; 
  __int64 v73; 
  POWER_ACTION *v74; 
  __int64 v75; 
  int *v76; 
  __int64 v77; 
  int *v78; 
  __int64 v79; 
  int *v80; 
  __int64 v81; 
  v5 = 0;
  v6 = a4;
  v7 = *(_DWORD *)(a3 + 8);
  v8 = a2;
  *(_QWORD *)FutureAction = *(_QWORD *)a3;
  LODWORD(v52) = a4;
  v54 = v7;
  if( (*(_WORD *)(&PerfGlobalGroupMask + 2) & 0x8000) != 0 )
  {
    EventData.Reserved = 0;
    EventData.Ptr = (unsigned __int64)&v63;
    v64 = FutureAction[0];
    v65 = a4;
    v63 = a1;
    EventData.Size = 16;
    LODWORD(UserData) = 4200450;
    EtwTraceKernelEvent(&EventData, 1ui64, 0x80008000ui64, 0x1222u, (UINT64)UserData);
  }
  v60 = v7;
  v10 = 0;
  v61 = v6;
  v11 = *(_DWORD *)(a1 + 4);
  v59 = FutureAction[1];
  v12 = *(_DWORD *)a1;
  v62 = a5;
  v58 = FutureAction[0];
  v57 = v8;
  v56 = v11;
  v55 = v12;
  if( PopDiagHandleRegistered )
  {
    v13 = PopDiagHandle;
    if( EtwEventEnabled(PopDiagHandle, (EVENT_DESCRIPTOR *)&POP_ETW_EVENT_EXECUTE_POWER_ACTION, (EVENT_DESCRIPTOR *)a3) )
    {
      *(_QWORD *)&v67.Size = 4i64;
      v67.Ptr = (unsigned __int64)&v55;
      v69 = 4i64;
      v68 = &v56;
      v71 = 4i64;
      v70 = (int *)&v57;
      v73 = 4i64;
      v72 = &v58;
      v75 = 4i64;
      v74 = &v59;
      v76 = &v60;
      v78 = &v61;
      v80 = &v62;
      v77 = 4i64;
      v79 = 4i64;
      v81 = 4i64;
      EtwWrite(v13, (EVENT_DESCRIPTOR *)&POP_ETW_EVENT_EXECUTE_POWER_ACTION, 0i64, 8ui64, &v67);
      v11 = *(_DWORD *)(a1 + 4);
    }
  }
  if( (v11 & 0x80u) == 0 )
  {
LABEL_53:
    v42 = 0i64;
LABEL_55:
    LODWORD(result) = PopCompleteAction(a1, v42);
    return result;
  }
  PopVerifySystemPowerState(&v52, (unsigned int)a5);
  PopVerifyPowerActionPolicy();
  if( v14 )
  {
    v42 = 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 = *(_DWORD *)(a1 + 4);
  if( (v17 & 2) == 0 )
  {
    v18 = 6;
    *(_DWORD *)(a1 + 4) = v17 | 2;
    if( v15 == PowerActionShutdownOff && PsWin32CalloutsEstablished )
    {
      v43 = *(_DWORD *)a1;
      if( *(_DWORD *)a1 == 2 )
      {
        FutureAction[0] = PowerActionNone;
        v15 = PowerActionNone;
        v5 = (v16 & 0x10) != 0 ? 16 : 32;
        goto LABEL_13;
      }
      if( !v43 )
      {
        v15 = PowerActionNone;
        FutureAction[0] = PowerActionNone;
        v5 = byte_140C23D44 != 0 ? 32 : 16;
        PopShutdownButtonPressTime = KeQueryPerformanceCounter(0i64);
LABEL_65:
        v18 = 6;
        goto LABEL_13;
      }
      if( v43 == 15 )
      {
        if( (v16 & 0x2000000) != 0 )
        {
          v5 = 16;
LABEL_64:
          PopDiagTraceShutdownAction(v15, v5, *(POWER_POLICY_DEVICE_TYPE *)a1);
          goto LABEL_65;
        }
        v5 = 32;
      }
    }
    if( (unsigned int)(v15 - 4) > 2 )
    {
LABEL_13:
      if( !byte_140C23261 )
        PopResetActionDefaults();
      if( v15 )
      {
        v19 = v52;
        Updates[0] = 0;
        v20 = v16 | 0x10000000;
        if( v15 != PowerActionWarmEject )
          v20 = v16;
        if( v15 == PowerActionHibernate )
          v19 = 5;
        if( v15 == PowerActionShutdown )
          v19 = v18;
        LODWORD(v52) = v19;
        if( PopCompareActions(v15, Action) < 0 )
        {
          v22 = PowerActionSleep;
        }
        else
        {
          LODWORD(UserData) = 1;
          PopPromoteActionFlag((UINT8 *)Updates, 1ui64, v20, 0, (UINT64)UserData);
          v22 = v21 + 2;
          LODWORD(UserDataa) = v21 + 2;
          PopPromoteActionFlag((UINT8 *)Updates, v23, v20, v21, (UINT64)UserDataa);
          LODWORD(UserDatab) = 0x10000000;
          PopPromoteActionFlag((UINT8 *)Updates, (unsigned int)(v24 + 4), v20, v24, (UINT64)UserDatab);
          if( v15 == v22 )
          {
            if( v26 < *((_DWORD *)PopPolicy + 17) )
              v26 = *((_DWORD *)PopPolicy + 17);
            LODWORD(v52) = v26;
          }
          if( v26 > *(&Action + 1) )
          {
            Updates[0] |= v25;
            *(&Action + 1) = v26;
          }
        }
        LODWORD(UserData) = 4;
        PopPromoteActionFlag((UINT8 *)Updates, 1ui64, v20, 1u, (UINT64)UserData);
        LODWORD(UserDatac) = 0x80000000;
        PopPromoteActionFlag((UINT8 *)Updates, 5ui64, v20, v27, (UINT64)UserDatac);
        LODWORD(UserDatad) = 0x40000000;
        PopPromoteActionFlag((UINT8 *)Updates, 0i64, v20, v28, (UINT64)UserDatad);
        LODWORD(UserDatae) = v29 + 8;
        PopPromoteActionFlag((UINT8 *)Updates, v29, v20, v30, (UINT64)UserDatae);
        LODWORD(UserDataf) = 32;
        PopPromoteActionFlag((UINT8 *)Updates, v31, v20, v32, (UINT64)UserDataf);
        if( PopCompareActions(v15, Action) <= 0 )
        {
          v38 = Updates[0];
        }
        else
        {
          PopCompareActions(v15, (POWER_ACTION)(v34 - 5));
          if( !PopCompareActions(v35, v36) )
            v37 |= v22;
          Action = v15;
          v38 = v37 | 5;
          v33 = v15;
          SleepReason = *(_DWORD *)a1;
          LODWORD(dword_140C23278) = 0;
          Updates[0] = v38;
          if( !*(_DWORD *)a1 )
            LODWORD(dword_140C23278) = *(_DWORD *)(a1 + 16);
        }
        if( v33 == PowerActionHibernate )
          Action = v22;
        if( v38 )
        {
          if( TtmpEnabled == 1 )
            *(_BYTE *)PopTtmIsSxTransitionInProgress = 1;
          v10 = 1;
          if( (unsigned __int8)byte_140C23261 < (unsigned __int8)v22 )
          {
            PopSetPowerActionState(1u);
            v39 = (unsigned int)v22;
            dword_140C23270 = 0;
          }
          else
          {
            LOBYTE(PopAction) = v38 | PopAction;
            v39 = 1i64;
          }
          PopGetPolicyWorker(v39);
        }
      }
      goto LABEL_42;
    }
    goto LABEL_64;
  }
LABEL_42:
  result = *(unsigned int *)(a1 + 4);
  if( (result & 1) == 0 )
  {
    *(_DWORD *)(a1 + 4) = result | 1;
    if( v5 == 32 )
    {
      if( !_InterlockedExchange(&PopShutdownEventCode, 32) )
        v8 |= 0x10u;
    }
    else if( v5 == 16 && !_InterlockedCompareExchange(&PopShutdownEventCode, 16, 0) )
    {
      v8 |= 0x10u;
    }
    PopSetNotificationWork(v8);
    result = *(unsigned int *)(a1 + 4);
  }
  if( (result & 0x20) != 0 )
  {
    if( v10 )
    {
      v41 = (INT64 *)qword_140C23BC8;
      result = *(_QWORD *)(a1 + 8) + 32i64;
      if( *(__int64 **)qword_140C23BC8 != &PopActionWaiters )
        __fastfail(3u);
      *(_QWORD *)result = &PopActionWaiters;
      *(_QWORD *)(result + 8) = v41;
      *v41 = result;
      qword_140C23BC8 = result;
      return result;
    }
    goto LABEL_53;
  }
  return result;
}

Referenced by:

CmCompleteRegistryInitialization
NtInitiatePowerAction
PdcPoSetPowerAction
PopBatteryApplyCompositeState
PopCheckAndHandleThermalConditions
PopCriticalShutdown
PopExecuteSystemIdleAction
PopIdleAoAcDozeToS4
PopPolicySystemIdle
PopStartStopTtmSxTranstion
PopTransitionSystemPowerStateEx