MiReplaceLockedPage

INT64 __fastcall MiReplaceLockedPage(INT64 a1, UINT64 a2, UINT64 a3, UINT64 a4, UINT64 a5){
  unsigned int v6; 
  _MMPFN *PfnDb; 
  __int64 v10; 
  int v11; 
  int PfnChannel; 
  UINT64 Page; 
  _MMPFN *v14; 
  _MMPFN *v15; 
  unsigned int v16; 
  int active; 
  UINT64 v18; 
  UINT64 v20; 
  UINT8 PageIrql; 
  v6 = a4;
  if( (*(_QWORD *)(a2 + 24) & 0x3FFFFFFFFFFFFFFFi64) != 1 )
    return 0i64;
  if( *(_WORD *)(a2 + 32) != 1 )
    return 0i64;
  if( !MiCanPageMove(a2) )
    return 0i64;
  PageIrql = 17;
  PfnDb = MmGetPfnDb();
  LODWORD(v10) = MiSearchNumaNodeTable((PVOID)((__int64)(a2 - (_QWORD)PfnDb) / 48));
  v11 = *(_DWORD *)(v10 + 8);
  PfnChannel = MiGetPfnChannel(a2);
  Page = MiGetPage(
           *(_MI_PARTITION **)(qword_140C4E388 + 8 * ((*(_QWORD *)(a2 + 40) >> 39) & 0x3FFi64)),
           (PfnChannel << byte_140C4DBCD) | (v11 << byte_140C4DBCC) | (unsigned int)((__int64)(a2 - (_QWORD)PfnDb) / 48) & dword_140C4DC38,
           v6);
  if( Page == -1i64 )
    return 0i64;
  v14 = (_MMPFN *)((char *)PfnDb + 48 * Page);
  v15 = MiLockProtoPoolPage((_MMPTE *)(*(_QWORD *)(a2 + 8) | 0x8000000000000000ui64), &PageIrql);
  if( !v15 )
  {
LABEL_8:
    MiReleaseFreshPage(v14);
    return 0i64;
  }
  v16 = MiTbFlushType(a1);
  active = MiTradeActivePage(a2, (__int64)v14, a3, v16, a5, v20);
  LOBYTE(v18) = PageIrql;
  if( !active )
  {
    MiUnlockProtoPoolPage(v15, v18);
    goto LABEL_8;
  }
  MiUnlockProtoPoolPage(v15, v18);
  *(_QWORD *)(a2 + 16) = ZeroPte;
  MiSetOriginalPtePfnFromFreeList((UINT64 *)(a2 + 16));
  MiReleaseFreshPage((_MMPFN *)a2);
  return 1i64;
}

Referenced by:

MiTrimSharedPageFromViews