KiFlushRangeTb
VOID __fastcall KiFlushRangeTb(UINT64 a1, CHAR a2){
UINT64 v2;
int v3;
__int64 v4;
bool v5;
UINT64 i;
_QWORD v7[2];
_QWORD v8[2];
v2 = a1;
v3 = (1 << a2) & 0xA;
if( v3 && KiFlushPcid && !*(_BYTE *)(*((_QWORD *)KeGetCurrentThread() + 23) + 912i64) )
{
if( (KiFlushPcid & 2) != 0 )
{
v7[0] = 1i64;
v7[1] = a1;
_invpcid(0, v7);
}
else
{
KiSetUserTbFlushPending();
}
}
v4 = 4096i64 << (9 * ((unsigned __int8)(v2 >> 10) & 3u));
v5 = (v2 & 0x3FF) == 0;
for( i = v2 & 0x3FF; ; v5 = i == 0 )
{
__invlpg((void *)v2);
if( v5 )
break;
v2 += v4;
if( v3 && KiFlushPcid && !*(_BYTE *)(*((_QWORD *)KeGetCurrentThread() + 23) + 912i64) )
{
if( (KiFlushPcid & 2) != 0 )
{
v8[0] = 1i64;
v8[1] = v2;
_invpcid(0, v8);
}
else
{
KiSetUserTbFlushPending();
}
}
--i;
}
}Referenced by:
KeFlushMultipleRangeCurrentTb
KeFlushMultipleRangeTb