Zebediah Figura : winedbg: Implement debugging 32-bit processes on x86_64.

Alexandre Julliard julliard at winehq.org
Thu Jun 14 16:53:22 CDT 2018


Module: wine
Branch: master
Commit: 5caaba7e3e8e283f11bb9ce79cb68c4bca2c44f3
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=5caaba7e3e8e283f11bb9ce79cb68c4bca2c44f3

Author: Zebediah Figura <zfigura at codeweavers.com>
Date:   Wed Jun 13 16:34:00 2018 -0500

winedbg: Implement debugging 32-bit processes on x86_64.

Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 programs/winedbg/be_i386.c   | 22 ++++++++++++----------
 programs/winedbg/db_disasm.c |  4 ++--
 programs/winedbg/winedbg.c   | 21 ++++++++-------------
 3 files changed, 22 insertions(+), 25 deletions(-)

diff --git a/programs/winedbg/be_i386.c b/programs/winedbg/be_i386.c
index f46ebb1..4e279ec 100644
--- a/programs/winedbg/be_i386.c
+++ b/programs/winedbg/be_i386.c
@@ -21,7 +21,7 @@
 #include "debugger.h"
 #include "wine/debug.h"
 
-#ifdef __i386__
+#if defined(__i386__) || defined(__x86_64__)
 
 WINE_DEFAULT_DEBUG_CHANNEL(winedbg);
 
@@ -33,6 +33,7 @@ extern void             be_i386_disasm_one_insn(ADDRESS64* addr, int display);
 
 #define IS_VM86_MODE(ctx) (ctx->EFlags & V86_FLAG)
 
+#ifndef __x86_64__
 typedef struct DECLSPEC_ALIGN(16) _M128A {
     ULONGLONG Low;
     LONGLONG High;
@@ -56,6 +57,7 @@ typedef struct _XMM_SAVE_AREA32 {
     M128A XmmRegisters[16];  /* 0a0 */
     BYTE Reserved4[96];      /* 1a0 */
 } XMM_SAVE_AREA32, *PXMM_SAVE_AREA32;
+#endif
 
 static ADDRESS_MODE get_selector_type(HANDLE hThread, const WOW64_CONTEXT *ctx, WORD sel)
 {
@@ -77,18 +79,18 @@ static void* be_i386_linearize(HANDLE hThread, const ADDRESS64* addr)
     switch (addr->Mode)
     {
     case AddrModeReal:
-        return (void*)((DWORD)(LOWORD(addr->Segment) << 4) + (DWORD)addr->Offset);
+        return (void*)((DWORD_PTR)(LOWORD(addr->Segment) << 4) + (DWORD_PTR)addr->Offset);
     case AddrMode1632:
         if (!(addr->Segment & 4) || ((addr->Segment >> 3) < 17))
-            return (void*)(DWORD)addr->Offset;
+            return (void*)(DWORD_PTR)addr->Offset;
         /* fall through */
     case AddrMode1616:
         if (!dbg_curr_process->process_io->get_selector(hThread, addr->Segment, &le)) return NULL;
         return (void*)((le.HighWord.Bits.BaseHi << 24) + 
                        (le.HighWord.Bits.BaseMid << 16) + le.BaseLow +
-                       (DWORD)addr->Offset);
+                       (DWORD_PTR)addr->Offset);
     case AddrModeFlat:
-        return (void*)(DWORD)addr->Offset;
+        return (void*)(DWORD_PTR)addr->Offset;
     }
     return NULL;
 }
@@ -502,7 +504,7 @@ static BOOL be_i386_is_func_call(const void* insn, ADDRESS64* callee)
         if (!fetch_value((const char*)insn + 1, operand_size, &delta))
             return FALSE;
         callee->Segment = dbg_context.x86.SegCs;
-        callee->Offset = (DWORD)insn + 1 + (operand_size / 8) + delta;
+        callee->Offset = (DWORD_PTR)insn + 1 + (operand_size / 8) + delta;
         return TRUE;
 
     case 0x9a: /* absolute far call */
@@ -589,11 +591,11 @@ static BOOL be_i386_is_func_call(const void* insn, ADDRESS64* callee)
                 }
                 if (((ch >> 3) & 0x07) == 0x03) /* LCALL */
                 {
-                    if (!dbg_read_memory((const char*)dst + operand_size, &segment, sizeof(segment)))
+                    if (!dbg_read_memory((const char*)(UINT_PTR)dst + operand_size, &segment, sizeof(segment)))
                         return FALSE;
                 }
                 else segment = dbg_context.x86.SegCs;
