KiSetProcessorIdle

VOID __stdcall KiSetProcessorIdle(_KPRCB *Prcb, UINT64 Idle, UINT64 IdleSchedule){
  _KNODE *ParentNode; 
  int IdleState; 
  _BYTE *SchedulerAssist; 
  int v6; 
  unsigned __int64 CoreProcessorSet; 
  unsigned __int64 v8; 
  int v9; 

  ParentNode = Prcb->ParentNode;
  IdleState = Prcb->IdleState;
  if( (_DWORD)Idle )
  {
    SchedulerAssist = Prcb->SchedulerAssist;
    if( SchedulerAssist )
      SchedulerAssist[16] = 1;
    Prcb->IdleSchedule = IdleSchedule;
    if( (IdleState & 1) != 0 )
    {
      v6 = IdleState - 1;
      Prcb->IdleState = v6;
      if( !v6 )
        _interlockedbittestandset64((volatile signed __int32 *)ParentNode, Prcb->GroupIndex);
      _interlockedbittestandset64((volatile signed __int32 *)&ParentNode->IdleCpuSet, Prcb->GroupIndex);
      CoreProcessorSet = Prcb->CoreProcessorSet;
      if( (ParentNode->IdleCpuSet & CoreProcessorSet) == CoreProcessorSet )
      {
        _InterlockedOr64((volatile signed __int64 *)&ParentNode->IdleSmtSet, CoreProcessorSet);
      }
      else
      {
        v8 = Prcb->CoreProcessorSet & ~ParentNode->IdleCpuSet;
        if( ((v8 - 1) & v8) == 0 )
          _InterlockedOr64((volatile signed __int64 *)&ParentNode->NonPairedSmtSet, v8);
      }
      _interlockedbittestandreset64((volatile signed __int32 *)&ParentNode->NonPairedSmtSet, Prcb->GroupIndex);
    }
  }
  else
  {
    Prcb->IdleSchedule = 0;
    if( (IdleState & 1) != 0 )
      __fastfail(0x21u);
    v9 = IdleState + 1;
    Prcb->IdleState = v9;
    if( v9 == 1 )
      _interlockedbittestandreset64((volatile signed __int32 *)ParentNode, Prcb->GroupIndex);
    _interlockedbittestandreset64((volatile signed __int32 *)&ParentNode->IdleCpuSet, Prcb->GroupIndex);
    _InterlockedAnd64((volatile signed __int64 *)&ParentNode->IdleSmtSet, ~Prcb->CoreProcessorSet);
    _InterlockedAnd64((volatile signed __int64 *)&ParentNode->NonPairedSmtSet, ~Prcb->CoreProcessorSet);
    if( (Prcb->CoreProcessorSet & ~ParentNode->IdleCpuSet) == Prcb->GroupSetMember )
      _interlockedbittestandset64((volatile signed __int32 *)&ParentNode->NonPairedSmtSet, Prcb->GroupIndex);
  }
}

Referenced by:

KeTransitionProcessorParkState
KiCompleteKernelInit
KiGroupSchedulingGenerationEnd
KiSchedulerApc
KiSearchForNewThread
KiSelectNextThread