KiInterruptDispatchCommon

VOID __stdcall KiInterruptDispatchCommon(
        _KINTERRUPT_TYPE InterruptType,
        UINT64 Vector,
        UINT64 Flags,
        _LIST_ENTRY *DisconnectListOut,
        _KINTERRUPT_DISPATCH_STATUS *DispatchStatus){
  _KINTERRUPT_TYPE v5; 
  char v6; 
  _LIST_ENTRY *v7; 
  UINT8 v8; 
  unsigned __int8 v9; 
  _KINTERRUPT *v10; 
  __int64 v11; 
  _KINTERRUPT *p_Blink; 
  _LIST_ENTRY *Flink; 
  unsigned int v14; 
  char v15; 
  UINT64 *v16; 
  _LIST_ENTRY *v17; 
  _KINTERRUPT_TYPE v18; 
  _LIST_ENTRY *v19; 
  UINT8 OldIrql; 
  char v21; 
  _KINTERRUPT_TYPE InterruptTypea; 
  _KINTERRUPT_DISPATCH_STATUS v23; 
  _PROCESSOR_NUMBER ProcNumber; 
  unsigned int Vectora; 
  unsigned int Vector_4; 
  UINT64 *SpinLock; 
  _KINTERRUPT_MODE Mode; 
  _LIST_ENTRY *DisconnectedList; 
  __int64 CurrentIrql; 
  _KINTERRUPT_DISPATCH_STATUS *v31; 
  _GROUP_AFFINITY Affinity; 
  __int128 v33; 
  _GROUP_AFFINITY PreviousAffinity; 

  Vectora = Vector;
  InterruptTypea = InterruptType;
  v5 = InterruptType;
  OldIrql = 0;
  v31 = DispatchStatus;
  v6 = Flags;
  ProcNumber = 0;
  v23 = IsrNotDispatched;
  v33 = 0i64;
  CurrentIrql = KeGetCurrentIrql();
  v7 = (_LIST_ENTRY *)&v33;
  v21 = 0;
  if( DisconnectListOut )
    v7 = DisconnectListOut;
  Vector_4 = 0;
  DisconnectedList = v7;
  v8 = 0;
  PreviousAffinity = 0i64;
  v7->Blink = v7;
  v7->Flink = v7;
  if( InterruptType )
  {
    v11 = (unsigned int)(Vector - 256);
    SpinLock = (UINT64 *)(KiGlobalSecondaryIDT + 48 * v11);
    KiAcquireSecondaryInterruptConnectLock(SpinLock, &OldIrql);
    v10 = 0i64;
    if( (unsigned int)v11 < 0x100 )
      v10 = *(_KINTERRUPT **)(KiGlobalSecondaryIDT + 48 * v11 + 40);
    v7 = DisconnectedList;
    v5 = InterruptTypea;
  }
  else
  {
    SpinLock = 0i64;
    KeGetCurrentProcessorNumberEx(&ProcNumber.Group);
    *(_QWORD *)&Affinity.Group = ProcNumber.Group;
    Affinity.Mask = 1i64 << ProcNumber.Number;
    KeSetSystemGroupAffinityThread(&Affinity, &PreviousAffinity);
    v9 = KeGetCurrentIrql();
    __writecr8(0xFui64);
    v10 = 0i64;
    OldIrql = v9;
    if( Vectora > 0xFF )
      goto LABEL_10;
    _mm_lfence();
    v10 = (_KINTERRUPT *)KeGetCurrentPrcb()->InterruptObject[Vectora];
  }
  v9 = OldIrql;
LABEL_10:
  if( v10 )
  {
    p_Blink = v10;
    ++v10->ActiveCount;
    if( (v6 & 1) != 0 )
    {
      while( p_Blink->SynchronizeIrql )
      {
        Flink = p_Blink->InterruptListEntry.Flink;
        if( !Flink )
        {
          p_Blink = 0i64;
          break;
        }
        p_Blink = (_KINTERRUPT *)&Flink[-1].Blink;
        if( p_Blink == v10 )
        {
          if( p_Blink->SynchronizeIrql )
            p_Blink = 0i64;
          break;
        }
      }
    }
    if( p_Blink )
    {
      v14 = 0;
      Mode = v10->Mode;
      v15 = 0;
      while( (unsigned __int8)CurrentIrql <= 2u || p_Blink->SynchronizeIrql )
      {
        if( (p_Blink->InternalState & 1) != 0 )
        {
          v19 = p_Blink->InterruptListEntry.Flink;
        }
        else
        {
          ++p_Blink->ActiveCount;
          ++v14;
          v16 = SpinLock;
          if( InterruptTypea )
            KxReleaseSpinLock(SpinLock);
          __writecr8(v9);
          v8 = KiInvokeInterruptServiceRoutine(p_Blink, v9, Vectora);
          v23 = IsrDispatched;
          if( InterruptTypea )
          {
            KiAcquireSecondaryInterruptConnectLock(v16, &OldIrql);
            v9 = OldIrql;
          }
          else
          {
            v9 = KeGetCurrentIrql();
            __writecr8(0xFui64);
            OldIrql = v9;
          }
          v17 = DisconnectedList;
          v18 = InterruptTypea;
          --p_Blink->ActiveCount;
          v19 = p_Blink->InterruptListEntry.Flink;
          KiProcessPendingDisconnect(v18, p_Blink, v17);
        }
        p_Blink = (_KINTERRUPT *)&v19[-1].Blink;
        if( Mode )
        {
          if( v8 )
            v15 = 1;
          if( p_Blink == v10 )
          {
            if( !v15 || v14 <= 1 )
              goto LABEL_45;
            v14 = 0;
            v15 = 0;
            v8 = 0;
          }
        }
        else if( v8 || p_Blink == v10 )
        {
          goto LABEL_45;
        }
      }
      v21 = 1;
      if( v23 != IsrDispatched )
        v23 = IsrDispatchDeferred;
      Vector_4 = p_Blink->Vector;
LABEL_45:
      v5 = InterruptTypea;
    }
    --v10->ActiveCount;
    v7 = DisconnectedList;
    KiProcessPendingDisconnect(v5, v10, DisconnectedList);
  }
  if( v5 )
  {
    KxReleaseSpinLock(SpinLock);
    __writecr8(v9);
  }
  else
  {
    __writecr8(v9);
    KeRevertToUserGroupAffinityThread(&PreviousAffinity);
  }
  if( v21 )
    IoProcessPassiveInterrupts(Vector_4);
  if( (unsigned __int8)CurrentIrql < 2u )
    KiProcessDisconnectList(v7);
  if( v31 )
    *v31 = v23;
}

Referenced by:

IopPassiveInterruptWorker
KeDispatchSecondaryInterrupt