Doxygen

VOID FORCEINLINE DECLSPEC_NORETURN KiExitV86Trap ( IN PKTRAP_FRAME  TrapFrame)

Definition at line 310 of file trap_x.h.

Referenced by KiTrap06Handler(), and KiTrap0DHandler().

{
    PKTHREAD Thread;
    KIRQL OldIrql;

    /* Get the thread */
    Thread = KeGetCurrentThread();
    while (TRUE)
    {
        /* Return if this isn't V86 mode anymore */
        if (!(TrapFrame->EFlags & EFLAGS_V86_MASK)) KiEoiHelper(TrapFrame);

        /* Turn off the alerted state for kernel mode */
        Thread->Alerted[KernelMode] = FALSE;

        /* Are there pending user APCs? */
        if (__builtin_expect(!Thread->ApcState.UserApcPending, 1)) break;

        /* Raise to APC level and enable interrupts */
        OldIrql = KfRaiseIrql(APC_LEVEL);
        _enable();

        /* Deliver APCs */
        KiDeliverApc(UserMode, NULL, TrapFrame);

        /* Restore IRQL and disable interrupts once again */
        KfLowerIrql(OldIrql);
        _disable();
    }

    /* If we got here, we're still in a valid V8086 context, so quit it */
    if (__builtin_expect(TrapFrame->Dr7 & ~DR7_RESERVED_MASK, 0))
    {
        /* Restore debug registers from the trap frame */
        KiHandleDebugRegistersOnTrapExit(TrapFrame);
    }

    /* Return from interrupt */
    KiTrapReturnNoSegments(TrapFrame);
}