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