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