MmFreeIndependentPages
void __fastcall MmFreeIndependentPages(VOID *a1, unsigned __int64 a2){
UINT64 v2;
_MMPTE *PteAddress;
int v4;
unsigned __int64 v5;
int v6;
_MMPFN *PfnDb;
unsigned __int64 PteShadow;
_MMPFN *v9;
_MMPFN *v10;
unsigned __int64 Long;
_MMPFN *v12;
int v13;
int v14;
_KTBFLUSH_TYPE v15;
_MMPTE *PointerPte;
UINT64 v17;
__int64 v18;
__int64 v19;
UINT64 v20;
__int128 v21;
UINT64 v22;
_MMPTE *v23;
UINT64 NumberOfPtes;
v18 = 0i64;
v19 = 0i64;
v21 = 0i64;
v2 = (a2 >> 12) + ((a2 & 0xFFF) != 0);
NumberOfPtes = v2;
v17 = v2;
v20 = v2;
PteAddress = MiGetPteAddress(a1);
PointerPte = PteAddress;
v23 = &PteAddress[v2];
LOBYTE(v4) = MiPteInShadowRange((UINT64)&v22);
v5 = (unsigned __int64)v23;
v6 = v4;
PfnDb = MmGetPfnDb();
do
{
LODWORD(PteShadow) = MI_READ_PTE_LOCK_FREE((INT64)PteAddress);
v22 = PteShadow;
if( v6 )
PteShadow = MiReadPteShadow((__int64)&v22, PteShadow);
v9 = &PfnDb[(PteShadow >> 12) & 0xFFFFFFFFFi64];
v10 = PfnDb;
Long = ZeroPte.u.Long;
v12 = &v10[v9->u4._bf_0 & 0xFFFFFFFFFi64];
LOBYTE(v13) = MiPteInShadowRange((UINT64)PteAddress);
if( v13 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
Long = ZeroPte.u.Long | 0x8000000000000000ui64;
PteAddress->u.Long = Long;
LOBYTE(v14) = MiIsPfnFromSlabAllocation((INT64)v9);
if( v14 )
{
--v17;
--v20;
MiLockAndDecrementShareCount(v9, 1ui64);
}
else if( MiLockAndDecrementShareCount(v9, 1ui64) == PageStillReferenced )
{
++v18;
}
MiLockAndDecrementShareCount(v12, 0i64);
++PteAddress;
PfnDb = MmGetPfnDb();
}
while( (unsigned __int64)PteAddress < v5 );
MiReleasePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), PointerPte, NumberOfPtes, v15);
MiReturnPoolCharges(&v17, 1i64);
}Referenced by:
ExDeletePoolTagTable
HvlStartBootLogicalProcessors
HvlpInitializeHvCrashdump
IopLiveDumpAllocateDumpBuffers
IopLiveDumpFreeDumpBuffers
IopLiveDumpReleaseResources
IopLiveDumpWriteDumpFile
IopLiveDumpWriteDumpFileWithExtraPages
KeAllocateProcessorProfileStructures
KeStartAllProcessors
KiStartDynamicProcessor
MmFreeIsrStack