KiIpiSendRequest

void __fastcall KiIpiSendRequest(__int64 a1, int a2, unsigned __int16 *a3, _OWORD *a4, __int64 a5){
  int v6; 
  __int64 v7; 
  unsigned __int16 *v8; 
  unsigned __int16 *v9; 
  unsigned __int16 v10; 
  __int64 v11; 
  __int64 v12; 
  _OWORD *v13; 
  int v14; 
  __int64 v15; 
  int v16; 
  int v17; 
  int v18; 
  unsigned int v19; 
  __int64 v20; 
  __int64 v21; 
  unsigned __int64 v22; 
  _QWORD *v23; 
  int v24; 
  unsigned __int64 v25; 
  __int64 v26; 
  __int64 v27; 
  signed __int64 *v28; 
  signed __int64 v29; 
  signed __int64 v30; 
  unsigned int v31; 
  unsigned int v32; 
  __int64 v33; 
  unsigned __int16 *v34; 
  __int64 v35; 
  __int64 v36; 
  int v37; 
  int v38; 
  int v39; 
  int v40; 
  unsigned int v41; 
  __int64 v42; 
  unsigned __int16 v43; 
  unsigned __int64 v46; 
  INT64 v47[2]; 
  __int128 v48; 
  __int128 v49; 
  v6 = a2;
  v7 = a1;
  *(_OWORD *)v47 = 0i64;
  v48 = 0i64;
  v8 = (unsigned __int16 *)(a1 + 12040);
  v9 = (unsigned __int16 *)(a1 + 12208);
  if( a2 )
  {
    KeCopyAffinityEx(a1 + 12040, &KeActiveProcessors.Count);
    if( v6 == 1 )
      KeRemoveProcessorAffinityEx((unsigned __int16 *)(v7 + 12040), *(_DWORD *)(v7 + 36));
    v12 = a5;
    if( (a5 & 0x80000000) != 0 )
    {
      LODWORD(v12) = a5 & 0x7FFFFFFF;
      if( !(unsigned int)KeIsEmptyAffinityEx(&KeSleepingProcessors) )
      {
        v6 = 0;
        KeSubtractAffinityEx((_KAFFINITY_EX *)(v7 + 12040), &KeSleepingProcessors, (_KAFFINITY_EX *)(v7 + 12040));
      }
    }
  }
  else
  {
    *v8 = *a3;
    *(_WORD *)(a1 + 12042) = a3[1];
    v10 = 0;
    for( *(_DWORD *)(a1 + 12044) = 0; v10 < *a3; *(_QWORD *)&v8[4 * v11 + 4] = *(_QWORD *)&a3[4 * v11 + 4] )
      v11 = v10++;
    v12 = a5;
  }
  v13 = a4;
  v14 = (unsigned __int16)KeNumberNodes;
  *(_DWORD *)(v7 + 11652) = (unsigned __int16)KeNumberNodes;
  v15 = v12 & 0xF | ((_QWORD)v13 << 7);
  v41 = *(_DWORD *)(v7 + 36);
  *(_DWORD *)(v7 + 11648) = 1;
  *(_QWORD *)v9 = 1310721i64;
  memset(v7 + 12216, 0i64);
  v40 = 0;
  v16 = 0;
  v39 = 0;
  v17 = 0;
  v38 = 0;
  v18 = 0;
  v19 = 0;
  if( v14 )
  {
    do
    {
      v49 = 0i64;
      v20 = *((_QWORD *)&KeNodeBlock + v19);
      v21 = *(unsigned __int16 *)(v20 + 144);
      if( *v8 > (unsigned __int16)v21 && (v22 = *(_QWORD *)(v20 + 136) & *(_QWORD *)&v8[4 * v21 + 4], (v46 = v22) != 0) )
      {
        v23 = 0i64;
        v43 = *(_WORD *)(v20 + 144);
        v24 = v43;
        while( v22 )
        {
LABEL_10:
          v24 = v43;
          _BitScanForward64(&v25, v22);
          v42 = v22 & ~(1i64 << v25);
          v26 = (unsigned int)KiProcessorNumberToIndexMappingTable[64 * v43 + (unsigned __int8)v25];
          v27 = (__int64)*(&KiProcessorBlock + v26);
          _m_prefetchw((const void *)(v27 + 35904));
          v28 = (signed __int64 *)(v27 + ((v41 + 699i64) << 6));
          _m_prefetchw(v28);
          if( !v23 )
          {
            v23 = v28 + 7;
            *((_DWORD *)v28 + 14) = (unsigned int)((0x101010101010101i64
                                                  * ((((v46 - ((v46 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
                                                    + (((v46 - ((v46 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)
                                                    + ((((v46 - ((v46 >> 1) & 0x5555555555555555i64)) & 0x3333333333333333i64)
                                                      + (((v46 - ((v46 >> 1) & 0x5555555555555555i64)) >> 2) & 0x3333333333333333i64)) >> 4)) & 0xF0F0F0F0F0F0F0Fi64)) >> 32) >> 24;
          }
          v28[6] = (signed __int64)v23;
          if( v12 == 5 )
          {
            *((_OWORD *)v28 + 1) = *a4;
            *((_OWORD *)v28 + 2) = a4[1];
          }
          v28[1] = v15;
          v29 = *(_QWORD *)(v27 + 35904);
          do
          {
            v30 = v29;
            *v28 = v29;
            v29 = _InterlockedCompareExchange64((volatile signed __int64 *)(v27 + 35904), (signed __int64)v28, v29);
          }
          while( v29 != v30 );
          if( v29 )
          {
            v38 = 1;
          }
          else
          {
            v31 = KiProcessorIndexToNumberMappingTable[v26];
            v32 = v31 & 0x3F;
            v33 = v31 >> 6;
            v39 = 1;
            if( *v9 <= (unsigned int)v33 )
              *v9 = v33 + 1;
            v34 = &v9[4 * v33];
            v35 = *((_QWORD *)v34 + 1);
            _bittestandset64(&v35, v32);
            *((_QWORD *)v34 + 1) = v35;
          }
          v36 = *(_QWORD *)(v27 + 33976);
          if( v36 )
            _InterlockedIncrement((volatile signed __int32 *)(v36 + 32));
          v22 = v42;
        }
        while( ++v43 < (unsigned int)(v24 + 1) )
        {
          v22 = *(_QWORD *)(8i64 * v43 + 8);
          if( v22 )
            goto LABEL_10;
        }
        v18 = v40;
      }
      else
      {
        v40 = ++v18;
      }
      ++v19;
    }
    while( v19 < (unsigned __int16)KeNumberNodes );
    v7 = a1;
    if( v18 && _InterlockedExchangeAdd((volatile signed __int32 *)(a1 + 11652), -v18) == v18 )
    {
      *(_DWORD *)(a1 + 11648) = 0;
      return;
    }
    v16 = v39;
    v17 = v38;
  }
  if( v12 != 5 && v17 )
  {
    if( v16 )
    {
      ++*(_DWORD *)(v7 + 34000);
      KiIpiEnlightenedGuestPriorityKick((INT64)v9);
      HalRequestIpi(0, v9);
    }
  }
  else
  {
    if( (unsigned int)(v6 - 1) <= 1 )
      ++*(_DWORD *)(v7 + 33996);
    else
      ++*(_DWORD *)(v7 + 34000);
    KiIpiEnlightenedGuestPriorityKick((INT64)v8);
    v37 = HalRequestIpiSpecifyVector(v6, v8, 0xE1u);
    if( v37 < 0 )
      KeBugCheckEx(0x5Cu, 0x201ui64, HalpInterruptController, v37, v6);
  }
}

Referenced by:

KeFlushMultipleRangeTb
KiIpiSendPacket
KiIpiSendRequestEx
KxFlushEntireTb