dbgeng: Partially implement GetModuleNameString().

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
stable
Nikolay Sivov 2019-04-23 10:38:18 +03:00 committed by Alexandre Julliard
parent 7c7f557bcd
commit 64aa7f61ad
3 changed files with 92 additions and 5 deletions

View File

@ -42,6 +42,7 @@ extern NTSTATUS WINAPI NtResumeProcess(HANDLE handle);
struct module_info
{
DEBUG_MODULE_PARAMETERS params;
char image_name[MAX_PATH];
};
struct target_process
@ -136,6 +137,9 @@ static HRESULT debug_target_init_modules_info(struct target_process *target)
target->modules.info[i].params.Base = (ULONG_PTR)info.lpBaseOfDll;
target->modules.info[i].params.Size = info.SizeOfImage;
GetModuleFileNameExA(target->handle, modules[i], target->modules.info[i].image_name,
ARRAY_SIZE(target->modules.info[i].image_name));
}
}
@ -1448,13 +1452,67 @@ static HRESULT STDMETHODCALLTYPE debugsymbols_GetModuleVersionInformation(IDebug
return E_NOTIMPL;
}
static HRESULT debug_target_return_string(const char *str, char *buffer, unsigned int buffer_size,
unsigned int *size)
{
unsigned int len = strlen(str), dst_len;
if (size)
*size = len + 1;
if (buffer && buffer_size)
{
dst_len = min(len, buffer_size - 1);
if (dst_len)
memcpy(buffer, str, dst_len);
buffer[dst_len] = 0;
}
return len < buffer_size ? S_OK : S_FALSE;
}
static HRESULT STDMETHODCALLTYPE debugsymbols_GetModuleNameString(IDebugSymbols3 *iface, ULONG which, ULONG index,
ULONG64 base, char *buffer, ULONG buffer_size, ULONG *name_size)
{
FIXME("%p, %u, %u, %s, %p, %u, %p stub.\n", iface, which, index, wine_dbgstr_longlong(base), buffer, buffer_size,
struct debug_client *debug_client = impl_from_IDebugSymbols3(iface);
const struct module_info *info;
struct target_process *target;
HRESULT hr;
TRACE("%p, %u, %u, %s, %p, %u, %p.\n", iface, which, index, wine_dbgstr_longlong(base), buffer, buffer_size,
name_size);
return E_NOTIMPL;
if (!(target = debug_client_get_target(debug_client)))
return E_UNEXPECTED;
if (index == DEBUG_ANY_ID)
info = debug_target_get_module_info_by_base(target, base);
else
info = debug_target_get_module_info(target, index);
if (!info)
{
WARN("Was unable to locate module.\n");
return E_INVALIDARG;
}
switch (which)
{
case DEBUG_MODNAME_IMAGE:
hr = debug_target_return_string(info->image_name, buffer, buffer_size, name_size);
break;
case DEBUG_MODNAME_MODULE:
case DEBUG_MODNAME_LOADED_IMAGE:
case DEBUG_MODNAME_SYMBOL_FILE:
case DEBUG_MODNAME_MAPPED_IMAGE:
FIXME("Unsupported name info %d.\n", which);
return E_NOTIMPL;
default:
WARN("Unknown name info %d.\n", which);
return E_INVALIDARG;
}
return hr;
}
static HRESULT STDMETHODCALLTYPE debugsymbols_GetConstantName(IDebugSymbols3 *iface, ULONG64 module, ULONG type_id,

View File

@ -326,11 +326,11 @@ static void test_module_information(void)
DEBUG_MODULE_PARAMETERS params[2];
IDebugDataSpaces *dataspaces;
PROCESS_INFORMATION info;
IDebugSymbols *symbols;
IDebugSymbols2 *symbols;
IDebugControl *control;
ULONG64 bases[2], base;
char buffer[MAX_PATH];
IDebugClient *client;
char buffer[64];
HANDLE event;
HRESULT hr;
BOOL ret;
@ -341,7 +341,7 @@ static void test_module_information(void)
hr = client->lpVtbl->QueryInterface(client, &IID_IDebugControl, (void **)&control);
ok(hr == S_OK, "Failed to get interface pointer, hr %#x.\n", hr);
hr = client->lpVtbl->QueryInterface(client, &IID_IDebugSymbols, (void **)&symbols);
hr = client->lpVtbl->QueryInterface(client, &IID_IDebugSymbols2, (void **)&symbols);
ok(hr == S_OK, "Failed to get interface pointer, hr %#x.\n", hr);
hr = client->lpVtbl->QueryInterface(client, &IID_IDebugDataSpaces, (void **)&dataspaces);
@ -432,6 +432,27 @@ static void test_module_information(void)
hr = symbols->lpVtbl->GetModuleParameters(symbols, 1, NULL, loaded, params);
ok(FAILED(hr), "Unexpected hr %#x.\n", hr);
/* Image name. */
hr = symbols->lpVtbl->GetModuleNameString(symbols, DEBUG_MODNAME_IMAGE, 0, 0, buffer, sizeof(buffer), &length);
ok(hr == S_OK, "Failed to get image name, hr %#x.\n", hr);
ok(strlen(buffer) + 1 == length, "Unexpected length.\n");
hr = symbols->lpVtbl->GetModuleNameString(symbols, DEBUG_MODNAME_IMAGE, 0, 0, NULL, sizeof(buffer), &length);
ok(hr == S_OK, "Failed to get image name, hr %#x.\n", hr);
ok(length > 0, "Unexpected length.\n");
hr = symbols->lpVtbl->GetModuleNameString(symbols, DEBUG_MODNAME_IMAGE, DEBUG_ANY_ID, base, buffer, sizeof(buffer),
&length);
ok(hr == S_OK, "Failed to get image name, hr %#x.\n", hr);
ok(strlen(buffer) + 1 == length, "Unexpected length.\n");
hr = symbols->lpVtbl->GetModuleNameString(symbols, DEBUG_MODNAME_IMAGE, 0, 0, buffer, length - 1, &length);
ok(hr == S_FALSE, "Failed to get image name, hr %#x.\n", hr);
ok(strlen(buffer) + 2 == length, "Unexpected length %u, %u.\n", length, strlen(buffer));
hr = symbols->lpVtbl->GetModuleNameString(symbols, DEBUG_MODNAME_IMAGE, 0, 0, NULL, length - 1, NULL);
ok(hr == S_FALSE, "Failed to get image name, hr %#x.\n", hr);
/* Read memory. */
base = 0;
hr = symbols->lpVtbl->GetModuleByIndex(symbols, 0, &base);

View File

@ -162,7 +162,15 @@ DEFINE_GUID(IID_IDebugSystemObjects3, 0xe9676e2f, 0xe286, 0x4ea3, 0xb0, 0xf9
#define DEBUG_CDS_REFRESH_INLINESTEP 16
#define DEBUG_CDS_REFRESH_INLINESTEP_PSEUDO 17
/* GetModuleNameString() indices */
#define DEBUG_MODNAME_IMAGE 0
#define DEBUG_MODNAME_MODULE 1
#define DEBUG_MODNAME_LOADED_IMAGE 2
#define DEBUG_MODNAME_SYMBOL_FILE 3
#define DEBUG_MODNAME_MAPPED_IMAGE 4
#define DEBUG_INVALID_OFFSET ((ULONG64)-1)
#define DEBUG_ANY_ID 0xffffffff
typedef struct _DEBUG_MODULE_PARAMETERS
{