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