KiUpdateGlobalCpuSetConfiguration

VOID __stdcall KiUpdateGlobalCpuSetConfiguration(_SINGLE_LIST_ENTRY *ReadyList){
  __int64 i; 
  __int64 v3; 
  INT64 v4; 
  int v5; 
  int v6; 
  _ETHREAD *v7; 
  int v8; 
  INT64 v9; 
  char v10; 
  int v11; 
  _KPRCB *v12; 
  __int64 v13; 
  char v14; 
  UINT8 IsThreadRankNonZero; 
  INT64 v16; 
  UINT64 v17; 
  UINT64 v18; 
  UINT64 v19; 
  UINT64 SpinCount; 

  for( i = 0i64; (unsigned int)i < (unsigned int)KeNumberProcessors_0; i = (unsigned int)(i + 1) )
  {
    v3 = (__int64)*(&KiProcessorBlock + i);
    *(_QWORD *)(*(_QWORD *)(v3 + 24) + 568i64) = KiCpuSetSequence;
    while( 1 )
    {
      LODWORD(v18) = 0;
      while( _interlockedbittestandset64((volatile signed __int32 *)(v3 + 48), 0i64) )
      {
        do
          KeYieldProcessorEx(&v18);
        while( *(_QWORD *)(v3 + 48) );
      }
      v4 = *(_QWORD *)(v3 + 8);
      if( KiTryToAcquireThreadLock((_KTHREAD *)v4, 0i64) )
        break;
      _InterlockedAdd16((volatile signed __int16 *)(v4 + 868), 1u);
      _InterlockedAnd64((volatile signed __int64 *)(v3 + 48), 0i64);
      LODWORD(v19) = 0;
      while( _interlockedbittestandset64((volatile signed __int32 *)(v4 + 64), 0i64) )
      {
        do
          KeYieldProcessorEx(&v19);
        while( *(_QWORD *)(v4 + 64) );
      }
      LODWORD(SpinCount) = 0;
      while( _interlockedbittestandset64((volatile signed __int32 *)(v3 + 48), 0i64) )
      {
        do
          KeYieldProcessorEx(&SpinCount);
        while( *(_QWORD *)(v3 + 48) );
      }
      _InterlockedDecrement16((volatile signed __int16 *)(v4 + 868));
      if( v4 == *(_QWORD *)(v3 + 8) )
        break;
      _InterlockedAnd64((volatile signed __int64 *)(v3 + 48), 0i64);
      KiReleaseThreadLockSafe(v4);
    }
    v5 = *(_DWORD *)(v4 + 588);
    v6 = 0;
    if( !(unsigned int)KiCheckThreadAffinity((_KTHREAD *)v4) )
    {
      KiComputeThreadAffinity(&v7->Tcb);
      v10 = *(_BYTE *)(v4 + 388);
      if( v10 == 2 || v10 == 5 )
      {
        KiRescheduleThreadAfterAffinityChange(
          (_ETHREAD *)v4,
          (_GROUP_AFFINITY *)(v4 + 576),
          2u,
          (_KPRCB *)v3,
          0i64,
          ReadyList);
        v6 = v11;
      }
    }
    v8 = *(_DWORD *)(v4 + 588);
    KiReleaseThreadLockSafe(v4);
    if( (xmmword_140CFB490 & 0x8000000) != 0 )
      EtwTraceIdealProcessor(v4, 0x546u, v5, v8);
    v9 = *(_QWORD *)(v3 + 16);
    if( v9 && !(unsigned int)KiCheckThreadAffinity(*(_KTHREAD **)(v3 + 16)) )
    {
      v13 = *(_QWORD *)(v3 + 8);
      if( (*(_BYTE *)(v13 + 2) & 4) == 0
        || (IsThreadRankNonZero = KiIsThreadRankNonZero(*(_KTHREAD **)(v3 + 8), (_KPRCB *)v3, v12),
            v14 = 1,
            !IsThreadRankNonZero) )
      {
        v14 = *(_BYTE *)(v13 + 195);
      }
      **(_BYTE **)(v3 + 56) = v14;
      if( *(_QWORD *)(v3 + 33976) )
      {
        v16 = (unsigned int)KiVpThreadSystemWorkPriority;
        if( v13 != *(_QWORD *)(v3 + 24) )
          v16 = (unsigned int)v14;
        KiSetSchedulerAssistPriority(*(INT32 **)(v3 + 33976), v16, 0);
      }
      KiSelectNextThread((_KPRCB *)v3, ReadyList);
      _interlockedbittestandreset((volatile signed __int32 *)(v9 + 120), 0xCu);
      KiInsertDeferredReadyList((INT64)ReadyList, v9);
    }
    _InterlockedAnd64((volatile signed __int64 *)(v3 + 48), 0i64);
    if( v6 )
    {
      v17 = *(unsigned int *)(v3 + 36);
      if( KeGetPcr()->Prcb.Number != (_DWORD)v17 )
        KiSendSoftwareInterrupt(v17, 2u);
    }
  }
}

Referenced by:

KeCpuSetReportParkedProcessors