From f91948ad94b1a7c8d3dd31cc5b3829cbacf2cb09 Mon Sep 17 00:00:00 2001 From: Eric Pouech Date: Wed, 3 Feb 2010 21:47:07 +0100 Subject: [PATCH] winedbg: Extend print_typed_basic to handle unicode strings. --- programs/winedbg/memory.c | 41 ++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/programs/winedbg/memory.c b/programs/winedbg/memory.c index e4f4729e944..c8ceeb19bfc 100644 --- a/programs/winedbg/memory.c +++ b/programs/winedbg/memory.c @@ -347,6 +347,7 @@ static void print_typed_basic(const struct dbg_lvalue* lvalue) DWORD tag, size, count, bt; struct dbg_type type = lvalue->type; struct dbg_type sub_type; + struct dbg_lvalue sub_lvalue; if (!types_get_real_type(&type, &tag)) return; @@ -383,6 +384,11 @@ static void print_typed_basic(const struct dbg_lvalue* lvalue) print_char: if (size == 1 && (val_int < 0x20 || val_int > 0x80)) dbg_printf("%d", (int)val_int); + else if (size == 2) + { + WCHAR wch = (WCHAR)val_int; + dbg_outputW(&wch, 1); + } else dbg_printf("'%c'", (char)val_int); break; @@ -396,32 +402,31 @@ static void print_typed_basic(const struct dbg_lvalue* lvalue) } break; case SymTagPointerType: - if (!memory_read_value(lvalue, sizeof(void*), &val_ptr)) return; - - sub_type.module = lvalue->type.module; - if (!types_get_info(&type, TI_GET_TYPE, &sub_type.id) || - sub_type.id == dbg_itype_none) + if (!types_deref(lvalue, &sub_lvalue)) { - dbg_printf("Internal symbol error: unable to access memory location %p", val_ptr); + dbg_printf("Internal symbol error: unable to access memory location %p", + memory_to_linear_addr(&lvalue->addr)); break; } - if (!types_get_real_type(&sub_type, &tag)) return; - - if (types_get_info(&sub_type, TI_GET_SYMTAG, &tag) && tag == SymTagBaseType && - types_get_info(&sub_type, TI_GET_BASETYPE, &bt) && (bt == btChar || bt == btInt) && - types_get_info(&sub_type, TI_GET_LENGTH, &size64) && size64 == 1) + val_ptr = memory_to_linear_addr(&sub_lvalue.addr); + if (types_get_real_type(&sub_lvalue.type, &tag) && tag == SymTagBaseType && + types_get_info(&sub_lvalue.type, TI_GET_BASETYPE, &bt) && + types_get_info(&sub_lvalue.type, TI_GET_LENGTH, &size64)) { char buffer[1024]; if (!val_ptr) dbg_printf("0x0"); - else if (memory_get_string(dbg_curr_process, val_ptr, - lvalue->cookie == DLV_TARGET, - size64 == 2, buffer, sizeof(buffer))) - dbg_printf("\"%s\"", buffer); - else - dbg_printf("*** invalid address %p ***", val_ptr); + else if (((bt == btChar || bt == btInt) && size64 == 1) || (bt == btUInt && size64 == 2)) + { + if (memory_get_string(dbg_curr_process, val_ptr, sub_lvalue.cookie == DLV_TARGET, + size64 == 2, buffer, sizeof(buffer))) + dbg_printf("\"%s\"", buffer); + else + dbg_printf("*** invalid address %p ***", val_ptr); + break; + } } - else dbg_printf("%p", val_ptr); + dbg_printf("%p", val_ptr); break; case SymTagArrayType: case SymTagUDT: