HalpInterruptSendIpi

__int64 __fastcall HalpInterruptSendIpi(_DWORD *a1, unsigned int a2){
  int v4; 
  _KAFFINITY_EX *p_Affinity; 
  __int64 v6; 
  __int64(__fastcall *v7)(_QWORD, int *, __int128 *, _QWORD, int *); 
  __int64 result; 
  int v9; 
  unsigned int v10; 
  unsigned __int16 Count; 
  unsigned __int16 i; 
  __int64 v13; 
  __int64 v14; 
  __int16 v15; 
  unsigned __int64 v16; 
  unsigned __int16 v17; 
  unsigned __int64 v18; 
  __int64 v19; 
  unsigned __int64 v20; 
  __int64 v21; 
  __int64(__fastcall *v22)(_QWORD, int *, __int128 *, _QWORD, int *); 
  int v23; 
  unsigned int *v24; 
  int v25; 
  unsigned __int64 Mask; 
  unsigned __int8 v27; 
  __int64(__fastcall *v28)(_QWORD, int *, __int128 *, _QWORD, int *); 
  int v29; 
  INT64 v30; 
  INT64 v31; 
  __int64 v32; 
  __int64 v33; 
  unsigned __int64 v34; 
  __int64(__fastcall *v35)(_QWORD, int *, __int128 *, _QWORD, int *); 
  int v36; 
  _PROCESSOR_NUMBER ProcNumber; 
  __int128 v38; 
  __int64 v39; 
  int v40[2]; 
  int v41[2]; 
  int v42[2]; 
  int v43[2]; 
  int v44[2]; 
  int v45[2]; 
  int v46[2]; 
  int v47[2]; 
  __int128 v48; 
  __int64 v49; 
  _GROUP_AFFINITY Result; 
  _KAFFINITY_EX Affinity; 
  unsigned __int16 v52; 
  __int16 v53[87]; 
  int v54; 

  memset(&Affinity, 0i64, sizeof(Affinity));
  v4 = *a1;
  p_Affinity = &Affinity;
  v49 = 0i64;
  v48 = 0i64;
  switch( v4 )
  {
    case 6:
      v6 = 3i64 * (unsigned int)a1[2];
      v48 = *(_OWORD *)(qword_140C50630 + 24i64 * (unsigned int)a1[2]);
      v49 = *(_QWORD *)(qword_140C50630 + 8 * v6 + 16);
      break;
    case 2:
    case 1:
      p_Affinity = (_KAFFINITY_EX *)*((_QWORD *)a1 + 1);
      if( v4 == 1 )
      {
        *(_DWORD *)&Affinity.Count = 1310721;
        memset(&Affinity.Reserved, 0i64, 0xA4u);
        v32 = LOWORD(p_Affinity->Bitmap[0]);
        v33 = *(_QWORD *)&p_Affinity->Count;
        if( (_WORD)v32 )
          Affinity.Count = v32 + 1;
        Affinity.Bitmap[v32] |= v33;
        p_Affinity = &Affinity;
      }
      goto LABEL_7;
    case 3:
      if( (*(_DWORD *)(Controller + 220) & 0x10) == 0 || HalpInterruptNoShorthand )
      {
        KeCopyAffinityEx(&Affinity, &KeActiveProcessors);
        goto LABEL_7;
      }
      LODWORD(v48) = 1;
      break;
    case 4:
      if( (*(_DWORD *)(Controller + 220) & 0x20) != 0 && !HalpInterruptNoShorthand )
      {
        LODWORD(v48) = 2;
        break;
      }
      KeCopyAffinityEx(&Affinity, &KeActiveProcessors);
      LODWORD(v31) = KeGetPcr()->Prcb.Number;
      KeRemoveProcessorAffinityEx(&Affinity.Count, v31);
LABEL_7:
      Result = 0i64;
      memset(v53, 0i64, 0xA6u);
      v9 = 0;
      v39 = 0i64;
      v10 = 0;
      v38 = 0i64;
      if( qword_140C4A1E8 )
      {
        return(unsigned int)qword_140C4A1E8(p_Affinity, a2);
      }
      else
      {
        Count = dword_140C4B7A0.Count;
        if( dword_140C4B7A0.Count >= p_Affinity->Count )
          Count = p_Affinity->Count;
        v52 = Count;
        for( i = 0; i < v52; *(_QWORD *)&v53[4 * v13 + 3] = qword_140C4B7A8[v13] & p_Affinity->Bitmap[v13] )
          v13 = i++;
        v53[0] = 20;
        *(_DWORD *)&v53[1] = 0;
        if( i < 0x14u )
        {
          do
          {
            v14 = i++;
            *(_QWORD *)&v53[4 * v14 + 3] = 0i64;
          }
          while( i < (unsigned int)v53[0] );
        }
        v15 = v54;
        if( *(&CmpDummyThreadEvent + 7160) )
        {
          v24 = (unsigned int *)*(&stru_140CF2E80 + 808);
          ProcNumber = 0;
          if( *(&stru_140CF2E80 + 808) < *(&stru_140CF2E80 + 809) )
          {
            do
            {
              KeAndGroupAffinityEx(p_Affinity, (_GROUP_AFFINITY *)(v24 + 2), &Result);
              if( v25 )
              {
                Mask = Result.Mask;
                v27 = 0;
                LODWORD(v38) = 6;
                *((_QWORD *)&v38 + 1) = *v24;
                ProcNumber.Group = Result.Group;
                for( ProcNumber.Number = 0; Mask; ProcNumber.Number = v27 )
                {
                  if( (Mask & 1) != 0 )
                  {
                    v9 |= *(_DWORD *)(qword_140C50630
                                    + 24i64 * (unsigned int)KeGetProcessorIndexFromNumber(&ProcNumber.Group)
                                    + 12);
                    HIDWORD(v38) = v9;
                  }
                  ++v27;
                  Mask >>= 1;
                }
                v40[0] = -1;
                v40[1] = 1;
                v41[1] = *(_DWORD *)(qword_140C50700 + 20);
                v41[0] = *(_DWORD *)(qword_140C50700 + 16);
                v28 = *(__int64(__fastcall **)(_QWORD, int *, __int128 *, _QWORD, int *))(Controller + 120);
                _disable();
                v29 = v28(*(_QWORD *)(Controller + 16), v41, &v38, a2, v40);
                v10 = v29;
                if( (v15 & 0x200) != 0 )
                  _enable();
                if( v29 < 0 )
                  return v10;
                v9 = 0;
              }
              v24 += 6;
            }
            while( (unsigned __int64)v24 < *(&stru_140CF2E80 + 809) );
          }
        }
        else if( !*(&stru_140CF2E80 + 6616) )
        {
          v16 = p_Affinity->Bitmap[0];
          v17 = 0;
          LODWORD(v38) = 5;
          DWORD2(v38) = 0;
          while( v16 )
          {
LABEL_18:
            _BitScanForward64(&v18, v16);
            v16 &= ~(1i64 << v18);
            v19 = (unsigned __int8)v18 + (v17 << 6);
            if( *(_DWORD *)(qword_140C50630 + 24i64 * (unsigned int)KiProcessorNumberToIndexMappingTable[v19]) == 5 )
              DWORD2(v38) |= *(_DWORD *)(qword_140C50630
                                       + 24i64 * (unsigned int)KiProcessorNumberToIndexMappingTable[v19]
                                       + 8);
          }
          while( ++v17 < p_Affinity->Count )
          {
            v16 = p_Affinity->Bitmap[v17];
            if( v16 )
              goto LABEL_18;
          }
          if( DWORD2(v38) )
          {
            v42[0] = -1;
            v42[1] = 1;
            v43[1] = *(_DWORD *)(qword_140C50700 + 20);
            v43[0] = *(_DWORD *)(qword_140C50700 + 16);
            v22 = *(__int64(__fastcall **)(_QWORD, int *, __int128 *, _QWORD, int *))(Controller + 120);
            _disable();
            v23 = v22(*(_QWORD *)(Controller + 16), v43, &v38, a2, v42);
            v10 = v23;
            if( (v15 & 0x200) != 0 )
              _enable();
            if( v23 < 0 )
              return v10;
          }
        }
        v20 = *(_QWORD *)&v53[3];
        LOWORD(v21) = 0;
        while( v20 )
        {
LABEL_66:
          _BitScanForward64(&v34, v20);
          LODWORD(v38) = 4;
          v20 &= ~(1i64 << v34);
          DWORD2(v38) = *(_DWORD *)(qword_140C50630
                                  + 24i64
                                  * (unsigned int)KiProcessorNumberToIndexMappingTable[64 * (unsigned __int16)v21
                                                                                     + (unsigned __int8)v34]
                                  + 8);
          v45[1] = *(_DWORD *)(qword_140C50700 + 20);
          v45[0] = *(_DWORD *)(qword_140C50700 + 16);
          v35 = *(__int64(__fastcall **)(_QWORD, int *, __int128 *, _QWORD, int *))(Controller + 120);
          v44[0] = -1;
          v44[1] = 1;
          _disable();
          v36 = v35(*(_QWORD *)(Controller + 16), v45, &v38, a2, v44);
          v10 = v36;
          if( (v15 & 0x200) != 0 )
            _enable();
          if( v36 < 0 )
            return v10;
        }
        while( 1 )
        {
          v21 = (unsigned __int16)(v21 + 1);
          if( (unsigned int)v21 >= v52 )
            break;
          v20 = *(_QWORD *)&v53[4 * v21 + 3];
          if( v20 )
            goto LABEL_66;
        }
      }
      return v10;
    case 5:
      if( (*(_DWORD *)(Controller + 220) & 0x40) == 0 || HalpInterruptNoShorthand )
      {
        *(_DWORD *)&Affinity.Count = 1310721;
        memset(&Affinity.Reserved, 0i64, 0xA4u);
        LODWORD(v30) = KeGetPcr()->Prcb.Number;
        KeAddProcessorAffinityEx(&Affinity.Count, v30);
        goto LABEL_7;
      }
      LODWORD(v48) = 3;
      break;
    default:
      return 3221225485i64;
  }
  v46[0] = -1;
  v46[1] = 1;
  v47[1] = *(_DWORD *)(qword_140C50700 + 20);
  v47[0] = *(_DWORD *)(qword_140C50700 + 16);
  v7 = *(__int64(__fastcall **)(_QWORD, int *, __int128 *, _QWORD, int *))(Controller + 120);
  _disable();
  result = v7(*(_QWORD *)(Controller + 16), v47, &v48, a2, v46);
  if( (v54 & 0x200) != 0 )
    _enable();
  return result;
}

Referenced by:

HalRequestDeferredRecoveryServiceInterrupt
HalRequestIpiSpecifyVector
HalSendSoftwareInterrupt
KiDeferredReadySingleThread
KiForwardTick
KiInsertQueueDpc