KeMaskInterrupt

NTSTATUS __stdcall KeMaskInterrupt(
        _KINTERRUPT **InterruptObject,
        UINT8 ProcessorCount,
        _INTERRUPT_CONNECTION_DATA *ConnectionData,
        _KDPC *LineMaskDpc){
  UINT8 IsInterruptTypeSecondary; 
  int ProcessorNumberFromIndex; 
  unsigned __int8 v10; 
  _KINTERRUPT *v11; 
  void *v12; 
  unsigned __int8 CurrentIrql; 
  int v14; 
  unsigned __int8 v15; 
  _KINTERRUPT *v16; 
  char v17; 
  _KINTERRUPT *v19; 
  char OldIrql[4]; 
  struct _PROCESSOR_NUMBER ProcNumber; 
  struct _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( *((_DWORD *)ConnectionData + 2) )
    return 0;
  v12 = (void *)*((unsigned int *)ConnectionData + 16);
  if( IsInterruptTypeSecondary != 0 )
  {
    ProcessorNumberFromIndex = KiMaskSecondaryInterruptInternal((*InterruptObject)->Vector, (unsigned int)v12);
    goto LABEL_13;
  }
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(0xFui64);
  v14 = *((_DWORD *)KeGetPcr() + 105);
  v15 = 0;
  OldIrql[0] = CurrentIrql;
  if( ProcessorCount )
  {
    while( 1 )
    {
      v16 = InterruptObject[v15];
      if( v16->Number == v14 )
        break;
      if( ++v15 >= ProcessorCount )
      {
        v17 = 0;
        goto LABEL_12;
      }
    }
    ProcessorNumberFromIndex = KiMaskInterruptInternal(v16->Vector, (unsigned int)v12);
    v17 = 1;
  }
  else
  {
    v17 = 0;
  }
LABEL_12:
  __writecr8(CurrentIrql);
  if( v17 )
    goto LABEL_13;
  v19 = *InterruptObject;
  if( KeGetCurrentIrql() < 2u )
  {
    KiAcquireInterruptConnectLock(v19->Number, (UINT8 *)OldIrql, &PreviousAffinity);
    ProcessorNumberFromIndex = KiMaskInterruptInternal(v19->Vector, (unsigned int)v12);
    __writecr8((unsigned __int8)OldIrql[0]);
    KeRevertToUserGroupAffinityThread(&PreviousAffinity);
LABEL_13:
    if( ProcessorNumberFromIndex == 296 )
      return 0;
    return ProcessorNumberFromIndex;
  }
  if( LineMaskDpc )
  {
    ProcessorNumberFromIndex = KeGetProcessorNumberFromIndex(v19->Number, &ProcNumber);
    if( ProcessorNumberFromIndex >= 0 )
    {
      KeRemoveQueueDpcEx(LineMaskDpc, 0);
      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, (PVOID)v19->Vector, v12, 0i64, 0);
    }
    goto LABEL_13;
  }
  return -1073741811;
}

Referenced by:

IopMaskInterrupt
KeDisconnectInterrupt