KiIntSteerCalculateDistribution
NTSTATUS __stdcall KiIntSteerCalculateDistribution(_KAFFINITY_EX *IntSteerMask, UINT64 ProcessorCount){
unsigned __int64 v3;
unsigned int v4;
__int64 v5;
void *v6;
unsigned __int64 v7;
void *v8;
unsigned int v9;
unsigned int v10;
signed __int64 v11;
unsigned int v12;
unsigned __int64 v13;
__int64 v14;
unsigned __int64 v15;
__int64 v16;
signed __int64 v17;
void *v18;
INT64 *v19;
void *v20;
unsigned int v21;
__int64 i;
unsigned __int64 v23;
int v24;
int v25;
INT64 *v26;
__int64 v27;
INT64 v28;
__int64 v30;
unsigned int v31;
unsigned int v32;
INT64 *Base;
INT64 **p_Base;
UINT64 v35;
v3 = 4i64 * (unsigned int)ProcessorCount;
v4 = ProcessorCount;
v5 = v3 + 15;
if( v3 + 15 <= v3 )
v5 = 0xFFFFFFFFFFFFFF0i64;
v11 = v5 & 0xFFFFFFFFFFFFFFF0ui64;
v6 = alloca(v11);
v7 = IntSteerMask->Bitmap[0];
v8 = alloca(v11);
v9 = 0;
v10 = 0;
LOWORD(v11) = 0;
p_Base = &Base;
while( 1 )
{
v12 = IntSteerMask ? IntSteerMask->Count : (unsigned __int16)v11 + 1;
if( !v7 )
break;
LABEL_7:
_BitScanForward64(&v13, v7);
v7 &= ~(1i64 << v13);
v14 = v10++;
*((_DWORD *)&Base + v14) = KiProcessorNumberToIndexMappingTable[64 * (unsigned __int16)v11 + (unsigned __int8)v13];
}
while( 1 )
{
v11 = (unsigned __int16)(v11 + 1);
if( (unsigned int)v11 >= v12 )
break;
v7 = IntSteerMask->Bitmap[v11];
if( v7 )
goto LABEL_7;
}
v15 = 8i64 * (unsigned int)KiIntTrackRootCount;
v16 = v15 + 15;
if( v15 + 15 <= v15 )
v16 = 0xFFFFFFFFFFFFFF0i64;
v17 = v16 & 0xFFFFFFFFFFFFFFF0ui64;
v18 = alloca(v17);
v19 = *(INT64 **)&KiIntTrackRootList;
v20 = alloca(v17);
v21 = 0;
for( i = (unsigned int)(KiIntTrackRootCount - 1); v19 != (INT64 *)&KiIntTrackRootList; v19 = (INT64 *)*v19 )
{
if( v19[24] )
{
v30 = v21++;
(&Base)[v30] = v19;
}
else
{
(&Base)[i] = v19;
i = (unsigned int)(i - 1);
}
}
qsort((UINT64)&Base, v21, 8ui64, (INT64)KiIntSteerLoadCompare, Base, (UINT64)p_Base, v35);
v24 = 0;
v25 = 1;
if( KiIntTrackRootCount )
{
do
{
v26 = (&Base)[v9];
if( *((_BYTE *)v26 + 132)
&& (!v26[17] || KiIntSteerComputeCpuSet((_INTERRUPT_TRACKING_ROOT *)(&Base)[v9], v23) < 0) )
{
if( v26[24]
|| ((v27 = *((unsigned __int16 *)v26 + 84), v28 = v26[20], IntSteerMask->Count <= (unsigned __int16)v27) ? (v23 = 0i64) : (v23 = v28 & IntSteerMask->Bitmap[v27]),
v23 != v28) )
{
LODWORD(v23) = KiProcessorIndexToNumberMappingTable[*((unsigned int *)p_Base + (unsigned int)v24)];
*(_DWORD *)((char *)v26 + 186) = 0;
*((_WORD *)v26 + 95) = 0;
v31 = (unsigned int)v23 >> 6;
LOBYTE(v23) = v23 & 0x3F;
*((_WORD *)v26 + 92) = v31;
v26[22] = 1i64 << v23;
v32 = v24 + v25;
if( v24 + v25 >= v4 )
v25 = -1;
v24 = v4 - 1;
if( v32 < v4 )
v24 = v32;
if( v24 < 0 )
{
v25 = 1;
v24 = 0;
}
}
else
{
v26[22] = v28;
}
}
++v9;
}
while( v9 < KiIntTrackRootCount );
}
return 0;
}Referenced by:
KeIntSteerPeriodic