Home | Info | Community | Development | myReactOS | Contact Us
Definition at line 171 of file vdmexec.c.
Referenced by NtVdmControl().
{ PETHREAD Thread = PsGetCurrentThread(); PKTRAP_FRAME VdmFrame; NTSTATUS Status; PVDM_TIB VdmTib; BOOLEAN Interrupts; KIRQL OldIrql; CONTEXT VdmContext; PAGED_CODE(); /* Get the thread's VDM frame and TIB */ VdmFrame = (PVOID)((ULONG_PTR)Thread->Tcb.InitialStack - sizeof(FX_SAVE_AREA) - sizeof(KTRAP_FRAME)); Status = VdmpGetVdmTib(&VdmTib); if (!NT_SUCCESS(Status)) return STATUS_INVALID_SYSTEM_SERVICE; /* Go to APC level */ KeRaiseIrql(APC_LEVEL, &OldIrql); /* Check if interrupts are enabled */ Interrupts = (BOOLEAN)(VdmTib->VdmContext.EFlags & EFLAGS_INTERRUPT_MASK); /* We don't support full VDM yet, this shouldn't happen */ ASSERT(*VdmState == 0); ASSERT(VdmTib->VdmContext.EFlags & EFLAGS_V86_MASK); /* Check if VME is supported and V86 mode was enabled */ if ((KeI386VirtualIntExtensions) && (VdmTib->VdmContext.EFlags & EFLAGS_V86_MASK)) { /* Check if interrupts are enabled */ if (Interrupts) { /* Set fake IF flag */ VdmTib->VdmContext.EFlags |= EFLAGS_VIF; } else { /* Remove fake IF flag, turn on real IF flag */ VdmTib->VdmContext.EFlags &= ~EFLAGS_VIF; VdmTib->VdmContext.EFlags |= EFLAGS_INTERRUPT_MASK; } } else { /* Set interrupt state in the VDM State */ if (VdmTib->VdmContext.EFlags & EFLAGS_INTERRUPT_MASK) { /* Enable them as well */ InterlockedOr((PLONG)VdmState, EFLAGS_INTERRUPT_MASK); } else { /* Disable them */ InterlockedAnd((PLONG)VdmState, ~EFLAGS_INTERRUPT_MASK); } /* Enable the interrupt flag */ VdmTib->VdmContext.EFlags |= EFLAGS_INTERRUPT_MASK; } /* Get the VDM context and make sure it's not an edited frame */ VdmContext = VdmTib->VdmContext; if (!(VdmContext.SegCs & FRAME_EDITED)) { /* Fail */ KeLowerIrql(OldIrql); return STATUS_INVALID_SYSTEM_SERVICE; } /* Now do the VDM Swap */ VdmSwapContext(VdmFrame, &VdmTib->MonitorContext, &VdmContext); /* Lower the IRQL and return EAX */ KeLowerIrql(OldIrql); return VdmFrame->Eax; }