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