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