Nikolay Sivov : dbgeng: Implement ReadVirtual().
Alexandre Julliard
julliard at winehq.org
Tue Apr 23 17:39:54 CDT 2019
Module: wine
Branch: master
Commit: 911050d87b5cd61867e06eac978cfd960bdb8e92
URL: https://source.winehq.org/git/wine.git/?a=commit;h=911050d87b5cd61867e06eac978cfd960bdb8e92
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Tue Apr 23 10:38:15 2019 +0300
dbgeng: Implement ReadVirtual().
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/dbgeng/dbgeng.c | 23 +++++++++++++++++++++--
dlls/dbgeng/tests/dbgeng.c | 27 ++++++++++++++++++++++++---
2 files changed, 45 insertions(+), 5 deletions(-)
diff --git a/dlls/dbgeng/dbgeng.c b/dlls/dbgeng/dbgeng.c
index 1acfe0b..d7f8191 100644
--- a/dlls/dbgeng/dbgeng.c
+++ b/dlls/dbgeng/dbgeng.c
@@ -725,9 +725,28 @@ static ULONG STDMETHODCALLTYPE debugdataspaces_Release(IDebugDataSpaces *iface)
static HRESULT STDMETHODCALLTYPE debugdataspaces_ReadVirtual(IDebugDataSpaces *iface, ULONG64 offset, void *buffer,
ULONG buffer_size, ULONG *read_len)
{
- FIXME("%p, %s, %p, %u, %p stub.\n", iface, wine_dbgstr_longlong(offset), buffer, buffer_size, read_len);
+ struct debug_client *debug_client = impl_from_IDebugDataSpaces(iface);
+ static struct target_process *target;
+ HRESULT hr = S_OK;
+ SIZE_T length;
- return E_NOTIMPL;
+ TRACE("%p, %s, %p, %u, %p.\n", iface, wine_dbgstr_longlong(offset), buffer, buffer_size, read_len);
+
+ if (!(target = debug_client_get_target(debug_client)))
+ return E_UNEXPECTED;
+
+ if (ReadProcessMemory(target->handle, (const void *)(ULONG_PTR)offset, buffer, buffer_size, &length))
+ {
+ if (read_len)
+ *read_len = length;
+ }
+ else
+ {
+ hr = HRESULT_FROM_WIN32(GetLastError());
+ WARN("Failed to read process memory %#x.\n", hr);
+ }
+
+ return hr;
}
static HRESULT STDMETHODCALLTYPE debugdataspaces_WriteVirtual(IDebugDataSpaces *iface, ULONG64 offset, void *buffer,
diff --git a/dlls/dbgeng/tests/dbgeng.c b/dlls/dbgeng/tests/dbgeng.c
index 2a2dd3ad..c8906c90 100644
--- a/dlls/dbgeng/tests/dbgeng.c
+++ b/dlls/dbgeng/tests/dbgeng.c
@@ -322,14 +322,15 @@ todo_wine
static void test_module_information(void)
{
static const char *event_name = "dbgeng_test_event";
- unsigned int loaded, unloaded, index;
+ unsigned int loaded, unloaded, index, length;
DEBUG_MODULE_PARAMETERS params[2];
+ IDebugDataSpaces *dataspaces;
PROCESS_INFORMATION info;
IDebugSymbols *symbols;
IDebugControl *control;
+ ULONG64 bases[2], base;
IDebugClient *client;
- ULONG64 bases[2];
- ULONG64 base;
+ char buffer[64];
HANDLE event;
HRESULT hr;
BOOL ret;
@@ -343,6 +344,9 @@ static void test_module_information(void)
hr = client->lpVtbl->QueryInterface(client, &IID_IDebugSymbols, (void **)&symbols);
ok(hr == S_OK, "Failed to get interface pointer, hr %#x.\n", hr);
+ hr = client->lpVtbl->QueryInterface(client, &IID_IDebugDataSpaces, (void **)&dataspaces);
+ ok(hr == S_OK, "Failed to get interface pointer, hr %#x.\n", hr);
+
event = CreateEventA(NULL, FALSE, FALSE, event_name);
ok(event != NULL, "Failed to create event.\n");
@@ -419,6 +423,22 @@ static void test_module_information(void)
hr = symbols->lpVtbl->GetModuleParameters(symbols, 1, NULL, loaded, params);
ok(FAILED(hr), "Unexpected hr %#x.\n", hr);
+ /* Read memory. */
+ base = 0;
+ hr = symbols->lpVtbl->GetModuleByIndex(symbols, 0, &base);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ ok(!!base, "Unexpected module base.\n");
+
+ hr = dataspaces->lpVtbl->ReadVirtual(dataspaces, base, buffer, sizeof(buffer), &length);
+ ok(hr == S_OK, "Failed to read process memory, hr %#x.\n", hr);
+ ok(length == sizeof(buffer), "Unexpected length %u.\n", length);
+ ok(buffer[0] == 'M' && buffer[1] == 'Z', "Unexpected contents.\n");
+
+ memset(buffer, 0, sizeof(buffer));
+ hr = dataspaces->lpVtbl->ReadVirtual(dataspaces, base, buffer, sizeof(buffer), NULL);
+ ok(hr == S_OK, "Failed to read process memory, hr %#x.\n", hr);
+ ok(buffer[0] == 'M' && buffer[1] == 'Z', "Unexpected contents.\n");
+
hr = client->lpVtbl->DetachProcesses(client);
ok(hr == S_OK, "Failed to detach, hr %#x.\n", hr);
@@ -431,6 +451,7 @@ static void test_module_information(void)
client->lpVtbl->Release(client);
control->lpVtbl->Release(control);
symbols->lpVtbl->Release(symbols);
+ dataspaces->lpVtbl->Release(dataspaces);
}
static void target_proc(const char *event_name, const char *event_ready_name)
More information about the wine-cvs
mailing list