KiFlushRangeWorker
VOID __fastcall KiFlushRangeWorker(INT64 a1){
void **v1;
unsigned __int64 v3;
unsigned __int64 v4;
int v5;
__int64 v6;
unsigned __int64 v7;
_QWORD v8[2];
_QWORD v9[2];
v1 = *(void ***)a1;
v3 = *(_QWORD *)a1 + 8i64 * *(unsigned int *)(a1 + 8);
do
{
v4 = (unsigned __int64)*v1;
v5 = (1 << *(_DWORD *)(a1 + 12)) & 0xA;
if( v5 && KiFlushPcid && !*(_BYTE *)(*((_QWORD *)KeGetCurrentThread() + 23) + 912i64) )
{
if( (KiFlushPcid & 2) != 0 )
{
v8[0] = 1i64;
v8[1] = v4;
_invpcid(0, v8);
}
else
{
KiSetUserTbFlushPending();
}
}
__invlpg((void *)v4);
v6 = 4096i64 << (9 * ((unsigned __int8)(v4 >> 10) & 3u));
v7 = v4 & 0x3FF;
if( (v4 & 0x3FF) != 0 )
{
do
{
v4 += v6;
if( v5 && KiFlushPcid && !*(_BYTE *)(*((_QWORD *)KeGetCurrentThread() + 23) + 912i64) )
{
if( (KiFlushPcid & 2) != 0 )
{
v9[0] = 1i64;
v9[1] = v4;
_invpcid(0, v9);
}
else
{
KiSetUserTbFlushPending();
}
}
__invlpg((void *)v4);
--v7;
}
while( v7 );
}
++v1;
}
while( (unsigned __int64)v1 < v3 );
}Referenced by:
KeFlushMultipleRangeTb