*** /home/danny/src/gdb/gdb/gdb-6.8.orig/gdb/gdbserver/win32-low.c 2008-02-14 23:41:39.000000000 +0100 --- win32-low.c 2009-06-07 11:12:30.000000000 +0200 *************** *** 894,907 **** 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]; DWORD done; /* Attempt to read the name of the dll that was detected. --- 894,912 ---- loaded_dll (buf2, load_addr); } + /* + * Warning : some parts of this function rely on sizeof(WCHAR) == 2 + */ static char * get_image_name (HANDLE h, void *address, int unicode) { ! static char buf[(2 * MAX_PATH) + 1]; /* here */ DWORD size = unicode ? sizeof (WCHAR) : sizeof (char); char *address_ptr; + #ifndef _WIN32_WCE int len = 0; ! char b[2]; /* here */ ! #endif DWORD done; /* Attempt to read the name of the dll that was detected. *************** *** 924,932 **** 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) --- 929,956 ---- return NULL; #endif + #ifdef _WIN32_WCE + /* Always unicode */ + /* Assume you can read it all in one go, or otherwise the done variable will + * tell you how far you've read. + */ + WCHAR *wbuf = alloca ((MAX_PATH + 1) * size); + ReadProcessMemory (h, address_ptr, wbuf, MAX_PATH * size, &done); + if (done < 0 || done > MAX_PATH * size) + buf[0] = '\0'; + else { + int n; + n = wcstombs (buf, wbuf, done); + if (n == (size_t)-1) + buf[0] = '\0'; + /* No need to address the length limit case of the wcstombs call, + * buf has been allocated large enough. */ + } + return buf; + #else /* 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) /* here */ continue; if (!unicode) *************** *** 936,946 **** WCHAR *unicode_address = (WCHAR *) alloca (len * sizeof (WCHAR)); 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 *, --- 960,969 ---- WCHAR *unicode_address = (WCHAR *) alloca (len * sizeof (WCHAR)); ReadProcessMemory (h, address_ptr, unicode_address, len * sizeof (WCHAR), &done); WideCharToMultiByte (CP_ACP, 0, unicode_address, len, buf, len, 0, 0); } return buf; + #endif } typedef BOOL (WINAPI *winapi_EnumProcessModules) (HANDLE, HMODULE *,