MiReplaceLockedPage

NTSTATUS __stdcall MiReplaceLockedPage(_MMPFN *Pfn1, VOID *Va, _KTBFLUSH_TARGET FlushTarget){
  unsigned int v3; 
  unsigned int v5; 
  VOID *v6; 
  _MMPFN *PfnDb; 
  __int64 v9; 
  int v10; 
  NTSTATUS PfnChannel; 
  __int64 v12; 
  _MMPFN *v13; 
  _MMPFN *v14; 
  _KTBFLUSH_TYPE v15; 
  int v16; 
  UINT8 PageIrql; 

  v5 = v3;
  v6 = *(VOID **)&FlushTarget;
  if( (*((_QWORD *)Va + 3) & 0x3FFFFFFFFFFFFFFFi64) != 1 )
    return 0;
  if( *((_WORD *)Va + 16) != 1 )
    return 0;
  if( !MiCanPageMove((_MMPFN *)Va) )
    return 0;
  PageIrql = 17;
  PfnDb = MmGetPfnDb();
  LODWORD(v9) = MiSearchNumaNodeTable((PVOID)(((_BYTE *)Va - (_BYTE *)PfnDb) / 48));
  v10 = *(_DWORD *)(v9 + 8);
  PfnChannel = MiGetPfnChannel((INT64)Va);
  LODWORD(v12) = MiGetPage(
                   *(ULONG_PTR **)(*(&stru_140C4DB30 + 267) + 8 * ((*((_QWORD *)Va + 5) >> 39) & 0x3FFi64)),
                   (PfnChannel << *(&stru_140C4DB30 + 157)) | (v10 << *(&stru_140C4DB30 + 156)) | (unsigned int)(((_BYTE *)Va - (_BYTE *)PfnDb) / 48) & *(&stru_140C4DB30 + 66),
                   v5);
  if( v12 == -1 )
    return 0;
  v13 = &PfnDb[v12];
  v14 = MiLockProtoPoolPage((_MMPTE *)(*((_QWORD *)Va + 1) | 0x8000000000000000ui64), &PageIrql);
  if( !v14 )
  {
LABEL_8:
    MiReleaseFreshPage(v13);
    return 0;
  }
  v15 = MiTbFlushType((_MMSUPPORT_INSTANCE *)Pfn1);
  MiTradeActivePage((_MMPFN *)Va, v13, v6, (_KTBFLUSH_TARGET)v15);
  if( !v16 )
  {
    MiUnlockProtoPoolPage((ULONG_PTR)v14, PageIrql);
    goto LABEL_8;
  }
  MiUnlockProtoPoolPage((ULONG_PTR)v14, PageIrql);
  *((_MMPTE *)Va + 2) = ZeroPte;
  MiSetOriginalPtePfnFromFreeList((UINT64 *)Va + 2);
  MiReleaseFreshPage((_MMPFN *)Va);
  return 1;
}

Referenced by:

MiTrimSharedPageFromViews