KiIntSteerChooseInitialTargetProcessors
INT64 __fastcall KiIntSteerChooseInitialTargetProcessors(
INT64 *a1,
UINT64 a2,
INT64 a3,
INT64 a4,
INT64 IsPrimaryInterrupt,
GROUP_AFFINITY *GroupAffinity,
INT64 a7){
INT64 v7;
unsigned int v8;
int v10;
KINTERRUPT_MODE v11;
int SteeringMode;
__int64 v13;
__int64 v14;
unsigned int v15;
unsigned __int64 v17;
GROUP_AFFINITY *v18;
v7 = a3 + 24;
v18 = (GROUP_AFFINITY *)(a3 + 24);
v8 = a2;
v10 = 0;
*GroupAffinity = 0i64;
v11 = *(_DWORD *)(a3 + 16);
LOBYTE(a3) = IsPrimaryInterrupt;
SteeringMode = KeIntSteerGetSteeringMode((UINT8)a1, a2, a3, v11, v18);
if( SteeringMode != 2 || (v10 = KiIntRedirectConnnect(a1, v8, v13), v10 >= 0) )
{
v14 = *(unsigned __int16 *)(v7 + 8);
GroupAffinity->Group = v14;
if( SteeringMode )
{
GroupAffinity->Mask = KiIntSteerMask.Bitmap[v14];
v15 = KiProcessorIndexToNumberMappingTable[(unsigned int)KeFindFirstSetRightGroupAffinity(GroupAffinity)];
*(_DWORD *)GroupAffinity->Reserved = 0;
GroupAffinity->Reserved[2] = 0;
GroupAffinity->Mask = 1i64 << (v15 & 0x3F);
GroupAffinity->Group = v15 >> 6;
}
else
{
v17 = *(_QWORD *)v7;
GroupAffinity->Mask = *(_QWORD *)v7;
if( LOWORD(KiIntSteerAffinitizedInterrupts[0]) <= (unsigned __int16)v14 )
LOWORD(KiIntSteerAffinitizedInterrupts[0]) = v14 + 1;
qword_140C2AFC8[v14] |= v17;
}
*(_DWORD *)a7 = SteeringMode;
}
return(unsigned int)v10;
}Referenced by:
KiIntSteerConnect