KiHvInterruptSubDispatch
VOID __stdcall KiHvInterruptSubDispatch(){
__int64 v0;
unsigned __int8 CurrentIrql;
struct _KPRCB *CurrentPrcb;
unsigned __int64 v3;
unsigned int EntropyCount;
unsigned int *v5;
_ETHREAD *CurrentThread;
UINT64 v7;
__int64 CurrentRunTime;
UINT64 v9;
int v10;
bool v11;
_LARGE_INTEGER TimeStamp;
CurrentIrql = KeGetCurrentIrql();
__writecr8(3ui64);
*(_BYTE *)(v0 - 87) = CurrentIrql;
*(_DWORD *)(v0 - 96) = 0;
CurrentPrcb = KeGetCurrentPrcb();
if( ++CurrentPrcb->NestingLevel == 1 )
{
v3 = __rdtsc();
EntropyCount = CurrentPrcb->EntropyTimingState.EntropyCount;
v5 = &CurrentPrcb->EntropyTimingState.Buffer[(unsigned __int16)(EntropyCount & 0x7FF) >> 5];
*v5 = v3 ^ __ROR4__(*v5, 5);
CurrentPrcb->EntropyTimingState.EntropyCount = ++EntropyCount;
if( (EntropyCount & 0x3FF) == 0 )
*(_DWORD *)(v0 - 96) = 1;
CurrentThread = CurrentPrcb->CurrentThread;
v7 = v3 - CurrentPrcb->StartCycles;
CurrentThread->Tcb.CycleTime += v7;
CurrentRunTime = CurrentThread->Tcb.CurrentRunTime;
CurrentPrcb->StartCycles += v7;
v9 = v7 + CurrentRunTime;
v10 = v9;
if( HIDWORD(v9) )
v10 = -1;
CurrentThread->Tcb.CurrentRunTime = v10;
if( (CurrentThread->Tcb.gap0[2] & 0x3E) != 0 )
KiEndThreadAccountingPeriod(KeGetCurrentPrcb(), &CurrentThread->Tcb, v7);
}
_enable();
if( *(_DWORD *)(v0 - 96) )
KiEntropyQueueDpc(KeGetCurrentPrcb());
v11 = (*(_WORD *)(&PerfGlobalGroupMask + 1) & 0x4000) == 0;
*(_BYTE *)(v0 + 243) = (*(_WORD *)(&PerfGlobalGroupMask + 1) & 0x4000) != 0;
if( !v11 )
EtwGetKernelTraceTimestamp(&TimeStamp, 0x20004000ui64);
KiEpfCompletionIsr();
HvlSharedIsr();
HvlpInterruptCallback[*(unsigned int *)(v0 + 224)]();
if( *(_BYTE *)(v0 + 243) )
PerfInfoLogInterruptHv(
(INT64)KiHvInterrupt,
(unsigned int)(((*(_DWORD *)(v0 + 224) + 48) << 8) + 1),
(INT64)&TimeStamp);
_disable();
}Referenced by:
No references.