From 30fad2a263a48f290e011d489a2db6d1e929651f Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Thu, 16 Sep 2010 19:21:20 +0000 Subject: [PATCH] [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. svn path=/trunk/; revision=48781 --- reactos/ntoskrnl/ke/i386/v86vdm.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/reactos/ntoskrnl/ke/i386/v86vdm.c b/reactos/ntoskrnl/ke/i386/v86vdm.c index bcb4b16f520..503f4138423 100644 --- a/reactos/ntoskrnl/ke/i386/v86vdm.c +++ b/reactos/ntoskrnl/ke/i386/v86vdm.c @@ -76,17 +76,17 @@ KiVdmOpcodePUSHF(IN PKTRAP_FRAME TrapFrame, { /* Save EFlags */ Esp -= 4; - *(PULONG)(Esp - 2) = V86EFlags; + *(PULONG)Esp = V86EFlags; } else { - Esp -= 2; /* Save EFLags */ + Esp -= 2; *(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 @@ KiVdmOpcodePOPF(IN PKTRAP_FRAME TrapFrame, /* 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; -- 2.17.1