MiDecommitLargePoolVa
UINT64 __stdcall MiDecommitLargePoolVa(PVOID VAorProtoPte, MMPTE *PointerPxe, INT64 PageCount){
unsigned int v3;
unsigned __int64 v6;
UINT64 ContainingPageTable;
__int64 v8;
__int64 v9;
__int64 v10;
__int64 *v11;
UINT64 result;
INT64 v13[2];
INT64 v14[4];
__int128 v15;
__int128 v16;
__int128 v17;
__int128 v18;
__int128 v19;
__int128 v20;
__int128 v21;
__int128 v22;
__int128 v23;
__int64 v24;
v14[0] = 0i64;
v15 = 0i64;
v3 = 0;
v16 = 0i64;
v17 = 0i64;
v18 = 0i64;
v19 = 0i64;
v20 = 0i64;
v24 = 0i64;
v21 = 0i64;
v22 = 0i64;
v23 = 0i64;
v14[1] = 20i64;
v14[2] = 0i64;
v14[3] = 0i64;
v13[0] = MI_READ_PTE_LOCK_FREE((INT64)PointerPxe);
v6 = ((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)v13) >> 12) & 0xFFFFFFFFFi64;
*((_QWORD *)MmGetPfnDb() + 6 * v6) = 0i64;
ContainingPageTable = MiGetContainingPageTable((UINT64)PointerPxe);
MiLockAndDecrementShareCount(v8 + 48 * ContainingPageTable, 0);
*(_QWORD *)PointerPxe = ZeroPte;
MiInsertLargeTbFlushEntry((INT64)v14, 1ui64, (INT64)PointerPxe);
if( PointerPxe >= MmGetPml4eBase() && PointerPxe <= MmGetPml4eLimit() )
{
v9 = (_QWORD)MmGetPteBase() << 25;
v10 = (((((((_QWORD)PointerPxe << 25) - v9) >> 16 << 25) - v9) >> 16 << 25) - v9) >> 16;
MiReplicatePteChange((MMPTE *)v10, (MMPTE *)v10);
}
MiFlushTbList((__int64)v14);
v11 = MiLargePageSizes;
do
{
if( *v11 == PageCount )
break;
++v3;
++v11;
}
while( v3 < 3 );
result = MiFreeLargePageMemory(v6, v3, 4ui64);
_InterlockedExchangeAdd64(&qword_140C4ECE0, -PageCount);
return result;
}Referenced by:
MiDeleteNonPagedPoolPte