From 53f97f1bee93d2db2bc8d07c5fb40133d431da2d Mon Sep 17 00:00:00 2001 From: Hartmut Birr Date: Sun, 17 Jul 2005 18:36:01 +0000 Subject: [PATCH] If the user mode is intercepted by an interrupt, we must deliver user mode apc's. svn path=/trunk/; revision=16627 --- reactos/ntoskrnl/ke/i386/irq.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/reactos/ntoskrnl/ke/i386/irq.c b/reactos/ntoskrnl/ke/i386/irq.c index 3b560651150..1ee5fc664dc 100644 --- a/reactos/ntoskrnl/ke/i386/irq.c +++ b/reactos/ntoskrnl/ke/i386/irq.c @@ -306,12 +306,12 @@ KiInterruptDispatch (ULONG vector, PKIRQ_TRAPFRAME Trapframe) */ Ke386DisableInterrupts(); - HalEndSystemInterrupt (old_level, 0); - if (old_level==PASSIVE_LEVEL && Trapframe->Cs != KERNEL_CS) { + HalEndSystemInterrupt (APC_LEVEL, 0); + CurrentThread = KeGetCurrentThread(); - if (CurrentThread!=NULL && CurrentThread->Alerted[1]) + if (CurrentThread!=NULL && CurrentThread->ApcState.UserApcPending) { DPRINT("PID: %d, TID: %d CS %04x/%04x\n", ((PETHREAD)CurrentThread)->ThreadsProcess->UniqueProcessId, @@ -325,8 +325,8 @@ KiInterruptDispatch (ULONG vector, PKIRQ_TRAPFRAME Trapframe) CurrentThread->TrapFrame = &KernelTrapFrame; } - Ke386EnableInterrupts(); - KiDeliverApc(KernelMode, NULL, NULL); + Ke386EnableInterrupts(); + KiDeliverApc(UserMode, NULL, NULL); Ke386DisableInterrupts(); ASSERT(KeGetCurrentThread() == CurrentThread); @@ -336,7 +336,13 @@ KiInterruptDispatch (ULONG vector, PKIRQ_TRAPFRAME Trapframe) CurrentThread->TrapFrame = OldTrapFrame; } } + KeLowerIrql(PASSIVE_LEVEL); } + else + { + HalEndSystemInterrupt (old_level, 0); + } + } static VOID