MiTransformValidPteInPlace
VOID __stdcall MiTransformValidPteInPlace(INT64 *a1, UINT64 a2, INT64 a3, UINT64 a4){
unsigned int v4;
INT64 v8;
unsigned __int64 v9;
INT64 v10;
INT64 v11;
v4 = a4;
if( (MiFlags & 0x4000000) != 0 )
_mm_lfence();
v8 = *a1;
while( v8 != a3 )
{
while( (v8 & 0x20) != 0 )
{
v9 = v8 & 0xFFFFFFFFFFFFFFDFui64;
v10 = v8;
v8 = _InterlockedCompareExchange64(a1, v8 & 0xFFFFFFFFFFFFFFDFui64, v8);
if( v10 == v8 )
{
MiFlushValidPteFromTb(a2, v8, v4);
v8 = v9;
break;
}
}
v11 = v8;
v8 = _InterlockedCompareExchange64(a1, a3, v8);
if( v11 == v8 )
{
if( (MiFlags & 0x800) != 0 )
LOBYTE(v8) = v8 | 0x20;
if( (v8 & 0x20) != 0 )
MiFlushValidPteFromTb(a2, v8, v4);
return;
}
}
}Referenced by:
MiDemoteValidLargePageOneLevel
MiInitializeDynamicBitmap
MiInitializeSystemPageTable
MiMakeLargePageTable
MiReplacePfnWithGapMapping
MiReplicatePteChangeToProcess