MmFreePoolMemory
NTSTATUS __stdcall MmFreePoolMemory(UINT64 *a1, UINT64 *a2){
char *v2;
UINT64 v3;
UINT64 v4;
unsigned int v5;
unsigned int v6;
int v7;
unsigned int v8;
_MMSUPPORT_INSTANCE *AnyMultiplexedVm;
_MMPTE *v10;
_MMPFN *v11;
UINT64 Flags;
_MI_DELETE_VA_INFO DeleteInfo;
UINT64 v15[2];
__int128 v16;
v2 = (char *)*a2;
v3 = *a1;
v4 = (*a2 >> 12) + ((*a2 & 0xFFF) != 0);
v5 = MiDeterminePoolType(*a1);
if( v5 == 32 )
KeBugCheckEx(0x1Au, (PVOID)0x5305, (PVOID)v3, v2, (PVOID)v6);
if( v5 == 33 )
v7 = 1;
else
v7 = (v5 != 0) + 5;
v8 = v6 | 0x4000;
if( (v6 & 0x8000) == 0 )
v8 = v6;
LODWORD(AnyMultiplexedVm) = v8;
if( (v8 & 0x4000) != 0 )
{
if( (v5 & 1) != 0 )
{
DeleteInfo = 0i64;
*(_OWORD *)v15 = 0i64;
v16 = 0i64;
v10 = (_MMPTE *)((char *)MmGetPteBase() + ((v3 >> 9) & 0x7FFFFFFFF8i64));
if( (v5 & 0x20) != 0 )
AnyMultiplexedVm = (_MMSUPPORT_INSTANCE *)((char *)KeGetCurrentThread()->ApcState.Process->Session + 256);
else
AnyMultiplexedVm = MiGetAnyMultiplexedVm(MiWorkingSetTypePagedPool, (VOID *)v5);
LODWORD(Flags) = (v8 >> 30) & 1;
MiDeleteSystemPagableVm(AnyMultiplexedVm, 0i64, v10, v4, Flags, &DeleteInfo);
v11 = (_MMPFN *)v15[1];
MiReturnCommit(
*(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8i64 * AnyMultiplexedVm->PartitionId),
v15[1] - *(_QWORD *)&DeleteInfo.ReducedCommitClonePages);
LOWORD(AnyMultiplexedVm) = v8;
}
else
{
if( (v8 & 0x40000000) == 0 && MmProtectFreedNonPagedPool )
LODWORD(AnyMultiplexedVm) = v8 | 0x40000000;
v11 = MiClearNonPagedPtes((VOID *)v3, v4, (unsigned int)AnyMultiplexedVm, FlushUser);
}
if( v11 )
MiCountSystemPool((unsigned int)v7, (UINT64)v11, 0i64);
}
if( ((unsigned __int16)AnyMultiplexedVm & 0x8000) != 0 )
{
if( v7 == 1 )
_InterlockedExchangeAdd(
(volatile signed __int32 *)KeGetCurrentThread()->ApcState.Process->Session + 217,
-(int)(v4 >> 9));
MiReturnSystemVa((VOID *)v3, &v2[v3], (_MI_SYSTEM_VA_TYPE)v7, 0i64);
}
return 0;
}Referenced by:
MmAllocatePoolMemory
RtlpHpEnvFreeVA
RtlpHpVaMgrCtxFree