From 360a87c9f9a8930162eac11e6b1d7f8ee2e538e1 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Mon, 13 Aug 2012 01:17:13 +0000 Subject: [PATCH] [NTOSKRNL] - Fix a critical bug in interrupt handling that could result in HAL returning the current processor to the wrong IRQL after an interrupt is handled that requires a raise to a synchronize IRQL. svn path=/trunk/; revision=57065 --- reactos/ntoskrnl/ke/i386/irqobj.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/reactos/ntoskrnl/ke/i386/irqobj.c b/reactos/ntoskrnl/ke/i386/irqobj.c index d571cff1c50..734872cec8e 100644 --- a/reactos/ntoskrnl/ke/i386/irqobj.c +++ b/reactos/ntoskrnl/ke/i386/irqobj.c @@ -229,7 +229,7 @@ FASTCALL KiChainedDispatch(IN PKTRAP_FRAME TrapFrame, IN PKINTERRUPT Interrupt) { - KIRQL OldIrql; + KIRQL OldIrql, OldInterruptIrql = 0; BOOLEAN Handled; PLIST_ENTRY NextEntry, ListHead; @@ -250,7 +250,7 @@ KiChainedDispatch(IN PKTRAP_FRAME TrapFrame, if (Interrupt->SynchronizeIrql > Interrupt->Irql) { /* Raise to higher IRQL */ - OldIrql = KfRaiseIrql(Interrupt->SynchronizeIrql); + OldInterruptIrql = KfRaiseIrql(Interrupt->SynchronizeIrql); } /* Acquire interrupt lock */ @@ -267,7 +267,8 @@ KiChainedDispatch(IN PKTRAP_FRAME TrapFrame, if (Interrupt->SynchronizeIrql > Interrupt->Irql) { /* Lower the IRQL back */ - KfLowerIrql(OldIrql); + ASSERT(OldInterruptIrql == Interrupt->Irql); + KfLowerIrql(OldInterruptIrql); } /* Check if the interrupt got handled and it's level */