This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[gdbserver] Fix toolhelp usage on Windows CE
- From: Pedro Alves <pedro_alves at portugalmail dot pt>
- To: gdb-patches at sourceware dot org
- Date: Tue, 31 Jul 2007 00:28:32 +0100
- Subject: [gdbserver] Fix toolhelp usage on Windows CE
Hi,
On Windows CE, the toolhelp functionality is implemented on
its own dll. Additionally, (and because of the former), the snapshots
must be closed with a special close
function - CloseToolhelp32Snapshot - unlike the "desktop" Windows
versions, which use the standard CloseHandle. The current code isn't
doing it right. This patch fixes it.
(in case the toolhelp_get_dll_name hunk isn't clear in
the diff, I'm just 'reorganizing a bit'/'removing the goto'
to minimize the #ifdefery.)
OK?
Cheers,
Pedro Alves
2007-07-31 Pedro Alves <pedro_alves@portugalmail.pt>
* win32-low.c (winapi_CloseToolhelp32Snapshot) [_WIN32_WCE]: New
typedef.
(win32_CloseToolhelp32Snapshot) [_WIN32_WCE]: New global var.
(load_toolhelp) [_WIN32_WCE]: Load TOOLHELP.DLL. Get
CloseToolhelp32Snapshot.
(toolhelp_get_dll_name) [_WIN32_WCE]: Close the snapshot with
CloseToolhelp32Snapshot.
---
gdb/gdbserver/win32-low.c | 44 +++++++++++++++++++++++++++++---------------
1 file changed, 29 insertions(+), 15 deletions(-)
Index: src/gdb/gdbserver/win32-low.c
===================================================================
--- src.orig/gdb/gdbserver/win32-low.c 2007-07-18 13:47:14.000000000 +0100
+++ src/gdb/gdbserver/win32-low.c 2007-07-18 13:56:44.000000000 +0100
@@ -980,6 +980,10 @@ typedef BOOL (WINAPI *winapi_Module32Nex
static winapi_CreateToolhelp32Snapshot win32_CreateToolhelp32Snapshot;
static winapi_Module32First win32_Module32First;
static winapi_Module32Next win32_Module32Next;
+#ifdef _WIN32_WCE
+typedef BOOL (WINAPI *winapi_CloseToolhelp32Snapshot) (HANDLE);
+static winapi_CloseToolhelp32Snapshot win32_CloseToolhelp32Snapshot;
+#endif
static BOOL
load_toolhelp (void)
@@ -993,7 +997,7 @@ load_toolhelp (void)
#ifndef _WIN32_WCE
dll = GetModuleHandle (_T("KERNEL32.DLL"));
#else
- dll = GetModuleHandle (_T("COREDLL.DLL"));
+ dll = LoadLibrary (L"TOOLHELP.DLL");
#endif
if (!dll)
return FALSE;
@@ -1002,11 +1006,19 @@ load_toolhelp (void)
GETPROCADDRESS (dll, CreateToolhelp32Snapshot);
win32_Module32First = GETPROCADDRESS (dll, Module32First);
win32_Module32Next = GETPROCADDRESS (dll, Module32Next);
+#ifdef _WIN32_WCE
+ win32_CloseToolhelp32Snapshot =
+ GETPROCADDRESS (dll, CloseToolhelp32Snapshot);
+#endif
}
return (win32_CreateToolhelp32Snapshot != NULL
&& win32_Module32First != NULL
- && win32_Module32Next != NULL);
+ && win32_Module32Next != NULL
+#ifdef _WIN32_WCE
+ && win32_CloseToolhelp32Snapshot != NULL
+#endif
+ );
}
static int
@@ -1014,6 +1026,7 @@ toolhelp_get_dll_name (DWORD BaseAddress
{
HANDLE snapshot_module;
MODULEENTRY32 modEntry = { sizeof (MODULEENTRY32) };
+ int found = 0;
if (!load_toolhelp ())
return 0;
@@ -1024,24 +1037,25 @@ toolhelp_get_dll_name (DWORD BaseAddress
return 0;
/* Ignore the first module, which is the exe. */
- if (!win32_Module32First (snapshot_module, &modEntry))
- goto failed;
-
- while (win32_Module32Next (snapshot_module, &modEntry))
- if ((DWORD) modEntry.modBaseAddr == BaseAddress)
- {
+ if (win32_Module32First (snapshot_module, &modEntry))
+ while (win32_Module32Next (snapshot_module, &modEntry))
+ if ((DWORD) modEntry.modBaseAddr == BaseAddress)
+ {
#ifdef UNICODE
- wcstombs (dll_name_ret, modEntry.szExePath, MAX_PATH + 1);
+ wcstombs (dll_name_ret, modEntry.szExePath, MAX_PATH + 1);
#else
- strcpy (dll_name_ret, modEntry.szExePath);
+ strcpy (dll_name_ret, modEntry.szExePath);
#endif
- CloseHandle (snapshot_module);
- return 1;
- }
+ found = 1;
+ break;
+ }
-failed:
+#ifdef _WIN32_WCE
+ win32_CloseToolhelp32Snapshot (snapshot_module);
+#else
CloseHandle (snapshot_module);
- return 0;
+#endif
+ return found;
}
static void