PopGracefulShutdown

VOID __stdcall __noreturn PopGracefulShutdown(VOID *WorkItemParameter){
  __int64 v1; 
  __int64 v2; 
  UINT64 *v3; 
  _EPROCESS *v4; 

  PopTransitionCheckpoint(10i64);
  PopDiagTraceEventNoPayload(&POP_ETW_EVENT_GRACEFULSHUTDOWN_START);
  *((_QWORD *)qword_140C23298 + 2) = KeGetCurrentThread();
  PopDiagTraceEventNoPayload(&POP_ETW_EVENT_ZEROPAGEFILE_START);
  MmZeroPageFileAtShutdown();
  PopDiagTraceEventNoPayload(&POP_ETW_EVENT_ZEROPAGEFILE_STOP);
  if( !qword_140C23290 )
    off_140C00AF8[0]();
  VfShutdownScheduleWatchdog();
  if( *(&stru_140C23628 + 584) )
  {
    PsShutdownSystem();
    KeSetEvent((PRKEVENT)((char *)&stru_140C23628 + 3416), 0, 0);
    KeAcquireGuardedMutex((PKGUARDED_MUTEX)((char *)&stru_140C23628 + 3352));
    PopShutdownListAvailable = 0;
    KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&stru_140C23628 + 3352));
    while( 1 )
    {
      v2 = *(&stru_140C23628 + 431);
      if( (_UNKNOWN *)*(&stru_140C23628 + 431) == (_UNKNOWN *)((char *)&stru_140C23628 + 3448) )
        break;
      if( *(_UNKNOWN **)(*(&stru_140C23628 + 431) + 8i64) != (_UNKNOWN *)((char *)&stru_140C23628 + 3448)
        || (v1 = **(&stru_140C23628 + 431), *(_QWORD *)(**(&stru_140C23628 + 431) + 8i64) != *(&stru_140C23628 + 431)) )
      {
        __fastfail(3u);
      }
      *(&stru_140C23628 + 431) = **(&stru_140C23628 + 431);
      *(_QWORD *)(v1 + 8) = (char *)&stru_140C23628 + 3448;
      (*(void(__fastcall **)(_QWORD))(v2 + 16))(*(_QWORD *)(v2 + 24));
    }
    while( 1 )
    {
      v3 = (UINT64 *)*(&stru_140C23628 + 433);
      if( !*(&stru_140C23628 + 433) )
        break;
      *(&stru_140C23628 + 433) = **(&stru_140C23628 + 433);
      KeWaitForSingleObject(v3[1], 0, 0, 0, 0i64);
      ObfDereferenceObjectWithTag((VOID *)v3[1], 0x64536F50ui64);
      ExFreePoolWithTag(v3, 0);
    }
  }
  TmShutdownSystem();
  CmShutdownSystem(0);
  ExShutdownSystem(0i64);
  PopDiagTraceEventNoPayload(&POP_ETW_EVENT_IOSHUTDOWNSYSTEM_START);
  IoShutdownSystem(0i64);
  PopDiagTraceEventNoPayload(&POP_ETW_EVENT_IOSHUTDOWNSYSTEM_STOP);
  if( *(&stru_140C23628 + 584) )
  {
    PopDiagTraceEventNoPayload(&POP_ETW_EVENT_WAITFORPROCESSES_START);
    PsWaitForAllProcesses();
    PopDiagTraceEventNoPayload(&POP_ETW_EVENT_WAITFORPROCESSES_STOP);
  }
  if( (*(&stru_140C23628 + 2336) & 0x10) != 0 )
    ObShutdownSystem(0i64);
  PopDiagTraceEventNoPayload(&POP_ETW_EVENT_CMSHUTDOWNSYSTEM_START);
  CmShutdownSystem(1);
  PopDiagTraceEventNoPayload(&POP_ETW_EVENT_CMSHUTDOWNSYSTEM_STOP);
  if( PopDiagHandleRegistered )
    EtwWriteEndScenario(
      PopDiagHandle,
      &POP_ETW_EVENT_GRACEFULSHUTDOWN_STOP,
      (_LPCGUID)&PopShutdownDiagnosticsScenarioGuid,
      0,
      0i64);
  EtwShutdown(0);
  ExShutdownSystem(1ui64);
  MmShutdownSystem(0i64);
  PopSetCleanShutdownMarker();
  PopTransitionCheckpoint(10i64);
  PnpWaitForEmptyDeviceActionQueue();
  PopDiagTraceEventNoPayload(&POP_ETW_EVENT_IOSHUTDOWN_FILE_SYSTEMS_START);
  IoShutdownSystem(1ui64);
  PopDiagTraceEventNoPayload(&POP_ETW_EVENT_IOSHUTDOWN_FILE_SYSTEMS_STOP);
  CcWaitForCurrentLazyWriterActivity();
  if( qword_140C23290 )
  {
    v4 = (_EPROCESS *)*((_QWORD *)qword_140C23290 + 1);
    if( v4 )
      KeAttachProcess(&v4->Pcb);
    IoAddTriageDumpDataBlock(qword_140C23290, (_BYTE *)0x48);
    KeBugCheckEx(
      *((_DWORD *)qword_140C23290 + 8),
      *((PVOID *)qword_140C23290 + 5),
      *((PVOID *)qword_140C23290 + 6),
      *((PVOID *)qword_140C23290 + 7),
      *((PVOID *)qword_140C23290 + 8));
  }
  PopBootStatCheckpointAvailable = 0;
  *((_DWORD *)qword_140C23298 + 112) = 0;
  PopBuildDeviceNotifyList((_PO_DEVICE_NOTIFY_ORDER *)((char *)qword_140C23298 + 48));
  PopSetDevicesSystemState();
  ExShutdownSystem(2ui64);
  if( (*(&stru_140C23628 + 2336) & 0x10) != 0 )
    ObShutdownSystem(2ui64);
  MmShutdownSystem(2ui64);
  PopShutdownSystem(SystemAction);
}

Referenced by:

PopTransitionSystemPowerStateEx