KiComputeCpuSetAffinity
UINT64 __stdcall KiComputeCpuSetAffinity(_ETHREAD *Thread){
_EPROCESS *Process;
__int64 Group;
$991E1CBB7797929499350D8948279CF6 *v4;
$7D7CAE6D41B81FF54781561F08F4E01A *v5;
int v6;
__int64 AllowedCpuSets;
__int64 v8;
$2F5B20675905D9187E7A5970F6F306B8 *v9;
unsigned __int64 SelectedCpuSets;
UINT64 result;
__int64 v12;
__int64 v13;
int v14;
unsigned __int64 v15;
Process = Thread->Tcb.Process;
Group = Thread->Tcb.Affinity.Group;
v4 = &Process->2376;
v5 = &Process->2384;
if( (Process->Flags3 & 0x80u) != 0 )
{
v4 = ($991E1CBB7797929499350D8948279CF6 *)v4->AllowedCpuSets;
v5 = ($7D7CAE6D41B81FF54781561F08F4E01A *)v5->DefaultCpuSets;
}
v6 = 1;
AllowedCpuSets = KiSystemAllowedCpuSets[2 * Group] | KiSystemAllowedCpuSets[2 * Group
+ (((unsigned __int64)Thread->SameThreadPassiveFlags >> 11) & 1)];
if( (Process->Flags2 & 0x8000000) != 0 && (v8 = v4[Group].AllowedCpuSets) != 0 )
{
AllowedCpuSets = v4[Group].AllowedCpuSets;
v6 = 0;
}
else
{
v8 = AllowedCpuSets | v4[Group].AllowedCpuSets;
}
if( !v8 )
return 0i64;
v9 = &Thread->1536;
if( (Thread->CrossThreadFlags & 0x20000) != 0 )
v9 = ($2F5B20675905D9187E7A5970F6F306B8 *)v9->SelectedCpuSets;
SelectedCpuSets = v9[Group].SelectedCpuSets;
if( !SelectedCpuSets )
{
SelectedCpuSets = v5[Group].DefaultCpuSets;
if( !SelectedCpuSets )
{
if( !KiRestrictedSystemCpuSetsActive && v6 )
return 0i64;
SelectedCpuSets = AllowedCpuSets;
}
}
v12 = v8 & SelectedCpuSets;
if( v12 )
v8 = v12;
v13 = v8 & KiNonParkedCpuSets[Group];
if( !v13 )
v13 = v8;
result = 0i64;
v14 = (_DWORD)Group << 6;
do
{
_BitScanForward64(&v15, v13);
result |= *((_QWORD *)KiCpuSetAffinities + (unsigned int)(v14 + v15));
v13 &= ~(1i64 << v15);
}
while( v13 );
return result;
}Referenced by:
KiComputeThreadAffinity