KiInterruptSubDispatch
VOID __stdcall KiInterruptSubDispatch(){
__int64 v0;
__int64 v1;
unsigned __int8 CurrentIrql;
struct _KPRCB *CurrentPrcb;
unsigned __int64 v4;
unsigned int EntropyCount;
unsigned int *v6;
_ETHREAD *CurrentThread;
UINT64 v8;
__int64 CurrentRunTime;
UINT64 v10;
int v11;
bool v12;
unsigned __int8 v13;
UINT64 v14;
_ETW_KERNEL_TRACE_TIMESTAMP TimeStamp[2];
CurrentIrql = KeGetCurrentIrql();
__writecr8(*(unsigned __int8 *)(v1 + 93));
*(_BYTE *)(v0 - 87) = CurrentIrql;
*(_DWORD *)(v0 - 96) = 0;
CurrentPrcb = KeGetCurrentPrcb();
if( ++CurrentPrcb->NestingLevel == 1 )
{
v4 = __rdtsc();
EntropyCount = CurrentPrcb->EntropyTimingState.EntropyCount;
v6 = &CurrentPrcb->EntropyTimingState.Buffer[(unsigned __int16)(EntropyCount & 0x7FF) >> 5];
*v6 = v4 ^ __ROR4__(*v6, 5);
CurrentPrcb->EntropyTimingState.EntropyCount = ++EntropyCount;
if( (EntropyCount & 0x3FF) == 0 )
*(_DWORD *)(v0 - 96) = 1;
CurrentThread = CurrentPrcb->CurrentThread;
v8 = v4 - CurrentPrcb->StartCycles;
CurrentThread->Tcb.CycleTime += v8;
CurrentRunTime = CurrentThread->Tcb.CurrentRunTime;
CurrentPrcb->StartCycles += v8;
v10 = v8 + CurrentRunTime;
v11 = v10;
if( HIDWORD(v10) )
v11 = -1;
CurrentThread->Tcb.CurrentRunTime = v11;
if( (CurrentThread->Tcb.gap0[2] & 0x3E) != 0 )
KiEndThreadAccountingPeriod(KeGetCurrentPrcb(), &CurrentThread->Tcb, v8);
}
_enable();
if( *(_DWORD *)(v0 - 96) )
KiEntropyQueueDpc(KeGetCurrentPrcb());
*(_QWORD *)(v1 + 136) = v0 - 128;
v12 = (*(_WORD *)(&PerfGlobalGroupMask + 1) & 0x4000) == 0;
*(_BYTE *)(v0 + 243) = (*(_WORD *)(&PerfGlobalGroupMask + 1) & 0x4000) != 0;
if( !v12 )
EtwGetKernelTraceTimestamp(TimeStamp[0].KernelTraceTimeStamp, 0x20004000ui64);
KiCallInterruptServiceRoutine((_KINTERRUPT *)v1, 1u);
if( *(_BYTE *)(v0 + 243) )
{
v14 = v13;
BYTE1(v14) = *(_BYTE *)(v1 + 88);
PerfInfoLogInterrupt((_KINTERRUPT *)v1, v14, TimeStamp);
}
_disable();
}Referenced by:
No references.