KeDisconnectInterrupt

NTSTATUS __stdcall KeDisconnectInterrupt(
        _KINTERRUPT **InterruptObject,
        UINT8 ProcessorCount,
        _INTERRUPT_CONNECTION_DATA *ConnectionData){
  unsigned int v3; 
  __int64 *v5; 
  NTSTATUS v6; 
  UINT8 IsInterruptTypeSecondary; 
  __int64 v8; 
  __int64 *v9; 
  __int64 v10; 
  __int64 v11; 
  int v12; 
  void *v13; 
  __int64 v14; 
  __int64 v15; 
  v3 = ProcessorCount;
  v5 = (__int64 *)InterruptObject;
  v6 = 0;
  KeMaskInterrupt(InterruptObject, ProcessorCount, ConnectionData, 0i64);
  IsInterruptTypeSecondary = KiIsInterruptTypeSecondary(ConnectionData);
  v8 = v3;
  KiIntSteerDisable(v5, v3);
  if( (_BYTE)v3 )
  {
    v9 = v5;
    v10 = v3;
    do
    {
      v11 = *v9;
      if( IsInterruptTypeSecondary )
        v12 = KiDisconnectSecondaryInterrupt(*v9, (struct _KEVENT *)ConnectionData);
      else
        v12 = KiDisconnectInterruptCommon(0, *v9, (struct _KEVENT *)ConnectionData);
      _InterlockedOr((volatile signed __int32 *)(v11 + 104), 1u);
      if( v12 < 0 )
      {
        v6 = v12;
      }
      else if( v12 == 296 )
      {
        v6 = 296;
      }
      ++v9;
      --v10;
    }
    while( v10 );
  }
  v13 = *(void **)(*v5 + 272);
  if( v13 )
  {
    if( (_DWORD)v8 )
    {
      v14 = v8;
      do
      {
        v15 = *v5++;
        *(_QWORD *)(v15 + 272) = 0i64;
        --v14;
      }
      while( v14 );
    }
    ExFreePoolWithTag(v13, 0x5249654Bu);
  }
  return v6;
}

Referenced by:

IoDisconnectInterrupt
KeConnectInterrupt