KiIntSteerConnect

NTSTATUS __stdcall KiIntSteerConnect(
        _KINTERRUPT **InterruptObjectArray,
        UINT64 InterruptObjectCount,
        _INTERRUPT_VECTOR_DATA *VectorData){
  __int64 v3; 
  unsigned int v6; 
  char v7; 
  VOID **PoolWithTag; 
  VOID **v9; 
  _KINTERRUPT **v10; 
  __int64 v11; 
  _QWORD *v12; 
  unsigned __int64 v13; 
  VOID **i; 
  UINT8 v15; 
  int v16; 
  INT64 v17; 
  __int16 v18; 
  unsigned __int16 v19; 
  VOID *v20; 
  bool v21; 
  VOID ***v22; 
  VOID **v23; 
  VOID ***v24; 
  int v26; 
  int v27; 
  __int64 Group; 
  unsigned __int64 Mask; 
  __int64 v30; 
  unsigned __int64 v31; 
  _GROUP_AFFINITY *TargetProcessors; 
  _INTERRUPT_STEERING_MODE OutputSteerMode[18]; 
  unsigned int Gsiv; 
  int v35; 

  v3 = (unsigned int)InterruptObjectCount;
  v35 = 0;
  *(_OWORD *)OutputSteerMode = 0i64;
  if( !qword_140CEC788[0] )
    EtwRegister(
      (_LPCGUID)&INTSTEER_ETW_PROVIDER,
      (PETWENABLECALLBACK)KiIntSteerEventTraceControlCallback,
      0i64,
      qword_140CEC788);
  if( VectorData->Type == InterruptTypeControllerInput )
  {
    Gsiv = VectorData->ControllerInput.Gsiv;
    if( (unsigned __int8)off_140C00780[0]() )
    {
      v7 = 0;
      v27 = ((__int64(__fastcall *)(_INTERRUPT_VECTOR_DATA *, unsigned int *))off_140C00768[0])(VectorData, &Gsiv);
      if( !v27 )
        goto LABEL_32;
    }
    else
    {
      v7 = 1;
      v27 = 0;
    }
    if( v27 < 0 )
      goto LABEL_35;
LABEL_32:
    v6 = Gsiv;
    goto LABEL_6;
  }
  if( VectorData->Type != InterruptTypeMessageRequest )
  {
LABEL_35:
    Group = VectorData->TargetProcessors.Group;
    Mask = VectorData->TargetProcessors.Mask;
    if( KiIntSteerAffinitizedInterrupts.Count <= (unsigned __int16)Group )
      KiIntSteerAffinitizedInterrupts.Count = Group + 1;
    KiIntSteerAffinitizedInterrupts.Bitmap[Group] |= Mask;
    return 0;
  }
  v6 = -1;
  v7 = 1;
  Gsiv = -1;
LABEL_6:
  PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x98ui64, 1802654793i64);
  v9 = PoolWithTag;
  if( PoolWithTag )
  {
    PoolWithTag[4] = InterruptObjectArray;
    *((_DWORD *)PoolWithTag + 6) = v3;
    PoolWithTag[5] = 0i64;
    PoolWithTag[6] = 0i64;
    *((_BYTE *)PoolWithTag + 56) = v7;
    *((_OWORD *)PoolWithTag + 4) = *(_OWORD *)&VectorData->Type;
    *((_OWORD *)PoolWithTag + 5) = *(_OWORD *)&VectorData->Mode;
    *((_OWORD *)PoolWithTag + 6) = *(_OWORD *)&VectorData->TargetProcessors.Group;
    *((_OWORD *)PoolWithTag + 7) = *(_OWORD *)&VectorData->IntRemapInfo.u.MessageAddressLow;
    *((_OWORD *)PoolWithTag + 8) = *(_OWORD *)&VectorData->HvDeviceId;
    PoolWithTag[18] = (VOID *)*((_QWORD *)&VectorData->MessageRequest + 1);
    if( (_DWORD)v3 )
    {
      v10 = InterruptObjectArray;
      v11 = v3;
      do
      {
        v12 = *v10++;
        v12[22] = 0i64;
        v12[24] = 0i64;
        v12[25] = 0i64;
        v12[27] = 0i64;
        v12[21] = v9;
        --v11;
      }
      while( v11 );
    }
    v13 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc(&KiIntTrackSpinlock);
    if( VectorData->Type )
    {
LABEL_11:
      i = ExAllocatePoolWithTag(0x200ui64, 0xD0ui64, 1802654793i64);
      if( i )
      {
        LOBYTE(TargetProcessors) = v7;
        v16 = KiIntSteerChooseInitialTargetProcessors(
                InterruptObjectArray,
                (unsigned int)v3,
                VectorData,
                v15,
                TargetProcessors,
                OutputSteerMode);
        if( v16 >= 0 )
        {
          memset(i, 0i64, 0xD0u);
          i[19] = 0i64;
          v18 = OutputSteerMode[2];
          i[3] = i + 2;
          i[2] = i + 2;
          *((_DWORD *)i + 8) = v6;
          *((_BYTE *)i + 132) = 0;
          v19 = VectorData->TargetProcessors.Group;
          i[17] = 0i64;
          *((_WORD *)i + 72) = v19;
          *((_DWORD *)i + 32) = v35;
          v20 = *(VOID **)OutputSteerMode;
          i[20] = *(VOID **)OutputSteerMode;
          i[22] = v20;
          *((_WORD *)i + 84) = v18;
          *((_WORD *)i + 92) = v18;
          v21 = *((_DWORD *)i + 32) == 2;
          *(_OWORD *)(i + 5) = *(_OWORD *)&VectorData->Type;
          *(_OWORD *)(i + 7) = *(_OWORD *)&VectorData->Mode;
          *(_OWORD *)(i + 9) = *(_OWORD *)&VectorData->TargetProcessors.Group;
          *(_OWORD *)(i + 11) = *(_OWORD *)&VectorData->IntRemapInfo.u.MessageAddressLow;
          *(_OWORD *)(i + 13) = *(_OWORD *)&VectorData->HvDeviceId;
          i[15] = (VOID *)*((_QWORD *)&VectorData->MessageRequest + 1);
          if( v21 )
            i[25] = (*InterruptObjectArray)->RedirectObject;
          v22 = (VOID ***)qword_140C2AED8;
          if( *(ULONG_PTR **)qword_140C2AED8 != &KiIntTrackRootList )
            goto LABEL_47;
          *i = &KiIntTrackRootList;
          i[1] = v22;
          *v22 = i;
          ++KiIntTrackRootCount;
          qword_140C2AED8 = (__int64)i;
          KiIntSteerUpdateDeviceInterruptMask((INT64)(i + 20), 0i64, v17);
          if( *((_DWORD *)i + 32) )
            KiIntSteerSetDestination((ULONG_PTR)i, (_GROUP_AFFINITY *)i + 10);
          v16 = 0;
        }
        if( !v16 )
        {
LABEL_20:
          v9[2] = i;
          v23 = i + 2;
          v24 = (VOID ***)v23[1];
          if( *v24 == v23 )
          {
            *v9 = v23;
            v9[1] = v24;
            *v24 = v9;
            v23[1] = v9;
            KiIntSteerLogState((__int64)v9, (__int64)PPM_ETW_INTERRUPT_STEERING_STATE_CONNECT);
LABEL_22:
            KxReleaseSpinLock(&KiIntTrackSpinlock);
            __writecr8(v13);
            return v16;
          }
LABEL_47:
          __fastfail(3u);
        }
      }
      else
      {
        v16 = -1073741670;
      }
      ExFreePoolWithTag(v9, 0x6B725449u);
      goto LABEL_22;
    }
    for( i = *(VOID ***)&KiIntTrackRootList; ; i = (VOID **)*i )
    {
      if( i == (VOID **)&KiIntTrackRootList )
        goto LABEL_11;
      v26 = *((_DWORD *)i + 8);
      if( v26 != -1 && v26 == v6 )
        break;
    }
    if( *((_DWORD *)i + 32) == 2 )
    {
      *((_BYTE *)i[25] + 16) = 0;
      *((_DWORD *)i + 32) = 0;
      *((_BYTE *)i + 132) = 0;
      v30 = VectorData->TargetProcessors.Group;
      v31 = VectorData->TargetProcessors.Mask;
      if( KiIntSteerAffinitizedInterrupts.Count <= (unsigned __int16)v30 )
        KiIntSteerAffinitizedInterrupts.Count = v30 + 1;
      KiIntSteerAffinitizedInterrupts.Bitmap[v30] |= v31;
    }
    v16 = 0;
    goto LABEL_20;
  }
  return -1073741670;
}

Referenced by:

KeConnectInterrupt