KeFlushSingleCurrentTb
VOID __stdcall KeFlushSingleCurrentTb(VOID *Virtual){
_KTBFLUSH_TYPE v1;
_KTBFLUSH_TYPE v2;
BOOL IsSecureProcessFlush;
unsigned __int64 v5;
UINT64 v6;
char v7;
unsigned __int8 CurrentIrql;
VOID **VaList;
char Global[8];
UINT64 v11;
UINT64 AddressSpace[2];
_QWORD v13[2];
_KAFFINITY_EX ProcessorSet;
v2 = v1;
AddressSpace[0] = 0i64;
memset(&ProcessorSet, 0i64, sizeof(ProcessorSet));
Global[0] = 0;
IsSecureProcessFlush = KiIsSecureProcessFlush((UINT64)Virtual, (unsigned int)v2);
if( !IsSecureProcessFlush
|| (KiPrepareFlushParameters(v2, AddressSpace, (UINT8 *)Global),
KiPrepareFlushCurrentAffinity(&ProcessorSet),
LOBYTE(v6) = IsSecureProcessFlush,
AddressSpace[1] = (unsigned __int64)Virtual & 0xFFFFFFFFFFFFF000ui64,
LOBYTE(VaList) = 0,
HvlFlushRangeListTb(AddressSpace[0], &ProcessorSet, Global[0], v6, VaList),
!v7) )
{
if( ((1 << v2) & 0xA) != 0 && KiFlushPcid && !KeGetCurrentThread()->ApcState.Process->Pcb.AddressPolicy )
{
if( (KiFlushPcid & 2) != 0 )
{
v13[0] = 1i64;
v13[1] = Virtual;
_invpcid(0, v13);
}
else
{
KiSetUserTbFlushPending();
}
}
__invlpg(Virtual);
}
v5 = (unsigned __int64)Virtual & 0xFFFFFFFFFFFFF000ui64;
if( VmTbFlushEnabled )
{
v11 = v5;
VmFlushTb((_MEMORY_CACHING_TYPE_ORIG)1, &v11, (unsigned int)v2);
}
if( *(&stru_140CF2E80 + 1830) )
{
v11 = v5;
CurrentIrql = KeGetCurrentIrql();
__writecr8(0xFui64);
ExFlushTb(1ui64, (_KTB_FLUSH_VA *)&v11, v2);
__writecr8(CurrentIrql);
}
}Referenced by:
MiDbgReleaseAddress
MiDbgUnTranslatePhysicalAddress
MiDbgWriteCheck
MiStackTheftIsr
MmInvalidateDumpAddresses
MmReadProcessPageTables