PopIssueActionRequest
NTSTATUS __stdcall PopIssueActionRequest(
UINT8 Promote,
POWER_ACTION Action,
_SYSTEM_POWER_STATE LightestState,
UINT64 Flags){
VOID *v4;
NTSTATUS v5;
int v6;
char v9;
_XSTATE_CONFIGURATION *v10;
POWER_MONITOR_REQUEST_REASON v11;
int v12;
int v13;
int v14;
UINT8 *v15;
INT64 v16;
NTSTATUS started;
int v18;
INT64 v19;
char v20;
unsigned int v21;
_KNOWN_CONTROLLER_TYPE v22;
_XSTATE_CONFIGURATION *v23;
char v25;
bool v26;
signed __int32 v27[8];
bool v28;
char v29;
_DWORD Console[3];
_WIN32_POWERSTATE_PARAMETERS Parms;
Console[1] = Flags;
v4 = (VOID *)(int)LightestState;
v5 = 0;
memset(&Parms, 0, sizeof(Parms));
Console[0] = 0;
v6 = Flags;
PopAcquireAwaymodeLock();
PopReadSystemAwayModePolicy();
v9 = 1;
if( !*(&stru_140C23628 + 884)
|| Action != PowerActionSleep
|| (int)v4 >= 5
|| (SleepReason & 0xFFFFFFFA) != 0
|| SleepReason == PolicyDeviceThermalZone )
{
PopReleaseAwaymodeLock();
if( SleepReason )
{
if( SleepReason > PolicySetPowerStateAPI
&& (SleepReason <= PolicySystemIdle || SleepReason == PolicyImmediateDozeS4Predicted) )
{
v11 = MonitorRequestReasonSystemIdle;
}
else
{
v11 = MonitorRequestReasonSxTransition;
}
}
else
{
v11 = MonitorRequestReasonPowerButton;
}
if( Action == PowerActionDisplayOff )
{
if( !dword_140C50478 )
return -1073700861;
PopReleasePolicyLock();
PopScreenOff(v11);
PopAcquirePolicyLock();
return 0;
}
PopSetPowerActionWatchdogState(1ui64, v10);
v28 = (unsigned int)(Action - 4) <= 2;
if( PsWin32CalloutsEstablished && (unsigned int)(Action - 4) > 2 )
v9 = 0;
v12 = v6;
v13 = v6 & 0xFFFFFFFE;
v14 = v12 | 1;
if( Console[1] >= 0 )
v13 = v14;
if( v9 )
LOBYTE(PopAction) = PopAction & 0xFD;
v29 = byte_140C23310;
PopReleasePolicyLock();
PpmBeginHighPerfRequest();
*(&stru_140C23628 + 280) = 0;
if( !Promote )
{
if( v28 )
goto LABEL_18;
memset((char *)&stru_140C23628 + 280, 0i64, 0x278u);
PopDiagTracePowerTransitionStart(SleepReason, (unsigned int)dword_140C23278);
*(&stru_140C23628 + 36) = KeQueryPerformanceCounter(0i64);
PopEnableSystemSleepCheckpoint(v16, v15);
PopCheckpointSystemSleep(PopSleepCheckpointPowerTransitionStart);
}
if( !v28 )
PopSetSleepMarker(PowerSystemWorking);
LABEL_18:
if( v9 )
{
v18 = ZwSetSystemPowerState(Action, (_SYSTEM_POWER_STATE)v4, (unsigned int)v13);
goto LABEL_39;
}
Parms.Promotion = Promote;
Parms.SystemAction = Action;
Parms.MinSystemState = (int)v4;
Parms.Flags = v13;
Parms.RequestReason = v11;
started = PoStartPowerStateTasks(&Parms);
v18 = started;
if( !Promote )
{
if( started >= 0 && !v29 )
PopPrepareSleep(&Parms);
Console[0] = PoBlockConsoleSwitch(&Parms);
}
if( v18 >= 0 && !Promote )
{
v19 = (v13 >> 31) & 2 | 4u;
if( (v13 & 8) == 0 )
v19 = (v13 >> 31) & 2;
PfPowerActionNotify(0i64, v19, v4);
PopNoMoreInput = 1;
_InterlockedOr(v27, 0);
if( !v29 )
{
PopPowerAggregatorNotifySuspendResume(1u);
PopSuspendApps((_XSTATE_FEATURE *)&Parms);
PopSuspendServices((_XSTATE_FEATURE *)&Parms);
}
if( (v13 & 8) != 0 )
EtwShutdown(1u);
PopDispatchSuperfetchNotification((unsigned int)v13, (_SYSTEM_POWER_STATE)v4);
v18 = ZwSetSystemPowerState(Action, (_SYSTEM_POWER_STATE)v4, (unsigned int)v13);
PopAcquirePolicyLock();
v20 = byte_140C23310;
PopReleasePolicyLock();
PopNoMoreInput = 0;
_InterlockedOr(v27, 0);
if( !v20 )
{
PopResumeServices((_XSTATE_FEATURE *)&Parms);
PopPowerAggregatorNotifySuspendResume(0);
PopResumeApps((_XSTATE_FEATURE *)&Parms);
}
PfPowerActionNotify((_EPROCESS *)7, 0i64, v4);
}
PoEndPowerStateTasks(&Parms);
if( TtmpEnabled == 1 )
{
if( Promote )
goto LABEL_44;
PopAcquirePolicyLock();
v25 = *(&stru_140C23628 + 2521);
*(&stru_140C23628 + 2520) = 0;
PopReleasePolicyLock();
v26 = v25 == 0;
v21 = Console[0];
if( v26 )
goto LABEL_38;
TtmNotifyLowPowerStateExited(Console[0]);
PopAcquirePolicyLock();
*(&stru_140C23628 + 2521) = 0;
PopReleasePolicyLock();
}
else
{
v21 = Console[0];
}
if( !Promote )
{
LABEL_38:
PoUnblockConsoleSwitch(&Parms, v21);
LABEL_39:
if( !Promote && !v28 )
{
if( v18 >= 0 )
{
*(&stru_140C23628 + 41) = KeQueryPerformanceCounter(0i64);
PopDiagTraceHiberStats();
PopDiagTracePowerTransitionTime();
PopDiagTracePerfTrackData((_KNOWN_CONTROLLER_TYPE)v13, v22);
*(&stru_140C23628 + 597) = 0i64;
*(&stru_140C23628 + 226) = Action;
*(&stru_140C23628 + 227) = (_DWORD)v4;
*(&stru_140C23628 + 280) = 1;
}
PopDiagTracePowerTransitionEnd((unsigned int)v18);
PopCheckpointSystemSleep(PopSleepCheckpointPowerTransitionEnd);
}
}
LABEL_44:
PpmEndHighPerfRequest(PpmHighPerfDurationTypeSxExit);
PopAcquirePolicyLock();
PopSetPowerActionWatchdogState(0i64, v23);
return v18;
}
if( !*(&stru_140C23628 + 444) )
{
if( *(&stru_140C23628 + 1769) )
{
if( (*(&stru_140C23628 + 582) & 0x4000000) != 0 )
PopSetSystemState(
(unsigned int)(*(&stru_140C23628 + 444) + 4),
(POWER_MONITOR_REQUEST_REASON)(*(&stru_140C23628 + 444) + 7));
}
else
{
PopReleasePolicyLock();
v5 = PopSetSystemAwayMode(1ui64);
PopAcquirePolicyLock();
}
}
PopReleaseAwaymodeLock();
return v5;
}Referenced by:
PopPolicyWorkerAction
PopPolicyWorkerActionPromote