HalpInterruptDestinationToTarget

__int64 __fastcall HalpInterruptDestinationToTarget(__int64 a1, __int64 a2, __int64 a3){
  unsigned int v3; 
  __int64 *v5; 
  unsigned __int8 v6; 
  __int64 v7; 
  unsigned int ProcessorIndexFromNumber; 
  __int64 v9; 
  __int64 v10; 
  int v11; 
  __int64 v13; 
  __int64 v14; 
  __int64 ProcNumber; 

  ProcNumber = a1;
  v3 = 0;
  *(_DWORD *)a3 = 0;
  switch( *(_DWORD *)a2 )
  {
    case 1:
      v5 = *(__int64 **)(a2 + 8);
      v6 = 0;
      LODWORD(ProcNumber) = 0;
      v7 = *v5;
      LOWORD(ProcNumber) = *((_WORD *)v5 + 4);
      while( 1 )
      {
        if( !v7 )
          return v3;
        if( _bittest64(&v7, v6) )
        {
          v7 &= ~(1i64 << v6);
          ProcessorIndexFromNumber = KeGetProcessorIndexFromNumber((UINT16 *)&ProcNumber);
          v9 = qword_140C50630;
          v10 = 3i64 * ProcessorIndexFromNumber;
          v11 = *(_DWORD *)(qword_140C50630 + 24i64 * ProcessorIndexFromNumber);
          switch( v11 )
          {
            case 4:
              *(_DWORD *)a3 = 4;
              goto LABEL_9;
            case 5:
              if( *(_DWORD *)a3 != 5 )
              {
                *(_DWORD *)a3 = 5;
LABEL_9:
                *(_DWORD *)(a3 + 8) = *(_DWORD *)(v9 + 8 * v10 + 8);
                break;
              }
              *(_DWORD *)(a3 + 8) |= *(_DWORD *)(qword_140C50630 + 8 * v10 + 8);
              break;
            case 6:
              if( *(_DWORD *)a3 == 6 && *(_DWORD *)(a3 + 8) == *(_DWORD *)(qword_140C50630 + 8 * v10 + 8) )
              {
                *(_DWORD *)(a3 + 12) |= *(_DWORD *)(qword_140C50630 + 8 * v10 + 12);
              }
              else
              {
                *(_DWORD *)a3 = 6;
                *(_DWORD *)(a3 + 8) = *(_DWORD *)(v9 + 8 * v10 + 8);
                *(_DWORD *)(a3 + 12) = *(_DWORD *)(v9 + 8 * v10 + 12);
              }
              break;
            default:
              *(_DWORD *)a3 = 3;
              break;
          }
        }
        BYTE2(ProcNumber) = ++v6;
      }
    case 3:
      *(_DWORD *)a3 = 1;
      break;
    case 4:
      *(_DWORD *)a3 = 2;
      break;
    case 5:
      *(_DWORD *)a3 = 3;
      break;
    case 6:
      v13 = 3i64 * *(unsigned int *)(a2 + 8);
      v14 = qword_140C50630;
      *(_OWORD *)a3 = *(_OWORD *)(qword_140C50630 + 24i64 * *(unsigned int *)(a2 + 8));
      *(_QWORD *)(a3 + 16) = *(_QWORD *)(v14 + 8 * v13 + 16);
      break;
    default:
      return(unsigned int)-1073741811;
  }
  return v3;
}

Referenced by:

HalpInterruptEnableNmi
HalpInterruptGenerateMessage
HalpInterruptRemap
HalpInterruptSetDestinationInternal
HalpInterruptSetLineState
HalpInterruptSetRemappedDestination