dbgeng: Partially implement GetModuleNameString().
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
7c7f557bcd
commit
64aa7f61ad
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue