MiShutdownSystem
UINT8 __stdcall MiShutdownSystem(){
INT8 v0;
UINT64 v1;
_ETHREAD *CurrentThread;
_ETHREAD *Lock;
INT64 *v4;
_ETHREAD *v5;
_QWORD *v6;
__int64 v7;
VOID *Pool;
INT64 v9;
void *v10;
if( !*(&stru_140C4DB30 + 565) )
{
CcNotifyWriteBehind(v1);
MiFlushAllFilesystemPages();
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&stru_140C50B28 + 117, 0i64);
*(&stru_140C4DB30 + 565) = 1;
if( (_InterlockedExchangeAdd64((_QWORD *)&stru_140C50B28 + 117, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)&stru_140C50B28 + 117);
KeAbPostRelease((char *)&stru_140C50B28 + 936);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
KeSetEvent((PRKEVENT)&stru_140C50B28, 0, 0);
if( *(&stru_140C4DB30 + 2258) == 1 )
{
if( (MiFlags & 4) == 0 )
MmLockPagableSectionByHandle(ExPageLockHandle);
MiZeroAllPageFiles();
if( (MiFlags & 4) == 0 )
MmUnlockPagableImageSection(ExPageLockHandle);
}
MiDeleteAllHardwareEnclaves();
}
if( *(&stru_140C23628 + 584) )
{
Lock = MmAcquireLoadLock(v1, v0);
v4 = (INT64 *)PsLoadedModuleList;
v5 = Lock;
while( v4 != &PsLoadedModuleList )
{
v6 = (_QWORD *)v4[17];
if( v6 != (_QWORD *)1 && v6 != (_QWORD *)-2i64 && ((unsigned __int8)v6 & 1) == 0 )
{
v7 = 8i64 * *v6 + 8;
Pool = MiAllocatePool(64i64, v7, 0x54446D4Dui64);
v9 = (INT64)Pool;
if( !Pool )
{
*(&stru_140C23628 + 584) = 0;
break;
}
memmove(Pool, v6, v7);
MiFreeLoadedImportList(v6);
v4[17] = v9;
}
v10 = (void *)v4[10];
if( v10 )
{
ExFreePoolWithTag(v10, 0);
v4[10] = 0i64;
}
v4 = (INT64 *)*v4;
}
MmReleaseLoadLock(v5);
MiDeletePagingFiles(&Irp);
}
return 1;
}Referenced by:
MmShutdownSystem