KiDisconnectInterruptCommon

VOID __fastcall KiDisconnectInterruptCommon(
        INT64 InterruptType,
        _KINTERRUPT *Interrupt,
        _INTERRUPT_CONNECTION_DATA *ConnectionData){
  int v3; 
  _ETHREAD *ServiceThread; 
  char v7; 
  UINT64 *v8; 
  _INTERRUPT_CONNECTION_DATA *v9; 
  char OldIrql[8]; 
  __int128 v11; 
  __int64 v12; 
  _KEVENT *v13[3]; 
  _GROUP_AFFINITY PreviousAffinity; 

  v13[1] = (_KEVENT *)ConnectionData;
  v13[0] = 0i64;
  v12 = 0i64;
  v3 = InterruptType;
  v13[2] = 0i64;
  ServiceThread = Interrupt->ServiceThread;
  v11 = 0i64;
  OldIrql[0] = 0;
  v7 = 0;
  PreviousAffinity = 0i64;
  if( ServiceThread != (_ETHREAD *)KeGetCurrentThread() )
  {
    LOWORD(v11) = 1;
    v12 = (__int64)&v11 + 8;
    *((_QWORD *)&v11 + 1) = (char *)&v11 + 8;
    v13[0] = (_KEVENT *)&v11;
    BYTE2(v11) = 6;
    DWORD1(v11) = 0;
  }
  if( v3 )
  {
    v8 = (UINT64 *)(KiGlobalSecondaryIDT + 48i64 * (Interrupt->Vector - 256));
    KiAcquireSecondaryInterruptConnectLock(v8, (UINT8 *)OldIrql);
  }
  else
  {
    v8 = 0i64;
    KiAcquireInterruptConnectLock(Interrupt->Number, (UINT8 *)OldIrql, &PreviousAffinity);
  }
  if( Interrupt->Connected && (Interrupt->InternalState & 2) == 0 )
  {
    if( Interrupt->ActiveCount )
    {
      _InterlockedOr(&Interrupt->InternalState, 2u);
      v7 = 1;
      Interrupt->DisconnectData = v13;
    }
    else
    {
      if( !v3 )
      {
        KiDisconnectInterruptInternal(Interrupt, ConnectionData);
LABEL_10:
        __writecr8((unsigned __int8)OldIrql[0]);
        KeRevertToUserGroupAffinityThread(&PreviousAffinity);
        goto LABEL_11;
      }
      KiDisconnectSecondaryInterruptInternal(Interrupt, v9);
    }
  }
  if( !v3 )
    goto LABEL_10;
  KxReleaseSpinLock(v8);
  __writecr8((unsigned __int8)OldIrql[0]);
LABEL_11:
  if( v13[0] )
  {
    if( v7 )
      KiSignalWaitDisconnectLock(v13[0], 1);
  }
}

Referenced by:

KeDisconnectInterrupt
KiDisconnectSecondaryInterrupt