MiDeleteEmptyPageTables
VOID __fastcall MiDeleteEmptyPageTables(UINT64 a1, UINT64 a2, CHAR a3){
_ETHREAD *CurrentThread;
__int64 v7;
__int64 v8;
RTL_BALANCED_NODE *Address;
int v10;
__int64 v11;
unsigned __int64 v12;
int v13;
__int128 v14[3];
__int16 v15;
char v16;
UINT8 v17;
int v18;
int *p_result;
__int64 v20;
UINT64 v21;
UINT64 v22;
INT64(__fastcall *v23)(_QWORD *, UINT64);
INT64(__fastcall *v24)(INT64 *);
INT64 *v25;
INT64 v26[13];
int v27;
int result;
__int16 result_4;
int v30;
__int64 v31;
__int64 v32;
memset((INT64)&result, 0i64);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v7 = *((_QWORD *)CurrentThread + 23);
if( (a3 & 1) != 0 )
{
v8 = 0i64;
LABEL_15:
memset(v14, 0, sizeof(v14));
memset((INT64)v26, 0i64);
memset((INT64)&v15, 0i64);
v26[12] = v8;
v26[2] = (INT64)v14;
v27 = 128;
v13 = MiTbFlushType(v7 + 1664);
result_4 = 0;
v31 = 0i64;
v32 = 0i64;
result = v13;
p_result = &result;
v30 = 20;
v18 = 0;
v21 = a1;
v22 = a2;
v16 = v16 & 0xE3 | 4;
v25 = v26;
v15 = 7;
v20 = v7 + 1664;
v23 = MiDeleteEmptyPageTable;
v24 = MiDeleteEmptyPageTableTail;
v17 = MiLockWorkingSetShared(v7 + 1664);
MiWalkPageTables((INT64)&v15);
MiUnlockWorkingSetShared(v7 + 1664, v17);
if( !v8 )
return;
UNLOCK_PAGE_TABLE_COMMITMENT((__int64)CurrentThread, v7);
goto LABEL_17;
}
LOCK_ADDRESS_SPACE((__int64)CurrentThread, *((_QWORD *)CurrentThread + 23));
if( (*(_DWORD *)(v7 + 1124) & 0x20) != 0 )
goto LABEL_18;
Address = MiLocateAddress(a1);
v8 = (__int64)Address;
if( !Address || a2 >> 12 > (HIDWORD(Address[1].Left) | ((unsigned __int64)BYTE1(Address[1].Right) << 32)) )
goto LABEL_18;
MiLockVad((__int64)CurrentThread, (__int64)Address);
if( (*(_DWORD *)(v8 + 48) & 0x100000) != 0
&& (unsigned int)MiVadPureReserve(v8)
&& ((v10 & 0x1000000) != 0 || (v10 & 0x2000000) == 0) )
{
v11 = *(unsigned int *)(v8 + 52);
LODWORD(v11) = v11 & 0x7FFFFFFF;
v12 = v11 | ((unsigned __int64)*(unsigned __int8 *)(v8 + 34) << 31);
if( v12 != 0x7FFFFFFFDi64 && (v10 & 4) == 0 && (v12 < 0x7FFFFFFFDi64 || v12 == 0x7FFFFFFFEi64) )
{
LOCK_PAGE_TABLE_COMMITMENT(CurrentThread, (_EPROCESS *)v7);
goto LABEL_15;
}
}
LABEL_17:
MiUnlockVad((__int64)CurrentThread, v8);
LABEL_18:
UNLOCK_ADDRESS_SPACE((__int64)CurrentThread, v7);
}Referenced by:
MiWriteAwePtes
MmFreeVirtualMemory