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