KeUnmaskInterrupt

NTSTATUS __stdcall KeUnmaskInterrupt(
        _KINTERRUPT **InterruptObject,
        UINT8 ProcessorCount,
        _INTERRUPT_CONNECTION_DATA *ConnectionData){
  UINT8 IsInterruptTypeSecondary; 
  NTSTATUS v7; 
  __int64 v8; 
  _BOOL8 v9; 
  _KINTERRUPT *v10; 
  __int64 Gsiv; 
  NTSTATUS v12; 

  IsInterruptTypeSecondary = KiIsInterruptTypeSecondary(ConnectionData);
  v7 = 0;
  LOBYTE(v8) = 0;
  v9 = IsInterruptTypeSecondary != 0;
  if( ProcessorCount )
  {
    while( 1 )
    {
      v10 = InterruptObject[(unsigned __int8)v8];
      _m_prefetchw(&v10->InternalState);
      if( (_InterlockedAnd(&v10->InternalState, 0xFFFFFFFE) & 1) == 0 )
        break;
      LOBYTE(v8) = v8 + 1;
      if( (unsigned __int8)v8 >= ProcessorCount )
        goto LABEL_4;
    }
    v12 = 295;
  }
  else
  {
LABEL_4:
    if( ConnectionData->Vectors[0].Type )
      return 0;
    Gsiv = ConnectionData->Vectors[0].ControllerInput.Gsiv;
    if( v9 )
      KiUnmaskSecondaryInterruptInternal((*InterruptObject)->Vector, (unsigned int)Gsiv);
    else
      v12 = ((__int64(__fastcall *)(__int64, _QWORD, _BOOL8, __int64))off_140C00778[0])(Gsiv, 0i64, v9, v8);
  }
  if( v12 != 296 )
    return v12;
  return v7;
}

Referenced by:

IopUnmaskInterrupt