MiPerformSafePdeWrite
CHAR __fastcall MiPerformSafePdeWrite(INT64 a1, INT64 *a2, INT64 a3, CHAR a4){
unsigned __int64 PteBase;
unsigned __int64 v8;
int v9;
int v10;
int v11;
INT64 v12;
INT64 v13;
unsigned __int64 v14;
__int64 v15;
signed __int64 v16;
INT64 v17;
unsigned __int64 v18;
__int64 v19;
INT64 result[24];
memset((INT64)result, 0i64);
PteBase = (unsigned __int64)MmGetPteBase();
v8 = (__int64)(((_QWORD)a2 << 25) - (PteBase << 25)) >> 16;
if( v8 < PteBase || v8 > (unsigned __int64)MmGetPteLimit() )
{
v17 = a3 | 0x20;
if( (a4 & 1) == 0 )
v17 = a3;
v18 = v17 | 0x8000000000000000ui64;
if( (a4 & 2) == 0 )
v18 = v17;
v19 = v18 | 4;
if( (a4 & 4) == 0 )
v19 = v18;
LOBYTE(v16) = MiWriteValidPteNewProtection(a2, v19);
}
else
{
v9 = a4 & 1;
v10 = a4 & 2;
v11 = a4 & 4;
do
{
v12 = a3;
v13 = a3 | 0x20;
if( !v9 )
v13 = a3;
v14 = v13 | 0x8000000000000000ui64;
if( !v10 )
v14 = v13;
v15 = v14 | 4;
if( !v11 )
v15 = v14;
v16 = _InterlockedCompareExchange64(a2, v15, a3);
a3 = v16;
}
while( v16 != v12 );
}
return v16;
}Referenced by:
MiGetWsAndMakePageTablesNx
MiLockLowestValidPageTable
MiValidVirtualizationFault
MiWalkPageTables