PopTransitionSystemPowerStateEx
VOID __stdcall PopTransitionSystemPowerStateEx(UINT64 *a1){
int v1;
UINT64 *v2;
_DWORD *v4;
int v5;
int v6;
char PreviousMode;
_EJOB *CurrentServerSilo;
POWER_ACTION v9;
int v10;
POWER_POLICY_DEVICE_TYPE v11;
bool v12;
NTSTATUS v13;
POWER_ACTION v14;
int v15;
UINT8 *v16;
unsigned int v17;
_SYSTEM_POWER_STATE *v18;
unsigned int v19;
int v20;
_DWORD *v21;
signed int v22;
__int64 v23;
int v24;
_SYSTEM_POWER_STATE v25;
NTSTATUS v26;
UINT8 v27;
NTSTATUS HiberContext;
UINT64 v29;
POWER_STATE_HANDLER_TYPE v30;
NTSTATUS inited;
__int64 v32;
UINT64 v33;
UINT8 NextSystemPowerState;
__int64 v35;
UINT64 v36;
__int64 v37;
__int64 v38;
__int64 v39;
UINT64 v40;
UINT64 v41;
__int64 *v42;
UINT64 *v43;
_DWORD *v44;
__int64 *v45;
UINT64 v46;
UINT8 v47;
UINT64 *v48;
_DIAGNOSTIC_BUFFER **v49;
UINT8 NextWakeTime;
UINT8 v51;
UINT8 v52;
__int64 v53;
UINT64 v54;
_XSTATE_CONFIGURATION *v55;
_SYSTEM_POWER_STATE v56;
_SYSTEM_POWER_STATE v57;
_SYSTEM_POWER_STATE v58;
_DIAGNOSTIC_BUFFER *v59;
__int64 v60;
_EX_RUNDOWN_REF *v61;
INT64 *v62;
INT64 v63;
VOID *v64;
VOID *v65;
UINT64 v66;
UINT8 v67;
__int64 v68;
_DWORD *v69;
UINT64 SubstitutionPolicya;
UINT64 SubstitutionPolicy;
UINT64 SubstitutionPolicyb;
_DIAGNOSTIC_BUFFER *WakeInfoAc;
_DIAGNOSTIC_BUFFER *WakeInfoAca;
_DIAGNOSTIC_BUFFER *WakeInfoDc;
_DIAGNOSTIC_BUFFER *WakeInfoDca;
_DIAGNOSTIC_BUFFER *WakeInfoDcb;
_UNICODE_STRING DestinationString;
int v79;
char *v80;
int v81;
int v82;
__int64 v83;
int v84;
char v85;
_SYSTEM_POWER_STATE TargetState;
v1 = 0;
v2 = a1 + 29;
*((_BYTE *)a1 + 24) = 0;
v4 = (_DWORD *)a1 + 59;
*((_BYTE *)a1 + 36) = 0;
*((_DWORD *)a1 + 10) = 0;
a1[10] = 0i64;
*((_DWORD *)a1 + 37) = 1;
*((_DWORD *)a1 + 38) = 1;
*((_BYTE *)a1 + 256) = 1;
a1[47] = 1i64;
a1[7] = 0i64;
*((_DWORD *)a1 + 29) = 0;
a1[30] = 0i64;
a1[27] = 0i64;
a1[28] = 0i64;
a1[43] = 0i64;
*((_BYTE *)a1 + 384) = 0;
a1[45] = 0i64;
a1[46] = 0i64;
*((_DWORD *)a1 + 58) = 0;
*((_DWORD *)a1 + 59) = 0;
v5 = *(&stru_140C23628 + 582) & 0x10000;
*((_DWORD *)a1 + 26) = 0;
*((_DWORD *)a1 + 97) = v5 != 0 ? 300000000 : 600000000;
PopTransitionCheckpoint(8i64);
if( (unsigned int)(*((_DWORD *)a1 + 1) - 1) > 5 )
return;
v6 = *(_DWORD *)a1;
TargetState = PowerSystemShutdown;
if( (unsigned int)(v6 - 1) > 6 || (a1[1] & 0xCFFFFC0) != 0 || v6 < 4 && SleepReason >= PolicyDeviceMax )
return;
PreviousMode = KeGetCurrentThread()->PreviousMode;
*((_BYTE *)a1 + 72) = PreviousMode;
if( PreviousMode )
{
if( SeSinglePrivilegeCheck(*(_QWORD *)&SeShutdownPrivilege, PreviousMode) )
ZwSetSystemPowerState(*(POWER_ACTION *)a1, *((_SYSTEM_POWER_STATE *)a1 + 1), *((unsigned int *)a1 + 2));
return;
}
CurrentServerSilo = PsGetCurrentServerSilo();
v9 = *(_DWORD *)a1;
a1[12] = (UINT64)CurrentServerSilo;
if( !PsIsHostSilo(CurrentServerSilo) )
{
if( (unsigned int)(v9 - 4) > 2 )
{
v1 = -1073741637;
}
else
{
v10 = -2147483599;
if( v9 != PowerActionShutdownReset )
v10 = -1073741077;
*((_DWORD *)a1 + 8) = v10;
PsTerminateServerSilo();
}
*((_DWORD *)a1 + 26) = v1;
return;
}
if( v9 == PowerActionShutdown )
PopReadShutdownPolicy();
*((_DWORD *)a1 + 5) = 0;
*((_DWORD *)a1 + 3) = *(_DWORD *)a1;
*((_DWORD *)a1 + 4) = *((_DWORD *)a1 + 2);
*(_OWORD *)(a1 + 15) = 0i64;
a1[17] = 0i64;
v11 = SleepReason;
v12 = SleepReason < PolicyDeviceMax;
*((_DWORD *)a1 + 31) = 128;
if( !v12 )
v11 = PolicySetPowerStateAPI;
*((_DWORD *)a1 + 30) = v11;
PopAcquireTransitionLock();
MmLockPagableSectionByHandle(ExPageLockHandle);
PopRunMaximumIrpWorkers();
*(&PopIrpWorkerControlEvent + 235) = 0i64;
*(&PopIrpWorkerControlEvent + 234) = PopUnlockAfterSleepWorker;
*(&PopIrpWorkerControlEvent + 232) = 0i64;
CmSetLazyFlushState(0);
PopNotifyCallbacksPreSleep();
ExSwapinWorkerThreads(0);
v13 = PoInitializeBroadcast();
*((_DWORD *)a1 + 26) = v13;
if( v13 < 0 )
{
ExQueueWorkItem((PWORK_QUEUE_ITEM)&PopIrpWorkerControlEvent + 58, DelayedWorkQueue);
return;
}
PopCheckPowerSourceAfterRtcWakeCancel();
PopAcquirePolicyLock();
*((_BYTE *)a1 + 64) = 1;
PopFilterCapabilities((_SYSTEM_POWER_CAPABILITIES *)&stru_140C23628 + 518, &FilteredCapabilities);
if( byte_140C23261 )
{
if( byte_140C23261 != 2 )
{
PopReleasePolicyLock();
PoClearBroadcast();
ExQueueWorkItem((PWORK_QUEUE_ITEM)&PopIrpWorkerControlEvent + 58, DelayedWorkQueue);
return;
}
}
else
{
PopResetActionDefaults();
}
PopSetPowerActionState(3u);
qword_140C23298 = rcx0;
PopExecutePowerAction(
(_POP_ACTION_TRIGGER *)a1 + 5,
0i64,
(POWER_ACTION_POLICY *)a1 + 1,
*((_SYSTEM_POWER_STATE *)a1 + 1),
SubstituteLightestOverallDownwardBounded);
PopIgnoreBatteryStatusChange();
PopCheckResiliencyScenarios();
PopEnforceResiliencyScenarios((PPOWER_IDLE_RESILIENCY)a1 + 31);
PopExecuteOnTargetProcessors(
&KeActiveProcessors,
(INT64 *)PpmStopIllegalProcessorThrottleLogging,
0i64,
0i64,
SubstitutionPolicya,
(UINT64)WakeInfoAc,
(UINT64)WakeInfoDc);
v14 = *(_DWORD *)a1;
if( *(_DWORD *)a1 == 6 )
{
SystemAction = PowerActionShutdownOff;
v14 = *(_DWORD *)a1;
}
if( (unsigned int)(v14 - 4) <= 2 )
{
PoPowerDownActionInProgress = 1;
if( v14 == PowerActionShutdownReset )
PoPowerResetActionInProgress = 1;
if( *(_QWORD *)&PopHiberInfo )
{
if( FileObject )
{
MmZeroPageFileAtShutdown();
if( v15 )
PopZeroHiberFile(*(VOID **)&PopHiberInfo, (_FILE_OBJECT *)FileObject);
}
}
}
v16 = (UINT8 *)(a1 + 11);
v17 = *(_DWORD *)a1 - 2;
*((_BYTE *)a1 + 88) = 0;
v18 = (_SYSTEM_POWER_STATE *)a1 + 7;
*((_DWORD *)a1 + 7) = 0;
if( v17 <= 1 )
PoPowerDownActionInProgress = 1;
*((_BYTE *)a1 + 112) = 0;
LABEL_38:
*((_DWORD *)a1 + 26) = -1073741536;
LABEL_39:
while( 2 )
{
v19 = 0x80000000;
while( 1 )
{
while( 1 )
{
if( !*((_BYTE *)a1 + 64) )
{
PopAcquirePolicyLock();
v19 = 0x80000000;
*((_BYTE *)a1 + 64) = 1;
}
if( SystemAction == PowerActionNone )
{
*((_DWORD *)a1 + 26) = 0;
goto LABEL_178;
}
*((_BYTE *)a1 + 144) = PopAction;
LOBYTE(PopAction) = 0;
v20 = *((_DWORD *)a1 + 26);
if( v20 == -1073741536 )
{
if( (a1[18] & 2) != 0 && ((unsigned int)Flags & v19) == 0 && (Flags & 3) != 0 )
{
PopGetPolicyWorker(2ui64);
goto LABEL_178;
}
PopActionRetrieveInitialState(
(_SYSTEM_POWER_STATE *)&SystemAction + 1,
(_SYSTEM_POWER_STATE *)a1 + 7,
&SystemState,
(UINT8 *)a1 + 88);
if( (unsigned int)(SystemAction - 4) <= 2 )
{
byte_140C23262 = 1;
LODWORD(Flags) = *((_DWORD *)a1 + 2);
}
*((_DWORD *)a1 + 26) = 0;
v20 = 0;
}
if( v20 < 0 )
goto LABEL_178;
PopReleasePolicyLock();
*((_BYTE *)a1 + 64) = 0;
*((_DWORD *)a1 + 94) = 1;
*((_DWORD *)a1 + 95) = 0;
PopQueryPowerSettingUlong(&GUID_ALLOW_RTC_WAKE, (_DWORD *)a1 + 94, (_DWORD *)a1 + 95);
v21 = (_DWORD *)a1 + 95;
if( (Flags & 0x40000000) != 0 )
{
*((_DWORD *)a1 + 94) = 0;
*v21 = 0;
}
if( !byte_140C23346 && !byte_140C23334 && !byte_140C2333B )
*v21 = 0;
PopInitializePowerPolicySimulate();
PowerState = SystemState;
v22 = ((unsigned int)Flags >> 27) & 2;
*((_DWORD *)a1 + 27) = v22;
PopAdvanceSystemPowerState(
&PowerState,
(POP_SUBSTITUTION_POLICY)v22,
(_SYSTEM_POWER_STATE)*(&SystemAction + 1),
*v18);
if( (a1[1] & 8) != 0 )
{
byte_140C23480 = 1;
*((_BYTE *)a1 + 36) = 0;
EffectiveState = PowerSystemHibernate;
*((_DWORD *)a1 + 11) = 6;
v23 = SystemState;
LABEL_62:
v24 = PopPowerStateHandlerLookup[v23];
goto LABEL_63;
}
if( !PopFastS4Check() )
{
EffectiveState = SystemState;
*((_DWORD *)a1 + 11) = SystemState;
v23 = SystemState;
*((_BYTE *)a1 + 36) = 0;
goto LABEL_62;
}
*((_DWORD *)a1 + 11) = SystemState;
v24 = 6;
EffectiveState = PowerSystemHibernate;
*((_BYTE *)a1 + 36) = 1;
LABEL_63:
*((_DWORD *)a1 + 17) = v24;
if( v24 < 0 || v24 >= 7 || !*((_QWORD *)&stru_140C23628 + 3 * v24 + 236) )
{
NextSystemPowerState = PopFindNextSystemPowerState(*v18, *((_BYTE *)a1 + 36), (UINT8 *)a1 + 88);
*((_BYTE *)a1 + 48) = NextSystemPowerState;
if( NextSystemPowerState )
{
*((_DWORD *)a1 + 26) = 0;
goto LABEL_39;
}
LABEL_178:
if( byte_140C23480 )
{
*(&stru_140C23628 + 99) = KeQueryPerformanceCounter(0i64);
dword_140C23464 = PopQpcTimeInMs(
(_LARGE_INTEGER *)&stru_140C23628 + 98,
(_LARGE_INTEGER *)&stru_140C23628 + 99);
}
if( *((int *)a1 + 26) >= 0 )
{
qword_140C232B0 = a1[43];
ExUpdateSystemTimeFromCmos(1u, 1ui64);
LOBYTE(v60) = 1;
if( ((unsigned __int8(__fastcall *)(__int64))off_140C00948[0])(v60) )
*((_BYTE *)a1 + 208) = 1;
*(&stru_140C23628 + 40) = KeQueryPerformanceCounter(0i64);
PfPowerActionNotify((_EPROCESS *)2, 0i64, 0i64);
qword_140C232A8 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
PopDiagComputeEarlyHiberStats();
if( *((_DWORD *)a1 + 10) == 4 )
PopDiagTraceFirmwareS3Stats();
}
byte_140C2327D = 1;
PoPowerDownActionInProgress = 0;
PoPowerResetActionInProgress = 0;
PsIumResumeAfterHibernate();
if( *((_BYTE *)a1 + 112) )
{
PfPowerActionNotify((_EPROCESS *)3, 0i64, 0i64);
PopSetDevicesSystemState();
PfPowerActionNotify((_EPROCESS *)3, 1i64, 0i64);
}
PpmCheckResumePpmEngineFromSx();
if( *((_BYTE *)a1 + 208) )
{
LODWORD(WakeInfoDca) = 0;
LODWORD(WakeInfoAca) = 0;
ZwUpdateWnfStateData(
&WNF_BOOT_INVALID_TIME_SOURCE,
0i64,
0i64,
0i64,
0i64,
(UINT64)WakeInfoAca,
(UINT64)WakeInfoDca);
}
if( !PopSleepReliabilityDetailedDiagEnabled )
{
LOBYTE(v62) = 1;
RtlBootStatusDisableFlushing(v62, v61, v63);
}
PopBootStatCheckpointAvailable = 1;
PopCheckpointSystemSleep(PopSleepCheckpointBootstatAvailable);
v65 = (VOID *)a1[30];
if( v65 )
{
ExFreePoolEx(v65, v64);
a1[30] = 0i64;
}
((void(__fastcall *)(_QWORD, _QWORD))off_140C005C0)(0i64, 0i64);
*((_DWORD *)a1 + 29) = PopNotifyTelemetryOsState(
SystemAction,
SystemState,
EffectiveState,
*((unsigned int *)a1 + 2),
0);
PopQueueBatteryStatusTimeout();
PopExecuteOnTargetProcessors(
&KeActiveProcessors,
(INT64 *)PpmStartIllegalProcessorThrottleLogging,
0i64,
0i64,
SubstitutionPolicyb,
(UINT64)WakeInfoAca,
(UINT64)WakeInfoDca);
if( *((_BYTE *)a1 + 64) )
{
PopReleasePolicyLock();
*((_BYTE *)a1 + 64) = 0;
}
PoClearBroadcast();
qword_140C23298 = 0i64;
PopEsExitSleep(v66);
PopCurrentPowerStatePrecise((SYSTEM_BATTERY_STATE *)((char *)a1 + 156));
*((_DWORD *)a1 + 38) = *(&stru_140C23628 + 441);
*(&PopIrpWorkerControlEvent + 227) = 0i64;
*(&PopIrpWorkerControlEvent + 226) = PopSpoilEstimatesOnPowerStateTransitionWorker;
*(&PopIrpWorkerControlEvent + 224) = 0i64;
ExQueueWorkItem((PWORK_QUEUE_ITEM)&PopIrpWorkerControlEvent + 56, DelayedWorkQueue);
PopThermalSxExit(v67);
if( !*((_BYTE *)a1 + 64) )
{
PopAcquirePolicyLock();
*((_BYTE *)a1 + 64) = 1;
}
if( *((int *)a1 + 26) >= 0 )
{
PopInitSIdle();
LOBYTE(PopAction) = 0;
if( (unsigned __int64)dword_140C232C0 < 3 )
{
qword_140C23318 = *(&ProgrammedWakeTimeAc + 3 * dword_140C232C0);
v68 = qword_140C232D8[3 * dword_140C232C0];
*(&stru_140C23628 + 466) = 0;
PopPendingUserPresenceDuringSystemSleep = 0;
PopPendingUserPresenceMonitorOnReason = MonitorRequestReasonUnknown;
switch( v68 )
{
case -1i64:
if( PopDeferDoze(*((unsigned int *)a1 + 94), *((unsigned int *)a1 + 95), (_BYTE *)a1 + 156) )
*(_QWORD *)&SystemAction = *a1;
else
*(_QWORD *)&SystemAction = 0x500000002i64;
LOBYTE(PopAction) = PopAction | 2;
LABEL_212:
*((_BYTE *)a1 + 256) = 0;
break;
case -2i64:
if( !qword_140C232B8 )
qword_140C232B8 = qword_140C232A8;
break;
case -3i64:
PopWakeAlarmTimeOverride = 0i64;
break;
default:
v69 = (_DWORD *)a1 + 95;
if( *(&stru_140C23628 + 441) == 1 )
{
if( !*v69 )
{
*(_QWORD *)&SystemAction = *a1;
LOBYTE(PopAction) = 2;
goto LABEL_212;
}
}
else if( !*v69 && *((_DWORD *)a1 + 37) == *((_DWORD *)a1 + 38) )
{
PopCheckPowerSourceAfterRtcWakeSet();
}
break;
}
}
}
if( byte_140C23310 && *((_BYTE *)a1 + 256) )
{
ExWakeTimersResume();
byte_140C23310 = 0;
qword_140C23318 = 0i64;
}
if( PoResumeFromHibernate )
{
PopBootLoaderTraceProcess();
PoResumeFromHibernate = 0;
}
byte_140C23480 = 0;
PopResetActionDefaults();
PopSetPowerActionState(2u);
PopReleasePolicyLock();
if( PopPendingUserPresenceDuringSystemSleep )
PoSetUserPresent(PopPendingUserPresenceMonitorOnReason);
ExQueueWorkItem((PWORK_QUEUE_ITEM)&PopIrpWorkerControlEvent + 58, DelayedWorkQueue);
PopCheckForWork();
if( *((int *)a1 + 26) >= 0 )
PpmPerfReApplyStates();
SleepReason = PolicyDeviceMax;
*(&stru_140C23628 + 85) = PopCaptureTimeOnProcZero();
return;
}
if( (a1[1] & 8) != 0 )
{
v25 = PowerSystemShutdown;
LABEL_70:
PopSetSleepMarker(v25);
goto LABEL_72;
}
if( !byte_140C23262 )
{
v25 = SystemState;
goto LABEL_70;
}
PopSetShutdownMarker();
LABEL_72:
PopAcquirePolicyLock();
if( (PopAction & 6) != 0 )
{
*((_BYTE *)a1 + 64) = 1;
goto LABEL_38;
}
PopReleasePolicyLock();
PopCheckpointSystemSleep(PopSleepCheckpointSleepTransactionCommitted);
byte_140C2327C = 3;
PopDiagTraceKernelQueriesAllowed(*v16);
if( !*v16 )
break;
v26 = PopSetDevicesSystemState();
*((_DWORD *)a1 + 26) = v26;
if( (int)(v26 + 0x80000000) < 0 || v26 == -1073741536 )
{
if( !Feature_Servicing_2207c_QxS0Irp__private_IsEnabled() )
break;
v19 = 0x80000000;
if( *((int *)a1 + 26) >= 0 )
{
*((_BYTE *)a1 + 112) = 1;
break;
}
}
else
{
v27 = PopFindNextSystemPowerState(*v18, *((_BYTE *)a1 + 36), (UINT8 *)a1 + 88);
*((_BYTE *)a1 + 48) = v27;
if( !v27 )
goto LABEL_178;
*((_DWORD *)a1 + 26) = 0;
}
}
v19 = 0x80000000;
if( *((int *)a1 + 26) >= 0 )
{
PopCheckpointSystemSleep(PopSleepCheckpointAllocatingHiberContext);
HiberContext = PopAllocateHiberContext();
*((_DWORD *)a1 + 26) = HiberContext;
v19 = 0x80000000;
if( HiberContext >= 0 )
break;
}
}
*((_DWORD *)a1 + 29) = PopNotifyTelemetryOsState(
SystemAction,
SystemState,
EffectiveState,
*((unsigned int *)a1 + 2),
1u);
PopTransitionCheckpoint(9i64);
if( !byte_140C23262 )
{
LODWORD(SubstitutionPolicy) = *((_DWORD *)a1 + 29);
PopDiagTracePreSleepNotification(
*((_SYSTEM_POWER_STATE *)a1 + 11),
EffectiveState,
SleepReason,
(unsigned int)dword_140C23278,
SubstitutionPolicy);
PopCheckpointSystemSleep(PopSleepCheckpointPreSleepNotification);
PopUmpoSendFlushSleepStudyLoggerNotification();
}
PopEsEnterSleepShutdown();
PopThermalSxEntry();
if( !*((_BYTE *)a1 + 24) )
{
if( byte_140C23262 )
{
v85 = 1;
v79 = 5;
v81 = 1;
v80 = &v85;
v82 = 11;
v83 = 0xFFFFF780000002C4ui64;
v84 = 4;
RtlSetSystemBootStatusEx((__int64)&v79, 2u, 0i64);
}
*((_BYTE *)a1 + 24) = 1;
}
v29 = 5i64;
if( !*((_BYTE *)a1 + 36) )
v29 = (unsigned int)SystemState;
PopFlushVolumes(v29);
if( EffectiveState < SystemState )
EffectiveState = SystemState;
byte_140C2327C = 2;
if( !byte_140C23262 )
{
v30 = *((_DWORD *)a1 + 17);
KeMtrrComparisonFailed = 0;
inited = PopInitSystemSleeperThread(v30, (POP_SLEEPER_HANDOFF *)a1 + 66);
*((_DWORD *)a1 + 26) = inited;
if( inited < 0 )
continue;
if( !byte_140C23310 )
{
ExWakeTimersPause();
byte_140C23310 = 1;
}
a1[24] = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
v32 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
v33 = PopWakeAlarmTimeOverride;
a1[25] = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
a1[28] = 0i64;
if( v33 )
{
a1[27] = v33;
a1[28] = -3i64;
}
else if( !*(_DWORD *)(*(&stru_140C23628 + 232) + 88i64)
|| SystemState == PowerSystemHibernate
|| !PopIsDozeSupported((_BYTE *)&stru_140C23628 + 2072)
|| (Flags & 0x40000000) != 0 )
{
if( *(&stru_140C23628 + 2092)
&& SystemState == PowerSystemHibernate
&& !byte_140C23480
&& qword_140C231C8
&& SleepReason == PolicyImmediateDozeS4Predicted )
{
v38 = qword_140C231C8 - v32;
a1[44] = qword_140C231C8 - v32;
v39 = -10000000i64 * (unsigned int)PopSmartUserPresenceWakeOffset;
a1[28] = -2i64;
v40 = v39 + v38;
v41 = a1[24];
a1[44] = v40;
a1[27] = v40 + v41;
}
}
else
{
v36 = a1[24];
a1[27] = v36;
v37 = *(unsigned int *)(v35 + 88);
a1[28] = -1i64;
a1[27] = v36 + 10000000 * v37;
if( !qword_140C23320 )
qword_140C23320 = v36;
}
v42 = &qword_140C232C8;
memset(&qword_140C232C8, 0i64, 0x48u);
dword_140C232C0 = 3;
if( a1[28] == -3i64 )
{
do
{
v42[2] = a1[28];
*v42 = a1[27];
v42 += 3;
}
while( (__int64)v42 < (__int64)&unk_140C232F8 );
}
else if( !byte_140C23480 && SleepReason != PolicyImmediateDozeS4AdaptiveReserveNoWake )
{
v43 = a1 + 47;
v44 = (_DWORD *)a1 + 95;
if( SystemState == PowerSystemHibernate && *(_DWORD *)v43 != 1 && *v44 != 1 )
{
PopQueryPowerSettingUlong(&GUID_LEGACY_RTC_MITIGATION, v2, v4);
if( *(_DWORD *)v2 || *v4 )
{
v43 = a1 + 47;
*v44 = 0;
*((_DWORD *)a1 + 94) = 0;
}
else
{
v43 = a1 + 47;
}
}
if( a1[27] )
{
if( a1[28] == -2i64 )
{
if( *(_DWORD *)v43 )
{
qword_140C232C8 = a1[27];
qword_140C232D8[0] = a1[28];
}
if( *v44 )
{
qword_140C232E0 = a1[27];
qword_140C232F0 = a1[28];
}
}
else
{
do
{
*v42 = a1[27];
v42 += 3;
}
while( (__int64)v42 < (__int64)&unk_140C232F8 );
v45 = qword_140C232D8;
do
{
*v45 = a1[28];
v45 += 3;
}
while( (__int64)v45 < (__int64)&unk_140C23308 );
}
}
v46 = qword_140C23318;
a1[10] = qword_140C23318;
if( v46 )
{
if( v46 < a1[24] + 20000000 )
v46 = a1[24] + 20000000;
a1[10] = v46;
}
if( *(_DWORD *)v43 )
{
if( *(_DWORD *)v43 != 2 || (v47 = 1, (*(&stru_140C23628 + 582) & 0x80000000) != 0) )
v47 = 0;
*((_BYTE *)a1 + 209) = v47;
v48 = a1 + 7;
v49 = (_DIAGNOSTIC_BUFFER **)(a1 + 30);
NextWakeTime = ExGetNextWakeTime(a1[10] + 1, a1[27], v47, a1 + 7, (_DIAGNOSTIC_BUFFER **)a1 + 30);
*((_BYTE *)a1 + 384) = NextWakeTime;
if( NextWakeTime )
{
qword_140C232C8 = *v48;
qword_140C232D8[0] = (__int64)*v49;
}
}
else
{
v48 = a1 + 7;
v49 = (_DIAGNOSTIC_BUFFER **)(a1 + 30);
}
if( *v44 )
{
if( *v44 != 2 || (v51 = 1, (*(&stru_140C23628 + 582) & 0x80000000) != 0) )
v51 = 0;
*((_BYTE *)a1 + 209) = v51;
v52 = ExGetNextWakeTime(a1[10] + 1, a1[27], v51, v48, v49);
*((_BYTE *)a1 + 384) = v52;
if( v52 )
{
qword_140C232E0 = *v48;
qword_140C232F0 = (__int64)*v49;
}
}
}
ProgrammedWakeTimeAc = qword_140C232C8;
if( qword_140C232C8 && qword_140C232C8 < a1[24] + *((unsigned int *)a1 + 97) )
ProgrammedWakeTimeAc = a1[24] + *((unsigned int *)a1 + 97);
ProgrammedWakeTimeDc = qword_140C232E0;
if( qword_140C232E0 && qword_140C232E0 < a1[24] + *((unsigned int *)a1 + 97) )
ProgrammedWakeTimeDc = a1[24] + *((unsigned int *)a1 + 97);
v53 = qword_140C232D8[0];
if( (unsigned __int64)(qword_140C232D8[0] - 1) <= 0xFFFFFFFFFFFFFFFBui64 )
v53 = *(int *)(qword_140C232D8[0] + 8);
a1[45] = v53;
v54 = qword_140C232F0;
if( (unsigned __int64)(qword_140C232F0 - 1) <= 0xFFFFFFFFFFFFFFFBui64 )
v54 = *(int *)(qword_140C232F0 + 8);
a1[46] = v54;
*(&stru_140C23628 + 37) = KeQueryPerformanceCounter(0i64);
ExAcquireTimeRefreshLock(1u);
ExUpdateSystemTimeFromCmos(1u, 1ui64);
ExReleaseTimeRefreshLock();
((void(__fastcall *)(UINT64, UINT64))off_140C005C0)(ProgrammedWakeTimeAc, ProgrammedWakeTimeDc);
PopBootStatCheckpointAvailable = 0;
PpmCheckPausePpmEngineForSx();
PopSetDevicesSystemState();
*((_BYTE *)a1 + 112) = 1;
PopNewWakeInfo();
a1[43] = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
*((_DWORD *)a1 + 37) = *(&stru_140C23628 + 441);
KeSetEvent((PRKEVENT)(a1 + 36), 0, 1u);
KeWaitForSingleObject((UINT64)(a1 + 39), 0, 0, 0, 0i64);
BugCheckParameter4 = 0i64;
*((_DWORD *)a1 + 26) = *((_DWORD *)a1 + 85);
PopSetPowerActionWatchdogState(2ui64, v55);
v56 = SystemState;
if( PoResumeFromHibernate )
v56 = EffectiveState;
WakeFromState = v56;
if( (a1[1] & 8) != 0 )
{
*((_DWORD *)a1 + 11) = 6;
}
else
{
*((_DWORD *)a1 + 11) = SystemState;
TargetState = SystemState;
}
v57 = WakeFromState;
v58 = TargetState;
WakeInfoDcb = (_DIAGNOSTIC_BUFFER *)a1[46];
v59 = (_DIAGNOSTIC_BUFFER *)a1[45];
*((_DWORD *)a1 + 10) = WakeFromState;
PopDiagTracePostSleepNotification(
v58,
EffectiveState,
v57,
ProgrammedWakeTimeAc,
ProgrammedWakeTimeDc,
v59,
WakeInfoDcb);
if( KeMtrrComparisonFailed )
PopDiagTraceMtrrError();
if( *((int *)a1 + 26) < 0 && SystemState == PowerSystemHibernate )
{
DestinationString = 0i64;
StringCchPrintfW((WCHAR *)&PopIrpWorkerControlEvent + 768, 0x80ui64, (WCHAR *)L"0x%x");
RtlInitUnicodeString(&DestinationString, (PCWSTR)&PopIrpWorkerControlEvent + 768);
IoRaiseInformationalHardError(3221226513i64, (INT8 **)&DestinationString, 0i64);
PopDiagTraceHibernateErrorStatus(*((unsigned int *)a1 + 26));
}
goto LABEL_178;
}
break;
}
PopFxPrepareDevicesForShutdown();
IoFreePoDeviceNotifyList((PO_DEVICE_NOTIFY_ORDER *)((char *)qword_140C23298 + 48));
if( SleepReason == PolicyDeviceBattery )
PopCriticalShutdownInProgress = 1;
PopTransitionCheckpoint(8i64);
if( PsGetCurrentProcess() == (_KPROCESS *)PsInitialSystemProcess )
PopGracefulShutdown(0i64);
*(&PopIrpWorkerControlEvent + 231) = 0i64;
*(&PopIrpWorkerControlEvent + 230) = PopGracefulShutdown;
*(&PopIrpWorkerControlEvent + 228) = 0i64;
ExQueueWorkItem((PWORK_QUEUE_ITEM)&PopIrpWorkerControlEvent + 57, CriticalWorkQueue);
KeSuspendThread(KeGetCurrentThread());
}Referenced by:
NtSetSystemPowerState