-                if (!dbg_read_memory((const char*)dst, &delta, sizeof(delta)))
+                if (!dbg_read_memory((const char*)(UINT_PTR)dst, &delta, sizeof(delta)))
                     return FALSE;
                 callee->Mode = get_selector_type(dbg_curr_thread->handle, &dbg_context.x86,
                                                  segment);
@@ -643,7 +645,7 @@ static BOOL be_i386_is_jump(const void* insn, ADDRESS64* jumpee)
         if (!fetch_value((const char*)insn + 1, operand_size, &delta))
             return FALSE;
         jumpee->Segment = dbg_context.x86.SegCs;
-        jumpee->Offset = (DWORD)insn + 1 + (operand_size / 8) + delta;
+        jumpee->Offset = (DWORD_PTR)insn + 1 + (operand_size / 8) + delta;
         return TRUE;
     default: WINE_FIXME("unknown %x\n", ch); return FALSE;
     }
@@ -733,7 +735,7 @@ static BOOL be_i386_insert_Xpoint(HANDLE hProcess, const struct be_process_io* p
         bits = DR7_RW_WRITE;
     hw_bp:
         if ((reg = be_i386_get_unused_DR(ctx, &pr)) == -1) return FALSE;
-        *pr = (DWORD)addr;
+        *pr = (DWORD_PTR)addr;
         if (type != be_xpoint_watch_exec) switch (size)
         {
         case 4: bits |= DR7_LEN_4; break;
diff --git a/programs/winedbg/db_disasm.c b/programs/winedbg/db_disasm.c
index 9bdfb90..f57f009 100644
--- a/programs/winedbg/db_disasm.c
+++ b/programs/winedbg/db_disasm.c
@@ -64,7 +64,7 @@
 
 #include "debugger.h"
 
-#ifdef __i386__
+#if defined(__i386__) || defined(__x86_64__)
 
 /*
  * Switch to disassemble 16-bit code.
@@ -1225,7 +1225,7 @@ static void db_print_address(const char *seg, int size, struct i_addr *addrp, in
                void*    a2;
                
                dbg_printf("0x%x -> ", addrp->disp);
-	       if (!dbg_read_memory((void*)addrp->disp, &a1, sizeof(a1))) {
+	       if (!dbg_read_memory((void*)(INT_PTR)addrp->disp, &a1, sizeof(a1))) {
 		   dbg_printf("(invalid source)");
 	       } else if (!dbg_read_memory(a1, &a2, sizeof(a2))) {
 		  dbg_printf("(invalid destination)");
diff --git a/programs/winedbg/winedbg.c b/programs/winedbg/winedbg.c
index b5ffd76..1ac4187 100644
--- a/programs/winedbg/winedbg.c
+++ b/programs/winedbg/winedbg.c
@@ -284,6 +284,7 @@ extern struct backend_cpu be_i386;
 #elif defined(__powerpc__)
 extern struct backend_cpu be_ppc;
 #elif defined(__x86_64__)
+extern struct backend_cpu be_i386;
 extern struct backend_cpu be_x86_64;
 #elif defined(__arm__) && !defined(__ARMEB__)
 extern struct backend_cpu be_arm;
@@ -296,21 +297,13 @@ extern struct backend_cpu be_arm64;
 struct dbg_process*	dbg_add_process(const struct be_process_io* pio, DWORD pid, HANDLE h)
 {
     struct dbg_process*	p;
+    BOOL wow64;
 
     if ((p = dbg_get_process(pid)))
-    {
-        if (p->handle != 0)
-        {
-            WINE_ERR("Process (%04x) is already defined\n", pid);
-        }
-        else
-        {
-            p->handle = h;
-            p->process_io = pio;
-            p->imageName = NULL;
-        }
         return p;
-    }
+
+    if (!h)
+        h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
 
     if (!(p = HeapAlloc(GetProcessHeap(), 0, sizeof(struct dbg_process)))) return NULL;
     p->handle = h;
@@ -333,12 +326,14 @@ struct dbg_process*	dbg_add_process(const struct be_process_io* pio, DWORD pid,
 
     list_add_head(&dbg_process_list, &p->entry);
 
+    IsWow64Process(h, &wow64);
+
 #ifdef __i386__
     p->be_cpu = &be_i386;
 #elif defined(__powerpc__)
     p->be_cpu = &be_ppc;
 #elif defined(__x86_64__)
-    p->be_cpu = &be_x86_64;
+    p->be_cpu = wow64 ? &be_i386 : &be_x86_64;
 #elif defined(__arm__) && !defined(__ARMEB__)
     p->be_cpu = &be_arm;
 #elif defined(__aarch64__) && !defined(__AARCH64EB__)




More information about the wine-cvs mailing list