Share get_image_name between gdb and gdbserver

This moves get_image_name to nat/windows-nat.c so that it can be
shared between gdb and gdbserver.

gdb/ChangeLog
2020-04-08  Tom Tromey  <tromey@adacore.com>

	* windows-nat.c (get_image_name): Move to nat/windows-nat.c.
	(handle_load_dll): Update.
	* nat/windows-nat.c (get_image_name): Move from windows-nat.c.

gdbserver/ChangeLog
2020-04-08  Tom Tromey  <tromey@adacore.com>

	* win32-low.c (get_image_name): Remove.
	(handle_load_dll): Update.
This commit is contained in:
Tom Tromey 2020-04-08 14:33:35 -06:00
parent 28688adf8f
commit 9d8679cc71
6 changed files with 77 additions and 101 deletions

View File

@ -1,3 +1,9 @@
2020-04-08 Tom Tromey <tromey@adacore.com>
* windows-nat.c (get_image_name): Move to nat/windows-nat.c.
(handle_load_dll): Update.
* nat/windows-nat.c (get_image_name): Move from windows-nat.c.
2020-04-08 Tom Tromey <tromey@adacore.com> 2020-04-08 Tom Tromey <tromey@adacore.com>
* windows-nat.c (enum thread_disposition_type): Move to * windows-nat.c (enum thread_disposition_type): Move to

View File

@ -69,4 +69,61 @@ windows_thread_info::resume ()
suspended = 0; suspended = 0;
} }
const char *
get_image_name (HANDLE h, void *address, int unicode)
{
#ifdef __CYGWIN__
static char buf[MAX_PATH];
#else
static char buf[(2 * MAX_PATH) + 1];
#endif
DWORD size = unicode ? sizeof (WCHAR) : sizeof (char);
char *address_ptr;
int len = 0;
char b[2];
SIZE_T done;
/* Attempt to read the name of the dll that was detected.
This is documented to work only when actively debugging
a program. It will not work for attached processes. */
if (address == NULL)
return NULL;
#ifdef _WIN32_WCE
/* Windows CE reports the address of the image name,
instead of an address of a pointer into the image name. */
address_ptr = address;
#else
/* See if we could read the address of a string, and that the
address isn't null. */
if (!ReadProcessMemory (h, address, &address_ptr,
sizeof (address_ptr), &done)
|| done != sizeof (address_ptr)
|| !address_ptr)
return NULL;
#endif
/* Find the length of the string. */
while (ReadProcessMemory (h, address_ptr + len++ * size, &b, size, &done)
&& (b[0] != 0 || b[size - 1] != 0) && done == size)
continue;
if (!unicode)
ReadProcessMemory (h, address_ptr, buf, len, &done);
else
{
WCHAR *unicode_address = (WCHAR *) alloca (len * sizeof (WCHAR));
ReadProcessMemory (h, address_ptr, unicode_address, len * sizeof (WCHAR),
&done);
#ifdef __CYGWIN__
wcstombs (buf, unicode_address, MAX_PATH);
#else
WideCharToMultiByte (CP_ACP, 0, unicode_address, len, buf, sizeof buf,
0, 0);
#endif
}
return buf;
}
} }

View File

@ -111,6 +111,13 @@ enum thread_disposition_type
extern windows_thread_info *thread_rec (ptid_t ptid, extern windows_thread_info *thread_rec (ptid_t ptid,
thread_disposition_type disposition); thread_disposition_type disposition);
/* Return the name of the DLL referenced by H at ADDRESS. UNICODE
determines what sort of string is read from the inferior. Returns
the name of the DLL, or NULL on error. If a name is returned, it
is stored in a static buffer which is valid until the next call to
get_image_name. */
extern const char *get_image_name (HANDLE h, void *address, int unicode);
} }
#endif #endif

View File

