KiIntSteerChooseInitialTargetProcessors
NTSTATUS __stdcall KiIntSteerChooseInitialTargetProcessors(
_KINTERRUPT **InterruptObjectArray,
UINT64 InterruptObjectCount,
_INTERRUPT_VECTOR_DATA *VectorData,
UINT8 IsPrimaryInterrupt,
_GROUP_AFFINITY *TargetProcessors,
_INTERRUPT_STEERING_MODE *OutputSteerMode){
_GROUP_AFFINITY *p_TargetProcessors;
unsigned int v7;
int v9;
_KINTERRUPT_MODE Mode;
NTSTATUS SteeringMode;
_INTERRUPT_VECTOR_DATA *v12;
__int64 Group;
unsigned int v14;
unsigned __int64 Mask;
_GROUP_AFFINITY *v17;
NTSTATUS *v18;
p_TargetProcessors = &VectorData->TargetProcessors;
v17 = &VectorData->TargetProcessors;
v7 = InterruptObjectCount;
v9 = 0;
*(_OWORD *)OutputSteerMode = 0i64;
Mode = VectorData->Mode;
LOBYTE(VectorData) = (_BYTE)TargetProcessors;
SteeringMode = KeIntSteerGetSteeringMode(
(UINT8)InterruptObjectArray,
InterruptObjectCount,
(INT64)VectorData,
Mode,
v17);
if( SteeringMode != 2 || (v9 = KiIntRedirectConnnect(InterruptObjectArray, v7, v12), v9 >= 0) )
{
Group = p_TargetProcessors->Group;
*((_WORD *)OutputSteerMode + 4) = Group;
if( SteeringMode )
{
*(_QWORD *)OutputSteerMode = KiIntSteerMask.Bitmap[Group];
v14 = KiProcessorIndexToNumberMappingTable[KeFindFirstSetRightGroupAffinity((INT64)OutputSteerMode)];
*(_INTERRUPT_STEERING_MODE *)((char *)OutputSteerMode + 10) = IntSteerModeNone;
*((_WORD *)OutputSteerMode + 7) = 0;
*(_QWORD *)OutputSteerMode = 1i64 << (v14 & 0x3F);
*((_WORD *)OutputSteerMode + 4) = v14 >> 6;
}
else
{
Mask = p_TargetProcessors->Mask;
*(_QWORD *)OutputSteerMode = p_TargetProcessors->Mask;
if( KiIntSteerAffinitizedInterrupts.Count <= (unsigned __int16)Group )
KiIntSteerAffinitizedInterrupts.Count = Group + 1;
KiIntSteerAffinitizedInterrupts.Bitmap[Group] |= Mask;
}
*v18 = SteeringMode;
}
return v9;
}Referenced by:
KiIntSteerConnect