Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [gdbserver] Fix toolhelp usage on Windows CE
@ 2007-07-30 23:34 Pedro Alves
  2007-07-31  3:01 ` Daniel Jacobowitz
  0 siblings, 1 reply; 2+ messages in thread
From: Pedro Alves @ 2007-07-30 23:34 UTC (permalink / raw)
  To: gdb-patches

[-- Attachment #1: Type: text/plain, Size: 518 bytes --]

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


[-- Attachment #2: toolhelp_wince.diff --]
[-- Type: text/x-diff, Size: 3270 bytes --]

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


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [gdbserver] Fix toolhelp usage on Windows CE
  2007-07-30 23:34 [gdbserver] Fix toolhelp usage on Windows CE Pedro Alves
@ 2007-07-31  3:01 ` Daniel Jacobowitz
  0 siblings, 0 replies; 2+ messages in thread
From: Daniel Jacobowitz @ 2007-07-31  3:01 UTC (permalink / raw)
  To: Pedro Alves; +Cc: gdb-patches

On Tue, Jul 31, 2007 at 12:28:32AM +0100, Pedro Alves wrote:
> 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?

OK, thanks.

-- 
Daniel Jacobowitz
CodeSourcery


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2007-07-31  3:01 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-07-30 23:34 [gdbserver] Fix toolhelp usage on Windows CE Pedro Alves
2007-07-31  3:01 ` Daniel Jacobowitz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox