KeDisconnectInterrupt
NTSTATUS __stdcall KeDisconnectInterrupt(
_KINTERRUPT **InterruptObject,
UINT8 ProcessorCount,
_INTERRUPT_CONNECTION_DATA *ConnectionData){
unsigned int v3;
__int64 *v5;
NTSTATUS v6;
UINT8 IsInterruptTypeSecondary;
__int64 v8;
__int64 *v9;
__int64 v10;
__int64 v11;
int v12;
void *v13;
__int64 v14;
__int64 v15;
v3 = ProcessorCount;
v5 = (__int64 *)InterruptObject;
v6 = 0;
KeMaskInterrupt(InterruptObject, ProcessorCount, ConnectionData, 0i64);
IsInterruptTypeSecondary = KiIsInterruptTypeSecondary(ConnectionData);
v8 = v3;
KiIntSteerDisable(v5, v3);
if( (_BYTE)v3 )
{
v9 = v5;
v10 = v3;
do
{
v11 = *v9;
if( IsInterruptTypeSecondary )
v12 = KiDisconnectSecondaryInterrupt(*v9, (struct _KEVENT *)ConnectionData);
else
v12 = KiDisconnectInterruptCommon(0, *v9, (struct _KEVENT *)ConnectionData);
_InterlockedOr((volatile signed __int32 *)(v11 + 104), 1u);
if( v12 < 0 )
{
v6 = v12;
}
else if( v12 == 296 )
{
v6 = 296;
}
++v9;
--v10;
}
while( v10 );
}
v13 = *(void **)(*v5 + 272);
if( v13 )
{
if( (_DWORD)v8 )
{
v14 = v8;
do
{
v15 = *v5++;
*(_QWORD *)(v15 + 272) = 0i64;
--v14;
}
while( v14 );
}
ExFreePoolWithTag(v13, 0x5249654Bu);
}
return v6;
}Referenced by:
IoDisconnectInterrupt
KeConnectInterrupt