MiUnlinkStandbyPfn
INT64 __fastcall MiUnlinkStandbyPfn(UINT64 *a1, CHAR a2){
unsigned __int64 v4;
__int64 v5;
_MMPFN *PfnDb;
UINT64 v7;
char v8;
unsigned __int8 v9;
unsigned __int8 v10;
int v11;
unsigned int v12;
UINT64 ValidPte;
v4 = MI_READ_PTE_LOCK_FREE((INT64)a1);
if( qword_140C4DC80 )
{
if( (v4 & 0x10) != 0 )
v4 &= ~0x10ui64;
else
v4 &= ~qword_140C4DC80;
}
v5 = (v4 >> 12) & 0xFFFFFFFFFi64;
PfnDb = MmGetPfnDb();
v7 = (UINT64)PfnDb + 48 * v5;
if( (*(_BYTE *)(v7 + 34) & 0x20) != 0 )
return 2i64;
if( (unsigned int)MiUnlinkPageFromList((_MMPFN *)((char *)PfnDb + 48 * v5), 0i64) )
{
v8 = *(_BYTE *)(v7 + 34);
++*(_WORD *)(v7 + 32);
*(_BYTE *)(v7 + 34) = v8 & 0xF8 | 6;
*(_QWORD *)(v7 + 24) = *(_QWORD *)(v7 + 24) & 0xC000000000000000ui64 | 1;
if( (a2 & 2) != 0 && (unsigned int)MiGetPfnPriority(v7) > 2 )
*(_BYTE *)(v7 + 35) = *(_BYTE *)(v7 + 35) & 0xF8 | 2;
v9 = MI_READ_PTE_LOCK_FREE(v7 + 16);
v10 = *(_BYTE *)(v7 + 34);
v11 = v10 >> 6;
v12 = v9 >> 5;
if( v11 )
{
if( v11 == 2 )
v12 |= 0x18u;
}
else
{
v12 |= 8u;
}
ValidPte = MiMakeValidPte(0i64, v5, v12);
if( (a2 & 4) == 0 || !MiIsPfnFileOnly(v7) )
{
*(_BYTE *)(v7 + 34) = v10 | 0x10;
ValidPte |= 0x42ui64;
}
*a1 = ValidPte;
return 0i64;
}
else
{
MiDiscardTransitionPteEx(v7, 0i64);
return 1i64;
}
}Referenced by:
MmCopyToCachedPage