[PATCH] [DbgHelp]: fix regression with prevented StackWalk on i386 CPU to be called with a NULL context

Eric Pouech eric.pouech at orange.fr
Sat Sep 11 05:14:59 CDT 2010


(all other CPUs require a non-null context)
Fix for #24068

A+
---

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


diff --git a/dlls/dbghelp/cpu_i386.c b/dlls/dbghelp/cpu_i386.c
index a88b00f..7739d13 100644
--- a/dlls/dbghelp/cpu_i386.c
+++ b/dlls/dbghelp/cpu_i386.c
@@ -108,6 +108,9 @@ static BOOL i386_stack_walk(struct cpu_stack_walk* csw, LPSTACKFRAME64 frame, CO
     WORD                val;
     BOOL                do_switch;
     unsigned            deltapc = 1;
+#ifdef __i386__
+    CONTEXT             _context;
+#endif
 
     /* sanity check */
     if (curr_mode >= stm_done) return FALSE;
@@ -120,6 +123,21 @@ static BOOL i386_stack_walk(struct cpu_stack_walk* csw, LPSTACKFRAME64 frame, CO
           curr_mode == stm_start ? "start" : (curr_mode == stm_16bit ? "16bit" : "32bit"),
           (void*)(DWORD_PTR)curr_switch, (void*)(DWORD_PTR)next_switch);
 
+#ifdef __i386__
+    if (!context)
+    {
+        /* setup a pseudo context for the rest of the code (esp. unwinding) */
+        context = &_context;
+        memset(context, 0, sizeof(*context));
+        context->ContextFlags = CONTEXT_CONTROL | CONTEXT_SEGMENTS;
+        if (frame->AddrPC.Mode != AddrModeFlat)    context->SegCs = frame->AddrPC.Segment;
+        context->Eip = frame->AddrPC.Offset;
+        if (frame->AddrFrame.Mode != AddrModeFlat) context->SegSs = frame->AddrFrame.Segment;
+        context->Ebp = frame->AddrFrame.Offset;
+        if (frame->AddrStack.Mode != AddrModeFlat) context->SegSs = frame->AddrStack.Segment;
+        context->Esp = frame->AddrStack.Offset;
+    }
+#endif
     if (curr_mode == stm_start)
     {
         THREAD_BASIC_INFORMATION info;






More information about the wine-patches mailing list