[PATCH 02/14] [DbgHelp]: SymInitializeW
Eric Pouech
eric.pouech at wanadoo.fr
Wed May 10 14:35:07 CDT 2006
- implemented SymInitializeW (and made SymInitialize call it)
- implemented Sym{SG}etSearchPathW (and made Sym{SG}etSearchPath
call them)
- per process search path is now stored as unicode string
A+
---
dlls/dbghelp/dbghelp.c | 117 ++++++++++++++++++++++++++++++++--------
dlls/dbghelp/dbghelp.spec | 7 +-
dlls/dbghelp/dbghelp_private.h | 2 -
dlls/dbghelp/path.c | 19 ++++++
dlls/dbghelp/pe_module.c | 10 +++
include/dbghelp.h | 3 +
6 files changed, 128 insertions(+), 30 deletions(-)
diff --git a/dlls/dbghelp/dbghelp.c b/dlls/dbghelp/dbghelp.c
index 9dbb4dd..dbd3cfb 100644
--- a/dlls/dbghelp/dbghelp.c
+++ b/dlls/dbghelp/dbghelp.c
@@ -25,6 +25,7 @@
#include "psapi.h"
#include "wine/debug.h"
#include "wdbgexts.h"
+#include "winnls.h"
WINE_DEFAULT_DEBUG_CHANNEL(dbghelp);
@@ -115,10 +116,10 @@ BOOL validate_addr64(DWORD64 addr)
}
/******************************************************************
- * SymSetSearchPath (DBGHELP.@)
+ * SymSetSearchPathW (DBGHELP.@)
*
*/
-BOOL WINAPI SymSetSearchPath(HANDLE hProcess, PCSTR searchPath)
+BOOL WINAPI SymSetSearchPathW(HANDLE hProcess, PCWSTR searchPath)
{
struct process* pcs = process_find_by_handle(hProcess);
@@ -126,24 +127,67 @@ BOOL WINAPI SymSetSearchPath(HANDLE hPro
if (!searchPath) return FALSE;
HeapFree(GetProcessHeap(), 0, pcs->search_path);
- pcs->search_path = strcpy(HeapAlloc(GetProcessHeap(), 0, strlen(searchPath) + 1),
- searchPath);
+ pcs->search_path = lstrcpyW(HeapAlloc(GetProcessHeap(), 0,
+ (lstrlenW(searchPath) + 1) * sizeof(WCHAR)),
+ searchPath);
return TRUE;
}
+/******************************************************************
+ * SymSetSearchPath (DBGHELP.@)
+ *
+ */
+BOOL WINAPI SymSetSearchPath(HANDLE hProcess, PCSTR searchPath)
+{
+ BOOL ret = FALSE;
+ unsigned len;
+ WCHAR* sp;
+
+ len = MultiByteToWideChar(CP_ACP, 0, searchPath, -1, NULL, 0);
+ if ((sp = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR))))
+ {
+ MultiByteToWideChar(CP_ACP, 0, searchPath, -1, sp, len);
+
+ ret = SymSetSearchPathW(hProcess, sp);
+ HeapFree(GetProcessHeap(), 0, sp);
+ }
+ return ret;
+}
+
/***********************************************************************
- * SymGetSearchPath (DBGHELP.@)
+ * SymGetSearchPathW (DBGHELP.@)
*/
-BOOL WINAPI SymGetSearchPath(HANDLE hProcess, LPSTR szSearchPath,
- DWORD SearchPathLength)
+BOOL WINAPI SymGetSearchPathW(HANDLE hProcess, LPWSTR szSearchPath,
+ DWORD SearchPathLength)
{
struct process* pcs = process_find_by_handle(hProcess);
if (!pcs) return FALSE;
- lstrcpynA(szSearchPath, pcs->search_path, SearchPathLength);
+ lstrcpynW(szSearchPath, pcs->search_path, SearchPathLength);
return TRUE;
}
+/***********************************************************************
+ * SymGetSearchPath (DBGHELP.@)
+ */
+BOOL WINAPI SymGetSearchPath(HANDLE hProcess, LPSTR szSearchPath,
+ DWORD SearchPathLength)
+{
+ WCHAR* buffer = HeapAlloc(GetProcessHeap(), 0, SearchPathLength);
+ BOOL ret = FALSE;
+
+ if (buffer)
+ {
+ ret = SymGetSearchPathW(hProcess, buffer,
+ SearchPathLength * sizeof(WCHAR));
+ if (ret)
+ WideCharToMultiByte(CP_ACP, 0, buffer, SearchPathLength,
+ szSearchPath, SearchPathLength, NULL, NULL);
+ HeapFree(GetProcessHeap(), 0, buffer);
+ }
+ return ret;
+}
+
/******************************************************************
* invade_process
*
@@ -176,7 +220,7 @@ static BOOL check_live_target(struct pro
}
/******************************************************************
- * SymInitialize (DBGHELP.@)
+ * SymInitializeW (DBGHELP.@)
*
* The initialisation of a dbghelp's context.
* Note that hProcess doesn't need to be a valid process handle (except
@@ -201,11 +245,11 @@ static BOOL check_live_target(struct pro
* Note also that this scheme can be intertwined with the deferred loading
* mechanism (ie only load the debug information when we actually need it).
*/
-BOOL WINAPI SymInitialize(HANDLE hProcess, PCSTR UserSearchPath, BOOL fInvadeProcess)
+BOOL WINAPI SymInitializeW(HANDLE hProcess, PCWSTR UserSearchPath, BOOL fInvadeProcess)
{
struct process* pcs;
- TRACE("(%p %s %u)\n", hProcess, debugstr_a(UserSearchPath), fInvadeProcess);
+ TRACE("(%p %s %u)\n", hProcess, debugstr_w(UserSearchPath), fInvadeProcess);
if (process_find_by_handle(hProcess))
FIXME("what to do ??\n");
@@ -217,33 +261,36 @@ BOOL WINAPI SymInitialize(HANDLE hProces
if (UserSearchPath)
{
- pcs->search_path = strcpy(HeapAlloc(GetProcessHeap(), 0, strlen(UserSearchPath) + 1),
- UserSearchPath);
+ pcs->search_path = lstrcpyW(HeapAlloc(GetProcessHeap(), 0,
+ (lstrlenW(UserSearchPath) + 1) * sizeof(WCHAR)),
+ UserSearchPath);
}
else
{
unsigned size;
unsigned len;
+ static const WCHAR sym_path[] = {'_','N','T','_','S','Y','M','B','O','L','_','P','A','T','H',0};
+ static const WCHAR alt_sym_path[] = {'_','N','T','_','A','L','T','E','R','N','A','T','E','_','S','Y','M','B','O','L','_','P','A','T','H',0};
- pcs->search_path = HeapAlloc(GetProcessHeap(), 0, len = MAX_PATH);
- while ((size = GetCurrentDirectoryA(len, pcs->search_path)) >= len)
- pcs->search_path = HeapReAlloc(GetProcessHeap(), 0, pcs->search_path, len *= 2);
- pcs->search_path = HeapReAlloc(GetProcessHeap(), 0, pcs->search_path, size + 1);
+ pcs->search_path = HeapAlloc(GetProcessHeap(), 0, (len = MAX_PATH) * sizeof(WCHAR));
+ while ((size = GetCurrentDirectoryW(len, pcs->search_path)) >= len)
+ pcs->search_path = HeapReAlloc(GetProcessHeap(), 0, pcs->search_path, (len *= 2) * sizeof(WCHAR));
+ pcs->search_path = HeapReAlloc(GetProcessHeap(), 0, pcs->search_path, (size + 1) * sizeof(WCHAR));
- len = GetEnvironmentVariableA("_NT_SYMBOL_PATH", NULL, 0);
+ len = GetEnvironmentVariableW(sym_path, NULL, 0);
if (len)
{
- pcs->search_path = HeapReAlloc(GetProcessHeap(), 0, pcs->search_path, size + 1 + len + 1);
+ pcs->search_path = HeapReAlloc(GetProcessHeap(), 0, pcs->search_path, (size + 1 + len + 1) * sizeof(WCHAR));
pcs->search_path[size] = ';';
- GetEnvironmentVariableA("_NT_SYMBOL_PATH", pcs->search_path + size + 1, len);
+ GetEnvironmentVariableW(sym_path, pcs->search_path + size + 1, len);
size += 1 + len;
}
- len = GetEnvironmentVariableA("_NT_ALTERNATE_SYMBOL_PATH", NULL, 0);
+ len = GetEnvironmentVariableW(alt_sym_path, NULL, 0);
if (len)
{
- pcs->search_path = HeapReAlloc(GetProcessHeap(), 0, pcs->search_path, size + 1 + len + 1);
+ pcs->search_path = HeapReAlloc(GetProcessHeap(), 0, pcs->search_path, (size + 1 + len + 1) * sizeof(WCHAR));
pcs->search_path[size] = ';';
- GetEnvironmentVariableA("_NT_ALTERNATE_SYMBOL_PATH", pcs->search_path + size + 1, len);
+ GetEnvironmentVariableW(alt_sym_path, pcs->search_path + size + 1, len);
size += 1 + len;
}
}
@@ -270,6 +317,30 @@ BOOL WINAPI SymInitialize(HANDLE hProces
}
/******************************************************************
+ * SymInitialize (DBGHELP.@)
+ *
+ *
+ */
+BOOL WINAPI SymInitialize(HANDLE hProcess, PCSTR UserSearchPath, BOOL fInvadeProcess)
+{
+ WCHAR* sp = NULL;
+ BOOL ret;
+
+ if (UserSearchPath)
+ {
+ unsigned len;
+
+ len = MultiByteToWideChar(CP_ACP, 0, UserSearchPath, -1, NULL, 0);
+ sp = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, UserSearchPath, -1, sp, len);
+ }
+
+ ret = SymInitializeW(hProcess, sp, fInvadeProcess);
+ HeapFree(GetProcessHeap(), 0, sp);
+ return ret;
+}
+
+/******************************************************************
* SymCleanup (DBGHELP.@)
*
*/
diff --git a/dlls/dbghelp/dbghelp.spec b/dlls/dbghelp/dbghelp.spec
index 79f6867..69d4ffa 100644
--- a/dlls/dbghelp/dbghelp.spec
+++ b/dlls/dbghelp/dbghelp.spec
@@ -89,7 +89,8 @@
@ stdcall SymGetOptions()
@ stub SymGetScope
@ stub SymGetScopeW
-@ stdcall SymGetSearchPath(long str long)
+@ stdcall SymGetSearchPath(long ptr long)
+@ stdcall SymGetSearchPathW(long ptr long)
@ stub SymGetSourceFileFromToken
@ stub SymGetSourceFileFromTokenW
@ stdcall SymGetSourceFileToken(ptr double str ptr ptr)
@@ -112,7 +113,7 @@
@ stdcall SymGetTypeInfo(ptr double long long ptr)
@ stub SymGetTypeInfoEx
@ stdcall SymInitialize(long str long)
-@ stub SymInitializeW
+@ stdcall SymInitializeW(long wstr long)
@ stdcall SymLoadModule(long long str str long long)
@ stdcall SymLoadModule64(long long str str double long)
@ stdcall SymLoadModuleEx(long long str str double long ptr long)
@@ -140,7 +141,7 @@
@ stdcall SymSetOptions(long)
@ stdcall SymSetParentWindow(long)
@ stdcall SymSetSearchPath(long str)
-@ stub SymSetSearchPathW
+@ stdcall SymSetSearchPathW(long wstr)
@ stub SymSetSymWithAddr64
@ stub SymSrvDeltaName
@ stub SymSrvDeltaNameW
diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h
index 41e4ace..efc5ceb 100644
--- a/dlls/dbghelp/dbghelp_private.h
+++ b/dlls/dbghelp/dbghelp_private.h
@@ -291,7 +291,7 @@ struct process
{
struct process* next;
HANDLE handle;
- char* search_path;
+ WCHAR* search_path;
PSYMBOL_REGISTERED_CALLBACK64 reg_cb;
DWORD64 reg_user;
diff --git a/dlls/dbghelp/path.c b/dlls/dbghelp/path.c
index 8033967..fbd3b6e 100644
--- a/dlls/dbghelp/path.c
+++ b/dlls/dbghelp/path.c
@@ -298,7 +298,7 @@ static BOOL CALLBACK sffip_cb(LPCSTR buf
* SymFindFileInPath (DBGHELP.@)
*
*/
-BOOL WINAPI SymFindFileInPath(HANDLE hProcess, PCSTR searchPath, PCSTR full_path,
+BOOL WINAPI SymFindFileInPath(HANDLE hProcess, PCSTR inSearchPath, PCSTR full_path,
PVOID id, DWORD two, DWORD three, DWORD flags,
LPSTR buffer, PFINDFILEINPATHCALLBACK cb,
PVOID user)
@@ -308,13 +308,22 @@ BOOL WINAPI SymFindFileInPath(HANDLE hPr
char tmp[MAX_PATH];
char* ptr;
const char* filename;
+ const char* searchPath = inSearchPath;
TRACE("(%p %s %s %p %08lx %08lx %08lx %p %p %p)\n",
hProcess, searchPath, full_path, id, two, three, flags,
buffer, cb, user);
if (!pcs) return FALSE;
- if (!searchPath) searchPath = pcs->search_path;
+ if (!searchPath)
+ {
+ unsigned len = WideCharToMultiByte(CP_ACP, 0, pcs->search_path, -1, NULL, 0, NULL, NULL);
+ char* buf;
+
+ searchPath = buf = HeapAlloc(GetProcessHeap(), 0, len);
+ if (!searchPath) return FALSE;
+ WideCharToMultiByte(CP_ACP, 0, pcs->search_path, -1, buf, len, NULL, NULL);
+ }
s.id = id;
s.two = two;
@@ -330,6 +339,8 @@ BOOL WINAPI SymFindFileInPath(HANDLE hPr
if (sffip_cb(full_path, &s))
{
strcpy(buffer, full_path);
+ if (searchPath != inSearchPath)
+ HeapFree(GetProcessHeap(), 0, (char*)searchPath);
return TRUE;
}
@@ -350,8 +361,12 @@ BOOL WINAPI SymFindFileInPath(HANDLE hPr
if (do_search(filename, tmp, FALSE, sffip_cb, &s))
{
strcpy(buffer, tmp);
+ if (searchPath != inSearchPath)
+ HeapFree(GetProcessHeap(), 0, (char*)searchPath);
return TRUE;
}
}
+ if (searchPath != inSearchPath)
+ HeapFree(GetProcessHeap(), 0, (char*)searchPath);
return FALSE;
}
diff --git a/dlls/dbghelp/pe_module.c b/dlls/dbghelp/pe_module.c
index 395f398..e1174ab 100644
--- a/dlls/dbghelp/pe_module.c
+++ b/dlls/dbghelp/pe_module.c
@@ -31,6 +31,7 @@
#include "winreg.h"
#include "winternl.h"
#include "wine/debug.h"
+#include "winnls.h"
WINE_DEFAULT_DEBUG_CHANNEL(dbghelp);
@@ -336,12 +337,19 @@ struct module* pe_load_module(struct pro
loaded_name[0] = '\0';
if (!hFile)
{
+ unsigned len = WideCharToMultiByte(CP_ACP,0, pcs->search_path, -1, NULL, 0, NULL, NULL);
+ char* sp;
+
if (!name)
{
/* FIXME SetLastError */
return NULL;
}
- if ((hFile = FindExecutableImage(name, pcs->search_path, loaded_name)) == NULL)
+ sp = HeapAlloc(GetProcessHeap(), 0, len);
+ if (!sp) return FALSE;
+ WideCharToMultiByte(CP_ACP,0, pcs->search_path, -1, sp, len, NULL, NULL);
+
+ if ((hFile = FindExecutableImage(name, sp, loaded_name)) == NULL)
return NULL;
opened = TRUE;
}
diff --git a/include/dbghelp.h b/include/dbghelp.h
index 09ce14f..85e6a73 100644
--- a/include/dbghelp.h
+++ b/include/dbghelp.h
@@ -941,6 +941,7 @@ BOOL WINAPI SymEnumLines(HANDLE, ULONG64
* File & image handling *
*************************/
BOOL WINAPI SymInitialize(HANDLE, PCSTR, BOOL);
+BOOL WINAPI SymInitializeW(HANDLE, PCWSTR, BOOL);
BOOL WINAPI SymCleanup(HANDLE);
HANDLE WINAPI FindDebugInfoFile(PCSTR, PCSTR, PSTR);
@@ -959,7 +960,9 @@ PVOID WINAPI ImageDirectoryEntryToData(P
PIMAGE_SECTION_HEADER WINAPI ImageRvaToSection(PIMAGE_NT_HEADERS, PVOID, ULONG);
PVOID WINAPI ImageRvaToVa(PIMAGE_NT_HEADERS, PVOID, ULONG, PIMAGE_SECTION_HEADER*);
BOOL WINAPI SymGetSearchPath(HANDLE, PSTR, DWORD);
+BOOL WINAPI SymGetSearchPathW(HANDLE, PWSTR, DWORD);
BOOL WINAPI SymSetSearchPath(HANDLE, PCSTR);
+BOOL WINAPI SymSetSearchPathW(HANDLE, PCWSTR);
DWORD WINAPI GetTimestampForLoadedLibrary(HMODULE);
BOOL WINAPI MakeSureDirectoryPathExists(PCSTR);
BOOL WINAPI SearchTreeForFile(PCSTR, PCSTR, PSTR);
More information about the wine-patches
mailing list