Commit f2f9d8b2 authored by Nikolay Sivov's avatar Nikolay Sivov Committed by Alexandre Julliard

dbgeng: Implement IsPointer64Bit().

parent 911050d8
...@@ -57,6 +57,7 @@ struct target_process ...@@ -57,6 +57,7 @@ struct target_process
unsigned int unloaded; unsigned int unloaded;
BOOL initialized; BOOL initialized;
} modules; } modules;
ULONG cpu_type;
}; };
struct debug_client struct debug_client
...@@ -79,6 +80,21 @@ static struct target_process *debug_client_get_target(struct debug_client *debug ...@@ -79,6 +80,21 @@ static struct target_process *debug_client_get_target(struct debug_client *debug
return LIST_ENTRY(list_head(&debug_client->targets), struct target_process, entry); return LIST_ENTRY(list_head(&debug_client->targets), struct target_process, entry);
} }
static WORD debug_target_get_module_machine(struct target_process *target, HMODULE module)
{
IMAGE_DOS_HEADER dos = { 0 };
WORD machine = 0;
ReadProcessMemory(target->handle, module, &dos, sizeof(dos), NULL);
if (dos.e_magic == IMAGE_DOS_SIGNATURE)
{
ReadProcessMemory(target->handle, (const char *)module + dos.e_lfanew + 4 /* signature */, &machine,
sizeof(machine), NULL);
}
return machine;
}
static HRESULT debug_target_init_modules_info(struct target_process *target) static HRESULT debug_target_init_modules_info(struct target_process *target)
{ {
unsigned int i, count; unsigned int i, count;
...@@ -123,6 +139,8 @@ static HRESULT debug_target_init_modules_info(struct target_process *target) ...@@ -123,6 +139,8 @@ static HRESULT debug_target_init_modules_info(struct target_process *target)
} }
} }
target->cpu_type = debug_target_get_module_machine(target, modules[0]);
heap_free(modules); heap_free(modules);
target->modules.loaded = count; target->modules.loaded = count;
...@@ -2465,9 +2483,35 @@ static HRESULT STDMETHODCALLTYPE debugcontrol_GetPageSize(IDebugControl2 *iface, ...@@ -2465,9 +2483,35 @@ static HRESULT STDMETHODCALLTYPE debugcontrol_GetPageSize(IDebugControl2 *iface,
static HRESULT STDMETHODCALLTYPE debugcontrol_IsPointer64Bit(IDebugControl2 *iface) static HRESULT STDMETHODCALLTYPE debugcontrol_IsPointer64Bit(IDebugControl2 *iface)
{ {
FIXME("%p stub.\n", iface); struct debug_client *debug_client = impl_from_IDebugControl2(iface);
static struct target_process *target;
HRESULT hr;
return E_NOTIMPL; TRACE("%p.\n", iface);
if (!(target = debug_client_get_target(debug_client)))
return E_UNEXPECTED;
if (FAILED(hr = debug_target_init_modules_info(target)))
return hr;
switch (target->cpu_type)
{
case IMAGE_FILE_MACHINE_I386:
case IMAGE_FILE_MACHINE_ARM:
hr = S_FALSE;
break;
case IMAGE_FILE_MACHINE_IA64:
case IMAGE_FILE_MACHINE_AMD64:
case IMAGE_FILE_MACHINE_ARM64:
hr = S_OK;
break;
default:
FIXME("Unexpected cpu type %#x.\n", target->cpu_type);
hr = E_UNEXPECTED;
}
return hr;
} }
static HRESULT STDMETHODCALLTYPE debugcontrol_ReadBugCheckData(IDebugControl2 *iface, ULONG *code, ULONG64 *arg1, static HRESULT STDMETHODCALLTYPE debugcontrol_ReadBugCheckData(IDebugControl2 *iface, ULONG *code, ULONG64 *arg1,
......
...@@ -347,6 +347,9 @@ static void test_module_information(void) ...@@ -347,6 +347,9 @@ static void test_module_information(void)
hr = client->lpVtbl->QueryInterface(client, &IID_IDebugDataSpaces, (void **)&dataspaces); hr = client->lpVtbl->QueryInterface(client, &IID_IDebugDataSpaces, (void **)&dataspaces);
ok(hr == S_OK, "Failed to get interface pointer, hr %#x.\n", hr); ok(hr == S_OK, "Failed to get interface pointer, hr %#x.\n", hr);
hr = control->lpVtbl->IsPointer64Bit(control);
ok(hr == E_UNEXPECTED, "Unexpected hr %#x.\n", hr);
event = CreateEventA(NULL, FALSE, FALSE, event_name); event = CreateEventA(NULL, FALSE, FALSE, event_name);
ok(event != NULL, "Failed to create event.\n"); ok(event != NULL, "Failed to create event.\n");
...@@ -359,9 +362,15 @@ static void test_module_information(void) ...@@ -359,9 +362,15 @@ static void test_module_information(void)
hr = client->lpVtbl->AttachProcess(client, 0, info.dwProcessId, DEBUG_ATTACH_NONINVASIVE); hr = client->lpVtbl->AttachProcess(client, 0, info.dwProcessId, DEBUG_ATTACH_NONINVASIVE);
ok(hr == S_OK, "Failed to attach to process, hr %#x.\n", hr); ok(hr == S_OK, "Failed to attach to process, hr %#x.\n", hr);
hr = control->lpVtbl->IsPointer64Bit(control);
ok(hr == E_UNEXPECTED, "Unexpected hr %#x.\n", hr);
hr = control->lpVtbl->WaitForEvent(control, 0, INFINITE); hr = control->lpVtbl->WaitForEvent(control, 0, INFINITE);
ok(hr == S_OK, "Waiting for event failed, hr %#x.\n", hr); ok(hr == S_OK, "Waiting for event failed, hr %#x.\n", hr);
hr = control->lpVtbl->IsPointer64Bit(control);
ok(SUCCEEDED(hr), "Failed to get pointer length, hr %#x.\n", hr);
/* Number of modules. */ /* Number of modules. */
hr = symbols->lpVtbl->GetNumberModules(symbols, &loaded, &unloaded); hr = symbols->lpVtbl->GetNumberModules(symbols, &loaded, &unloaded);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment