HalpInterruptGenerateMessage

__int64 __fastcall HalpInterruptGenerateMessage(__int64 a1, __int64 a2, _QWORD *a3, _QWORD *a4){
  INT64 v4; 
  int v6; 
  char v7; 
  __int64 v11; 
  int ProcessorIdByNtNumber; 
  int v13; 
  __int64 result; 
  int v15; 
  UINT64 v16; 
  _DWORD *v17; 
  __int128 v18; 
  __int128 v19; 
  UINT64 Id[2]; 
  __int64 v21; 

  v4 = Controller;
  *a3 = 0i64;
  *a4 = 0i64;
  v6 = *(_DWORD *)a1;
  v7 = 0;
  v21 = 0i64;
  v18 = 0i64;
  v19 = 0i64;
  *(_OWORD *)Id = 0i64;
  v11 = (unsigned int)(v6 - 1);
  if( (_DWORD)v11 )
  {
    v15 = v11 - 2;
    if( !v15 )
    {
      DWORD2(v19) = 1;
      goto LABEL_4;
    }
    if( v15 != 3 )
      return 3221225659i64;
    v16 = *(unsigned int *)(a1 + 8);
    v7 = 1;
    DWORD2(v19) = 4;
    ProcessorIdByNtNumber = HalGetProcessorIdByNtNumber(v16, Id);
  }
  else
  {
    ProcessorIdByNtNumber = HalpInterruptDestinationToTarget(v11, a1, (__int64)&v19 + 8);
  }
  if( ProcessorIdByNtNumber < 0 )
  {
    *(&CmpDummyThreadEvent + 1789) = 21;
    return 3221225485i64;
  }
LABEL_4:
  v13 = 16;
  LODWORD(v18) = 2;
  DWORD2(v18) = 1;
  DWORD1(v19) = 1;
  if( !v7 )
    v13 = 18;
  LODWORD(v19) = -1;
  HIDWORD(v18) = v13;
  LODWORD(v21) = *(_DWORD *)(a2 + 4);
  if( (*(_DWORD *)(v4 + 220) & 0x100) != 0 )
  {
    v17 = *(_DWORD **)(a1 + 16);
    if( (*v17 & 0x3FFFFFFF) != 1073741822 )
    {
      DWORD2(v19) = 7;
      LODWORD(Id[0]) = *v17 & 0x3FFFFFFF;
    }
  }
  result = 3221225659i64;
  if( *(_QWORD *)(v4 + 136)
    && (result = (*(__int64(__fastcall **)(_QWORD, __int128 *, _QWORD *, _QWORD *))(v4 + 136))(
                   *(_QWORD *)(v4 + 16),
                   &v18,
                   a3,
                   a4),
        (int)result >= 0) )
  {
    if( (((-(__int64)(*(&stru_140CF2E80 + 7328) != 0) & 0xFF00000100000000ui64) - 0x100000000i64) & *a3) != 0 )
      return 3221226528i64;
    else
      return(*a4 & 0xFFFFFFFFFFFF0000ui64) != 0 ? 0xC0000420 : 0;
  }
  else
  {
    *(_DWORD *)(v4 + 296) = result;
    *(&CmpDummyThreadEvent + 1789) = 8;
    *(_DWORD *)(v4 + 292) = 8;
    *(_QWORD *)(v4 + 304) = "minkernel\\hals\\lib\\interrupts\\common\\connect.c";
    *(_DWORD *)(v4 + 312) = 2041;
  }
  return result;
}

Referenced by:

HalpIommuConfigureInterrupt
HalpPopulateMsiMessages