KeSetIdealProcessorThreadEx

VOID __fastcall KeSetIdealProcessorThreadEx(_ETHREAD *Thread, UINT64 Processor, UINT64 *OldProcessor){
  unsigned int v4; 
  unsigned __int8 CurrentIrql; 
  int IdealProcessor; 
  int UserIdealProcessor; 
  unsigned int v8; 
  int v9; 
  __int32 bf_0; 
  _KPRCB *v11; 
  int v12; 
  _KPRCB *ControlPrcb; 
  _KPRCB *Prcb; 
  UINT64 SpinCount; 
  UINT64 *v17; 
  _KSHARED_READY_QUEUE *ControlReadyQueue; 

  v17 = OldProcessor;
  ControlPrcb = 0i64;
  ControlReadyQueue = 0i64;
  v4 = Processor;
  Prcb = *(&KiProcessorBlock + (unsigned int)Processor);
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  LODWORD(SpinCount) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)&Thread->Tcb.ThreadLock, 0i64) )
  {
    do
      KeYieldProcessorEx(&SpinCount);
    while( Thread->Tcb.ThreadLock );
  }
  IdealProcessor = Thread->Tcb.IdealProcessor;
  UserIdealProcessor = Thread->Tcb.UserIdealProcessor;
  if( Thread == (_ETHREAD *)KeGetCurrentThread() || (Thread->Tcb._bf_0 & 8) == 0 )
  {
    v8 = Thread->Tcb.IdealProcessor;
    v9 = v8;
    if( (unsigned int)KiPrcbInGroupAffinity(Prcb, &Thread->Tcb.Affinity) )
    {
      KiAcquireThreadStateLock(Thread, &ControlPrcb, &ControlReadyQueue);
      bf_0 = Thread->Tcb._bf_0;
      Thread->Tcb.IdealProcessor = v4;
      if( (bf_0 & 8) == 0 )
        Thread->Tcb.UserIdealProcessor = v4;
      KiUpdateSharedReadyQueueAffinityThread(Prcb, &Thread->Tcb);
      KiReleaseThreadStateLock(v11, (_KSHARED_READY_QUEUE *)ControlPrcb);
      v9 = Thread->Tcb.IdealProcessor;
    }
  }
  else
  {
    v8 = Thread->Tcb.UserIdealProcessor;
    if( (unsigned int)KiPrcbInGroupAffinity(Prcb, &Thread->Tcb.UserAffinity) )
      Thread->Tcb.UserIdealProcessor = v4;
    v9 = IdealProcessor;
  }
  v12 = Thread->Tcb.UserIdealProcessor;
  KiReleaseThreadLockSafe((INT64)Thread);
  if( (xmmword_140CFB490 & 0x8000000) != 0 )
  {
    EtwTraceIdealProcessor((__int64)Thread, 0x546u, IdealProcessor, v9);
    if( (xmmword_140CFB490 & 0x8000000) != 0 )
      EtwTraceIdealProcessor((__int64)Thread, 0x547u, UserIdealProcessor, v12);
  }
  __writecr8(CurrentIrql);
  if( v17 )
    *(_DWORD *)v17 = v8;
}

Referenced by:

KeSetIdealProcessorThreadByNumber
MiSetIdealProcessorThread
MiZeroInParallelWorker