KiScanInterruptObjectList
VOID __stdcall KiScanInterruptObjectList(){
__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;
__int64 v12;
bool v13;
int v14;
__int64 v15;
unsigned __int64 v16;
unsigned __int8 v17;
unsigned __int64 v18;
UINT64 v19;
unsigned __int8 v20;
_ETW_KERNEL_TRACE_TIMESTAMP TimeStamp[4];
CurrentIrql = KeGetCurrentIrql();
__writecr8(*(unsigned __int8 *)(v1 + 92));
*(_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());
v12 = v1 + 8;
v13 = (*(_WORD *)(&PerfGlobalGroupMask + 1) & 0x4000) == 0;
*(_BYTE *)(v0 + 243) = (*(_WORD *)(&PerfGlobalGroupMask + 1) & 0x4000) != 0;
if( !v13 )
EtwGetKernelTraceTimestamp(TimeStamp[0].KernelTraceTimeStamp, 0x20004000ui64);
while( 2 )
{
v14 = 0;
do
{
v15 = v12 - 8;
if( (*(_DWORD *)(v15 + 104) & 1) != 0 )
{
v20 = 0;
}
else
{
v16 = *(unsigned __int8 *)(v15 + 93);
if( !(_BYTE)v16 )
{
KiDispatchPassiveInterrupts((_KINTERRUPT *)v15);
goto LABEL_26;
}
if( (_BYTE)v16 != *(_BYTE *)(v1 + 92) )
__writecr8(v16);
KiCallInterruptServiceRoutine((_KINTERRUPT *)v15, 1u);
v20 = v17;
v18 = *(unsigned __int8 *)(v1 + 92);
if( (_BYTE)v18 != *(_BYTE *)(v15 + 93) )
__writecr8(v18);
}
if( *(_BYTE *)(v0 + 243) )
{
v19 = v20;
BYTE1(v19) = *(_BYTE *)(v15 + 88);
PerfInfoLogInterrupt((_KINTERRUPT *)v15, v19, TimeStamp);
EtwGetKernelTraceTimestamp(TimeStamp[0].KernelTraceTimeStamp, 0x20004000ui64);
}
if( v20 )
{
if( *(_WORD *)(v15 + 108) != 1 )
goto LABEL_26;
++v14;
}
v12 = *(_QWORD *)(v15 + 8);
}
while( v12 != v1 + 8 );
if( v14 )
continue;
break;
}
LABEL_26:
_disable();
}Referenced by:
No references.