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