HalpIommuConfigureInterrupt
INT64 __fastcall HalpIommuConfigureInterrupt(INT64 a1, INT64 a2, GROUP_AFFINITY *a3){
int v3;
GROUP_AFFINITY v6;
INT64 v7;
unsigned int Message;
INT64 v9;
int v10;
__int64 v11;
unsigned int v12;
INT64 v13;
INT64 v14;
int v15[4];
__int128 *v16;
__int128 v17;
INT64 result;
char v19;
int v20;
int v21;
GROUP_AFFINITY v22;
unsigned int v23;
int v24;
int v25;
unsigned __int16 v26;
v15[1] = 0;
v3 = a2;
v15[3] = 0;
v17 = 0i64;
memset((INT64)&result, 0i64);
v6 = *a3;
HIDWORD(result) = 206;
v19 = 12;
v15[0] = 6;
v23 = v3 & 0x3FFFFFFF | v23 & 0xC0000000 | 0x40000000;
v22 = v6;
v15[2] = KeFindFirstSetRightGroupAffinity(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)&result, (_QWORD *)(a1 + 480), (_QWORD *)(a1 + 488));
if( (Message & 0x80000000) == 0 )
goto LABEL_9;
return Message;
}
v11 = *(unsigned int *)(a1 + 472);
v12 = *(_DWORD *)(a1 + 468);
v20 = 0;
LODWORD(v14) = 1;
LODWORD(result) = 3;
v21 = 1;
Message = HalpInterruptRemap(v12, v11, 0i64, 0, (__int64)&result, v14);
if( (Message & 0x80000000) != 0 )
return Message;
*(_DWORD *)(a1 + 484) = v24;
*(_DWORD *)(a1 + 480) = v25;
*(_QWORD *)(a1 + 488) = v26;
LABEL_9:
*(_DWORD *)(a1 + 360) |= 1u;
LABEL_10:
v13 = HalpIommuSetupMessageInterruptRouting(a1, v9);
if( (int)v13 >= 0 )
*(_DWORD *)(a1 + 360) |= 2u;
return v13;
}Referenced by:
HalpIommuInitializeAll