KiDisconnectSecondaryInterrupt
NTSTATUS __stdcall KiDisconnectSecondaryInterrupt(_KINTERRUPT *Interrupt, _INTERRUPT_CONNECTION_DATA *ConnectionData){
bool v4;
__int64 v5;
_KINTERRUPT *v6;
NTSTATUS v7;
NTSTATUS v8;
UINT8 OldIrql;
OldIrql = 0;
v4 = 0;
v5 = KiGlobalSecondaryIDT + 48i64 * (Interrupt->Vector - 256);
KiAcquireSecondaryPassiveConnectLock((_KSECONDARY_IDT_ENTRY *)v5);
KiAcquireSecondaryInterruptConnectLock((UINT64 *)v5, &OldIrql);
if( Interrupt->Connected )
{
v6 = *(_KINTERRUPT **)(v5 + 40);
if( v6 == Interrupt )
v4 = v6->InterruptListEntry.Flink == &v6->InterruptListEntry;
}
KxReleaseSpinLock((UINT64 *)v5);
__writecr8(OldIrql);
if( v4 )
HalDisableInterrupt(ConnectionData);
KiDisconnectInterruptCommon(1i64, Interrupt, ConnectionData);
v8 = v7;
KeSetEvent((PRKEVENT)(v5 + 8), 0, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
return v8;
}Referenced by:
KeDisconnectInterrupt