KeDisconnectInterrupt
VOID __fastcall KeDisconnectInterrupt(
_KINTERRUPT **InterruptObject,
INT64 ProcessorCount,
_INTERRUPT_CONNECTION_DATA *ConnectionData){
unsigned int v3;
_KINTERRUPT **v5;
UINT8 IsInterruptTypeSecondary;
__int64 v7;
_KINTERRUPT **v8;
__int64 v9;
_KINTERRUPT *v10;
void *RedirectObject;
__int64 v12;
_KINTERRUPT *v13;
v3 = (unsigned __int8)ProcessorCount;
v5 = InterruptObject;
KeMaskInterrupt(InterruptObject, ProcessorCount, ConnectionData, 0i64);
IsInterruptTypeSecondary = KiIsInterruptTypeSecondary(ConnectionData);
v7 = v3;
KiIntSteerDisable(v5, v3);
if( (_BYTE)v3 )
{
v8 = v5;
v9 = v3;
do
{
v10 = *v8;
if( IsInterruptTypeSecondary )
KiDisconnectSecondaryInterrupt(*v8, ConnectionData);
else
KiDisconnectInterruptCommon(0i64, *v8, ConnectionData);
_InterlockedOr(&v10->InternalState, 1u);
++v8;
--v9;
}
while( v9 );
}
RedirectObject = (*v5)->RedirectObject;
if( RedirectObject )
{
if( (_DWORD)v7 )
{
v12 = v7;
do
{
v13 = *v5++;
v13->RedirectObject = 0i64;
--v12;
}
while( v12 );
}
ExFreePoolWithTag(RedirectObject, 0x5249654Bu);
}
}Referenced by:
IoDisconnectInterrupt
KeConnectInterrupt