MiConvertLargePfnToSmall
INT64 __fastcall MiConvertLargePfnToSmall(INT64 a1, INT64 a2, INT64 a3, INT64 a4){
char v5;
__int64 v6;
INT64 result;
bool v8;
int v9[8];
__int128 v10;
__int128 v11;
unsigned __int64 v12[3];
*(_BYTE *)(a2 + 35) &= 0xF8u;
v5 = *(_BYTE *)(a2 + 34) & 0xEF;
*(_BYTE *)(a2 + 34) = v5;
if( a2 != a1 )
{
*(_BYTE *)(a2 + 34) = v5 ^ (v5 ^ *(_BYTE *)(a1 + 34)) & 7;
*(_QWORD *)(a2 + 16) = *(_QWORD *)(a1 + 16);
}
v6 = *(_QWORD *)(a2 + 40);
*(_BYTE *)(a2 + 39) &= 0xFCu;
result = v6 & 0xFFFFFFEFFFFFFFFFui64;
v12[0] = 0i64;
v12[1] = result;
v10 = 0i64;
v11 = 0i64;
*(_QWORD *)(a2 + 40) = result;
if( (_DWORD)a4 )
{
*(_QWORD *)(a2 + 24) &= 0xC000000000000000ui64;
result = 65534i64;
v8 = *(_WORD *)(a2 + 32) == 2;
*(_WORD *)(a2 + 32) -= 2;
if( v8 )
{
_InterlockedOr(v9, 0);
MiSetPfnTbFlushStamp((_MMPFN *)a2, (unsigned int)KiTbFlushTimeStamp, 1ui64);
}
}
return result;
}Referenced by:
MiConvertEntireLargePageToSmall
MiDemoteValidLargePageOneLevel
MiInitializeMdlLeafPfns