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