KiComputeThreadAffinity
UINT64 __stdcall KiComputeThreadAffinity(_ETHREAD *Thread){
unsigned int v1;
$041662087374B0E8167C762F8350D020 *v3;
__int64 v4;
unsigned __int64 Mask;
__int64 TickLock;
UINT64 v7;
__int64 UserIdealProcessor;
__int64 v10;
_KNODE *v11;
_GROUP_AFFINITY GroupAffinity;
v1 = 0;
GroupAffinity = 0i64;
if( (Thread->Tcb._bf_0 & 8) != 0 )
{
TickLock = RtlBeginReadTickLock(&KiCpuSetSequence);
}
else
{
v3 = &Thread->Tcb.576;
do
{
v4 = RtlBeginReadTickLock(&KiCpuSetSequence);
Mask = Thread->Tcb.UserAffinity.Mask;
TickLock = v4;
if( ((Mask - 1) & Mask) != 0 )
{
v7 = KiComputeCpuSetAffinity(&Thread->Tcb);
if( (v7 & Mask) != 0 )
Mask &= v7;
}
if( v3->Affinity.Mask != Mask )
{
UserIdealProcessor = Thread->Tcb.UserIdealProcessor;
v3->Affinity.Mask = Mask;
if( !(unsigned int)KiPrcbInGroupAffinity(*(&KiProcessorBlock + UserIdealProcessor), &v3->Affinity) )
{
*(_QWORD *)&GroupAffinity.Group = Thread->Tcb.Affinity.Group;
GroupAffinity.Mask = Mask;
v11 = KeSelectNodeForAffinity(&GroupAffinity);
v10 = (unsigned __int16)KeSelectIdealProcessor(v11, &GroupAffinity, 0i64);
}
Thread->Tcb.IdealProcessor = v10;
KiUpdateSharedReadyQueueAffinityThread(*(&KiProcessorBlock + v10), &Thread->Tcb);
KiUpdateNodeAffinitizedFlag(&Thread->Tcb);
v1 = 1;
}
}
while( KiCpuSetSequence != TickLock );
}
Thread->Tcb.AffinityVersion = TickLock;
return v1;
}Referenced by:
KiDeferredReadySingleThread
KiQueueReadyThread
KiSetAffinityThread
KiSetSystemAffinityThread
KiUpdateGlobalCpuSetConfiguration
KiUpdateThreadCpuSets