diff --git a/programs/winedbg/debugger.h b/programs/winedbg/debugger.h index d11e291ca76..3fb650d4040 100644 --- a/programs/winedbg/debugger.h +++ b/programs/winedbg/debugger.h @@ -417,7 +417,7 @@ extern void print_value(const struct dbg_lvalue* addr, char format, extern int types_print_type(const struct dbg_type*, BOOL details); extern int print_types(void); extern long int types_extract_as_integer(const struct dbg_lvalue*); -extern LONGLONG types_extract_as_longlong(const struct dbg_lvalue*); +extern LONGLONG types_extract_as_longlong(const struct dbg_lvalue*, unsigned* psize); extern void types_extract_as_address(const struct dbg_lvalue*, ADDRESS64*); extern BOOL types_deref(const struct dbg_lvalue* value, struct dbg_lvalue* result); extern BOOL types_udt_find_element(struct dbg_lvalue* value, const char* name, long int* tmpbuf); diff --git a/programs/winedbg/memory.c b/programs/winedbg/memory.c index 70ca4caa6ba..3d7a15b287c 100644 --- a/programs/winedbg/memory.c +++ b/programs/winedbg/memory.c @@ -474,14 +474,20 @@ void print_basic(const struct dbg_lvalue* lvalue, char format) if (format != 0) { - LONGLONG res = types_extract_as_longlong(lvalue); + unsigned size; + LONGLONG res = types_extract_as_longlong(lvalue, &size); + DWORD hi; WCHAR wch; /* FIXME: this implies i386 byte ordering */ switch (format) { case 'x': - dbg_printf("0x%x", (DWORD)(ULONG64)res); + hi = (ULONG64)res >> 32; + if (size == 8 && hi) + dbg_printf("0x%x%08x", hi, (DWORD)res); + else + dbg_printf("0x%x", (DWORD)res); return; case 'd': @@ -509,7 +515,7 @@ void print_basic(const struct dbg_lvalue* lvalue, char format) } if (lvalue->type.id == dbg_itype_segptr) { - dbg_print_longlong(types_extract_as_longlong(lvalue), TRUE); + dbg_print_longlong(types_extract_as_longlong(lvalue, NULL), TRUE); dbg_printf("\n"); } else print_typed_basic(lvalue); diff --git a/programs/winedbg/types.c b/programs/winedbg/types.c index a5700fb4fef..fd13dac85e6 100644 --- a/programs/winedbg/types.c +++ b/programs/winedbg/types.c @@ -53,7 +53,7 @@ BOOL types_get_real_type(struct dbg_type* type, DWORD* tag) * Given a lvalue, try to get an integral (or pointer/address) value * out of it */ -LONGLONG types_extract_as_longlong(const struct dbg_lvalue* lvalue) +LONGLONG types_extract_as_longlong(const struct dbg_lvalue* lvalue, unsigned* psize) { LONGLONG rtn; DWORD tag, bt; @@ -68,6 +68,7 @@ LONGLONG types_extract_as_longlong(const struct dbg_lvalue* lvalue) return (long int)memory_to_linear_addr(&lvalue->addr); } + if (psize) *psize = 0; switch (tag) { case SymTagBaseType: @@ -96,6 +97,7 @@ LONGLONG types_extract_as_longlong(const struct dbg_lvalue* lvalue) case btFloat: RaiseException(DEBUG_STATUS_NOT_AN_INTEGER, 0, 0, NULL); } + if (psize) *psize = (unsigned)size; break; case SymTagPointerType: if (!be_cpu->fetch_integer(lvalue, sizeof(void*), FALSE, &rtn)) @@ -131,7 +133,7 @@ LONGLONG types_extract_as_longlong(const struct dbg_lvalue* lvalue) */ long int types_extract_as_integer(const struct dbg_lvalue* lvalue) { - return types_extract_as_longlong(lvalue); + return types_extract_as_longlong(lvalue, NULL); } /****************************************************************** @@ -148,7 +150,7 @@ void types_extract_as_address(const struct dbg_lvalue* lvalue, ADDRESS64* addr) else { addr->Mode = AddrModeFlat; - addr->Offset = types_extract_as_longlong( lvalue ); + addr->Offset = types_extract_as_longlong(lvalue, NULL); } }