PopGracefulShutdown

VOID __fastcall __noreturn PopGracefulShutdown(VOID *WorkItemParameter){
  __int64 v1; 
  __int64 v2; 
  PVOID *v3; 
  UINT64 *v4; 
  _EPROCESS *v5; 
  PopTransitionCheckpoint(10i64);
  PopDiagTraceEventNoPayload((EVENT_DESCRIPTOR *)&POP_ETW_EVENT_GRACEFULSHUTDOWN_START);
  *((_QWORD *)qword_140C23298 + 2) = KeGetCurrentThread();
  PopDiagTraceEventNoPayload((EVENT_DESCRIPTOR *)&POP_ETW_EVENT_ZEROPAGEFILE_START);
  MmZeroPageFileAtShutdown();
  PopDiagTraceEventNoPayload((EVENT_DESCRIPTOR *)&POP_ETW_EVENT_ZEROPAGEFILE_STOP);
  if( !qword_140C23290 )
    off_140C00AF8[0]();
  VfShutdownScheduleWatchdog();
  if( PopShutdownCleanly )
  {
    PsShutdownSystem();
    KeSetEvent(&PopShutdownEvent, 0);
    KeAcquireGuardedMutex(&PopShutdownListMutex);
    PopShutdownListAvailable = 0;
    KeReleaseGuardedMutex(&PopShutdownListMutex);
    while( 1 )
    {
      v2 = PopShutdownQueue;
      if( (__int64 *)PopShutdownQueue == &PopShutdownQueue )
        break;
      if( *(__int64 **)(PopShutdownQueue + 8) != &PopShutdownQueue
        || (v1 = *(_QWORD *)PopShutdownQueue, *(_QWORD *)(*(_QWORD *)PopShutdownQueue + 8i64) != PopShutdownQueue) )
      {
        __fastfail(3u);
      }
      PopShutdownQueue = *(_QWORD *)PopShutdownQueue;
      *(_QWORD *)(v1 + 8) = &PopShutdownQueue;
      (*(void(__fastcall **)(_QWORD))(v2 + 16))(*(_QWORD *)(v2 + 24));
    }
    while( 1 )
    {
      v3 = (PVOID *)PopShutdownThreadList;
      if( !PopShutdownThreadList )
        break;
      PopShutdownThreadList = *(PVOID *)PopShutdownThreadList;
      KeWaitForSingleObject(v3[1], Executive, 0, 0, 0i64);
      ObfDereferenceObjectWithTag(v3[1], 0x64536F50ui64);
      ExFreePoolWithTag(v3, 0);
    }
  }
  TmShutdownSystem();
  CmShutdownSystem(0i64);
  ExShutdownSystem(0i64);
  PopDiagTraceEventNoPayload((EVENT_DESCRIPTOR *)&POP_ETW_EVENT_IOSHUTDOWNSYSTEM_START);
  IoShutdownSystem(0i64);
  PopDiagTraceEventNoPayload((EVENT_DESCRIPTOR *)&POP_ETW_EVENT_IOSHUTDOWNSYSTEM_STOP);
  if( PopShutdownCleanly )
  {
    PopDiagTraceEventNoPayload((EVENT_DESCRIPTOR *)&POP_ETW_EVENT_WAITFORPROCESSES_START);
    PsWaitForAllProcesses();
    PopDiagTraceEventNoPayload((EVENT_DESCRIPTOR *)&POP_ETW_EVENT_WAITFORPROCESSES_STOP);
  }
  if( (PopShutdownCleanly & 0x10) != 0 )
    ObShutdownSystem(0i64);
  PopDiagTraceEventNoPayload((EVENT_DESCRIPTOR *)&POP_ETW_EVENT_CMSHUTDOWNSYSTEM_START);
  CmShutdownSystem(1ui64);
  PopDiagTraceEventNoPayload((EVENT_DESCRIPTOR *)&POP_ETW_EVENT_CMSHUTDOWNSYSTEM_STOP);
  if( PopDiagHandleRegistered )
    EtwWriteEndScenario(
      PopDiagHandle,
      &POP_ETW_EVENT_GRACEFULSHUTDOWN_STOP,
      &PopShutdownDiagnosticsScenarioGuid,
      0i64,
      0i64);
  EtwShutdown(0);
  ExShutdownSystem(1ui64);
  MmShutdownSystem(0i64);
  PopSetCleanShutdownMarker();
  PopTransitionCheckpoint(10i64);
  PnpWaitForEmptyDeviceActionQueue(v4);
  PopDiagTraceEventNoPayload((EVENT_DESCRIPTOR *)&POP_ETW_EVENT_IOSHUTDOWN_FILE_SYSTEMS_START);
  IoShutdownSystem(1ui64);
  PopDiagTraceEventNoPayload((EVENT_DESCRIPTOR *)&POP_ETW_EVENT_IOSHUTDOWN_FILE_SYSTEMS_STOP);
  CcWaitForCurrentLazyWriterActivity();
  if( qword_140C23290 )
  {
    v5 = (_EPROCESS *)*((_QWORD *)qword_140C23290 + 1);
    if( v5 )
      KeAttachProcess((PRKPROCESS)v5);
    IoAddTriageDumpDataBlock(qword_140C23290, 0x48ui64);
    KeBugCheckEx(
      *((_DWORD *)qword_140C23290 + 8),
      *((_QWORD *)qword_140C23290 + 5),
      *((_QWORD *)qword_140C23290 + 6),
      *((_QWORD *)qword_140C23290 + 7),
      *((_QWORD *)qword_140C23290 + 8));
  }
  PopBootStatCheckpointAvailable = 0;
  *((_DWORD *)qword_140C23298 + 112) = 0;
  PopBuildDeviceNotifyList((_PO_DEVICE_NOTIFY_ORDER *)((char *)qword_140C23298 + 48));
  PopSetDevicesSystemState();
  ExShutdownSystem(2ui64);
  if( (PopShutdownCleanly & 0x10) != 0 )
    ObShutdownSystem(2ui64);
  MmShutdownSystem(2ui64);
  PopShutdownSystem(Action);
}

Referenced by:

PopTransitionSystemPowerStateEx