KeDisconnectInterrupt

VOID __fastcall KeDisconnectInterrupt(
        _KINTERRUPT **InterruptObject,
        INT64 ProcessorCount,
        _INTERRUPT_CONNECTION_DATA *ConnectionData){
  unsigned int v3; 
  _KINTERRUPT **v5; 
  UINT8 IsInterruptTypeSecondary; 
  __int64 v7; 
  _KINTERRUPT **v8; 
  __int64 v9; 
  _KINTERRUPT *v10; 
  void *RedirectObject; 
  __int64 v12; 
  _KINTERRUPT *v13; 

  v3 = (unsigned __int8)ProcessorCount;
  v5 = InterruptObject;
  KeMaskInterrupt(InterruptObject, ProcessorCount, ConnectionData, 0i64);
  IsInterruptTypeSecondary = KiIsInterruptTypeSecondary(ConnectionData);
  v7 = v3;
  KiIntSteerDisable(v5, v3);
  if( (_BYTE)v3 )
  {
    v8 = v5;
    v9 = v3;
    do
    {
      v10 = *v8;
      if( IsInterruptTypeSecondary )
        KiDisconnectSecondaryInterrupt(*v8, ConnectionData);
      else
        KiDisconnectInterruptCommon(0i64, *v8, ConnectionData);
      _InterlockedOr(&v10->InternalState, 1u);
      ++v8;
      --v9;
    }
    while( v9 );
  }
  RedirectObject = (*v5)->RedirectObject;
  if( RedirectObject )
  {
    if( (_DWORD)v7 )
    {
      v12 = v7;
      do
      {
        v13 = *v5++;
        v13->RedirectObject = 0i64;
        --v12;
      }
      while( v12 );
    }
    ExFreePoolWithTag(RedirectObject, 0x5249654Bu);
  }
}

Referenced by:

IoDisconnectInterrupt
KeConnectInterrupt