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.