From a2c9ae57c38cc49be5de06a7ed9801100e4b2f39 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Tue, 22 Aug 2006 23:41:39 +0000 Subject: [PATCH] - Use the IRR to determine APC delivery. svn path=/trunk/; revision=23655 --- reactos/hal/halx86/generic/irql.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/reactos/hal/halx86/generic/irql.c b/reactos/hal/halx86/generic/irql.c index 3a9a93a6a2c..99cd60e33d7 100644 --- a/reactos/hal/halx86/generic/irql.c +++ b/reactos/hal/halx86/generic/irql.c @@ -60,6 +60,7 @@ HalpLowerIrql(KIRQL NewIrql) Mask >>= 8; WRITE_PORT_UCHAR((PUCHAR)0xa1, (UCHAR)Mask); } + if (NewIrql >= PROFILE_LEVEL) { KeGetPcr()->Irql = NewIrql; @@ -73,18 +74,24 @@ HalpLowerIrql(KIRQL NewIrql) KeGetPcr()->Irql = DISPATCH_LEVEL; if (Table[KeGetPcr()->IRR] >= NewIrql) { - KeGetPcr()->IRR &= ~4; - KiDispatchInterrupt(); + if (Table[KeGetPcr()->IRR] == DISPATCH_LEVEL) + { + KeGetPcr()->IRR &= ~4; + KiDispatchInterrupt(); + } } KeGetPcr()->Irql = APC_LEVEL; if (NewIrql == APC_LEVEL) { return; } - if (KeGetCurrentThread() != NULL && - KeGetCurrentThread()->ApcState.KernelApcPending) + if (Table[KeGetPcr()->IRR] >= NewIrql) { + if (Table[KeGetPcr()->IRR] == APC_LEVEL) + { + KeGetPcr()->IRR &= ~2; KiDeliverApc(KernelMode, NULL, NULL); + } } KeGetPcr()->Irql = PASSIVE_LEVEL; }