MiConvertLargePfnToSmall

INT64 __fastcall MiConvertLargePfnToSmall(INT64 a1, INT64 a2, INT64 a3, INT64 a4){
  char v5; 
  __int64 v6; 
  INT64 result; 
  bool v8; 
  int v9[8]; 
  __int128 v10; 
  __int128 v11; 
  unsigned __int64 v12[3]; 
  *(_BYTE *)(a2 + 35) &= 0xF8u;
  v5 = *(_BYTE *)(a2 + 34) & 0xEF;
  *(_BYTE *)(a2 + 34) = v5;
  if( a2 != a1 )
  {
    *(_BYTE *)(a2 + 34) = v5 ^ (v5 ^ *(_BYTE *)(a1 + 34)) & 7;
    *(_QWORD *)(a2 + 16) = *(_QWORD *)(a1 + 16);
  }
  v6 = *(_QWORD *)(a2 + 40);
  *(_BYTE *)(a2 + 39) &= 0xFCu;
  result = v6 & 0xFFFFFFEFFFFFFFFFui64;
  v12[0] = 0i64;
  v12[1] = result;
  v10 = 0i64;
  v11 = 0i64;
  *(_QWORD *)(a2 + 40) = result;
  if( (_DWORD)a4 )
  {
    *(_QWORD *)(a2 + 24) &= 0xC000000000000000ui64;
    result = 65534i64;
    v8 = *(_WORD *)(a2 + 32) == 2;
    *(_WORD *)(a2 + 32) -= 2;
    if( v8 )
    {
      _InterlockedOr(v9, 0);
      MiSetPfnTbFlushStamp((_MMPFN *)a2, (unsigned int)KiTbFlushTimeStamp, 1ui64);
    }
  }
  return result;
}

Referenced by:

MiConvertEntireLargePageToSmall
MiDemoteValidLargePageOneLevel
MiInitializeMdlLeafPfns