MiLargeFreePageToMdl

NTSTATUS __stdcall MiLargeFreePageToMdl(UINT64 PageFrameIndex, UINT64 LargePageIndex, UINT64 *MdlPage){
  __int64 v3; 
  __int64 v4; 
  unsigned int v5; 
  __int64 v6; 
  UINT64 v7; 
  NTSTATUS result; 
  _MMPFN *v9; 
  int v10; 
  union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v11; 
  UINT8 v12; 
  unsigned __int64 v13; 
  _QWORD *v14; 

  v4 = v3;
  v5 = (unsigned int)MdlPage;
  KeGetCurrentIrql();
  v6 = MiLargePageSizes[(unsigned int)MdlPage];
  v7 = LargePageIndex & ~(v6 - 1);
  result = MiTryUnlinkNodeLargePage(PageFrameIndex, v7);
  if( result )
  {
    v9 = &MmGetPfnDb()[v7];
    LOBYTE(v10) = MiIsFreeZeroPfnCold((INT64)v9);
    if( v10 )
    {
      MiChangePageHeatImmediate(v7, v5, 1i64);
      MiLockPage(v9);
      LODWORD(v11.Long) = MiUpdatePageFileHighInPte(
                            v9->OriginalPte.u.Hard.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0,
                            0i64);
      v9->OriginalPte.u = (union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;})v11.Long;
      MiUnlockPage(v9, v12);
    }
    MiConvertEntireLargePageToSmall((_KQUEUE *)v9, v5, 0, (_LARGE_INTEGER *)1, 0i64, 0i64);
    if( v4 )
    {
      v13 = ((unsigned __int64)*(unsigned int *)(v4 + 40) >> 12) + 6;
      *(_DWORD *)(v4 + 40) += (_DWORD)v6 << 12;
      v14 = (_QWORD *)(v4 + 8 * v13);
      do
      {
        *v14++ = v7++;
        --v6;
      }
      while( v6 );
    }
    return 1;
  }
  return result;
}

Referenced by:

MiTradePage