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