MiUpdateAwePageTable
INT64 __fastcall MiUpdateAwePageTable(UINT64 a1, INT64 a2, INT64 a3){
int v3;
__int64 v6;
unsigned int v7;
__int64 v8;
unsigned __int64 v9;
char *v10;
_MMPFN *UsedPtesHandle;
UINT64 SpinCount;
v3 = a3;
v6 = (_QWORD)MmGetPteBase() << 25;
v7 = 0;
v8 = (((__int64)((a1 << 25) - v6) >> 16 << 25) - v6) >> 16;
if( a2 )
{
v9 = *(_QWORD *)a1;
MiPteInShadowRange(a1);
v10 = (char *)MmGetPfnDb() + 48 * ((v9 >> 12) & 0xFFFFFFFFFi64);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v10 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((__int64 *)v10 + 3) < 0 );
}
*((_QWORD *)v10 + 3) ^= (*((_QWORD *)v10 + 3) ^ (*((_QWORD *)v10 + 3) + a2)) & 0x3FFFFFFFFFFFFFFFi64;
_InterlockedAnd64((volatile signed __int64 *)v10 + 3, 0x7FFFFFFFFFFFFFFFui64);
}
if( (_MMPTE *)a1 == MmGetPxeSelfRef() || !v3 )
return 0i64;
UsedPtesHandle = MiGetUsedPtesHandle(v8);
if( v3 <= 0 )
{
if( !(unsigned int)MiDecreaseUsedPtesCount(UsedPtesHandle, (unsigned int)-v3) )
return 1;
}
else
{
MiIncreaseUsedPtesCount(UsedPtesHandle, (unsigned int)v3);
}
return v7;
}Referenced by:
MiDeleteEnclavePage
MiFreePhysicalPages
MiWriteAwePtes
MiWriteEnclavePte