HalpIommuConfigureInterrupt
NTSTATUS __stdcall HalpIommuConfigureInterrupt(INT64 a1, INT64 a2, _GROUP_AFFINITY *a3){
int v3;
_GROUP_AFFINITY v6;
INT64 v7;
NTSTATUS Message;
INT64 v9;
int v10;
UINT64 v11;
INT64 v12;
NTSTATUS result;
UINT64 VectorCount;
int v15[4];
__int128 *v16;
__int128 v17;
_INTERRUPT_VECTOR_DATA VectorData;
v15[1] = 0;
v3 = a2;
v15[3] = 0;
v17 = 0i64;
memset(&VectorData, 0i64, sizeof(VectorData));
v6 = *a3;
VectorData.Vector = 206;
VectorData.Irql = 12;
v15[0] = 6;
VectorData.IntRemapInfo._bf_0 = v3 & 0x3FFFFFFF | VectorData.IntRemapInfo._bf_0 & 0xC0000000 | 0x40000000;
VectorData.TargetProcessors = v6;
v15[2] = KeFindFirstSetRightGroupAffinity((INT64)a3);
v16 = &v17;
Message = -1073741637;
LODWORD(v17) = v3 & 0x3FFFFFFF;
if( (*(_DWORD *)(a1 + 456) & 2) == 0 )
return Message;
LOBYTE(v7) = 1;
if( !(unsigned __int8)HalpInterruptIsMsiSupported(v7) )
return Message;
v10 = *(_DWORD *)(a1 + 360);
if( (v10 & 3) == 1 )
return Message;
if( (v10 & 1) != 0 )
goto LABEL_10;
if( v3 == 1073741822 )
{
Message = HalpInterruptGenerateMessage(
(__int64)v15,
(__int64)&VectorData,
(_QWORD *)(a1 + 480),
(_QWORD *)(a1 + 488));
if( Message >= 0 )
goto LABEL_9;
return Message;
}
v11 = *(unsigned int *)(a1 + 472);
v12 = *(unsigned int *)(a1 + 468);
VectorData.Polarity = InterruptPolarityUnknown;
LODWORD(VectorCount) = 1;
VectorData.Type = InterruptTypeMessageRequest;
VectorData.Mode = Latched;
Message = HalpInterruptRemap(v12, v11, 0i64, 0, &VectorData, VectorCount);
if( Message < 0 )
return Message;
*(_DWORD *)(a1 + 484) = VectorData.IntRemapInfo.u.MessageAddressHigh;
*(_DWORD *)(a1 + 480) = VectorData.IntRemapInfo.u.MessageAddressLow;
*(_QWORD *)(a1 + 488) = VectorData.IntRemapInfo.u.MessageData;
LABEL_9:
*(_DWORD *)(a1 + 360) |= 1u;
LABEL_10:
result = HalpIommuSetupMessageInterruptRouting(a1, v9);
if( result >= 0 )
*(_DWORD *)(a1 + 360) |= 2u;
return result;
}Referenced by:
HalpIommuInitializeAll