MiDeleteFinalPageTables
NTSTATUS __stdcall MiDeleteFinalPageTables(_EPROCESS *Process){
unsigned __int64 v1;
__int64 v3;
_MMPFN *PfnDb;
_ETHREAD *CurrentThread;
int i;
unsigned __int64 v7;
__int64 v8;
INT64 v9;
bool v10;
NTSTATUS result;
_MI_DELETE_VA_INFO *BugCheckParameter4;
UINT8 WsIrql[16];
__int128 v14;
__int128 v15;
_KAPC_STATE ApcState;
v1 = Process->Pcb.DirectoryTableBase >> 12;
memset(&ApcState, 0, sizeof(ApcState));
v3 = v1;
*(_OWORD *)WsIrql = 0i64;
v14 = 0i64;
v15 = 0i64;
PfnDb = MmGetPfnDb();
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
KiStackAttachProcess(Process, 0i64, &ApcState);
for( i = 0; i < 2; ++i )
{
if( i )
{
v7 = *(&stru_140C4DB30 + 11);
if( !*(&stru_140C4DB30 + 11) )
continue;
}
else
{
v7 = (unsigned __int64)&UKUSER_SHARED_DATA;
}
LODWORD(v8) = MI_READ_PTE_LOCK_FREE((INT64)&MmGetPml4eBase()[(v7 >> 39) & 0x1FF]);
if( v8 )
{
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockExclusiveEx(&Process->AddressCreationLock, 0i64);
CurrentThread->$84F33738BEE95ACDF5C5BF1C8FDC7C8C::_bf_0 |= 1u;
MiDeleteVirtualAddresses((VOID *)v7, (VOID *)v7, 0i64, (UINT8)WsIrql, BugCheckParameter4);
UNLOCK_ADDRESS_SPACE(CurrentThread, Process);
}
}
MiDeleteVadBitmap(Process);
if( (PfnDb[v3].u2._bf_0 & 0x3FFFFFFFFFFFFFFFi64) != 2 )
KeBugCheckEx(
0x1Au,
(PVOID)0x3453,
Process,
(PVOID)(v3 * 48 / 48),
(PVOID)(PfnDb[v3].u2._bf_0 & 0x3FFFFFFFFFFFFFFFi64));
MiDeleteProcessShadow();
KiUnstackDetachProcess(&ApcState, 0i64);
_interlockedbittestandset(&Process->Pcb.ProcessFlags, 0xAu);
MiUnlinkProcessFromSession(Process);
KeFlushProcessTb(Process->Pcb.DirectoryTableBase);
v10 = MiDeleteTopLevelPage(v9, Process->Pcb.DirectoryTableBase >> 12) == 3;
result = *(_DWORD *)&WsIrql[8];
if( v10 )
return *(_DWORD *)&WsIrql[8] + 1;
return result;
}Referenced by:
MmDeleteProcessAddressSpace