KiIntSteerConnect
NTSTATUS __stdcall KiIntSteerConnect(
_KINTERRUPT **InterruptObjectArray,
UINT64 InterruptObjectCount,
_INTERRUPT_VECTOR_DATA *VectorData){
__int64 v3;
unsigned int v6;
char v7;
VOID **PoolWithTag;
VOID **v9;
_KINTERRUPT **v10;
__int64 v11;
_QWORD *v12;
unsigned __int64 v13;
VOID **i;
UINT8 v15;
int v16;
INT64 v17;
__int16 v18;
unsigned __int16 v19;
VOID *v20;
bool v21;
VOID ***v22;
VOID **v23;
VOID ***v24;
int v26;
int v27;
__int64 Group;
unsigned __int64 Mask;
__int64 v30;
unsigned __int64 v31;
_GROUP_AFFINITY *TargetProcessors;
_INTERRUPT_STEERING_MODE OutputSteerMode[18];
unsigned int Gsiv;
int v35;
v3 = (unsigned int)InterruptObjectCount;
v35 = 0;
*(_OWORD *)OutputSteerMode = 0i64;
if( !qword_140CEC788[0] )
EtwRegister(
(_LPCGUID)&INTSTEER_ETW_PROVIDER,
(PETWENABLECALLBACK)KiIntSteerEventTraceControlCallback,
0i64,
qword_140CEC788);
if( VectorData->Type == InterruptTypeControllerInput )
{
Gsiv = VectorData->ControllerInput.Gsiv;
if( (unsigned __int8)off_140C00780[0]() )
{
v7 = 0;
v27 = ((__int64(__fastcall *)(_INTERRUPT_VECTOR_DATA *, unsigned int *))off_140C00768[0])(VectorData, &Gsiv);
if( !v27 )
goto LABEL_32;
}
else
{
v7 = 1;
v27 = 0;
}
if( v27 < 0 )
goto LABEL_35;
LABEL_32:
v6 = Gsiv;
goto LABEL_6;
}
if( VectorData->Type != InterruptTypeMessageRequest )
{
LABEL_35:
Group = VectorData->TargetProcessors.Group;
Mask = VectorData->TargetProcessors.Mask;
if( KiIntSteerAffinitizedInterrupts.Count <= (unsigned __int16)Group )
KiIntSteerAffinitizedInterrupts.Count = Group + 1;
KiIntSteerAffinitizedInterrupts.Bitmap[Group] |= Mask;
return 0;
}
v6 = -1;
v7 = 1;
Gsiv = -1;
LABEL_6:
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x98ui64, 1802654793i64);
v9 = PoolWithTag;
if( PoolWithTag )
{
PoolWithTag[4] = InterruptObjectArray;
*((_DWORD *)PoolWithTag + 6) = v3;
PoolWithTag[5] = 0i64;
PoolWithTag[6] = 0i64;
*((_BYTE *)PoolWithTag + 56) = v7;
*((_OWORD *)PoolWithTag + 4) = *(_OWORD *)&VectorData->Type;
*((_OWORD *)PoolWithTag + 5) = *(_OWORD *)&VectorData->Mode;
*((_OWORD *)PoolWithTag + 6) = *(_OWORD *)&VectorData->TargetProcessors.Group;
*((_OWORD *)PoolWithTag + 7) = *(_OWORD *)&VectorData->IntRemapInfo.u.MessageAddressLow;
*((_OWORD *)PoolWithTag + 8) = *(_OWORD *)&VectorData->HvDeviceId;
PoolWithTag[18] = (VOID *)*((_QWORD *)&VectorData->MessageRequest + 1);
if( (_DWORD)v3 )
{
v10 = InterruptObjectArray;
v11 = v3;
do
{
v12 = *v10++;
v12[22] = 0i64;
v12[24] = 0i64;
v12[25] = 0i64;
v12[27] = 0i64;
v12[21] = v9;
--v11;
}
while( v11 );
}
v13 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc(&KiIntTrackSpinlock);
if( VectorData->Type )
{
LABEL_11:
i = ExAllocatePoolWithTag(0x200ui64, 0xD0ui64, 1802654793i64);
if( i )
{
LOBYTE(TargetProcessors) = v7;
v16 = KiIntSteerChooseInitialTargetProcessors(
InterruptObjectArray,
(unsigned int)v3,
VectorData,
v15,
TargetProcessors,
OutputSteerMode);
if( v16 >= 0 )
{
memset(i, 0i64, 0xD0u);
i[19] = 0i64;
v18 = OutputSteerMode[2];
i[3] = i + 2;
i[2] = i + 2;
*((_DWORD *)i + 8) = v6;
*((_BYTE *)i + 132) = 0;
v19 = VectorData->TargetProcessors.Group;
i[17] = 0i64;
*((_WORD *)i + 72) = v19;
*((_DWORD *)i + 32) = v35;
v20 = *(VOID **)OutputSteerMode;
i[20] = *(VOID **)OutputSteerMode;
i[22] = v20;
*((_WORD *)i + 84) = v18;
*((_WORD *)i + 92) = v18;
v21 = *((_DWORD *)i + 32) == 2;
*(_OWORD *)(i + 5) = *(_OWORD *)&VectorData->Type;
*(_OWORD *)(i + 7) = *(_OWORD *)&VectorData->Mode;
*(_OWORD *)(i + 9) = *(_OWORD *)&VectorData->TargetProcessors.Group;
*(_OWORD *)(i + 11) = *(_OWORD *)&VectorData->IntRemapInfo.u.MessageAddressLow;
*(_OWORD *)(i + 13) = *(_OWORD *)&VectorData->HvDeviceId;
i[15] = (VOID *)*((_QWORD *)&VectorData->MessageRequest + 1);
if( v21 )
i[25] = (*InterruptObjectArray)->RedirectObject;
v22 = (VOID ***)qword_140C2AED8;
if( *(ULONG_PTR **)qword_140C2AED8 != &KiIntTrackRootList )
goto LABEL_47;
*i = &KiIntTrackRootList;
i[1] = v22;
*v22 = i;
++KiIntTrackRootCount;
qword_140C2AED8 = (__int64)i;
KiIntSteerUpdateDeviceInterruptMask((INT64)(i + 20), 0i64, v17);
if( *((_DWORD *)i + 32) )
KiIntSteerSetDestination((ULONG_PTR)i, (_GROUP_AFFINITY *)i + 10);
v16 = 0;
}
if( !v16 )
{
LABEL_20:
v9[2] = i;
v23 = i + 2;
v24 = (VOID ***)v23[1];
if( *v24 == v23 )
{
*v9 = v23;
v9[1] = v24;
*v24 = v9;
v23[1] = v9;
KiIntSteerLogState((__int64)v9, (__int64)PPM_ETW_INTERRUPT_STEERING_STATE_CONNECT);
LABEL_22:
KxReleaseSpinLock(&KiIntTrackSpinlock);
__writecr8(v13);
return v16;
}
LABEL_47:
__fastfail(3u);
}
}
else
{
v16 = -1073741670;
}
ExFreePoolWithTag(v9, 0x6B725449u);
goto LABEL_22;
}
for( i = *(VOID ***)&KiIntTrackRootList; ; i = (VOID **)*i )
{
if( i == (VOID **)&KiIntTrackRootList )
goto LABEL_11;
v26 = *((_DWORD *)i + 8);
if( v26 != -1 && v26 == v6 )
break;
}
if( *((_DWORD *)i + 32) == 2 )
{
*((_BYTE *)i[25] + 16) = 0;
*((_DWORD *)i + 32) = 0;
*((_BYTE *)i + 132) = 0;
v30 = VectorData->TargetProcessors.Group;
v31 = VectorData->TargetProcessors.Mask;
if( KiIntSteerAffinitizedInterrupts.Count <= (unsigned __int16)v30 )
KiIntSteerAffinitizedInterrupts.Count = v30 + 1;
KiIntSteerAffinitizedInterrupts.Bitmap[v30] |= v31;
}
v16 = 0;
goto LABEL_20;
}
return -1073741670;
}Referenced by:
KeConnectInterrupt