KiUpdateNodeAffinitizedFlag
VOID __stdcall KiUpdateNodeAffinitizedFlag(_ETHREAD *Thread){
unsigned __int64 Mask;
__int64 Group;
int v4;
unsigned __int64 v5;
unsigned __int64 v6;
Mask = Thread->Tcb.Affinity.Mask;
Group = Thread->Tcb.Affinity.Group;
if( Mask == KeActiveProcessors.Bitmap[Group] )
{
LABEL_2:
v4 = 1;
}
else if( (unsigned __int16)KeNumberNodes <= 1u )
{
v4 = 0;
}
else
{
v4 = 0;
while( 1 )
{
_BitScanReverse64(&v5, Mask);
v6 = (*(&KiProcessorBlock
+ (unsigned int)KiProcessorNumberToIndexMappingTable[(unsigned int)(((_DWORD)Group << 6) + v5)]))->ParentNode->Affinity.Mask;
if( (Mask & v6) != v6 )
break;
Mask &= ~v6;
if( !Mask )
goto LABEL_2;
}
}
if( v4 == (((unsigned __int8)Thread->Tcb.gap0[2] >> 3) & 1) )
_InterlockedXor((volatile signed __int32 *)Thread, 0x80000u);
}Referenced by:
KeStartThread
KiComputeThreadAffinity
KiSetAffinityThread
KiSetSystemAffinityThread