- Do not allow software interrupts to preempt code running with interrupts disabled during KfLowerIrql

svn path=/trunk/; revision=54418
This commit is contained in:
Cameron Gutman 2011-11-18 18:53:41 +00:00
parent 01323f857e
commit aefaa2f4f9

View file

@ -666,6 +666,9 @@ KfLowerIrql(IN KIRQL OldIrql)
/* Set old IRQL */ /* Set old IRQL */
Pcr->Irql = OldIrql; Pcr->Irql = OldIrql;
/* Make sure interrupts were enabled */
if (EFlags & EFLAGS_INTERRUPT_MASK)
{
/* Check for pending software interrupts and compare with current IRQL */ /* Check for pending software interrupts and compare with current IRQL */
PendingIrqlMask = Pcr->IRR & FindHigherIrqlMask[OldIrql]; PendingIrqlMask = Pcr->IRR & FindHigherIrqlMask[OldIrql];
if (PendingIrqlMask) if (PendingIrqlMask)
@ -686,6 +689,7 @@ KfLowerIrql(IN KIRQL OldIrql)
/* Now handle pending interrupt */ /* Now handle pending interrupt */
SWInterruptHandlerTable[PendingIrql](); SWInterruptHandlerTable[PendingIrql]();
} }
}
/* Restore interrupt state */ /* Restore interrupt state */
__writeeflags(EFlags); __writeeflags(EFlags);