ObShutdownSystem
VOID __stdcall ObShutdownSystem(UINT64 Phase){
_QWORD *v1;
_QWORD *v2;
_ADAPTER_OBJECT *v3;
_ADAPTER_OBJECT *v4;
_ADAPTER_OBJECT *v5;
unsigned int v6;
unsigned int v7;
__int64 v8;
unsigned __int16 *v9;
unsigned __int16 *v10;
unsigned __int16 *v11;
_OBJECT_SYMBOLIC_LINK *v12;
_ADAPTER_OBJECT *v13;
_OBJECT_SYMBOLIC_LINK *v14;
_OBJECT_TYPE *v15;
char v16;
__int64 v17;
_ETHREAD *CurrentThread;
unsigned __int16 *v19;
_ADAPTER_OBJECT **v20;
int v21;
unsigned __int16 *v22;
_OBJECT_TYPE *v23;
_UNICODE_STRING DestinationString;
int v25;
int v26;
int v27;
PADAPTER_OBJECT DmaAdapter;
if( (_DWORD)Phase )
{
if( (_DWORD)Phase == 1 )
{
v27 = 0;
ExEnumHandleTable(
PsInitialSystemProcess->ObjectTable,
(__int64(__fastcall *)(_HANDLE_TABLE *, _HANDLE_TABLE_ENTRY *, _EXHANDLE, __int64))ObpShutdownCloseHandleProcedure,
(__int64)&v27,
0i64);
}
else
{
v1 = (_QWORD *)*(&stru_140C23628 + 837);
DmaAdapter = 0i64;
DestinationString = 0i64;
v2 = (_QWORD *)**(&stru_140C23628 + 837);
while( v2 != v1 )
{
v3 = (_ADAPTER_OBJECT *)(v2 + 10);
v2 = (_QWORD *)*v2;
DmaAdapter = v3;
ObMakeTemporaryObject(v3);
}
RtlInitUnicodeString(&DestinationString, L"DosDevices");
if( ObReferenceObjectByName(&DestinationString, 0x40ui64, 0i64, 0i64, ObjectType, 0, 0i64, (VOID **)&DmaAdapter) >= 0 )
{
ObMakeTemporaryObject(DmaAdapter);
HalPutDmaAdapter(DmaAdapter);
}
RtlInitUnicodeString(&DestinationString, L"Global");
if( ObReferenceObjectByName(&DestinationString, 0x40ui64, 0i64, 0i64, ObjectType, 0, 0i64, (VOID **)&DmaAdapter) >= 0 )
{
ObMakeTemporaryObject(DmaAdapter);
HalPutDmaAdapter(DmaAdapter);
}
RtlInitUnicodeString(&DestinationString, L"GLOBALROOT");
if( ObReferenceObjectByName(&DestinationString, 0x40ui64, 0i64, 0i64, ObjectType, 0, 0i64, (VOID **)&DmaAdapter) >= 0 )
{
ObMakeTemporaryObject(DmaAdapter);
HalPutDmaAdapter(DmaAdapter);
}
HalPutDmaAdapter(*(&stru_140C23628 + 836));
HalPutDmaAdapter((PADAPTER_OBJECT)::DmaAdapter);
HalPutDmaAdapter((PADAPTER_OBJECT)ObjectType);
HalPutDmaAdapter(Directory);
HalPutDmaAdapter(*(&stru_140C23628 + 837));
}
}
else
{
v4 = (_ADAPTER_OBJECT *)*(&stru_140C23628 + 836);
v25 = 1;
v5 = 0i64;
v6 = 1;
v7 = 1;
if( *(&stru_140C23628 + 836) )
{
LABEL_15:
while( 2 )
{
v8 = 0i64;
LABEL_16:
v26 = v8;
if( (unsigned int)v8 < 0x25 )
{
v9 = &v4->AdapterObject.DmaHeader.Version + 4 * v8;
v10 = *(unsigned __int16 **)v9;
v11 = v9;
v22 = v9;
while( 1 )
{
if( !v10 )
{
v8 = (unsigned int)(v26 + 1);
goto LABEL_16;
}
v12 = (_OBJECT_SYMBOLIC_LINK *)*((_QWORD *)v10 + 1);
v13 = v5;
v14 = (_OBJECT_SYMBOLIC_LINK *)v5;
v15 = (_OBJECT_TYPE *)ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ LOBYTE(v12[-1].CallbackContext) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)((_WORD)v12 - 48) >> 8)];
v16 = BYTE2(v12[-1].CallbackContext);
v23 = v15;
if( (v16 & 2) != 0 )
{
v17 = (__int64)&v12[-2].AccessMask - *((unsigned __int8 *)&dword_140C25D60 + (v16 & 3));
v15 = (_OBJECT_TYPE *)ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ LOBYTE(v12[-1].CallbackContext) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)((_WORD)v12 - 48) >> 8)];
}
else
{
v17 = 0i64;
}
if( v5 )
{
if( v12 == (_OBJECT_SYMBOLIC_LINK *)v5 && (v5 = 0i64, v7 > v6) )
{
v7 = v6;
v11 = v9;
v25 = v6;
}
else
{
v5 = 0i64;
v11 = v10;
if( v12 != v14 )
v5 = v13;
}
}
else if( v15 == (_OBJECT_TYPE *)*(&stru_140C23628 + 837) )
{
v11 = v10;
}
else
{
if( v15 == ::DmaAdapter )
{
++v6;
v4 = (_ADAPTER_OBJECT *)*((_QWORD *)v10 + 1);
goto LABEL_15;
}
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&v12[-1].8, 0i64);
BYTE3(v12[-1].CallbackContext) &= ~0x10u;
ExReleasePushLockEx((_DWORD)v12 - 32, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
v19 = *(unsigned __int16 **)v11;
if( v12[-1].CreationTime.QuadPart )
{
v7 = v25;
v11 = *(unsigned __int16 **)v11;
}
else
{
*(_QWORD *)v11 = *(_QWORD *)v19;
ExFreePoolWithTag(v19, 0);
if( (v23->TypeInfo._bf_0 & 8) == 0 )
{
LOBYTE(v21) = 0;
v23->TypeInfo.SecurityProcedure(
v12,
DeleteSecurityDescriptor,
0i64,
0i64,
0i64,
(void **)&v12[-1].AccessMask,
v23->TypeInfo.PoolType,
0i64,
v21);
}
if( v23 == ObjectType )
{
v7 = v6;
v25 = v6;
ObpDeleteSymbolicLinkName(v12);
v11 = v22;
}
else
{
v7 = v25;
}
ExFreePoolWithTag(*(PVOID *)(v17 + 16), 0);
*(_QWORD *)(v17 + 16) = 0i64;
*(_DWORD *)(v17 + 8) = 0;
*(_QWORD *)v17 = 0i64;
HalPutDmaAdapter((PADAPTER_OBJECT)v12);
HalPutDmaAdapter(v4);
}
v9 = v22;
}
v10 = *(unsigned __int16 **)v11;
}
}
--v6;
if( (BYTE2(v4[-1].AllocationState) & 2) != 0 )
v20 = (_ADAPTER_OBJECT **)((char *)&v4[-1].LowMemoryLogicalAddressQueueEntry
- *((unsigned __int8 *)&dword_140C25D60 + (BYTE2(v4[-1].AllocationState) & 3)));
else
v20 = 0i64;
v5 = v4;
v4 = *v20;
if( *v20 )
continue;
break;
}
}
}
}Referenced by:
PoBroadcastSystemState
PopGracefulShutdown