KeMaskInterrupt
NTSTATUS __stdcall KeMaskInterrupt(
_KINTERRUPT **InterruptObject,
UINT8 ProcessorCount,
_INTERRUPT_CONNECTION_DATA *ConnectionData,
_KDPC *LineMaskDpc){
UINT8 IsInterruptTypeSecondary;
int ProcessorNumberFromIndex;
unsigned __int8 v10;
_KINTERRUPT *v11;
VOID *Gsiv;
unsigned __int8 CurrentIrql;
unsigned int Number;
unsigned __int8 v15;
_KINTERRUPT *v16;
char v17;
int v19;
_KINTERRUPT *v20;
int v21;
char OldIrql[4];
_PROCESSOR_NUMBER ProcNumber;
_GROUP_AFFINITY PreviousAffinity;
PreviousAffinity = 0i64;
OldIrql[0] = 0;
ProcNumber = 0;
IsInterruptTypeSecondary = KiIsInterruptTypeSecondary(ConnectionData);
ProcessorNumberFromIndex = 0;
v10 = 0;
if( ProcessorCount )
{
do
{
v11 = InterruptObject[v10];
_m_prefetchw(&v11->InternalState);
if( (_InterlockedOr(&v11->InternalState, 1u) & 1) != 0 )
return -2147483611;
}
while( ++v10 < ProcessorCount );
}
if( ConnectionData->Vectors[0].Type )
return 0;
Gsiv = (VOID *)ConnectionData->Vectors[0].ControllerInput.Gsiv;
if( IsInterruptTypeSecondary != 0 )
{
ProcessorNumberFromIndex = KiMaskSecondaryInterruptInternal((*InterruptObject)->Vector, (unsigned int)Gsiv);
goto LABEL_13;
}
CurrentIrql = KeGetCurrentIrql();
__writecr8(0xFui64);
Number = KeGetPcr()->Prcb.Number;
v15 = 0;
OldIrql[0] = CurrentIrql;
if( ProcessorCount )
{
while( 1 )
{
v16 = InterruptObject[v15];
if( v16->Number == Number )
break;
if( ++v15 >= ProcessorCount )
{
v17 = 0;
goto LABEL_12;
}
}
KiMaskInterruptInternal(v16->Vector, (_BYTE *)(unsigned int)Gsiv);
ProcessorNumberFromIndex = v19;
v17 = 1;
}
else
{
v17 = 0;
}
LABEL_12:
__writecr8(CurrentIrql);
if( v17 )
goto LABEL_13;
v20 = *InterruptObject;
if( KeGetCurrentIrql() < 2u )
{
KiAcquireInterruptConnectLock(v20->Number, (UINT8 *)OldIrql, &PreviousAffinity);
KiMaskInterruptInternal(v20->Vector, (_BYTE *)(unsigned int)Gsiv);
ProcessorNumberFromIndex = v21;
__writecr8((unsigned __int8)OldIrql[0]);
KeRevertToUserGroupAffinityThread(&PreviousAffinity);
LABEL_13:
if( ProcessorNumberFromIndex == 296 )
return 0;
return ProcessorNumberFromIndex;
}
if( LineMaskDpc )
{
ProcessorNumberFromIndex = KeGetProcessorNumberFromIndex(v20->Number, &ProcNumber);
if( ProcessorNumberFromIndex >= 0 )
{
KeRemoveQueueDpcEx(LineMaskDpc, 0i64);
LineMaskDpc->TargetInfoAsUlong = 275;
LineMaskDpc->DeferredRoutine = (void(__fastcall *)(_KDPC *, void *, void *, void *))KiMaskInterruptDpc;
LineMaskDpc->DeferredContext = 0i64;
LineMaskDpc->DpcData = 0i64;
LineMaskDpc->ProcessorHistory = 0i64;
ProcessorNumberFromIndex = KeSetTargetProcessorDpcEx(LineMaskDpc, &ProcNumber);
if( ProcessorNumberFromIndex >= 0 )
KiInsertQueueDpc(LineMaskDpc, (VOID *)v20->Vector, Gsiv, 0i64, 0);
}
goto LABEL_13;
}
return -1073741811;
}Referenced by:
IopMaskInterrupt
KeDisconnectInterrupt