If the user mode is intercepted by an interrupt, we must deliver user mode apc's.

svn path=/trunk/; revision=16627
This commit is contained in:
Hartmut Birr 2005-07-17 18:36:01 +00:00
parent 2adf26048d
commit 53f97f1bee

View file

@ -306,12 +306,12 @@ KiInterruptDispatch (ULONG vector, PKIRQ_TRAPFRAME Trapframe)
*/ */
Ke386DisableInterrupts(); Ke386DisableInterrupts();
HalEndSystemInterrupt (old_level, 0);
if (old_level==PASSIVE_LEVEL && Trapframe->Cs != KERNEL_CS) if (old_level==PASSIVE_LEVEL && Trapframe->Cs != KERNEL_CS)
{ {
HalEndSystemInterrupt (APC_LEVEL, 0);
CurrentThread = KeGetCurrentThread(); CurrentThread = KeGetCurrentThread();
if (CurrentThread!=NULL && CurrentThread->Alerted[1]) if (CurrentThread!=NULL && CurrentThread->ApcState.UserApcPending)
{ {
DPRINT("PID: %d, TID: %d CS %04x/%04x\n", DPRINT("PID: %d, TID: %d CS %04x/%04x\n",
((PETHREAD)CurrentThread)->ThreadsProcess->UniqueProcessId, ((PETHREAD)CurrentThread)->ThreadsProcess->UniqueProcessId,
@ -325,8 +325,8 @@ KiInterruptDispatch (ULONG vector, PKIRQ_TRAPFRAME Trapframe)
CurrentThread->TrapFrame = &KernelTrapFrame; CurrentThread->TrapFrame = &KernelTrapFrame;
} }
Ke386EnableInterrupts(); Ke386EnableInterrupts();
KiDeliverApc(KernelMode, NULL, NULL); KiDeliverApc(UserMode, NULL, NULL);
Ke386DisableInterrupts(); Ke386DisableInterrupts();
ASSERT(KeGetCurrentThread() == CurrentThread); ASSERT(KeGetCurrentThread() == CurrentThread);
@ -336,7 +336,13 @@ KiInterruptDispatch (ULONG vector, PKIRQ_TRAPFRAME Trapframe)
CurrentThread->TrapFrame = OldTrapFrame; CurrentThread->TrapFrame = OldTrapFrame;
} }
} }
KeLowerIrql(PASSIVE_LEVEL);
} }
else
{
HalEndSystemInterrupt (old_level, 0);
}
} }
static VOID static VOID