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