KxFlushEntireTb
__int64 __fastcall KxFlushEntireTb(int a1){
__int64 v1;
char v2;
unsigned __int8 CurrentIrql;
struct _KPRCB *CurrentPrcb;
int v5;
__int64 result;
int v7[8];
__int64 v8;
VOID(__stdcall *v9)();
__int64 v10;
v1 = 3i64;
v2 = 1;
if( a1 == 1 )
{
v1 = 2147483651i64;
}
else if( !a1 && (_BYTE)KiKvaShadow )
{
v2 = 0;
}
CurrentIrql = KeGetCurrentIrql();
__writecr8(0xCui64);
if( v2 )
{
if( KxSetTimeStampBusy((INT64 *)&KiTbFlushTimeStamp) )
{
v10 = 0i64;
v9 = KiFlushCurrentTbWorker;
v8 = v1;
KiIpiSendRequestEx((CHAR)KeGetCurrentPrcb());
_InterlockedIncrement((volatile signed __int32 *)&KiTbFlushTimeStamp);
}
}
else
{
_InterlockedOr(v7, 0);
CurrentPrcb = KeGetCurrentPrcb();
KeCopyAffinityEx(
(__int64)CurrentPrcb + 11704,
(unsigned __int16 *)(*(_QWORD *)(*((_QWORD *)CurrentPrcb + 1) + 184i64) + 368i64));
KeRemoveProcessorAffinityEx((unsigned __int16 *)CurrentPrcb + 5852, *((_DWORD *)CurrentPrcb + 9));
if( (unsigned int)KiAffinityContainsProcessorsOtherThanSelf((INT64)CurrentPrcb, (_WORD *)CurrentPrcb + 5852) )
{
KiIpiSendRequest((__int64)CurrentPrcb, 0, (unsigned __int16 *)CurrentPrcb + 5852, 0i64, v1);
KiFlushCurrentTbWorker();
v5 = 0;
while( *((_DWORD *)CurrentPrcb + 2912) )
{
++v5;
_mm_pause();
}
}
else
{
KiFlushCurrentTbWorker();
}
}
result = CurrentIrql;
__writecr8(CurrentIrql);
return result;
}Referenced by:
KeFlushEntireTb
KeFlushTb