MmFreeNonCachedMemory
VOID __stdcall MmFreeNonCachedMemory(VOID *BaseAddress, UINT64 NumberOfBytes){
UINT64 v2;
_MMPTE *PteAddress;
UINT64 v4;
unsigned __int64 PteShadow;
int v6;
_MDL *Long;
__int64 DemandZeroPte;
INT64 v9;
_KTBFLUSH_TYPE v10;
UINT64 v11;
v2 = (NumberOfBytes >> 12) + ((NumberOfBytes & 0xFFF) != 0);
PteAddress = MiGetPteAddress(BaseAddress);
LODWORD(v4) = MI_READ_PTE_LOCK_FREE((INT64)PteAddress);
v11 = v4;
PteShadow = v4;
LOBYTE(v6) = MiPteInShadowRange((UINT64)&v11);
if( v6 )
PteShadow = MiReadPteShadow((__int64)&v11, PteShadow);
Long = (_MDL *)MmGetPfnDb()[(PteShadow >> 12) & 0xFFFFFFFFFi64].OriginalPte.u.Long;
DemandZeroPte = MiMakeDemandZeroPte(4);
MiSetPfnOriginalPte(v9, DemandZeroPte);
MmFreePagesFromMdl(Long);
ExFreePoolWithTag(Long, 0);
MiReleasePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), PteAddress, (unsigned int)v2, v10);
}Referenced by:
No references.