KiVmbusInterruptSubDispatch
VOID __fastcall KiVmbusInterruptSubDispatch(){
__int64 v0;
unsigned __int8 CurrentIrql;
struct _KPRCB *CurrentPrcb;
unsigned __int64 v3;
int v4;
_DWORD *v5;
__int64 v6;
UINT64 v7;
__int64 v8;
UINT64 v9;
int v10;
bool v11;
void(*v12)(void);
__int64 v13[5];
CurrentIrql = KeGetCurrentIrql();
__writecr8(3ui64);
*(_BYTE *)(v0 - 87) = CurrentIrql;
*(_DWORD *)(v0 - 96) = 0;
CurrentPrcb = KeGetCurrentPrcb();
if( ++*((_BYTE *)CurrentPrcb + 32) == 1 )
{
v3 = __rdtsc();
v4 = *((_DWORD *)CurrentPrcb + 8568);
v5 = (_DWORD *)((char *)CurrentPrcb + 4 * ((unsigned __int16)(v4 & 0x7FF) >> 5) + 34276);
*v5 = v3 ^ __ROR4__(*v5, 5);
*((_DWORD *)CurrentPrcb + 8568) = ++v4;
if( (v4 & 0x3FF) == 0 )
*(_DWORD *)(v0 - 96) = 1;
v6 = *((_QWORD *)CurrentPrcb + 1);
v7 = v3 - *((_QWORD *)CurrentPrcb + 4056);
*(_QWORD *)(v6 + 72) += v7;
v8 = *(unsigned int *)(v6 + 80);
*((_QWORD *)CurrentPrcb + 4056) += v7;
v9 = v7 + v8;
v10 = v9;
if( HIDWORD(v9) )
v10 = -1;
*(_DWORD *)(v6 + 80) = v10;
if( (*(_BYTE *)(v6 + 2) & 0x3E) != 0 )
KiEndThreadAccountingPeriod(KeGetCurrentPrcb(), (_KTHREAD *)v6, v7);
}
_enable();
if( *(_DWORD *)(v0 - 96) )
KiEntropyQueueDpc((__int64)KeGetCurrentPrcb());
v11 = (PerfGlobalGroupMask & 0x400000000000i64) == 0;
*(_BYTE *)(v0 + 243) = (PerfGlobalGroupMask & 0x400000000000i64) != 0;
if( !v11 )
EtwGetKernelTraceTimestamp((LARGE_INTEGER *)v13, 0x20004000ui64);
v12 = (void(*)(void))HvlpInterruptCallback[*(unsigned int *)(v0 + 224)];
v12();
if( *(_BYTE *)(v0 + 243) )
PerfInfoLogInterruptHv((INT64)v12, (unsigned int)(((*(_DWORD *)(v0 + 224) + 48) << 8) + 1), (INT64)v13);
_disable();
}Referenced by:
No references.