KeSetIdealProcessorThreadEx
NTSTATUS __stdcall KeSetIdealProcessorThreadEx(_ETHREAD *Thread, UINT64 Processor, UINT64 *OldProcessor){
int v4;
NTSTATUS v5;
unsigned __int8 CurrentIrql;
unsigned int v7;
unsigned int v8;
unsigned int v9;
unsigned int v10;
int v11;
__int64 v12;
unsigned int v13;
void *ControlPrcb[11];
_KPRCB *IdealPrcb;
UINT64 SpinCount;
UINT64 *v19;
_KSHARED_READY_QUEUE *ControlReadyQueue;
v19 = OldProcessor;
ControlPrcb[0] = 0i64;
ControlReadyQueue = 0i64;
v4 = Processor;
v5 = -1073741823;
IdealPrcb = *(&KiProcessorBlock + (unsigned int)Processor);
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)Thread + 16, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((_QWORD *)Thread + 8) );
}
v7 = *((_DWORD *)Thread + 147);
v8 = *((_DWORD *)Thread + 49);
if( Thread == (_ETHREAD *)KeGetCurrentThread() || (*((_DWORD *)Thread + 29) & 8) == 0 )
{
v9 = *((_DWORD *)Thread + 147);
v10 = v9;
if( KiPrcbInGroupAffinity((__int64)IdealPrcb, (__int64)Thread + 576) )
{
KiAcquireThreadStateLock(Thread, (_KPRCB **)ControlPrcb, &ControlReadyQueue);
v11 = *((_DWORD *)Thread + 29);
*((_DWORD *)Thread + 147) = v4;
if( (v11 & 8) == 0 )
*((_DWORD *)Thread + 49) = v4;
KiUpdateSharedReadyQueueAffinityThread(IdealPrcb, (_KTHREAD *)Thread);
KiReleaseThreadStateLock(v12, (__int64)ControlPrcb[0], (volatile signed __int64 *)ControlReadyQueue);
v10 = *((_DWORD *)Thread + 147);
v5 = 0;
}
}
else
{
v9 = *((_DWORD *)Thread + 49);
if( KiPrcbInGroupAffinity((__int64)IdealPrcb, (__int64)Thread + 552) )
{
v5 = 0;
*((_DWORD *)Thread + 49) = v4;
}
v10 = v7;
}
v13 = *((_DWORD *)Thread + 49);
KiReleaseThreadLockSafe((INT64)Thread);
if( (xmmword_140CFB490 & 0x8000000) != 0 )
{
EtwTraceIdealProcessor((INT64)Thread, 0x546u, v7, v10);
if( (xmmword_140CFB490 & 0x8000000) != 0 )
EtwTraceIdealProcessor((INT64)Thread, 0x547u, v8, v13);
}
__writecr8(CurrentIrql);
if( v19 )
*(_DWORD *)v19 = v9;
return v5;
}Referenced by:
KeSetIdealProcessorThreadByNumber
MiSetIdealProcessorThread
MiZeroInParallelWorker