KiConfigureSchedulingInformation
VOID __stdcall KiConfigureSchedulingInformation(_KPRCB *Prcb, UINT8 DynamicProcessor){
unsigned int CacheCount;
_KPRCB *v4;
unsigned __int64 LLCMask;
__int64 v6;
unsigned int v7;
unsigned __int64 v8;
unsigned __int64 v9;
_KNODE *ParentNode;
unsigned int v11;
unsigned __int8 CurrentIrql;
UINT16 v13;
_KSHARED_READY_QUEUE *SharedReadyQueue;
int v15;
unsigned int v16;
_KPRCB *v17;
int v18;
unsigned int v19;
_KPRCB *v20;
int ProcCount;
int v22;
unsigned __int64 GroupSetMember;
_ETHREAD *NextThread;
UINT8 IsThreadRankNonZero;
char Priority;
int v27;
int v28;
__int64 v29;
__int64 v30;
char v31;
unsigned __int64 v32;
int v33;
unsigned int v34;
unsigned int v35;
_GROUP_AFFINITY Affinity;
_KAFFINITY_ENUMERATION_CONTEXT Context;
USHORT Count;
UINT64 ProcIndex;
unsigned int v41;
CacheCount = Prcb->CacheCount;
*(_DWORD *)(&Context.CurrentIndex + 1) = 0;
*(&Context.CurrentIndex + 3) = 0;
Count = 0;
v4 = Prcb;
LODWORD(ProcIndex) = 0;
Affinity = 0i64;
if( CacheCount )
{
LLCMask = Prcb->CacheProcessorMask[CacheCount - 1];
Prcb->LLCMask = LLCMask;
}
else
{
LLCMask = Prcb->LLCMask;
}
if( !LLCMask )
Prcb->LLCMask = Prcb->GroupSetMember;
LODWORD(v6) = Prcb->GroupIndex;
v7 = 0;
v41 = 0;
if( CacheCount )
{
v8 = ~Prcb->CoreProcessorSet;
while( (v8 & Prcb->CacheProcessorMask[v7]) == 0 )
{
v41 = ++v7;
if( v7 >= CacheCount )
goto LABEL_12;
}
v9 = Prcb->CacheProcessorMask[v7];
_BitScanForward64((unsigned __int64 *)&v6, v9);
v4->ScanSiblingMask = v9;
}
LABEL_12:
ParentNode = v4->ParentNode;
v4->ScanSiblingIndex = v6;
if( !DynamicProcessor && v4->Number == ParentNode->Lowest )
{
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 = ParentNode->Affinity.Reserved[0];
ParentNode->SharedReadyQueueMask = 0i64;
KeQueryNodeActiveAffinity(v13, &Affinity, &Count);
SharedReadyQueue = v4->SharedReadyQueue;
v15 = 0;
Context.Affinity = 0i64;
v16 = (v11 + Count - 1) / v11;
v35 = Count / v16;
Context.CurrentIndex = Affinity.Group;
v34 = Count % v16;
Context.CurrentMask = Affinity.Mask;
KeEnumerateNextProcessor(&ProcIndex, &Context);
if( !v18 )
{
v19 = v34;
do
{
v20 = *(&KiProcessorBlock + (unsigned int)ProcIndex);
ProcCount = SharedReadyQueue->ProcCount;
if( v15 == ProcCount )
SharedReadyQueue = v20->SharedReadyQueue;
v22 = 0;
if( v15 != ProcCount )
v22 = v15;
if( !v22 )
{
SharedReadyQueue->ProcCount = v35;
if( v19 )
{
--v19;
SharedReadyQueue->ProcCount = v35 + 1;
}
}
GroupSetMember = v20->GroupSetMember;
v15 = v22 + 1;
v20->SharedReadyQueue = SharedReadyQueue;
SharedReadyQueue->Affinity |= GroupSetMember;
NextThread = v20->NextThread;
v41 = v20->GroupIndex - SharedReadyQueue->LowProcIndex;
v20->PriorityState = &SharedReadyQueue->RunningSummary[v41];
if( !NextThread )
NextThread = v20->CurrentThread;
IsThreadRankNonZero = KiIsThreadRankNonZero(&NextThread->Tcb, v20, v17);
Priority = 1;
if( !IsThreadRankNonZero )
Priority = NextThread->Tcb.Priority;
*v20->PriorityState = Priority;
KeEnumerateNextProcessor(&ProcIndex, &Context);
}
while( !v27 );
v4 = Prcb;
}
Context.CurrentIndex = Affinity.Group;
Context.CurrentMask = Affinity.Mask;
Context.Affinity = 0i64;
KeEnumerateNextProcessor(&ProcIndex, &Context);
if( !v28 )
{
do
{
v29 = (__int64)*(&KiProcessorBlock + (unsigned int)ProcIndex);
v30 = *(_QWORD *)(v29 + 33864);
if( *(_BYTE *)(v30 + 595) > 1u )
*(_QWORD *)(v29 + 33856) = *(_QWORD *)(v30 + 600);
v31 = *(_BYTE *)(v29 + 209);
if( v31 == *(_BYTE *)(v30 + 593) && *(_BYTE *)(v30 + 595) > 1u )
{
*(_DWORD *)(v29 + 33872) = 1;
*(_BYTE *)(v30 + 596) = v31;
_BitScanReverse64(&v32, *(_QWORD *)(v30 + 600));
v41 = v32;
*(_BYTE *)(v30 + 592) = v32 - *(_BYTE *)(v30 + 593) + 1;
}
KeEnumerateNextProcessor(&ProcIndex, &Context);
}
while( !v33 );
}
__writecr8(CurrentIrql);
}
KiConfigureCpuSetSchedulingInformation(v4);
}Referenced by:
KiConfigureAllSchedulingInformation
KiInitializeDynamicProcessorDpc