KeMaskInterrupt

NTSTATUS __stdcall KeMaskInterrupt(
        _KINTERRUPT **InterruptObject,
        UINT8 ProcessorCount,
        _INTERRUPT_CONNECTION_DATA *ConnectionData,
        _KDPC *LineMaskDpc){
  UINT8 IsInterruptTypeSecondary; 
  int ProcessorNumberFromIndex; 
  unsigned __int8 v10; 
  _KINTERRUPT *v11; 
  VOID *Gsiv; 
  unsigned __int8 CurrentIrql; 
  unsigned int Number; 
  unsigned __int8 v15; 
  _KINTERRUPT *v16; 
  char v17; 
  int v19; 
  _KINTERRUPT *v20; 
  int v21; 
  char OldIrql[4]; 
  _PROCESSOR_NUMBER ProcNumber; 
  _GROUP_AFFINITY PreviousAffinity; 

  PreviousAffinity = 0i64;
  OldIrql[0] = 0;
  ProcNumber = 0;
  IsInterruptTypeSecondary = KiIsInterruptTypeSecondary(ConnectionData);
  ProcessorNumberFromIndex = 0;
  v10 = 0;
  if( ProcessorCount )
  {
    do
    {
      v11 = InterruptObject[v10];
      _m_prefetchw(&v11->InternalState);
      if( (_InterlockedOr(&v11->InternalState, 1u) & 1) != 0 )
        return -2147483611;
    }
    while( ++v10 < ProcessorCount );
  }
  if( ConnectionData->Vectors[0].Type )
    return 0;
  Gsiv = (VOID *)ConnectionData->Vectors[0].ControllerInput.Gsiv;
  if( IsInterruptTypeSecondary != 0 )
  {
    ProcessorNumberFromIndex = KiMaskSecondaryInterruptInternal((*InterruptObject)->Vector, (unsigned int)Gsiv);
    goto LABEL_13;
  }
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(0xFui64);
  Number = KeGetPcr()->Prcb.Number;
  v15 = 0;
  OldIrql[0] = CurrentIrql;
  if( ProcessorCount )
  {
    while( 1 )
    {
      v16 = InterruptObject[v15];
      if( v16->Number == Number )
        break;
      if( ++v15 >= ProcessorCount )
      {
        v17 = 0;
        goto LABEL_12;
      }
    }
    KiMaskInterruptInternal(v16->Vector, (_BYTE *)(unsigned int)Gsiv);
    ProcessorNumberFromIndex = v19;
    v17 = 1;
  }
  else
  {
    v17 = 0;
  }
LABEL_12:
  __writecr8(CurrentIrql);
  if( v17 )
    goto LABEL_13;
  v20 = *InterruptObject;
  if( KeGetCurrentIrql() < 2u )
  {
    KiAcquireInterruptConnectLock(v20->Number, (UINT8 *)OldIrql, &PreviousAffinity);
    KiMaskInterruptInternal(v20->Vector, (_BYTE *)(unsigned int)Gsiv);
    ProcessorNumberFromIndex = v21;
    __writecr8((unsigned __int8)OldIrql[0]);
    KeRevertToUserGroupAffinityThread(&PreviousAffinity);
LABEL_13:
    if( ProcessorNumberFromIndex == 296 )
      return 0;
    return ProcessorNumberFromIndex;
  }
  if( LineMaskDpc )
  {
    ProcessorNumberFromIndex = KeGetProcessorNumberFromIndex(v20->Number, &ProcNumber);
    if( ProcessorNumberFromIndex >= 0 )
    {
      KeRemoveQueueDpcEx(LineMaskDpc, 0i64);
      LineMaskDpc->TargetInfoAsUlong = 275;
      LineMaskDpc->DeferredRoutine = (void(__fastcall *)(_KDPC *, void *, void *, void *))KiMaskInterruptDpc;
      LineMaskDpc->DeferredContext = 0i64;
      LineMaskDpc->DpcData = 0i64;
      LineMaskDpc->ProcessorHistory = 0i64;
      ProcessorNumberFromIndex = KeSetTargetProcessorDpcEx(LineMaskDpc, &ProcNumber);
      if( ProcessorNumberFromIndex >= 0 )
        KiInsertQueueDpc(LineMaskDpc, (VOID *)v20->Vector, Gsiv, 0i64, 0);
    }
    goto LABEL_13;
  }
  return -1073741811;
}

Referenced by:

IopMaskInterrupt
KeDisconnectInterrupt