PoBroadcastSystemState
__int64 __fastcall PoBroadcastSystemState(__int64 a1, __int64 a2, EVENT_DESCRIPTOR *a3){
char v3;
char *v5;
int v6;
int v7;
int v8;
int v9;
int v10;
_POP_SLEEP_CHECKPOINT v11;
EVENT_DESCRIPTOR *v12;
int v13;
__int64 v14;
int v15;
__int64 v16;
_DWORD *v17;
EVENT_DESCRIPTOR *v18;
UINT64 v19;
int v21;
_DWORD *v22;
EVENT_DESCRIPTOR *v23;
UINT64 v24;
UINT64 v25;
int v26;
MDL *v27;
POWER_ACTION v28;
DEVICE_OBJECT *v29;
DEVICE_OBJECT *v30;
ULONG_PTR BugCheckParameter4;
char v32;
__int64 v33;
int v34;
union _LARGE_INTEGER Interval;
EVENT_DATA_DESCRIPTOR EventData;
EVENT_DATA_DESCRIPTOR v37;
v5 = (char *)DevState;
v32 = *(_BYTE *)(a1 + 25);
v3 = v32;
*(_BYTE *)DevState = *(_BYTE *)(a1 + 26);
*((_DWORD *)v5 + 1) = *(_DWORD *)(a1 + 4);
*((_DWORD *)v5 + 112) = 0;
*((_QWORD *)v5 + 57) = 0i64;
*(_WORD *)(v5 + 465) = 0;
v5[467] = 0;
v5[464] = v32;
DWORD1(PopCurrentBroadcast) = 0;
v6 = (*(_DWORD *)a1 & 0xF) << 16;
DWORD1(PopCurrentBroadcast) = v6;
if( v32 )
{
v26 = v6 | 0x1100;
}
else
{
DWORD1(PopCurrentBroadcast) = v6 | ((*(_DWORD *)(a1 + 8) & 0xF) << 8);
v7 = DWORD1(PopCurrentBroadcast) | ((*(_DWORD *)(a1 + 4) & 0xF) << 12);
DWORD1(PopCurrentBroadcast) = v7;
if( *(_DWORD *)(a1 + 16) != 5 )
goto LABEL_3;
v26 = (PopKsrPrepared != 0 ? 0x400000 : 0) | v7;
}
DWORD1(PopCurrentBroadcast) = v26;
LABEL_3:
v8 = *(_DWORD *)(a1 + 16);
LOBYTE(PopCurrentBroadcast) = 1;
DWORD2(PopCurrentBroadcast) = v8;
if( (*(_WORD *)(&PerfGlobalGroupMask + 2) & 0x8000) != 0 )
{
v33 = *((unsigned int *)v5 + 1);
BYTE6(v33) = *(_BYTE *)(a1 + 26);
BYTE5(v33) = *(_BYTE *)(a1 + 24);
EventData.Ptr = (unsigned __int64)&v33;
BYTE4(v33) = v32;
*(_QWORD *)&EventData.Size = 8i64;
LODWORD(BugCheckParameter4) = 4200450;
EtwTraceKernelEvent(&EventData, 1ui64, 0x80008000ui64, 0x1224u, BugCheckParameter4);
}
if( *(_BYTE *)(a1 + 26) == 2 && (*(_DWORD *)(a1 + 20) & 0x4000000) == 0 )
v5[466] = 1;
if( *(_BYTE *)(a1 + 24) && *(_BYTE *)(a1 + 26) == 3 )
v5[467] = 1;
v9 = *(_DWORD *)(a1 + 20);
if( (v9 & 0x8000000) != 0 )
{
DWORD1(PopCurrentBroadcast) |= 0x200000u;
v9 = *(_DWORD *)(a1 + 20);
}
v10 = v9 & 0x4000000;
if( v10 )
DWORD1(PopCurrentBroadcast) |= 0x800000u;
if( !v32 )
{
if( *(_BYTE *)(a1 + 26) == 2 )
PopFxNotifySxTransitionState(1);
if( *((int *)v5 + 112) < 0 )
{
LABEL_37:
if( (*(_DWORD *)PopSimulate & 0x20000) != 0 && *(_BYTE *)(a1 + 26) == 2 )
{
DbgPrint("po: POP_WAKE_DEVICE_AFTER_SLEEP enabled.\n");
v3 = 1;
v32 = 1;
*((_DWORD *)v5 + 112) = -1073741823;
}
goto LABEL_38;
}
PopSetupSleepNotifies((INT64)v5);
PopDiagTraceDevicesSuspend(
*(_BYTE *)(a1 + 26) == 3,
(_SYSTEM_POWER_STATE)((DWORD1(PopCurrentBroadcast) >> 8) & 0xF),
(_SYSTEM_POWER_STATE)(WORD2(PopCurrentBroadcast) >> 12));
v11 = PopSleepCheckpointQueryDriversBefore;
if( *(_BYTE *)(a1 + 26) != 3 )
v11 = PopSleepCheckpointSuspendDriversBefore;
PopCheckpointSystemSleep(v11);
v13 = *(_DWORD *)(a1 + 16);
if( v13 == 4 && (PopShutdownPowerOffPolicy || qword_140C23290) )
{
v14 = 4i64;
}
else
{
v14 = 0i64;
if( (unsigned int)(v13 - 2) <= 1 && *v5 == 2 )
PopFxActivateDevicesForSx(1ui64);
}
v15 = 4;
v16 = 4i64;
v17 = v5 + 352;
while( 1 )
{
if( v15 == 1 && *(_BYTE *)(a1 + 26) == 2 && !v10 )
{
if( EffectiveState == PowerSystemHibernate )
WmiAcquireSmbiosLockExclusive();
EmPowerPagingEnabled(0);
PopVerifierFlushMemoryBeforeSleep();
_InterlockedExchange(&PopPagingEnabled, 0);
if( *(_BYTE *)(a1 + 24) )
{
IoConfigureCrashDump(0i64, 1);
if( (PopShutdownCleanly & 0x10) != 0 )
ObShutdownSystem(1ui64);
MmShutdownSystem(1ui64);
}
else
{
ExAcquireTimeRefreshLock(1u);
v5[468] = 1;
}
}
LOBYTE(v12) = *v5;
PopDiagTraceDevicesLevel(v15, 0, v12, 1);
if( *v17 )
{
if( *(int *)(a1 + 20) < 0 )
**((_QWORD **)v5 + 7) = 0i64;
PopSleepDeviceList((_POP_DEVICE_SYS_STATE *)v5, (_PO_NOTIFY_ORDER_LEVEL *)&v5[64 * v15 + 64 + 8 * v15]);
}
LOBYTE(v18) = *v5;
PopDiagTraceDevicesLevel(v15, 0, v18, 0);
if( *((int *)v5 + 112) < 0 )
break;
--v15;
--v16;
v17 -= 18;
if( v16 < v14 )
{
v3 = v32;
goto LABEL_32;
}
}
v32 = 1;
v3 = 1;
if( *((_QWORD *)v5 + 57) && *(_DWORD *)(a1 + 12) == 1 )
{
v28 = PopMapInternalActionToIrpAction(*(POWER_ACTION *)(a1 + 16), *((_SYSTEM_POWER_STATE *)v5 + 1), 0);
if( v28 == PowerActionWarmEject )
{
v29 = (DEVICE_OBJECT *)**((_QWORD **)v5 + 7);
LABEL_98:
IoNotifyPowerOperationVetoed(v28, v29, v30);
goto LABEL_99;
}
if( *(int *)(a1 + 20) >= 0 )
goto LABEL_98;
}
LABEL_99:
if( v10 )
PopDirectedDripsNotifyTransitionFailed(*((DEVICE_OBJECT **)v5 + 57));
LABEL_32:
if( *v5 == 2 && v10 )
PopFxIdleDevicesFromSx(v19);
PopDiagTraceEventNoPayload((EVENT_DESCRIPTOR *)&POP_ETW_EVENT_DEVICESSUSPEND_END);
if( *(_BYTE *)(a1 + 26) == 3 )
PopCheckpointSystemSleep(PopSleepCheckpointQueryDriversAfter);
goto LABEL_37;
}
LABEL_38:
v5[464] = v3;
if( v3 )
{
v5[466] = 1;
*v5 = 2;
*((_DWORD *)v5 + 1) = 1;
if( *(_BYTE *)(a1 + 26) != 2
|| (PopDiagTraceEventNoPayload((EVENT_DESCRIPTOR *)&POP_ETW_EVENT_DEVICESWAKE),
stru_140C23778 = KeQueryPerformanceCounter(0i64),
*v5 == 2) )
{
if( v10 )
PopFxActivateDevicesForSx(1ui64);
}
v21 = 0;
v22 = v5 + 64;
do
{
if( PoResumeFromHibernate && !v21 )
{
if( byte_140C23480 )
stru_140C23940 = KeQueryPerformanceCounter(0i64);
if( byte_140C50390 )
{
BgDisplayFade();
byte_140C50485 = 0;
byte_140C50484 = 0;
}
}
LOBYTE(a3) = *v5;
PopDiagTraceDevicesLevel(v21, 1, a3, 1);
if( v22[1] < *v22 )
PopWakeDeviceList(v5, (INT64)&v5[64 * v21 + 64 + 8 * v21]);
LOBYTE(v23) = *v5;
PopDiagTraceDevicesLevel(v21, 1, v23, 0);
if( v21 == 1 && *(_BYTE *)(a1 + 26) == 2 && !v10 )
{
if( v5[468] )
{
v5[468] = 0;
ExReleaseTimeRefreshLock();
}
if( PoResumeFromHibernate )
{
if( HiberContext )
{
v27 = *(MDL **)(HiberContext + 216);
if( v27 )
PopBootLoaderSiData(v27, v24);
}
PopUpdateSmbiosData(
*(_BYTE *)(*(_QWORD *)(HiberContext + 200) + 980i64),
*(_BYTE *)(*(_QWORD *)(HiberContext + 200) + 981i64),
*(unsigned int *)(*(_QWORD *)(HiberContext + 200) + 976i64),
*(LARGE_INTEGER *)(*(_QWORD *)(HiberContext + 200) + 968i64));
}
if( EffectiveState == PowerSystemHibernate )
WmiReleaseSmbiosLockExclusive();
EmPowerPagingEnabled(1u);
_InterlockedExchange(&PopPagingEnabled, 1);
v25 = (unsigned int)PopDebugFlags;
if( (PopDebugFlags & 4) != 0 )
{
Interval.QuadPart = -50000000i64;
KeDelayExecutionThread(0, 0, &Interval);
KeBugCheckEx(0xA0u, 0xAui64, 1ui64, 0i64, 0i64);
}
}
++v21;
v22 += 18;
}
while( v21 <= 4 );
if( *(_BYTE *)(a1 + 26) == 2 )
{
PopFxIdleDevicesFromSx(v25);
stru_140C23780 = KeQueryPerformanceCounter(0i64);
PopDiagTraceDevicesWakeEnd();
PopCheckpointSystemSleep(PopSleepCheckpointWakeDriversAfter);
PopHandleWakeSources();
if( (PopDebugFlags & 8) != 0 )
{
Interval.QuadPart = -50000000i64;
KeDelayExecutionThread(0, 0, &Interval);
KeBugCheckEx(0xA0u, 0xAui64, 2ui64, 0i64, 0i64);
}
}
v3 = v32;
*v5 = *(_BYTE *)(a1 + 26);
*((_DWORD *)v5 + 1) = *(_DWORD *)(a1 + 4);
}
if( (*(_WORD *)(&PerfGlobalGroupMask + 2) & 0x8000) != 0 )
{
v34 = *((_DWORD *)v5 + 112);
*(_QWORD *)&v37.Size = 4i64;
v37.Ptr = (unsigned __int64)&v34;
LODWORD(BugCheckParameter4) = 4200450;
EtwTraceKernelEvent(&v37, 1ui64, 0x80008000ui64, 0x1225u, BugCheckParameter4);
}
if( v3 && *(_BYTE *)(a1 + 26) == 2 )
PopFxNotifySxTransitionState(0);
DWORD1(PopCurrentBroadcast) &= ~0x800000u;
LOBYTE(PopCurrentBroadcast) = 0;
return *((unsigned int *)v5 + 112);
}Referenced by:
PnprQuiesceDevices
PnprWakeDevices
PopDirectedDripsResumeDevices
PopDirectedDripsSuspendDevices
PopSetDevicesSystemState