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:
parent
28688adf8f
commit
9d8679cc71
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 = ¤t_event.u.LoadDll;
|
LOAD_DLL_DEBUG_INFO *event = ¤t_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,
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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 = ¤t_event.u.LoadDll;
|
LOAD_DLL_DEBUG_INFO *event = ¤t_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);
|
||||||
|
|
Loading…
Reference in New Issue