MiUpdateAwePageTable
NTSTATUS __stdcall MiUpdateAwePageTable(UINT64 a1, INT64 a2, INT64 a3){
int v3;
__int64 v6;
NTSTATUS v7;
__int64 v8;
unsigned __int64 v9;
_MMPFN *v10;
VOID *v11;
int v12;
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 = &MmGetPfnDb()[(v9 >> 12) & 0xFFFFFFFFFi64];
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v10->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v10->u2._bf_0 < 0 );
}
v10->u2._bf_0 ^= (v10->u2._bf_0 ^ (v10->u2._bf_0 + a2)) & 0x3FFFFFFFFFFFFFFFi64;
_InterlockedAnd64(&v10->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
}
if( (_MMPTE *)a1 == MmGetPxeSelfRef() || !v3 )
return 0;
LODWORD(v11) = MiGetUsedPtesHandle((PSLIST_ENTRY)v8);
if( v3 <= 0 )
{
LOWORD(v12) = MiDecreaseUsedPtesCount(v11, (unsigned int)-v3);
if( !v12 )
return 1;
}
else
{
MiIncreaseUsedPtesCount(v11, (VOID *)(unsigned int)v3);
}
return v7;
}Referenced by:
MiDeleteEnclavePage
MiFreePhysicalPages
MiWriteAwePtes
MiWriteEnclavePte