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