KiComputeThreadAffinity
UINT64 __stdcall KiComputeThreadAffinity(_ETHREAD *Thread){
unsigned int v1;
unsigned __int64 *v3;
INT64 v4;
unsigned __int64 v5;
INT64 TickLock;
__int64 v7;
__int64 v9;
__int64 v10;
_KNODE *v11;
_GROUP_AFFINITY GroupAffinity;
v1 = 0;
GroupAffinity = 0i64;
if( (*((_DWORD *)Thread + 29) & 8) != 0 )
{
TickLock = RtlBeginReadTickLock(&KiCpuSetSequence);
}
else
{
v3 = (unsigned __int64 *)((char *)Thread + 576);
do
{
v4 = RtlBeginReadTickLock(&KiCpuSetSequence);
v5 = *((_QWORD *)Thread + 69);
TickLock = v4;
if( ((v5 - 1) & v5) != 0 )
{
v7 = KiComputeCpuSetAffinity((__int64)Thread);
if( (v7 & v5) != 0 )
v5 &= v7;
}
if( *v3 != v5 )
{
v9 = *((unsigned int *)Thread + 49);
*v3 = v5;
if( !KiPrcbInGroupAffinity((__int64)*(&KiProcessorBlock + v9), (__int64)v3) )
{
*(_QWORD *)&GroupAffinity.Group = *((unsigned __int16 *)Thread + 292);
GroupAffinity.Mask = v5;
v11 = KeSelectNodeForAffinity(&GroupAffinity);
v10 = (unsigned __int16)KeSelectIdealProcessor(v11, &GroupAffinity, 0i64);
}
*((_DWORD *)Thread + 147) = v10;
KiUpdateSharedReadyQueueAffinityThread(*(&KiProcessorBlock + v10), (_KTHREAD *)Thread);
KiUpdateNodeAffinitizedFlag((_KTHREAD *)Thread);
v1 = 1;
}
}
while( KiCpuSetSequence != TickLock );
}
*((_QWORD *)Thread + 71) = TickLock;
return v1;
}Referenced by:
KiDeferredReadySingleThread
KiQueueReadyThread
KiSetAffinityThread
KiSetSystemAffinityThread
KiUpdateGlobalCpuSetConfiguration
KiUpdateThreadCpuSets