diff --git a/dll/win32/dbghelp/dbghelp_private.h b/dll/win32/dbghelp/dbghelp_private.h index 9eb0592fcab..23ee3f46621 100644 --- a/dll/win32/dbghelp/dbghelp_private.h +++ b/dll/win32/dbghelp/dbghelp_private.h @@ -655,9 +655,9 @@ extern BOOL pdb_virtual_unwind(struct cpu_stack_walk* csw, DWORD_PTR ip, CONTEXT* context, struct pdb_cmd_pair* cpair) DECLSPEC_HIDDEN; /* path.c */ -extern BOOL path_find_symbol_file(const struct process* pcs, PCSTR full_path, - const GUID* guid, DWORD dw1, DWORD dw2, PSTR buffer, - BOOL* is_unmatched) DECLSPEC_HIDDEN; +extern BOOL path_find_symbol_file(const struct process* pcs, const struct module* module, + PCSTR full_path, const GUID* guid, DWORD dw1, DWORD dw2, + PSTR buffer, BOOL* is_unmatched) DECLSPEC_HIDDEN; /* pe_module.c */ extern BOOL pe_load_nt_header(HANDLE hProc, DWORD64 base, IMAGE_NT_HEADERS* nth) DECLSPEC_HIDDEN; diff --git a/dll/win32/dbghelp/msc.c b/dll/win32/dbghelp/msc.c index eba26498cb0..58a4a55f2e9 100644 --- a/dll/win32/dbghelp/msc.c +++ b/dll/win32/dbghelp/msc.c @@ -2450,11 +2450,11 @@ static HANDLE map_pdb_file(const struct process* pcs, switch (lookup->kind) { case PDB_JG: - ret = path_find_symbol_file(pcs, lookup->filename, NULL, lookup->timestamp, + ret = path_find_symbol_file(pcs, module, lookup->filename, NULL, lookup->timestamp, lookup->age, dbg_file_path, &module->module.PdbUnmatched); break; case PDB_DS: - ret = path_find_symbol_file(pcs, lookup->filename, &lookup->guid, 0, + ret = path_find_symbol_file(pcs, module, lookup->filename, &lookup->guid, 0, lookup->age, dbg_file_path, &module->module.PdbUnmatched); break; } diff --git a/dll/win32/dbghelp/path.c b/dll/win32/dbghelp/path.c index 8c74426eec3..f8f268d8e9a 100644 --- a/dll/win32/dbghelp/path.c +++ b/dll/win32/dbghelp/path.c @@ -49,6 +49,17 @@ static inline const WCHAR* file_nameW(const WCHAR* str) return p + 1; } +static inline void file_pathW(const WCHAR* srcFileNameW, + WCHAR* dstFilePathW) +{ + int len; + + for (len = strlenW(srcFileNameW) - 1; (len > 0) && (!is_sepW(srcFileNameW[len])); len--); + + strncpyW(dstFilePathW, srcFileNameW, len); + dstFilePathW[len] = L'\0'; +} + /****************************************************************** * FindDebugInfoFile (DBGHELP.@) * @@ -612,9 +623,9 @@ static BOOL CALLBACK module_find_cb(PCWSTR buffer, PVOID user) return mf->matched == 2; } -BOOL path_find_symbol_file(const struct process* pcs, PCSTR full_path, - const GUID* guid, DWORD dw1, DWORD dw2, PSTR buffer, - BOOL* is_unmatched) +BOOL path_find_symbol_file(const struct process* pcs, const struct module* module, + PCSTR full_path, const GUID* guid, DWORD dw1, DWORD dw2, + PSTR buffer, BOOL* is_unmatched) { struct module_find mf; WCHAR full_pathW[MAX_PATH]; @@ -643,6 +654,24 @@ BOOL path_find_symbol_file(const struct process* pcs, PCSTR full_path, return TRUE; } + /* FIXME: Use Environment-Variables (see MS docs) + _NT_SYMBOL_PATH and _NT_ALT_SYMBOL_PATH + FIXME: Implement "Standard Path Elements" (Path) ... (see MS docs) + do a search for (every?) path-element like this ... + + \dll + \symbols\dll + (dll may be exe, or sys depending on the file extension) */ + + /* 2. check module-path */ + file_pathW(module->module.LoadedImageName, tmp); + if (do_searchW(filename, tmp, FALSE, module_find_cb, &mf)) + { + WideCharToMultiByte(CP_ACP, 0, tmp, -1, buffer, MAX_PATH, NULL, NULL); + return TRUE; + } + + /* 3. check search-path */ while (searchPath) { ptr = strchrW(searchPath, ';'); diff --git a/dll/win32/dbghelp/pe_module.c b/dll/win32/dbghelp/pe_module.c index 376a780653b..4b9eac4f032 100644 --- a/dll/win32/dbghelp/pe_module.c +++ b/dll/win32/dbghelp/pe_module.c @@ -560,7 +560,7 @@ static BOOL pe_load_dbg_file(const struct process* pcs, struct module* module, TRACE("Processing DBG file %s\n", debugstr_a(dbg_name)); - if (path_find_symbol_file(pcs, dbg_name, NULL, timestamp, 0, tmp, &module->module.DbgUnmatched) && + if (path_find_symbol_file(pcs, module, dbg_name, NULL, timestamp, 0, tmp, &module->module.DbgUnmatched) && (hFile = CreateFileA(tmp, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE && ((hMap = CreateFileMappingW(hFile, NULL, PAGE_READONLY, 0, 0, NULL)) != 0) &&