MiDeleteEmptyPageTables
VOID __fastcall MiDeleteEmptyPageTables(VOID *VirtualAddress, UINT64 a2, CHAR a3){
_ETHREAD *CurrentThread;
_EPROCESS *Process;
_MMVAD_SHORT *p_Core;
_MMVAD *Address;
int v10;
__int64 LongFlags1;
unsigned __int64 v12;
_KTBFLUSH_TYPE v13;
char v14;
UINT64 v15;
__int128 v16[3];
INT64 v17[22];
__int64 v18[20];
__int64 v19[24];
memset(v19, 0i64, 0xB8u);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
Process = CurrentThread->Tcb.ApcState.Process;
if( (a3 & 1) != 0 )
{
p_Core = 0i64;
LABEL_15:
memset(v16, 0, sizeof(v16));
memset(v18, 0i64, 0x98u);
memset(v17, 0i64, sizeof(v17));
v18[12] = (__int64)p_Core;
v18[2] = (__int64)v16;
LODWORD(v18[13]) = 128;
v13 = MiTbFlushType(&Process->Vm.Instance);
WORD2(v19[0]) = 0;
v19[2] = 0i64;
v19[3] = 0i64;
LODWORD(v19[0]) = v13;
v17[2] = (INT64)v19;
LODWORD(v19[1]) = 20;
LODWORD(v17[1]) = 0;
v17[4] = (INT64)VirtualAddress;
v17[5] = a2;
BYTE2(v17[0]) = BYTE2(v17[0]) & 0xE3 | 4;
v17[21] = (INT64)v18;
LOWORD(v17[0]) = 7;
v17[3] = (INT64)&Process->Vm;
v17[19] = (INT64)MiDeleteEmptyPageTable;
v17[20] = (INT64)MiDeleteEmptyPageTableTail;
MiLockWorkingSetShared();
BYTE6(v17[0]) = v14;
MiWalkPageTables((INT64)v17);
LOBYTE(v15) = BYTE6(v17[0]);
MiUnlockWorkingSetShared(&Process->Vm.Instance, v15);
if( !p_Core )
return;
UNLOCK_PAGE_TABLE_COMMITMENT(CurrentThread, Process);
goto LABEL_17;
}
LOCK_ADDRESS_SPACE(CurrentThread, CurrentThread->Tcb.ApcState.Process);
if( (Process->Flags & 0x20) != 0 )
goto LABEL_18;
Address = MiLocateAddress(VirtualAddress);
p_Core = &Address->Core;
if( !Address || a2 >> 12 > (Address->Core.EndingVpn | ((unsigned __int64)Address->Core.EndingVpnHigh << 32)) )
goto LABEL_18;
MiLockVad(CurrentThread, &Address->Core);
if( (p_Core->u.LongFlags & 0x100000) != 0
&& MiVadPureReserve(p_Core)
&& ((v10 & 0x1000000) != 0 || (v10 & 0x2000000) == 0) )
{
LongFlags1 = p_Core->u1.LongFlags1;
LODWORD(LongFlags1) = LongFlags1 & 0x7FFFFFFF;
v12 = LongFlags1 | ((unsigned __int64)p_Core->CommitChargeHigh << 31);
if( v12 != 0x7FFFFFFFDi64 && (v10 & 4) == 0 && (v12 < 0x7FFFFFFFDi64 || v12 == 0x7FFFFFFFEi64) )
{
LOCK_PAGE_TABLE_COMMITMENT(CurrentThread, Process);
goto LABEL_15;
}
}
LABEL_17:
MiUnlockVad(CurrentThread, p_Core);
LABEL_18:
UNLOCK_ADDRESS_SPACE(CurrentThread, Process);
}Referenced by:
MiWriteAwePtes
MmFreeVirtualMemory