If the user mode is intercepted by an interrupt, we must deliver user mode apc's. Modified: trunk/reactos/ntoskrnl/ke/i386/irq.c _____
Modified: trunk/reactos/ntoskrnl/ke/i386/irq.c --- trunk/reactos/ntoskrnl/ke/i386/irq.c 2005-07-17 18:34:23 UTC (rev 16626) +++ trunk/reactos/ntoskrnl/ke/i386/irq.c 2005-07-17 18:36:01 UTC (rev 16627) @@ -306,12 +306,12 @@
*/ 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 @@ CurrentThread->TrapFrame = &KernelTrapFrame; }
- Ke386EnableInterrupts(); - KiDeliverApc(KernelMode, NULL, NULL); + Ke386EnableInterrupts(); + KiDeliverApc(UserMode, NULL, NULL); Ke386DisableInterrupts();
ASSERT(KeGetCurrentThread() == CurrentThread); @@ -336,7 +336,13 @@ CurrentThread->TrapFrame = OldTrapFrame; } } + KeLowerIrql(PASSIVE_LEVEL); } + else + { + HalEndSystemInterrupt (old_level, 0); + } + }
static VOID