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.