MI_WRITE_INVALID_PTE_TB_FLUSH_NEEDED

VOID __fastcall MI_WRITE_INVALID_PTE_TB_FLUSH_NEEDED(_MMPTE *PointerPte, _MMPTE NewPteContents){
  union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v4; 
  int v5; 

  v4.Long = (unsigned __int64)PointerPte->u;
  if( (MiFlags & 0x800) != 0 )
  {
    LOBYTE(v4.Long) = 32;
  }
  else if( (MiFlags & 0x4000000) != 0 )
  {
    _mm_lfence();
  }
  if( (v4.Long & 0x20) != 0 )
  {
    LOBYTE(v5) = MiPteInShadowRange((UINT64)PointerPte);
    if( v5 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (NewPteContents.u.Long & 1) != 0 )
      NewPteContents.u.Long |= 0x8000000000000000ui64;
    PointerPte->u.Long = NewPteContents.u.Long;
  }
  else
  {
    MI_INTERLOCKED_EXCHANGE_PTE((INT64 *)PointerPte, NewPteContents.u.Hard._bf_0);
  }
}

Referenced by:

MiConvertPrivateToProto
MiTerminateWsle