This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]