MiTradeTransitionPage
NTSTATUS __fastcall MiTradeTransitionPage(_MMPFN *Pfn1, UINT8 a2, INT64 a3, INT64 a4, INT64 a5, INT64 a6){
unsigned __int64 v6;
int v7;
int v9;
ULONG_PTR *v10;
unsigned __int64 v11;
__int64 v12;
int v13;
NTSTATUS PfnChannel;
UINT64 v15;
unsigned int v16;
__int64 v17;
__int64 v18;
_MMPFN *v19;
unsigned __int64 v20;
int v21;
int v22;
_MMPTE_COPY_LIST *v23;
NTSTATUS v25;
ULONG_PTR *v26;
v6 = a2;
v7 = a4;
if( Pfn1->u3.ReferenceCount )
{
_InterlockedAnd64(&Pfn1->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
LABEL_26:
__writecr8(v6);
return 0;
}
if( !MiCanPageMove(Pfn1) || (LOBYTE(v9) = MiIsPfnFromSlabAllocation((INT64)Pfn1), v9) )
{
_InterlockedAnd64(&Pfn1->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
goto LABEL_26;
}
v10 = *(ULONG_PTR **)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)Pfn1->u4._bf_0 >> 39) & 0x3FF));
v26 = v10;
_InterlockedAnd64(&Pfn1->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v6);
v11 = Pfn1 - MmGetPfnDb();
if( v7 == -1 )
{
LODWORD(v12) = MiSearchNumaNodeTable((PVOID)v11);
v13 = *(_DWORD *)(v12 + 8);
PfnChannel = MiGetPfnChannel((INT64)Pfn1);
v15 = 128i64;
v16 = (PfnChannel << *(&stru_140C4DB30 + 157)) | *(&stru_140C4DB30 + 66) & v11 | (v13 << *(&stru_140C4DB30 + 156));
if( (a5 & 0x3000000) != 0 )
v15 = 65664i64;
}
else
{
v15 = 48i64;
v16 = *(&stru_140C4DB30 + 66) & v11 | v7 & ~*(&stru_140C4DB30 + 66);
}
LODWORD(v17) = MiGetPage(v10, v16, v15);
v18 = v17;
if( v17 == -1 )
return 1;
v19 = &MmGetPfnDb()[v17];
v20 = MiLockPageInline(Pfn1);
if( v19 == Pfn1 )
{
v18 = -1i64;
goto LABEL_18;
}
if( v11 > 0xFFFFFFFFFi64
|| (MmGetPfnDb()[v11].u4._bf_0 & 0x4000000000000i64) == 0
|| (LOBYTE(v21) = MiIsPfnFileOnly((INT64)Pfn1), v21 == 1) )
{
LODWORD(v23) = 0;
LABEL_23:
v25 = (int)v23;
goto LABEL_22;
}
LOBYTE(v22) = MiIsPfnFromSlabAllocation((INT64)Pfn1);
LODWORD(v23) = 0;
if( v22
|| Pfn1->u3.ReferenceCount
|| v26 != *(ULONG_PTR **)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)Pfn1->u4._bf_0 >> 39) & 0x3FF))
|| !MiCanPageMove(Pfn1) )
{
goto LABEL_23;
}
if( (unsigned __int8)((*(_BYTE *)(&Pfn1->u3 + 1) & 7) - 2) > 2u )
{
v25 = 2;
LABEL_22:
_InterlockedAnd64(&Pfn1->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v20);
MiReleaseFreshPage(v19);
return v25;
}
MiReplaceTransitionPage(Pfn1, v19, v23);
LABEL_18:
Pfn1->OriginalPte = ZeroPte;
MiSetOriginalPtePfnFromFreeList(&Pfn1->OriginalPte.u.Long);
_InterlockedAnd64(&Pfn1->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v20);
if( a6 )
*(_QWORD *)a6 = v18;
return 3;
}Referenced by:
MiTradePage