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