Author: tkreuzer Date: Thu Sep 16 19:21:20 2010 New Revision: 48781
URL: http://svn.reactos.org/svn/reactos?rev=48781&view=rev Log: [NTOS] - More fixes to VDM PUSH/POPF code: - When doing a 32bit push, don't store the flags 2 bytes off - Recalculate HardwareEsp, by substracting the segment part, instead of truncating the flat pointer to 16 bit.
Modified: trunk/reactos/ntoskrnl/ke/i386/v86vdm.c
Modified: trunk/reactos/ntoskrnl/ke/i386/v86vdm.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/i386/v86vdm.c?r... ============================================================================== --- trunk/reactos/ntoskrnl/ke/i386/v86vdm.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/ke/i386/v86vdm.c [iso-8859-1] Thu Sep 16 19:21:20 2010 @@ -76,17 +76,17 @@ { /* Save EFlags */ Esp -= 4; - *(PULONG)(Esp - 2) = V86EFlags; + *(PULONG)Esp = V86EFlags; } else { + /* Save EFLags */ Esp -= 2; - /* Save EFLags */ *(PUSHORT)Esp = (USHORT)V86EFlags; }
/* Set new ESP and EIP */ - TrapFrame->HardwareEsp = (USHORT)Esp; + TrapFrame->HardwareEsp = Esp - (TrapFrame->HardwareSegSs << 4); TrapFrame->Eip += KiVdmGetInstructionSize(Flags);
/* We're done */ @@ -115,12 +115,10 @@ /* Read EFlags */ EFlags = *(PUSHORT)Esp; Esp += 2; - /* Read correct flags and use correct stack address */ - EFlags &= 0xFFFF; }
/* Set new ESP */ - TrapFrame->HardwareEsp = (USHORT)Esp; + TrapFrame->HardwareEsp = Esp - (TrapFrame->HardwareSegSs << 4);
/* Mask out IOPL from the flags */ EFlags &= ~EFLAGS_IOPL;