KeUnmaskInterrupt
NTSTATUS __stdcall KeUnmaskInterrupt(
_KINTERRUPT **InterruptObject,
UINT8 ProcessorCount,
_INTERRUPT_CONNECTION_DATA *ConnectionData){
UINT8 IsInterruptTypeSecondary;
NTSTATUS v7;
__int64 v8;
_BOOL8 v9;
_KINTERRUPT *v10;
__int64 Gsiv;
NTSTATUS v12;
IsInterruptTypeSecondary = KiIsInterruptTypeSecondary(ConnectionData);
v7 = 0;
LOBYTE(v8) = 0;
v9 = IsInterruptTypeSecondary != 0;
if( ProcessorCount )
{
while( 1 )
{
v10 = InterruptObject[(unsigned __int8)v8];
_m_prefetchw(&v10->InternalState);
if( (_InterlockedAnd(&v10->InternalState, 0xFFFFFFFE) & 1) == 0 )
break;
LOBYTE(v8) = v8 + 1;
if( (unsigned __int8)v8 >= ProcessorCount )
goto LABEL_4;
}
v12 = 295;
}
else
{
LABEL_4:
if( ConnectionData->Vectors[0].Type )
return 0;
Gsiv = ConnectionData->Vectors[0].ControllerInput.Gsiv;
if( v9 )
KiUnmaskSecondaryInterruptInternal((*InterruptObject)->Vector, (unsigned int)Gsiv);
else
v12 = ((__int64(__fastcall *)(__int64, _QWORD, _BOOL8, __int64))off_140C00778[0])(Gsiv, 0i64, v9, v8);
}
if( v12 != 296 )
return v12;
return v7;
}Referenced by:
IopUnmaskInterrupt