From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- dlls/dbghelp/dbghelp_private.h | 2 +- dlls/dbghelp/msc.c | 28 +++++++++++++++++++--------- dlls/dbghelp/path.c | 7 ++++--- dlls/dbghelp/pe_module.c | 13 +++++++++---- 4 files changed, 33 insertions(+), 17 deletions(-)
diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h index 1249d02b666..55001902b47 100644 --- a/dlls/dbghelp/dbghelp_private.h +++ b/dlls/dbghelp/dbghelp_private.h @@ -840,7 +840,7 @@ extern BOOL old_pdb_virtual_unwind(struct cpu_stack_walk *csw, DWORD_PTR
/* path.c */ extern BOOL path_find_symbol_file(const struct process *pcs, const struct module *module, - PCSTR full_path, BOOL is_pdb, const GUID* guid, DWORD dw1, DWORD dw2, + const WCHAR *full_path, BOOL is_pdb, const GUID* guid, DWORD dw1, DWORD dw2, SYMSRV_INDEX_INFOW *info, BOOL *unmatched); extern WCHAR *get_dos_file_name(const WCHAR *filename) __WINE_DEALLOC(HeapFree, 3) __WINE_MALLOC; extern BOOL search_dll_path(const struct process* process, const WCHAR *name, WORD machine, diff --git a/dlls/dbghelp/msc.c b/dlls/dbghelp/msc.c index 43ee8509a0d..8aafd7c6b40 100644 --- a/dlls/dbghelp/msc.c +++ b/dlls/dbghelp/msc.c @@ -3743,6 +3743,7 @@ static void pdb_process_symbol_imports(const struct process *pcs, last = (const char*)imp + symbols->pdbimport_size; while (imp < (const PDB_SYMBOL_IMPORT*)last) { + WCHAR buffer[MAX_PATH]; SYMSRV_INDEX_INFOW info; BOOL line_info;
@@ -3750,7 +3751,8 @@ static void pdb_process_symbol_imports(const struct process *pcs, if (i >= CV_MAX_MODULES) FIXME("Out of bounds!!!\n"); TRACE("got for %s: age=%u ts=%x\n", debugstr_a(imp->filename), imp->Age, imp->TimeDateStamp); - if (path_find_symbol_file(pcs, msc_dbg->module, imp->filename, TRUE, NULL, imp->TimeDateStamp, imp->Age, &info, + MultiByteToWideChar(CP_ACP, 0, imp->filename, -1, buffer, ARRAY_SIZE(buffer)); + if (path_find_symbol_file(pcs, msc_dbg->module, buffer, TRUE, NULL, imp->TimeDateStamp, imp->Age, &info, &msc_dbg->module->module.PdbUnmatched)) pdb_process_internal(pcs, msc_dbg, info.pdbfile, pdb_module_info, i, &line_info); i++; @@ -3998,7 +4000,7 @@ static BOOL old_pdb_process_file(const struct process *pcs,
static BOOL pdb_process_file(const struct process *pcs, const struct msc_debug_info *msc_dbg, - const char *filename, const GUID *guid, DWORD timestamp, DWORD age) + const WCHAR *filename, const GUID *guid, DWORD timestamp, DWORD age) { SYMSRV_INDEX_INFOW info; BOOL unmatched, has_linenumber_info, ret; @@ -4147,7 +4149,10 @@ static BOOL codeview_process_info(const struct process *pcs, case CODEVIEW_NB10_SIG: { const CODEVIEW_PDB_DATA* pdb = (const CODEVIEW_PDB_DATA*)msc_dbg->root; - ret = pdb_process_file(pcs, msc_dbg, pdb->name, NULL, pdb->timestamp, pdb->age); + WCHAR buffer[MAX_PATH]; + + MultiByteToWideChar(CP_ACP, 0, pdb->name, -1, buffer, ARRAY_SIZE(buffer)); + ret = pdb_process_file(pcs, msc_dbg, buffer, NULL, pdb->timestamp, pdb->age); break; } case CODEVIEW_RSDS_SIG: @@ -4160,7 +4165,12 @@ static BOOL codeview_process_info(const struct process *pcs, * Don't search for the .pdb file in that case. */ if (rsds->name[0]) - ret = pdb_process_file(pcs, msc_dbg, rsds->name, &rsds->guid, 0, rsds->age); + { + WCHAR buffer[MAX_PATH]; + + MultiByteToWideChar(CP_ACP, 0, rsds->name, -1, buffer, ARRAY_SIZE(buffer)); + ret = pdb_process_file(pcs, msc_dbg, buffer, &rsds->guid, 0, rsds->age); + } else ret = TRUE; break; @@ -4274,13 +4284,13 @@ typedef struct _FPO_DATA if (!ret && module->module.SymType == SymDeferred) { SYMSRV_INDEX_INFOW info = {.sizeofstruct = sizeof(info)}; - char buffer[MAX_PATH]; - char *ext; + WCHAR buffer[MAX_PATH]; + WCHAR *ext; DWORD options;
- WideCharToMultiByte(CP_ACP, 0, module->module.LoadedImageName, -1, buffer, ARRAY_SIZE(buffer), 0, NULL); - ext = strrchr(buffer, '.'); - if (ext) strcpy(ext + 1, "pdb"); else strcat(buffer, ".pdb"); + wcscpy(buffer, module->module.LoadedImageName); + ext = wcsrchr(buffer, '.'); + if (ext) wcscpy(ext + 1, L"pdb"); else wcscat(buffer, L".pdb"); options = SymGetOptions(); SymSetOptions(options | SYMOPT_LOAD_ANYTHING); ret = pdb_process_file(pcs, &msc_dbg, buffer, &null_guid, 0, 0); diff --git a/dlls/dbghelp/path.c b/dlls/dbghelp/path.c index c1fc6addb0c..3ce68d3431a 100644 --- a/dlls/dbghelp/path.c +++ b/dlls/dbghelp/path.c @@ -507,7 +507,7 @@ static BOOL CALLBACK module_find_cb(PCWSTR buffer, PVOID user) }
BOOL path_find_symbol_file(const struct process* pcs, const struct module* module, - PCSTR full_path, BOOL is_pdb, const GUID* guid, DWORD dw1, DWORD dw2, + const WCHAR *full_path, BOOL is_pdb, const GUID* guid, DWORD dw1, DWORD dw2, SYMSRV_INDEX_INFOW *info, BOOL* is_unmatched) { struct module_find mf; @@ -517,7 +517,7 @@ BOOL path_find_symbol_file(const struct process* pcs, const struct module* modul WCHAR buffer[MAX_PATH];
TRACE("(pcs = %p, full_path = %s, guid = %s, dw1 = 0x%08lx, dw2 = 0x%08lx)\n", - pcs, debugstr_a(full_path), debugstr_guid(guid), dw1, dw2); + pcs, debugstr_w(full_path), debugstr_guid(guid), dw1, dw2);
mf.info = info; mf.guid = guid; @@ -526,7 +526,8 @@ BOOL path_find_symbol_file(const struct process* pcs, const struct module* modul mf.matched = 0; mf.buffer = is_pdb ? info->pdbfile : info->dbgfile;
- MultiByteToWideChar(CP_ACP, 0, full_path, -1, info->file, MAX_PATH); + if (wcslen(full_path) + 1 >= ARRAY_SIZE(info->file)) return FALSE; + wcscpy(info->file, full_path); filename = file_name(info->file); mf.is_pdb = is_pdb; *is_unmatched = FALSE; diff --git a/dlls/dbghelp/pe_module.c b/dlls/dbghelp/pe_module.c index cbfa2b902c1..f86fb7c00e8 100644 --- a/dlls/dbghelp/pe_module.c +++ b/dlls/dbghelp/pe_module.c @@ -586,14 +586,14 @@ static BOOL pe_load_dwarf(struct module* module) * loads a .dbg file */ static BOOL pe_load_dbg_file(const struct process* pcs, struct module* module, - const char* dbg_name, DWORD timestamp) + const WCHAR* dbg_name, DWORD timestamp) { HANDLE hFile = INVALID_HANDLE_VALUE, hMap = 0; const BYTE* dbg_mapping = NULL; BOOL ret = FALSE; SYMSRV_INDEX_INFOW info;
- TRACE("Processing DBG file %s\n", debugstr_a(dbg_name)); + TRACE("Processing DBG file %s\n", debugstr_w(dbg_name));
if (path_find_symbol_file(pcs, module, dbg_name, FALSE, NULL, timestamp, 0, &info, &module->module.DbgUnmatched) && (hFile = CreateFileW(info.dbgfile, GENERIC_READ, FILE_SHARE_READ, NULL, @@ -619,7 +619,7 @@ static BOOL pe_load_dbg_file(const struct process* pcs, struct module* module, hdr->DebugDirectorySize / sizeof(*dbg)); } else - ERR("Couldn't find .DBG file %s (%s)\n", debugstr_a(dbg_name), debugstr_w(info.dbgfile)); + ERR("Couldn't find .DBG file %s (%s)\n", debugstr_w(dbg_name), debugstr_w(info.dbgfile));
if (dbg_mapping) UnmapViewOfFile(dbg_mapping); if (hMap) CloseHandle(hMap); @@ -655,7 +655,12 @@ static BOOL pe_load_msc_debug_info(const struct process* pcs, struct module* mod { misc = (const IMAGE_DEBUG_MISC *)((const char *)mapping + dbg->PointerToRawData); if (misc->DataType == IMAGE_DEBUG_MISC_EXENAME) - ret = pe_load_dbg_file(pcs, module, (const char*)misc->Data, nth->FileHeader.TimeDateStamp); + { + WCHAR buffer[MAX_PATH]; + + MultiByteToWideChar(CP_ACP, 0, (const char*)misc->Data, -1, buffer, ARRAY_SIZE(buffer)); + ret = pe_load_dbg_file(pcs, module, buffer, nth->FileHeader.TimeDateStamp); + } else misc = NULL; }