HalpInterruptSetDestinationInternal

__int64 __fastcall HalpInterruptSetDestinationInternal(_INTERRUPT_LINE *a1, __int64 a2, _INTERRUPT_LINE *a3){
  _INTERRUPT_LINE v5; 
  _REGISTERED_INTERRUPT_CONTROLLER *v6; 
  _REGISTERED_INTERRUPT_CONTROLLER *v7; 
  _LIST_ENTRY *Lines; 
  _LIST_ENTRY *Flink; 
  char v10; 
  _LIST_ENTRY *Blink; 
  __int128 v12; 
  __int128 v13; 
  _INTERRUPT_LINE *v14; 
  NTSTATUS v15; 
  __int128 v17; 
  _LIST_ENTRY *v18; 
  __int128 v19; 
  int v20[8]; 
  _LIST_ENTRY v21; 
  __int128 v22; 
  __int128 v23; 
  __int64 v24; 
  _INTERRUPT_LINE Line; 

  Line = *a1;
  HalpInterruptApplyOverrides(&Line, 0i64, 0i64);
  v5.UnitId = Line.UnitId;
  while( 1 )
  {
    v6 = HalpInterruptLookupController(v5.UnitId);
    v7 = v6;
    if( !v6 )
    {
      *(&CmpDummyThreadEvent + 1789) = 17;
      return(unsigned int)-1073741275;
    }
    if( (v6->Flags & 2) != 0 )
      KeBugCheckEx(0x5Cu, (PVOID)0x200, (PVOID)*(&CmpDummyThreadEvent + 1789), v6, (PVOID)0x7931847);
    Lines = HalpInterruptFindLines((unsigned int *)&Line);
    if( !Lines )
    {
      v7->ProblemStatus = 0;
      *(&CmpDummyThreadEvent + 1789) = 18;
      v7->Problem = InterruptProblemNoSuchLines;
      v7->ProblemSourceFile = "minkernel\\hals\\lib\\interrupts\\common\\connect.c";
      v7->ProblemSourceLine = 1067;
      return(unsigned int)-1073741275;
    }
    Flink = Lines[3].Flink;
    if( LOBYTE(Flink->Flink) )
    {
      v7->ProblemStatus = 0;
      *(&CmpDummyThreadEvent + 1789) = 19;
      v15 = -1073741811;
      v7->Problem = InterruptProblemBadConnectionData;
      v7->ProblemSourceFile = "minkernel\\hals\\lib\\interrupts\\common\\connect.c";
      v7->ProblemSourceLine = 1080;
      return(unsigned int)v15;
    }
    v10 = 1;
    Blink = Lines[2].Blink;
    v12 = (__int128)Blink[1];
    v21 = *Blink;
    v13 = (__int128)Blink[2];
    v22 = v12;
    *(_QWORD *)&v12 = Blink[3].Flink;
    v23 = v13;
    v24 = v12;
    HalpInterruptDestinationToTarget((__int64)Flink, a2, (__int64)&Blink[1].Blink);
    v14 = (_INTERRUPT_LINE *)&Blink[1];
    HalpInterruptFindBestRouting(&Line, *a3, (_INTERRUPT_LINE *)&Blink[1]);
    _InterlockedOr(v20, 0);
    v15 = HalpInterruptSetLineStateInternal(v7, &Line, (_INTERRUPT_LINE_STATE *)Blink);
    if( v15 < 0 )
      break;
    v10 = 0;
    if( HIDWORD(Blink[1].Flink) == a3->Line && v14->UnitId == a3->UnitId )
      goto LABEL_9;
    v5 = *v14;
    Line = *v14;
  }
  v7->ProblemStatus = v15;
  *(&CmpDummyThreadEvent + 1789) = 7;
  v7->Problem = InterruptProblemSetLineStateFailed;
  v7->ProblemSourceFile = "minkernel\\hals\\lib\\interrupts\\common\\connect.c";
  v7->ProblemSourceLine = 1119;
LABEL_9:
  if( v15 < 0 && v10 )
  {
    v17 = v22;
    v18 = Lines[2].Blink;
    *v18 = v21;
    v19 = v23;
    v18[1] = (_LIST_ENTRY)v17;
    *(_QWORD *)&v17 = v24;
    v18[2] = (_LIST_ENTRY)v19;
    v18[3].Flink = (_LIST_ENTRY *)v17;
  }
  return(unsigned int)v15;
}

Referenced by:

HalpInterruptSetDestination