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