KiDisconnectSecondaryInterruptInternal
NTSTATUS __stdcall KiDisconnectSecondaryInterruptInternal(
_KINTERRUPT *Interrupt,
_INTERRUPT_CONNECTION_DATA *ConnectionData){
NTSTATUS result;
__int64 v3;
_KINTERRUPT *v4;
_LIST_ENTRY *Flink;
_LIST_ENTRY *Blink;
bool v7;
result = -1073741585;
if( Interrupt->Connected )
{
v3 = KiGlobalSecondaryIDT + 48i64 * (Interrupt->Vector - 256);
v4 = *(_KINTERRUPT **)(v3 + 40);
if( v4 == Interrupt )
{
if( v4->InterruptListEntry.Flink == &v4->InterruptListEntry )
*(_QWORD *)(v3 + 40) = 0i64;
else
*(_QWORD *)(v3 + 40) = (char *)Interrupt->InterruptListEntry.Flink - 8;
}
Flink = Interrupt->InterruptListEntry.Flink;
if( Flink->Blink != &Interrupt->InterruptListEntry
|| (Blink = Interrupt->InterruptListEntry.Blink, Blink->Flink != &Interrupt->InterruptListEntry) )
{
__fastfail(3u);
}
Blink->Flink = Flink;
Flink->Blink = Blink;
v7 = *(_QWORD *)(v3 + 40) != 0i64;
Interrupt->Connected = 0;
return v7 ? 0x128 : 0;
}
return result;
}Referenced by:
KiDisconnectInterruptCommon
KiProcessPendingDisconnect