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