@ -921,56 +921,6 @@ windows_make_so (const char *name, LPVOID load_addr)
return so; return so;
} }
static char *
get_image_name (HANDLE h, void *address, int unicode)
{
#ifdef __CYGWIN__
static char buf[__PMAX];
#else
static char buf[(2 * __PMAX) + 1];
#endif
DWORD size = unicode ? sizeof (WCHAR) : sizeof (char);
char *address_ptr;
int len = 0;
char b[2];
SIZE_T done;
/* Attempt to read the name of the dll that was detected.
This is documented to work only when actively debugging
a program. It will not work for attached processes. */
if (address == NULL)
return NULL;
/* See if we could read the address of a string, and that the
address isn't null. */
if (!ReadProcessMemory (h, address, &address_ptr,
sizeof (address_ptr), &done)
|| done != sizeof (address_ptr) || !address_ptr)
return NULL;
/* Find the length of the string. */
while (ReadProcessMemory (h, address_ptr + len++ * size, &b, size, &done)
&& (b[0] != 0 || b[size - 1] != 0) && done == size)
continue;
if (!unicode)
ReadProcessMemory (h, address_ptr, buf, len, &done);
else
{
WCHAR *unicode_address = (WCHAR *) alloca (len * sizeof (WCHAR));
ReadProcessMemory (h, address_ptr, unicode_address, len * sizeof (WCHAR),
&done);
#ifdef __CYGWIN__
wcstombs (buf, unicode_address, __PMAX);
#else
WideCharToMultiByte (CP_ACP, 0, unicode_address, len, buf, sizeof buf,
0, 0);
#endif
}
return buf;
}
/* Handle a DLL load event, and return 1. /* Handle a DLL load event, and return 1.
This function assumes that this event did not occur during inferior This function assumes that this event did not occur during inferior
@ -982,7 +932,7 @@ static void
handle_load_dll () handle_load_dll ()
{ {
LOAD_DLL_DEBUG_INFO *event = &current_event.u.LoadDll; LOAD_DLL_DEBUG_INFO *event = &current_event.u.LoadDll;
char *dll_name; const char *dll_name;
/* Try getting the DLL name via the lpImageName field of the event. /* Try getting the DLL name via the lpImageName field of the event.
Note that Microsoft documents this fields as strictly optional, Note that Microsoft documents this fields as strictly optional,

View File

@ -1,3 +1,8 @@
2020-04-08 Tom Tromey <tromey@adacore.com>
* win32-low.c (get_image_name): Remove.
(handle_load_dll): Update.
2020-04-08 Tom Tromey <tromey@adacore.com> 2020-04-08 Tom Tromey <tromey@adacore.com>
* win32-low.c (windows_nat::thread_rec): Rename from thread_rec. * win32-low.c (windows_nat::thread_rec): Rename from thread_rec.

View File

@ -1031,55 +1031,6 @@ win32_add_one_solib (const char *name, CORE_ADDR load_addr)
loaded_dll (buf2, load_addr); loaded_dll (buf2, load_addr);
} }
static char *
get_image_name (HANDLE h, void *address, int unicode)
{
static char buf[(2 * MAX_PATH) + 1];
DWORD size = unicode ? sizeof (WCHAR) : sizeof (char);
char *address_ptr;
int len = 0;
char b[2];
SIZE_T done;
/* Attempt to read the name of the dll that was detected.
This is documented to work only when actively debugging
a program. It will not work for attached processes. */
if (address == NULL)
return NULL;
#ifdef _WIN32_WCE
/* Windows CE reports the address of the image name,
instead of an address of a pointer into the image name. */
address_ptr = address;
#else
/* See if we could read the address of a string, and that the
address isn't null. */
if (!ReadProcessMemory (h, address, &address_ptr,
sizeof (address_ptr), &done)
|| done != sizeof (address_ptr)
|| !address_ptr)
return NULL;
#endif
/* Find the length of the string */
while (ReadProcessMemory (h, address_ptr + len++ * size, &b, size, &done)
&& (b[0] != 0 || b[size - 1] != 0) && done == size)
continue;
if (!unicode)
ReadProcessMemory (h, address_ptr, buf, len, &done);
else
{
WCHAR *unicode_address = XALLOCAVEC (WCHAR, len);
ReadProcessMemory (h, address_ptr, unicode_address, len * sizeof (WCHAR),
&done);
WideCharToMultiByte (CP_ACP, 0, unicode_address, len, buf, len, 0, 0);
}
return buf;
}
typedef BOOL (WINAPI *winapi_EnumProcessModules) (HANDLE, HMODULE *, typedef BOOL (WINAPI *winapi_EnumProcessModules) (HANDLE, HMODULE *,
DWORD, LPDWORD); DWORD, LPDWORD);
typedef BOOL (WINAPI *winapi_GetModuleInformation) (HANDLE, HMODULE, typedef BOOL (WINAPI *winapi_GetModuleInformation) (HANDLE, HMODULE,
@ -1188,7 +1139,7 @@ static void
handle_load_dll (void) handle_load_dll (void)
{ {
LOAD_DLL_DEBUG_INFO *event = &current_event.u.LoadDll; LOAD_DLL_DEBUG_INFO *event = &current_event.u.LoadDll;
char *dll_name; const char *dll_name;
dll_name = get_image_name (current_process_handle, dll_name = get_image_name (current_process_handle,
event->lpImageName, event->fUnicode); event->lpImageName, event->fUnicode);