KiDisconnectInterruptCommon
VOID __fastcall KiDisconnectInterruptCommon(
INT64 InterruptType,
_KINTERRUPT *Interrupt,
_INTERRUPT_CONNECTION_DATA *ConnectionData){
int v3;
_ETHREAD *ServiceThread;
char v7;
UINT64 *v8;
_INTERRUPT_CONNECTION_DATA *v9;
char OldIrql[8];
__int128 v11;
__int64 v12;
_KEVENT *v13[3];
_GROUP_AFFINITY PreviousAffinity;
v13[1] = (_KEVENT *)ConnectionData;
v13[0] = 0i64;
v12 = 0i64;
v3 = InterruptType;
v13[2] = 0i64;
ServiceThread = Interrupt->ServiceThread;
v11 = 0i64;
OldIrql[0] = 0;
v7 = 0;
PreviousAffinity = 0i64;
if( ServiceThread != (_ETHREAD *)KeGetCurrentThread() )
{
LOWORD(v11) = 1;
v12 = (__int64)&v11 + 8;
*((_QWORD *)&v11 + 1) = (char *)&v11 + 8;
v13[0] = (_KEVENT *)&v11;
BYTE2(v11) = 6;
DWORD1(v11) = 0;
}
if( v3 )
{
v8 = (UINT64 *)(KiGlobalSecondaryIDT + 48i64 * (Interrupt->Vector - 256));
KiAcquireSecondaryInterruptConnectLock(v8, (UINT8 *)OldIrql);
}
else
{
v8 = 0i64;
KiAcquireInterruptConnectLock(Interrupt->Number, (UINT8 *)OldIrql, &PreviousAffinity);
}
if( Interrupt->Connected && (Interrupt->InternalState & 2) == 0 )
{
if( Interrupt->ActiveCount )
{
_InterlockedOr(&Interrupt->InternalState, 2u);
v7 = 1;
Interrupt->DisconnectData = v13;
}
else
{
if( !v3 )
{
KiDisconnectInterruptInternal(Interrupt, ConnectionData);
LABEL_10:
__writecr8((unsigned __int8)OldIrql[0]);
KeRevertToUserGroupAffinityThread(&PreviousAffinity);
goto LABEL_11;
}
KiDisconnectSecondaryInterruptInternal(Interrupt, v9);
}
}
if( !v3 )
goto LABEL_10;
KxReleaseSpinLock(v8);
__writecr8((unsigned __int8)OldIrql[0]);
LABEL_11:
if( v13[0] )
{
if( v7 )
KiSignalWaitDisconnectLock(v13[0], 1);
}
}Referenced by:
KeDisconnectInterrupt
KiDisconnectSecondaryInterrupt