BOOL path_find_symbol_file(const struct process* pcs, PCSTR full_path, const GUID* guid, DWORD dw1, DWORD dw2, PSTR buffer, BOOL* is_unmatched) { struct module_find mf; WCHAR full_pathW[MAX_PATH]; WCHAR tmp[MAX_PATH]; WCHAR* ptr; const WCHAR* filename; WCHAR* searchPath = pcs->search_path; TRACE("(pcs = %p, full_path = %s, guid = %s, dw1 = 0x%08x, dw2 = 0x%08x, buffer = %p)\n", pcs, debugstr_a(full_path), debugstr_guid(guid), dw1, dw2, buffer); mf.guid = guid; mf.dw1 = dw1; mf.dw2 = dw2; mf.matched = 0; MultiByteToWideChar(CP_ACP, 0, full_path, -1, full_pathW, MAX_PATH); filename = file_nameW(full_pathW); mf.kind = module_get_type_by_name(filename); *is_unmatched = FALSE; /* first check full path to file */ if (module_find_cb(full_pathW, &mf)) { WideCharToMultiByte(CP_ACP, 0, full_pathW, -1, buffer, MAX_PATH, NULL, NULL); return TRUE; } while (searchPath) { ptr = strchrW(searchPath, ';'); if (ptr) { memcpy(tmp, searchPath, (ptr - searchPath) * sizeof(WCHAR)); tmp[ptr - searchPath] = '\0'; searchPath = ptr + 1; } else { strcpyW(tmp, searchPath); searchPath = NULL; } if (do_searchW(filename, tmp, FALSE, module_find_cb, &mf)) { /* return first fully matched file */ WideCharToMultiByte(CP_ACP, 0, tmp, -1, buffer, MAX_PATH, NULL, NULL); return TRUE; } } /* if no fully matching file is found, return the best matching file if any */ if ((dbghelp_options & SYMOPT_LOAD_ANYTHING) && mf.matched) { WideCharToMultiByte(CP_ACP, 0, mf.filename, -1, buffer, MAX_PATH, NULL, NULL); *is_unmatched = TRUE; return TRUE; } return FALSE; }
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]; WCHAR tmp[MAX_PATH]; WCHAR* ptr; const WCHAR* filename; WCHAR* searchPath = pcs->search_path; TRACE("(pcs = %p, full_path = %s, guid = %s, dw1 = 0x%08x, dw2 = 0x%08x, buffer = %p)\n", pcs, debugstr_a(full_path), debugstr_guid(guid), dw1, dw2, buffer); mf.guid = guid; mf.dw1 = dw1; mf.dw2 = dw2; mf.matched = 0; MultiByteToWideChar(CP_ACP, 0, full_path, -1, full_pathW, MAX_PATH); filename = file_nameW(full_pathW); mf.kind = module_get_type_by_name(filename); *is_unmatched = FALSE; /* first check full path to file */ if (module_find_cb(full_pathW, &mf)) { WideCharToMultiByte(CP_ACP, 0, full_pathW, -1, buffer, MAX_PATH, NULL, NULL); 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 ... <path> <path>\dll <path>\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, ';'); if (ptr) { memcpy(tmp, searchPath, (ptr - searchPath) * sizeof(WCHAR)); tmp[ptr - searchPath] = '\0'; searchPath = ptr + 1; } else { strcpyW(tmp, searchPath); searchPath = NULL; } if (do_searchW(filename, tmp, FALSE, module_find_cb, &mf)) { /* return first fully matched file */ WideCharToMultiByte(CP_ACP, 0, tmp, -1, buffer, MAX_PATH, NULL, NULL); return TRUE; } } /* if no fully matching file is found, return the best matching file if any */ if ((dbghelp_options & SYMOPT_LOAD_ANYTHING) && mf.matched) { WideCharToMultiByte(CP_ACP, 0, mf.filename, -1, buffer, MAX_PATH, NULL, NULL); *is_unmatched = TRUE; return TRUE; } return FALSE; }