KiAdjustGroupConfiguration
CHAR __fastcall KiAdjustGroupConfiguration(INT64 a1){
__int64 v2;
unsigned __int16 v3;
__int64 v4;
INT64 *v5;
int v6;
UINT8 *v7;
UINT8 *v8;
__int64 v9;
__int64 v10;
unsigned __int16 v11;
__int64 v12;
unsigned __int16 v13;
int v14;
int v15;
unsigned int v16;
__int64 v17;
int *v18;
int v19;
UINT8 *v20;
__int64 v21;
__int64 v22;
char v23;
__int64 v24;
__int64 v25;
__int64 v26;
unsigned __int16 v27;
__int64 v28;
__int64 *v29;
__int64 v30;
__int64 v31;
__int64 *v32;
__int64 v33;
__int64 v34;
char v35;
unsigned __int16 v36;
unsigned int v37;
unsigned __int16 i;
__int64 v39;
__int16 v40;
unsigned __int16 v41;
unsigned int v42;
__int64 *v43;
__int64 v44;
INT64 v46[10];
int Src[20];
__int64 result[64];
memset((INT64)result, 0i64);
LOBYTE(v2) = memset((INT64)v46, 0i64);
if( (*(_BYTE *)(a1 + 181) & 8) == 0 && !*(_QWORD *)(a1 + 136) )
{
v3 = *(_WORD *)(a1 + 144);
if( v3 >= (unsigned __int16)KiActiveGroups )
{
if( KiMaximumGroups )
{
v4 = (unsigned __int16)KiMaximumGroups;
v5 = v46;
v6 = KiMaximumGroupSize;
while( v4 )
{
*(_DWORD *)v5 = v6;
v5 = (INT64 *)((char *)v5 + 4);
--v4;
}
}
v7 = &KeNodeBlock;
if( KeNumberNodes )
{
v8 = &KeNodeBlock;
v9 = (unsigned __int16)KeNumberNodes;
do
{
if( (*(_BYTE *)(*(_QWORD *)v8 + 181i64) & 2) != 0 )
*((_DWORD *)v46 + *(unsigned __int16 *)(*(_QWORD *)v8 + 144i64)) -= *(unsigned __int8 *)(*(_QWORD *)v8 + 180i64);
v8 += 8;
--v9;
}
while( v9 );
}
v10 = (unsigned __int16)KeNumberNodes;
v11 = 0;
if( KeNumberNodes )
{
while( 1 )
{
v12 = *((_QWORD *)&KeNodeBlock + v11);
if( (*(_BYTE *)(v12 + 181) & 0xA) == 2 && !*(_QWORD *)(v12 + 136) )
{
v13 = *(_WORD *)(v12 + 144);
if( v13 < (unsigned __int16)KiActiveGroups )
{
v14 = *(unsigned __int8 *)(v12 + 180);
v15 = *(unsigned __int8 *)(a1 + 180);
v16 = v14 - v15;
if( (unsigned __int8)v14 <= (unsigned __int8)v15 )
v16 = *(unsigned __int8 *)(a1 + 180) - v14;
LOWORD(v2) = v3;
if( (unsigned __int8)v14 <= (unsigned __int8)v15 )
LOWORD(v2) = *(_WORD *)(v12 + 144);
if( *((_DWORD *)v46 + (unsigned __int16)v2) >= v16 )
break;
}
}
if( ++v11 >= (unsigned __int16)KeNumberNodes )
goto LABEL_23;
}
*(_WORD *)(v12 + 144) = v3;
*(_BYTE *)(v12 + 181) &= ~4u;
*(_BYTE *)(a1 + 181) |= 4u;
*(_WORD *)(a1 + 144) = v13;
}
else
{
LABEL_23:
if( KiMaximumGroups )
{
v17 = (unsigned __int16)KiMaximumGroups;
v18 = Src;
v19 = KiMaximumGroupSize;
while( v17 )
{
*v18++ = v19;
--v17;
}
}
if( (_WORD)v10 )
{
v20 = &KeNodeBlock;
v21 = v10;
do
{
v22 = *(_QWORD *)v20;
v23 = *(_BYTE *)(*(_QWORD *)v20 + 181i64);
if( (v23 & 2) != 0 && ((v23 & 8) != 0 || *(_QWORD *)(v22 + 136)) )
Src[*(unsigned __int16 *)(v22 + 144)] -= *(unsigned __int8 *)(v22 + 180);
v20 += 8;
--v21;
}
while( v21 );
}
LOBYTE(v2) = KeNumberNodes;
LOWORD(v24) = 0;
if( KeNumberNodes )
{
v25 = (unsigned __int16)KeNumberNodes;
do
{
v26 = *(_QWORD *)v7;
LOBYTE(v2) = *(_BYTE *)(*(_QWORD *)v7 + 181i64) & 0xA;
if( (_BYTE)v2 == 2 && !*(_QWORD *)(v26 + 136) )
{
v2 = (unsigned __int16)v24;
LOWORD(v24) = v24 + 1;
result[v2] = v26;
}
v7 += 8;
--v25;
}
while( v25 );
}
if( (unsigned __int16)v24 - 1 > 0 )
{
v27 = 1;
do
{
if( v27 < (unsigned __int16)v24 )
{
v28 = (unsigned __int16)(v27 - 1);
v29 = &result[v27];
v30 = (unsigned __int16)(v24 - v27);
do
{
v31 = result[v28];
if( *(_BYTE *)(v31 + 180) < *(_BYTE *)(*v29 + 180) )
{
result[v28] = *v29;
*v29 = v31;
}
++v29;
--v30;
}
while( v30 );
}
LODWORD(v2) = v27++;
}
while( (int)v2 < (unsigned __int16)v24 - 1 );
}
if( (_WORD)v24 )
{
v32 = result;
v33 = (unsigned __int16)v24;
do
{
v34 = *v32++;
LOWORD(v2) = *(_WORD *)(v34 + 144);
*(_WORD *)(v34 + 146) = v2;
--v33;
}
while( v33 );
}
v35 = 0;
v36 = 0;
if( KiActiveGroups )
{
while( 1 )
{
if( KiMaximumGroups )
memmove((UINT8 *)v46, (UINT8 *)Src, 4i64 * (unsigned __int16)KiMaximumGroups);
v37 = *(unsigned __int8 *)(a1 + 180);
LODWORD(v2) = *((_DWORD *)v46 + v36);
if( (unsigned int)v2 >= v37 )
{
LODWORD(v2) = v2 - v37;
*(_WORD *)(a1 + 144) = v36;
*((_DWORD *)v46 + v36) = v2;
for( i = 0; i < (unsigned __int16)v24; ++i )
{
LOBYTE(v2) = i;
v39 = result[i];
if( v39 != a1 )
{
v40 = KiMaximumGroups;
v41 = 0;
if( KiMaximumGroups )
{
LODWORD(v2) = *(unsigned __int8 *)(v39 + 180);
while( 1 )
{
v42 = *((_DWORD *)v46 + v41);
if( v42 >= (unsigned int)v2 )
break;
if( ++v41 >= (unsigned __int16)KiMaximumGroups )
goto LABEL_64;
}
*(_WORD *)(v39 + 144) = v41;
LODWORD(v2) = *(unsigned __int8 *)(v39 + 180);
*((_DWORD *)v46 + v41) = v42 - v2;
}
LABEL_64:
if( v41 == v40 )
break;
}
}
if( i == (_WORD)v24 )
break;
}
if( ++v36 >= (unsigned __int16)KiActiveGroups )
goto LABEL_70;
}
v35 = 1;
}
LABEL_70:
if( (_WORD)v24 )
{
v43 = result;
v24 = (unsigned __int16)v24;
do
{
v44 = *v43;
if( v35 )
{
LOBYTE(v2) = (*(_WORD *)(v44 + 144) < (unsigned __int16)KiActiveGroups ? 4 : 0) | *(_BYTE *)(v44 + 181) & 0xFB;
*(_BYTE *)(v44 + 181) = v2;
}
else
{
LOWORD(v2) = *(_WORD *)(v44 + 146);
*(_WORD *)(v44 + 144) = v2;
}
++v43;
*(_WORD *)(v44 + 146) = 0;
--v24;
}
while( v24 );
}
}
}
}
return v2;
}Referenced by:
KiStartDynamicProcessor