KiConfigureSchedulingInformation
INT64 __fastcall KiConfigureSchedulingInformation(VOID **Sid){
char v1;
unsigned int v2;
char v3;
VOID **v4;
VOID *v5;
__int64 v6;
unsigned int v7;
unsigned __int64 v8;
VOID *v9;
_WORD *v10;
unsigned int v11;
unsigned __int8 CurrentIrql;
USHORT v13;
_BYTE *v14;
int v15;
unsigned int v16;
unsigned int v17;
__int64 v18;
int v19;
int v20;
__int64 v21;
__int64 v22;
char v23;
char v24;
__int64 v25;
__int64 v26;
char v27;
unsigned __int64 v28;
unsigned int v30;
unsigned int v31;
struct _GROUP_AFFINITY Affinity;
unsigned __int16 *v33;
unsigned __int64 Mask;
unsigned __int16 Group;
int v36;
__int16 v37;
USHORT Count;
unsigned int v40;
unsigned int v41;
v2 = *((_DWORD *)Sid + 8389);
v36 = 0;
v37 = 0;
v3 = v1;
Count = 0;
v4 = Sid;
v40 = 0;
Affinity = 0i64;
if( v2 )
{
v5 = Sid[v2 + 4237];
Sid[4237] = v5;
}
else
{
v5 = Sid[4237];
}
if( !v5 )
Sid[4237] = Sid[25];
LODWORD(v6) = *((unsigned __int8 *)Sid + 209);
v7 = 0;
v41 = 0;
if( v2 )
{
v8 = ~(unsigned __int64)Sid[4235];
while( (v8 & (unsigned __int64)Sid[v7 + 4238]) == 0 )
{
v41 = ++v7;
if( v7 >= v2 )
goto LABEL_12;
}
v9 = Sid[v7 + 4238];
_BitScanForward64((unsigned __int64 *)&v6, (unsigned __int64)v9);
v4[4236] = v9;
}
LABEL_12:
v10 = v4[24];
*((_DWORD *)v4 + 8469) = v6;
if( !v3 && *((_DWORD *)v4 + 9) == *((_DWORD *)v10 + 43) )
{
v11 = KiMaximumSharedReadyQueueSize;
if( !KiMaximumSharedReadyQueueSize )
v11 = 1;
if( (v11 & 0x100) != 0 )
{
v11 &= ~0x100u;
if( (unsigned int)KeDoesSystemHaveHeterogeneousCoreTypes() )
v11 *= 2;
}
if( v11 > 0x40 )
v11 = 64;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
v13 = v10[73];
*((_QWORD *)v10 + 19) = 0i64;
KeQueryNodeActiveAffinity(v13, &Affinity, &Count);
v14 = v4[4233];
v15 = 0;
v33 = 0i64;
v16 = (v11 + Count - 1) / v11;
v31 = Count / v16;
Group = Affinity.Group;
v30 = Count % v16;
Mask = Affinity.Mask;
if( !(unsigned int)KeEnumerateNextProcessor(&v40, &v33) )
{
v17 = v30;
do
{
v18 = (__int64)*(&KiProcessorBlock + v40);
v19 = (unsigned __int8)v14[595];
if( v15 == v19 )
v14 = *(_BYTE **)(v18 + 33864);
v20 = 0;
if( v15 != v19 )
v20 = v15;
if( !v20 )
{
v14[595] = v31;
if( v17 )
{
--v17;
v14[595] = v31 + 1;
}
}
v21 = *(_QWORD *)(v18 + 200);
v15 = v20 + 1;
*(_QWORD *)(v18 + 33864) = v14;
*((_QWORD *)v14 + 75) |= v21;
v22 = *(_QWORD *)(v18 + 16);
v41 = *(unsigned __int8 *)(v18 + 209) - (unsigned __int8)v14[593];
*(_QWORD *)(v18 + 56) = &v14[v41 + 528];
if( !v22 )
v22 = *(_QWORD *)(v18 + 8);
KiIsThreadRankNonZero((_ETHREAD *)v22, (_KPRCB *)v18);
v23 = 1;
if( !v24 )
v23 = *(_BYTE *)(v22 + 195);
**(_BYTE **)(v18 + 56) = v23;
}
while( !(unsigned int)KeEnumerateNextProcessor(&v40, &v33) );
v4 = Sid;
}
Group = Affinity.Group;
Mask = Affinity.Mask;
v33 = 0i64;
while( !(unsigned int)KeEnumerateNextProcessor(&v40, &v33) )
{
v25 = (__int64)*(&KiProcessorBlock + v40);
v26 = *(_QWORD *)(v25 + 33864);
if( *(_BYTE *)(v26 + 595) > 1u )
*(_QWORD *)(v25 + 33856) = *(_QWORD *)(v26 + 600);
v27 = *(_BYTE *)(v25 + 209);
if( v27 == *(_BYTE *)(v26 + 593) && *(_BYTE *)(v26 + 595) > 1u )
{
*(_DWORD *)(v25 + 33872) = 1;
*(_BYTE *)(v26 + 596) = v27;
_BitScanReverse64(&v28, *(_QWORD *)(v26 + 600));
v41 = v28;
*(_BYTE *)(v26 + 592) = v28 - *(_BYTE *)(v26 + 593) + 1;
}
}
__writecr8(CurrentIrql);
}
return KiConfigureCpuSetSchedulingInformation((__int64)v4);
}Referenced by:
KiConfigureAllSchedulingInformation
KiInitializeDynamicProcessorDpc