MmSetPfnListInfo
INT64 __fastcall MmSetPfnListInfo(INT64 a1, _QWORD *a2, INT64 a3){
int v3;
_QWORD *v7;
_ETHREAD *CurrentThread;
unsigned int v9;
int v10;
unsigned __int64 v11;
char *v12;
unsigned __int64 v13;
char v14;
int PfnPriority;
UINT64 v16;
_MMPFN *v17;
UINT16 v18;
unsigned __int64 v19;
unsigned __int64 v20;
__int64 v21;
__int128 a2_8;
__int64 v23;
_ETHREAD *v24;
INT64 v25;
int v26;
INT64 result[16];
v3 = a3;
v23 = 0i64;
a2_8 = 0i64;
memset((INT64)result, 0i64);
if( v3 && !(unsigned int)MiColdPageSizeSupported() )
return 3221225659i64;
v25 = 0i64;
v26 = 16;
v7 = &a2[3 * a1];
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v9 = 0;
v24 = CurrentThread;
--*((_WORD *)CurrentThread + 243);
ExAcquirePushLockSharedEx((UINT64)&qword_140C50B80, 0i64);
if( a2 >= v7 )
goto LABEL_32;
v10 = v3;
do
{
v11 = a2[1];
if( v11 <= 0xFFFFFFFFFi64 && (*((_QWORD *)MmGetPfnDb() + 6 * v11 + 5) & 0x4000000000000i64) != 0 )
{
*(_QWORD *)&a2_8 = 0i64;
v12 = (char *)MmGetPfnDb() + 48 * v11;
v23 = 0i64;
*((_QWORD *)&a2_8 + 1) = v11;
v13 = (unsigned __int8)MiLockPageInline((INT64)v12);
MiIdentifyPfn((_MMPFN *)v12, (UINT64 *)&a2_8);
if( v23 != a2[2] )
goto LABEL_28;
if( (((unsigned __int64)a2_8 ^ *a2) & 0x1FFFFFFFFFFFE00i64) != 0 )
goto LABEL_28;
v14 = v12[34] & 7;
if( v14 != 6 && (unsigned __int8)(v14 - 2) > 2u )
goto LABEL_28;
if( v10 )
{
if( (*a2 & 0x80u) != 0i64
&& v14 == 2
&& !*((_WORD *)v12 + 16)
&& ((unsigned int)MiColdPageSizeSupported() || MiIsPfnFileOnly((INT64)v12)) )
{
v19 = *((_QWORD *)v12 + 2);
v20 = (v19 & 0x400) != 0 ? v19 >> 11 : v19 >> 3;
if( (v20 & 1) == 0 )
{
MiSetNonResidentPteHeat((UINT64 *)v12 + 2, 1i64);
_InterlockedAnd64((volatile signed __int64 *)v12 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v13);
MiAddPageToHeatList(&v25, v11, 3i64);
goto LABEL_30;
}
}
LABEL_28:
_InterlockedAnd64((volatile signed __int64 *)v12 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v13);
v23 |= 2ui64;
v9 = -1073741788;
v21 = v23;
*(_OWORD *)a2 = a2_8;
a2[2] = v21;
goto LABEL_30;
}
PfnPriority = MiGetPfnPriority((INT64)v12);
if( (_DWORD)v16 != PfnPriority )
{
if( (_BYTE)v18 == 2 )
MiRelinkStandbyPage(v17, v16, v18);
else
v12[35] = v16 | v12[35] & 0xF8;
}
_InterlockedAnd64((volatile signed __int64 *)v12 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v13);
}
else
{
v9 = -1073741584;
}
LABEL_30:
a2 += 3;
}
while( a2 < v7 );
CurrentThread = v24;
LABEL_32:
if( HIDWORD(v25) )
MiNotifyPageHeat(&v25);
if( _InterlockedCompareExchange64((volatile signed __int64 *)&qword_140C50B80, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)&qword_140C50B80);
KeAbPostRelease(&qword_140C50B80);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
return v9;
}Referenced by:
PfpPfnPrioRequest