MiReplaceNumaStandbyPage
INT64 __fastcall MiReplaceNumaStandbyPage(INT64 a1, INT64 a2){
_MMPFN *PfnDb;
__int64 v5;
__int64 v6;
__int64 PfnChannel;
unsigned __int64 v8;
__int64 v9;
int v10;
int v11;
__int64 v12;
__int64 v13;
char *v14;
__int64 v15;
INT64 result;
char *v17;
unsigned __int64 v18;
PfnDb = MmGetPfnDb();
LODWORD(v5) = MiSearchNumaNodeTable((PVOID)((a1 - (__int64)PfnDb) / 48));
v6 = *(unsigned int *)(v5 + 8);
PfnChannel = (unsigned int)MiGetPfnChannel(a1);
v8 = (a2 - (__int64)PfnDb) / 48;
LODWORD(v9) = MiSearchNumaNodeTable((PVOID)v8);
v10 = *(_DWORD *)(v9 + 8);
v11 = MiGetPfnChannel(a2);
if( (_DWORD)v6 == v10 && (_DWORD)PfnChannel == v11 )
{
v12 = 4544 * v6
+ *(_QWORD *)(*(_QWORD *)(qword_140C4E388 + 8 * ((*(_QWORD *)(a1 + 40) >> 39) & 0x3FFi64)) + 16i64)
+ 24 * ((unsigned int)MiGetPfnPriority(a1) + 8 * PfnChannel);
v13 = *(unsigned __int8 *)(a1 + 39) | (*(_QWORD *)a1 >> 28) & 0xFFFFFFF00i64;
*(_BYTE *)(a2 + 39) = *(_BYTE *)(a1 + 39);
*(_QWORD *)a2 = (v13 << 28) ^ (*(_QWORD *)a2 ^ (v13 << 28)) & 0xFFFFFFFFFi64;
if( v13 == 0xFFFFFFFFFi64 )
{
*(_QWORD *)(v12 + 3272) = v8;
}
else
{
v14 = (char *)PfnDb + 48 * v13;
*((_WORD *)v14 + 18) = v8;
MiSetPfnNodeBlinkHigh((_MMPFN *)v14, v8 >> 16, 0i64);
}
v15 = *(unsigned __int16 *)(a1 + 36) | (*(_QWORD *)(a1 + 24) >> 20) & 0xFFFFF0000i64;
*(_WORD *)(a2 + 36) = *(_WORD *)(a1 + 36);
result = (*(_QWORD *)(a2 + 24) ^ (v15 << 20)) & 0xFFFFF000000000i64;
*(_QWORD *)(a2 + 24) ^= result;
if( v15 == 0xFFFFFFFFFi64 )
{
*(_QWORD *)(v12 + 3264) = v8;
}
else
{
v17 = (char *)PfnDb + 48 * v15;
v18 = *(_QWORD *)v17 ^ (v8 << 28);
v17[39] = v8;
result = (v8 << 28) ^ v18 & 0xFFFFFFFFFi64;
*(_QWORD *)v17 = result;
}
}
else
{
MiUnlinkNumaStandbyPage((_MMPFN *)a1);
MiInsertNumaStandbyPage((_MMPFN *)a2);
}
return result;
}Referenced by:
MiReplaceTransitionPage