IopConnectInterrupt

__int64 __fastcall IopConnectInterrupt(
        _QWORD *a1,
        ULONG_PTR a2,
        __int64 (__fastcall *a3)(__int64 a1, __int64 a2),
        __int64 a4,
        __int64 a5,
        int a6,
        __int64 a7,
        char a8,
        char a9,
        __int64 a10,
        __int64 a11){
  GROUP_AFFINITY v13; 
  int v14; 
  unsigned __int64 v15; 
  unsigned __int64 v17; 
  char *PoolWithTag; 
  char *v19; 
  int v20; 
  __int64 v21; 
  char v22; 
  GROUP_AFFINITY v23; 
  __int64 v24; 
  unsigned __int8 v25; 
  _KINTERRUPT *Interrupt; 
  _KINTERRUPT *v27; 
  int v28; 
  __int64 v29; 
  char *v30; 
  unsigned __int64 v31; 
  _OWORD *v32; 
  _OWORD *v33; 
  __int64 v34; 
  __int128 v35; 
  _KINTERRUPT **v37; 
  __int16 *v38; 
  _WORD *v39; 
  PVOID *v40; 
  PVOID *v41; 
  __int64 v42; 
  _WORD *v43; 
  __int64 v44; 
  _WORD *v45; 
  __int64 v46; 
  struct _PROCESSOR_NUMBER ProcNumber; 
  int v48; 
  unsigned int Vector; 
  unsigned int Vector_4; 
  GROUP_AFFINITY GroupAffinity; 
  __int64 v52; 
  __int64 v53; 
  __int64 result[16]; 
  bool v56; 
  char v57; 
  unsigned __int8 a1a; 
  memset((INT64)result, 0i64);
  *a1 = 0i64;
  ProcNumber = 0;
  IopInitializeActiveConnectBlock(a11, result);
  v13 = *(GROUP_AFFINITY *)(a11 + 32);
  v14 = *(_DWORD *)(a11 + 24);
  Vector = *(_DWORD *)(a11 + 12);
  GroupAffinity = v13;
  v48 = v14;
  v15 = v13.Mask & KeActiveProcessors.Bitmap[(unsigned __int16)_mm_extract_epi16((__m128i)v13, 4)];
  GroupAffinity.Mask = v15;
  if( !*(_DWORD *)(a11 + 8)
    && !((unsigned __int8(__fastcall *)(_QWORD, _QWORD))off_140C00780[0])(0i64, *(unsigned int *)(a11 + 64))
    && (unsigned int)(*(_DWORD *)(a11 + 20) - 3) <= 1 )
  {
    v48 = 0;
  }
  v56 = a8 == 0;
  if( KeVerifyGroupAffinity(&GroupAffinity, 0)
    && (v17 = (0x101010101010101i64
             * ((((v15 - ((v15 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
               + (((v15 - ((v15 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)
               + ((((v15 - ((v15 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
                 + (((v15 - ((v15 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 56,
        (_BYTE)v17) )
  {
    PoolWithTag = (char *)ExAllocatePoolWithTag(NonPagedPoolNx, (unsigned int)(8 * (char)v17 + 496), 0x6E696F49ui64);
    v19 = PoolWithTag;
    if( PoolWithTag )
    {
      memset((INT64)PoolWithTag, 0i64);
      KeInitializeDpc((PRKDPC)(v19 + 432), 0i64, 0i64);
      v20 = v48;
      *((_OWORD *)v19 + 1) = *(_OWORD *)a11;
      v21 = (__int64)v19;
      v22 = 0;
      *((_OWORD *)v19 + 2) = *(_OWORD *)(a11 + 16);
      ProcNumber.Reserved = 0;
      *((_OWORD *)v19 + 3) = *(_OWORD *)(a11 + 32);
      *((_OWORD *)v19 + 4) = *(_OWORD *)(a11 + 48);
      *((_OWORD *)v19 + 5) = *(_OWORD *)(a11 + 64);
      v23 = GroupAffinity;
      *((_OWORD *)v19 + 6) = *(_OWORD *)(a11 + 80);
      *((_DWORD *)v19 + 10) = v20;
      *((GROUP_AFFINITY *)v19 + 3) = v23;
      if( a7 )
        v21 = a7;
      *((_QWORD *)v19 + 1) = v15;
      v19[400] = v56;
      v24 = (__int64)(v19 + 408);
      if( a8 )
        v24 = 0i64;
      v53 = v21;
      v52 = v24;
      v25 = 0;
      v57 = 0;
      a1a = 0;
      ProcNumber.Group = _mm_extract_epi16((__m128i)v23, 4);
      if( (char)v17 > 0 )
      {
        do
        {
          if( _bittest64((const __int64 *)&v15, v25) )
          {
            ProcNumber.Number = v25;
            Vector_4 = KeGetProcessorIndexFromNumber(&ProcNumber);
            Interrupt = KeAllocateInterrupt(*(&KiProcessorBlock + Vector_4));
            v27 = Interrupt;
            if( !Interrupt )
            {
              v28 = -1073741670;
              goto LABEL_33;
            }
            memset((INT64)Interrupt, 0i64);
            KeInitializeInterruptEx();
            v25 = a1a;
            *(_QWORD *)&v19[8 * v57 + 496] = v27;
            v22 = ++v57;
          }
          a1a = ++v25;
        }
        while( v22 < (char)v17 );
      }
      if( !a8 )
      {
        v28 = IopAllocatePassiveInterruptBlock((_DWORD *)v19 + 4, &GroupAffinity);
        if( v28 < 0 )
          goto LABEL_33;
      }
      IopAcquireActiveConnectLock((INT64)result);
      v28 = KeConnectInterrupt((_KINTERRUPT **)v19 + 62, v17, (_INTERRUPT_CONNECTION_DATA *)(v19 + 16));
      IopReleaseActiveConnectLock((INT64)result);
      if( v28 < 0 )
      {
        if( !a8 )
          IopDestroyPassiveInterruptBlock(Vector);
      }
      else
      {
        if( a2 )
        {
          v29 = *(_QWORD *)(*(_QWORD *)(a2 + 312) + 40i64);
          if( !v29 || (*(_DWORD *)(v29 + 396) & 0x20000) != 0 )
          {
            IoAddTriageDumpDataBlock((PVOID)a2, *(unsigned __int16 *)(a2 + 2));
            v38 = *(__int16 **)(a2 + 8);
            if( v38 )
            {
              IoAddTriageDumpDataBlock(v38, (unsigned int)v38[1]);
              v39 = (_WORD *)(*(_QWORD *)(a2 + 8) + 56i64);
              if( *v39 )
              {
                IoAddTriageDumpDataBlock(v39, 2ui64);
                IoAddTriageDumpDataBlock(
                  *(PVOID *)(*(_QWORD *)(a2 + 8) + 64i64),
                  *(unsigned __int16 *)(*(_QWORD *)(a2 + 8) + 56i64));
              }
            }
            v40 = *(PVOID **)(*(_QWORD *)(a2 + 312) + 40i64);
            if( v40 )
            {
              v41 = v40 + 5;
              IoAddTriageDumpDataBlock(v40, 0x310ui64);
              if( *(_WORD *)v41 )
              {
                IoAddTriageDumpDataBlock(v41, 2ui64);
                IoAddTriageDumpDataBlock(v41[1], *(unsigned __int16 *)v41);
              }
              v42 = *(_QWORD *)(a2 + 312);
              v43 = (_WORD *)(*(_QWORD *)(v42 + 40) + 56i64);
              if( *v43 )
              {
                IoAddTriageDumpDataBlock(v43, 2ui64);
                IoAddTriageDumpDataBlock(
                  *(PVOID *)(*(_QWORD *)(*(_QWORD *)(a2 + 312) + 40i64) + 64i64),
                  *(unsigned __int16 *)(*(_QWORD *)(*(_QWORD *)(a2 + 312) + 40i64) + 56i64));
                v42 = *(_QWORD *)(a2 + 312);
              }
              v44 = *(_QWORD *)(*(_QWORD *)(v42 + 40) + 16i64);
              if( v44 )
              {
                v45 = (_WORD *)(v44 + 56);
                if( *v45 )
                {
                  IoAddTriageDumpDataBlock(v45, 2ui64);
                  v46 = *(_QWORD *)(*(_QWORD *)(*(_QWORD *)(a2 + 312) + 40i64) + 16i64);
                  IoAddTriageDumpDataBlock(*(PVOID *)(v46 + 64), *(unsigned __int16 *)(v46 + 56));
                }
              }
            }
            KeBugCheckEx(0xCAu, 2ui64, a2, 0i64, 0i64);
          }
          if( (char)v17 > 0 )
          {
            v30 = v19 + 496;
            v31 = (0x101010101010101i64
                 * ((((v15 - ((v15 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
                   + (((v15 - ((v15 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)
                   + ((((v15 - ((v15 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
                     + (((v15 - ((v15 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 56;
            do
            {
              ObfReferenceObjectWithTag((PVOID)a2, 0x54706E50u);
              *(_QWORD *)(*(_QWORD *)v30 + 280i64) = a2;
              _InterlockedIncrement((volatile signed __int32 *)(*(_QWORD *)(a2 + 312) + 96i64));
              v30 += 8;
              --v31;
            }
            while( v31 );
          }
        }
        v32 = (_OWORD *)*((_QWORD *)v19 + 62);
        v33 = v19 + 112;
        v34 = 2i64;
        do
        {
          *v33 = *v32;
          v33[1] = v32[1];
          v33[2] = v32[2];
          v33[3] = v32[3];
          v33[4] = v32[4];
          v33[5] = v32[5];
          v33[6] = v32[6];
          v33 += 8;
          v35 = v32[7];
          v32 += 8;
          *(v33 - 1) = v35;
          --v34;
        }
        while( v34 );
        v28 = 0;
        *v33 = *v32;
        v33[1] = v32[1];
        *a1 = v19;
        PnpTraceInterruptConnection();
      }
      if( v28 < 0 )
      {
LABEL_33:
        if( (char)v17 > 0 )
        {
          v37 = (_KINTERRUPT **)(v19 + 496);
          do
          {
            if( *v37 )
              KeFreeInterrupt(*v37);
            ++v37;
            --v17;
          }
          while( v17 );
        }
        ExFreePoolWithTag(v19, 0x6E696F49u);
      }
    }
    else
    {
      v28 = -1073741670;
    }
  }
  else
  {
    v28 = -1073741811;
  }
  IopDestroyActiveConnectBlock((volatile INT32 *)result);
  return(unsigned int)v28;
}

Referenced by:

IoConnectInterruptEx
IopConnectInterruptFullySpecified
IopConnectLineBasedInterrupt
IopConnectMessageBasedInterrupt