KiDisconnectSecondaryInterrupt

NTSTATUS __stdcall KiDisconnectSecondaryInterrupt(_KINTERRUPT *Interrupt, _INTERRUPT_CONNECTION_DATA *ConnectionData){
  bool v4; 
  __int64 v5; 
  _KINTERRUPT *v6; 
  NTSTATUS v7; 
  NTSTATUS v8; 
  UINT8 OldIrql; 

  OldIrql = 0;
  v4 = 0;
  v5 = KiGlobalSecondaryIDT + 48i64 * (Interrupt->Vector - 256);
  KiAcquireSecondaryPassiveConnectLock((_KSECONDARY_IDT_ENTRY *)v5);
  KiAcquireSecondaryInterruptConnectLock((UINT64 *)v5, &OldIrql);
  if( Interrupt->Connected )
  {
    v6 = *(_KINTERRUPT **)(v5 + 40);
    if( v6 == Interrupt )
      v4 = v6->InterruptListEntry.Flink == &v6->InterruptListEntry;
  }
  KxReleaseSpinLock((UINT64 *)v5);
  __writecr8(OldIrql);
  if( v4 )
    HalDisableInterrupt(ConnectionData);
  KiDisconnectInterruptCommon(1i64, Interrupt, ConnectionData);
  v8 = v7;
  KeSetEvent((PRKEVENT)(v5 + 8), 0, 0);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  return v8;
}

Referenced by:

KeDisconnectInterrupt