KiFlushRangeTb
VOID __stdcall KiFlushRangeTb(_KTB_FLUSH_VA Virtual){
char v1;
union {$35D744587036AE522A5F9ADC4D2A64A6 __s0;void *Va;unsigned __int64 VaLong;} v2;
int v3;
__int64 v4;
bool v5;
__int64 i;
_QWORD v7[2];
_QWORD v8[2];
v2.0 = Virtual.u1.0;
v3 = (1 << v1) & 0xA;
if( v3 && KiFlushPcid && !KeGetCurrentThread()->ApcState.Process->Pcb.AddressPolicy )
{
if( (KiFlushPcid & 2) != 0 )
{
v7[0] = 1i64;
v7[1] = Virtual.u1.0;
_invpcid(0, v7);
}
else
{
KiSetUserTbFlushPending();
}
}
v4 = 4096i64 << (9 * ((unsigned __int8)(v2.VaLong >> 10) & 3u));
v5 = (*(_WORD *)&v2.0 & 0x3FF) == 0;
for( i = *(_WORD *)&v2.0 & 0x3FF; ; v5 = i == 0 )
{
__invlpg(v2.Va);
if( v5 )
break;
v2.VaLong += v4;
if( v3 && KiFlushPcid && !KeGetCurrentThread()->ApcState.Process->Pcb.AddressPolicy )
{
if( (KiFlushPcid & 2) != 0 )
{
v8[0] = 1i64;
v8[1] = v2.0;
_invpcid(0, v8);
}
else
{
KiSetUserTbFlushPending();
}
}
--i;
}
}Referenced by:
KeFlushMultipleRangeCurrentTb
KeFlushMultipleRangeTb