[PATCH 13/17] programs/winedbg: add helper to transfer memory between lvalues
Eric Pouech
eric.pouech at gmail.com
Tue Dec 7 08:57:33 CST 2021
Signed-off-by: Eric Pouech <eric.pouech at gmail.com>
---
programs/winedbg/debugger.h | 1 +
programs/winedbg/memory.c | 31 +++++++++++++++++++++++++++++++
programs/winedbg/types.c | 19 +++----------------
3 files changed, 35 insertions(+), 16 deletions(-)
diff --git a/programs/winedbg/debugger.h b/programs/winedbg/debugger.h
index 14048258c47..b086853e0e7 100644
--- a/programs/winedbg/debugger.h
+++ b/programs/winedbg/debugger.h
@@ -394,6 +394,7 @@ extern void info_wine_dbg_channel(BOOL add, const char* chnl, const
/* memory.c */
extern BOOL memory_read_value(const struct dbg_lvalue* lvalue, DWORD size, void* result);
extern BOOL memory_write_value(const struct dbg_lvalue* val, DWORD size, void* value);
+extern BOOL memory_transfer_value(const struct dbg_lvalue* to, const struct dbg_lvalue* from);
extern BOOL memory_fetch_integer(const struct dbg_lvalue* lvalue, unsigned size,
BOOL is_signed, dbg_lgint_t* ret);
extern BOOL memory_store_integer(const struct dbg_lvalue* lvalue, dbg_lgint_t val);
diff --git a/programs/winedbg/memory.c b/programs/winedbg/memory.c
index 15fe31db3dc..b6182da9d2d 100644
--- a/programs/winedbg/memory.c
+++ b/programs/winedbg/memory.c
@@ -133,6 +133,37 @@ BOOL memory_write_value(const struct dbg_lvalue* lvalue, DWORD size, void* value
return ret;
}
+/* transfer a block of memory
+ * the two lvalue:s are expected to be of same size
+ */
+BOOL memory_transfer_value(const struct dbg_lvalue* to, const struct dbg_lvalue* from)
+{
+ DWORD64 size_to, size_from;
+ BYTE tmp[256];
+ BYTE* ptr = tmp;
+ BOOL ret;
+
+ if (to->bitlen || from->bitlen) return FALSE;
+ if (!types_get_info(&to->type, TI_GET_LENGTH, &size_to) ||
+ !types_get_info(&from->type, TI_GET_LENGTH, &size_from) ||
+ size_from != size_to) return FALSE;
+ /* optimize debugger to debugger transfer */
+ if (!lvalue_in_debuggee(to) && !lvalue_in_debuggee(from))
+ {
+ memcpy(memory_to_linear_addr(&to->addr), memory_to_linear_addr(&from->addr), size_from);
+ return TRUE;
+ }
+ if (size_to > sizeof(tmp))
+ {
+ ptr = malloc(size_from);
+ if (!ptr) return FALSE;
+ }
+ ret = memory_read_value(from, size_from, ptr) &&
+ memory_write_value(to, size_from, ptr);
+ if (size_to > sizeof(tmp)) free(ptr);
+ return ret;
+}
+
/***********************************************************************
* memory_examine
*
diff --git a/programs/winedbg/types.c b/programs/winedbg/types.c
index 2a8be6edfcb..c7f6d142d06 100644
--- a/programs/winedbg/types.c
+++ b/programs/winedbg/types.c
@@ -162,30 +162,17 @@ void types_extract_as_address(const struct dbg_lvalue* lvalue, ADDRESS64* addr)
BOOL types_store_value(struct dbg_lvalue* lvalue_to, const struct dbg_lvalue* lvalue_from)
{
- dbg_lgint_t val;
- DWORD64 size;
- BOOL equal;
-
if (!lvalue_to->bitlen && !lvalue_from->bitlen)
{
+ BOOL equal;
if (!types_compare(lvalue_to->type, lvalue_from->type, &equal)) return FALSE;
if (equal)
- {
- if (!types_get_info(&lvalue_to->type, TI_GET_LENGTH, &size)) return FALSE;
- if (sizeof(val) < size)
- {
- return memory_read_value(lvalue_from, size, &val) &&
- memory_write_value(lvalue_to, size, &val);
- }
- dbg_printf("NIY\n");
- /* else: should allocate intermediate buffer... */
- return FALSE;
- }
+ return memory_transfer_value(lvalue_to, lvalue_from);
}
if (types_is_integral_type(lvalue_from) && types_is_integral_type(lvalue_to))
{
/* doing integer conversion (about sign, size) */
- val = types_extract_as_integer(lvalue_from);
+ dbg_lgint_t val = types_extract_as_integer(lvalue_from);
return memory_store_integer(lvalue_to, val);
}
/* FIXME: should support floats as well */
More information about the wine-devel
mailing list