MiDecommitLargePoolVa
NTSTATUS __stdcall MiDecommitLargePoolVa(VOID *VAorProtoPte, UINT64 a2, INT64 PageCount){
unsigned int v3;
__int64 v6;
unsigned __int64 v7;
__int64 v8;
__int64 v9;
__int64 v10;
unsigned __int64 Long;
int v12;
__int64 v13;
__int64 v14;
__int64 *v15;
NTSTATUS result;
__int64 v17[2];
_MI_TB_FLUSH_LIST TbFlushList[2];
__int64 v19;
__int64 v20;
__int64 v21;
__int128 v22;
__int128 v23;
__int128 v24;
__int128 v25;
__int128 v26;
__int128 v27;
__int128 v28;
__int128 v29;
__int128 v30;
__int64 v31;
*(_QWORD *)TbFlushList = 0i64;
v22 = 0i64;
v3 = 0;
v23 = 0i64;
v24 = 0i64;
v25 = 0i64;
v26 = 0i64;
v27 = 0i64;
v31 = 0i64;
v28 = 0i64;
v29 = 0i64;
v30 = 0i64;
v19 = 20i64;
v20 = 0i64;
v21 = 0i64;
LODWORD(v6) = MI_READ_PTE_LOCK_FREE(a2);
v17[0] = v6;
LODWORD(v7) = MI_READ_PTE_LOCK_FREE((INT64)v17);
v8 = (v7 >> 12) & 0xFFFFFFFFFi64;
MmGetPfnDb()[v8].u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 = 0i64;
LODWORD(v9) = MiGetContainingPageTable(a2);
MiLockAndDecrementShareCount((_MMPFN *)(v10 + 48 * v9), 0i64);
Long = ZeroPte.u.Long;
LOBYTE(v12) = MiPteInShadowRange(a2);
if( v12 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
Long = ZeroPte.u.Long | 0x8000000000000000ui64;
*(_QWORD *)a2 = Long;
MiInsertLargeTbFlushEntry(TbFlushList, 1ui64, a2);
if( a2 >= (unsigned __int64)MmGetPml4eBase() && a2 <= (unsigned __int64)MmGetPml4eLimit() )
{
v13 = (_QWORD)MmGetPteBase() << 25;
v14 = (((((__int64)((a2 << 25) - v13) >> 16 << 25) - v13) >> 16 << 25) - v13) >> 16;
MiReplicatePteChange((_MMPTE *)v14, (_MMPTE *)v14);
}
MiFlushTbList(TbFlushList);
v15 = MiLargePageSizes;
do
{
if( *v15 == PageCount )
break;
++v3;
++v15;
}
while( v3 < 3 );
result = MiFreeLargePageMemory(v8, v3, 4ui64);
_InterlockedExchangeAdd64((_QWORD *)&stru_140C4DB30 + 566, -PageCount);
return result;
}Referenced by:
MiDeleteNonPagedPoolPte