[PATCH 3/3] [DbgHelp]: when unwinding i386 stacks, update CONTEXT with sp/bp/ip

Eric Pouech eric.pouech at orange.fr
Sun Jun 27 11:55:21 CDT 2010




A+
---

 dlls/dbghelp/cpu_i386.c |   14 ++++++++++++++
 1 files changed, 14 insertions(+), 0 deletions(-)


diff --git a/dlls/dbghelp/cpu_i386.c b/dlls/dbghelp/cpu_i386.c
index dc00410..3ea1c2f 100644
--- a/dlls/dbghelp/cpu_i386.c
+++ b/dlls/dbghelp/cpu_i386.c
@@ -410,6 +410,20 @@ static BOOL i386_stack_walk(struct cpu_stack_walk* csw, LPSTACKFRAME64 frame, CO
         sw_read_mem(csw, frame->AddrFrame.Offset + 2 * sizeof(DWORD),
                     frame->Params, sizeof(frame->Params));
     }
+    if (context)
+    {
+#define SET(field, seg, reg) \
+        switch (frame->field.Mode) \
+        { \
+        case AddrModeFlat: context->reg = frame->field.Offset; break; \
+        case AddrMode1616: context->seg = frame->field.Segment; context->reg = frame->field.Offset; break; \
+        default: assert(0); \
+        }
+        SET(AddrStack,  SegSs, Esp);
+        SET(AddrFrame,  SegSs, Ebp);
+        SET(AddrReturn, SegCs, Eip);
+#undef SET
+    }
     goto done_pep; /* just to ensure done_pep label is referenced */
 done_pep:
 






More information about the wine-patches mailing list