The following series starts implementing inline site support in dbghelp. Nothing fancy for now, just the definitions & stubs, and a couple of fixes and code improvements as well.
A+
---
Eric Pouech (11): dbghelp: use wide string literals dbghelp: handle some more error conditions in SymGetTypeInfo() include/dbghelp.h: update for inline related APIs and structures dbghelp: added stubs for inline related APIs dbghelp: start implementing StackWalkEx dbgHelp: added stub implementation of SymFromInlineContext(W) dbghelp: added stub implementations of SymGetLineFromInlineContext(W) dbghelp: added stubs implementation for the SymSetScope* functions dbghelp: improved error handling in SymSetContext() dbghelp: factorize SymUnloadModule and SymUnloadModule64 dbghelp/dwarf: properly handle error cases while computing frame_cfa
dlls/dbghelp/dbghelp.c | 63 +++++++++++++++++++++----- dlls/dbghelp/dbghelp.spec | 12 ++++- dlls/dbghelp/dbghelp_private.h | 1 - dlls/dbghelp/dwarf.c | 4 +- dlls/dbghelp/elf_module.c | 8 +--- dlls/dbghelp/macho_module.c | 15 +++---- dlls/dbghelp/minidump.c | 3 +- dlls/dbghelp/module.c | 43 +++++------------- dlls/dbghelp/path.c | 19 +++----- dlls/dbghelp/stack.c | 75 +++++++++++++++++++++++++++++++ dlls/dbghelp/symbol.c | 82 ++++++++++++++++++++++++++-------- dlls/dbghelp/type.c | 3 ++ include/dbghelp.h | 53 +++++++++++++++++++++- 13 files changed, 283 insertions(+), 98 deletions(-)
Signed-off-by: Eric Pouech eric.pouech@gmail.com
--- dlls/dbghelp/dbghelp.c | 10 ++++------ dlls/dbghelp/dbghelp_private.h | 1 - dlls/dbghelp/elf_module.c | 8 ++------ dlls/dbghelp/macho_module.c | 15 +++++---------- dlls/dbghelp/minidump.c | 3 +-- dlls/dbghelp/module.c | 34 +++++++++++----------------------- dlls/dbghelp/path.c | 19 ++++++------------- dlls/dbghelp/symbol.c | 8 +++----- 8 files changed, 32 insertions(+), 66 deletions(-)
diff --git a/dlls/dbghelp/dbghelp.c b/dlls/dbghelp/dbghelp.c index 9d99f0d646a..65a57ac90dc 100644 --- a/dlls/dbghelp/dbghelp.c +++ b/dlls/dbghelp/dbghelp.c @@ -430,28 +430,26 @@ BOOL WINAPI SymInitializeW(HANDLE hProcess, PCWSTR UserSearchPath, BOOL fInvadeP { 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) * 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 = GetEnvironmentVariableW(sym_path, NULL, 0); + len = GetEnvironmentVariableW(L"_NT_SYMBOL_PATH", NULL, 0); if (len) { pcs->search_path = HeapReAlloc(GetProcessHeap(), 0, pcs->search_path, (size + 1 + len + 1) * sizeof(WCHAR)); pcs->search_path[size] = ';'; - GetEnvironmentVariableW(sym_path, pcs->search_path + size + 1, len); + GetEnvironmentVariableW(L"_NT_SYMBOL_PATH", pcs->search_path + size + 1, len); size += 1 + len; } - len = GetEnvironmentVariableW(alt_sym_path, NULL, 0); + len = GetEnvironmentVariableW(L"_NT_ALTERNATE_SYMBOL_PATH", NULL, 0); if (len) { pcs->search_path = HeapReAlloc(GetProcessHeap(), 0, pcs->search_path, (size + 1 + len + 1) * sizeof(WCHAR)); pcs->search_path[size] = ';'; - GetEnvironmentVariableW(alt_sym_path, pcs->search_path + size + 1, len); + GetEnvironmentVariableW(L"_NT_ALTERNATE_SYMBOL_PATH", pcs->search_path + size + 1, len); } }
diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h index fda6714c332..2ebe6699a1d 100644 --- a/dlls/dbghelp/dbghelp_private.h +++ b/dlls/dbghelp/dbghelp_private.h @@ -626,7 +626,6 @@ void minidump_add_memory_block(struct dump_context* dc, ULONG64 base, ULONG size /* module.c */ extern const WCHAR S_ElfW[] DECLSPEC_HIDDEN; extern const WCHAR S_WineLoaderW[] DECLSPEC_HIDDEN; -extern const WCHAR S_SlashW[] DECLSPEC_HIDDEN; extern const struct loader_ops no_loader_ops DECLSPEC_HIDDEN;
extern BOOL module_init_pair(struct module_pair* pair, HANDLE hProcess, diff --git a/dlls/dbghelp/elf_module.c b/dlls/dbghelp/elf_module.c index 553b212c526..dbae4db40d2 100644 --- a/dlls/dbghelp/elf_module.c +++ b/dlls/dbghelp/elf_module.c @@ -1429,7 +1429,6 @@ static BOOL elf_search_and_load_file(struct process* pcs, const WCHAR* filename, { BOOL ret = FALSE; struct module* module; - static const WCHAR S_libstdcPPW[] = {'l','i','b','s','t','d','c','+','+','\0'};
if (filename == NULL || *filename == '\0') return FALSE; if ((module = module_is_already_loaded(pcs, filename))) @@ -1439,7 +1438,7 @@ static BOOL elf_search_and_load_file(struct process* pcs, const WCHAR* filename, return module->module.SymType; }
- if (wcsstr(filename, S_libstdcPPW)) return FALSE; /* We know we can't do it */ + if (wcsstr(filename, L"libstdc++")) return FALSE; /* We know we can't do it */ ret = elf_load_file(pcs, filename, load_offset, dyn_addr, elf_info); /* if relative pathname, try some absolute base dirs */ if (!ret && filename == file_name(filename)) @@ -1563,10 +1562,7 @@ static BOOL elf_enum_modules_internal(const struct process* pcs, ULONG_PTR ehdr_addr;
if (elf_search_auxv(pcs, ELF_AT_SYSINFO_EHDR, &ehdr_addr)) - { - static const WCHAR vdsoW[] = {'[','v','d','s','o',']','.','s','o',0}; - cb(vdsoW, ehdr_addr, 0, TRUE, user); - } + cb(L"[vdso].so", ehdr_addr, 0, TRUE, user); } return TRUE; } diff --git a/dlls/dbghelp/macho_module.c b/dlls/dbghelp/macho_module.c index 34bc4f2c4ea..c4a19b63de0 100644 --- a/dlls/dbghelp/macho_module.c +++ b/dlls/dbghelp/macho_module.c @@ -1232,9 +1232,7 @@ static BOOL try_dsym(struct process *pcs, const WCHAR* path, struct macho_file_m return FALSE; }
-static const WCHAR dsym_subpath[] = {'\','C','o','n','t','e','n','t','s', - '\','R','e','s','o','u','r','c','e','s', - '\','D','W','A','R','F','\',0}; +static const WCHAR dsym_subpath[] = L"'\Contents\Resources\DWARF\";
static WCHAR *query_dsym(const GUID *uuid, const WCHAR *filename) { @@ -1287,8 +1285,6 @@ static WCHAR *query_dsym(const GUID *uuid, const WCHAR *filename) */ static void find_and_map_dsym(struct process *pcs, struct module* module) { - static const WCHAR dot_dsym[] = {'.','d','S','Y','M',0}; - static const WCHAR dot_dwarf[] = {'.','d','w','a','r','f',0}; struct macho_file_map* fmap = &module->format_info[DFI_MACHO]->u.macho_info->file_map.u.macho; const WCHAR* p; size_t len; @@ -1300,19 +1296,19 @@ static void find_and_map_dsym(struct process *pcs, struct module* module) return;
p = file_name(module->module.LoadedImageName); - len = lstrlenW(module->module.LoadedImageName) + lstrlenW(dot_dsym) + lstrlenW(dsym_subpath) + lstrlenW(p) + 1; + len = lstrlenW(module->module.LoadedImageName) + lstrlenW(L".dSYM") + lstrlenW(dsym_subpath) + lstrlenW(p) + 1; path = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); if (!path) return; lstrcpyW(path, module->module.LoadedImageName); - lstrcatW(path, dot_dsym); + lstrcatW(path, L".dSYM"); lstrcatW(path, dsym_subpath); lstrcatW(path, p);
if (try_dsym(pcs, path, fmap)) goto found;
- lstrcpyW(path + lstrlenW(module->module.LoadedImageName), dot_dwarf); + lstrcpyW(path + lstrlenW(module->module.LoadedImageName), L".dwarf");
if (try_dsym(pcs, path, fmap)) goto found; @@ -1552,7 +1548,6 @@ static BOOL macho_search_and_load_file(struct process* pcs, const WCHAR* filenam { BOOL ret = FALSE; struct module* module; - static const WCHAR S_libstdcPPW[] = {'l','i','b','s','t','d','c','+','+','\0'}; const WCHAR* p; struct macho_load_params load_params;
@@ -1567,7 +1562,7 @@ static BOOL macho_search_and_load_file(struct process* pcs, const WCHAR* filenam return module->module.SymType; }
- if (wcsstr(filename, S_libstdcPPW)) return FALSE; /* We know we can't do it */ + if (wcsstr(filename, L"libstdc++")) return FALSE; /* We know we can't do it */
load_params.process = pcs; load_params.load_addr = load_addr; diff --git a/dlls/dbghelp/minidump.c b/dlls/dbghelp/minidump.c index cae966b8e80..c2461413570 100644 --- a/dlls/dbghelp/minidump.c +++ b/dlls/dbghelp/minidump.c @@ -326,7 +326,6 @@ static void fetch_module_versioninfo(LPCWSTR filename, VS_FIXEDFILEINFO* ffi) { DWORD handle; DWORD sz; - static const WCHAR backslashW[] = {'\', '\0'};
memset(ffi, 0, sizeof(*ffi)); if ((sz = GetFileVersionInfoSizeW(filename, &handle))) @@ -337,7 +336,7 @@ static void fetch_module_versioninfo(LPCWSTR filename, VS_FIXEDFILEINFO* ffi) VS_FIXEDFILEINFO* ptr; UINT len;
- if (VerQueryValueW(info, backslashW, (void*)&ptr, &len)) + if (VerQueryValueW(info, L"\", (void*)&ptr, &len)) memcpy(ffi, ptr, min(len, sizeof(*ffi))); } HeapFree(GetProcessHeap(), 0, info); diff --git a/dlls/dbghelp/module.c b/dlls/dbghelp/module.c index 488ed1a3bd6..b645e6dbf0f 100644 --- a/dlls/dbghelp/module.c +++ b/dlls/dbghelp/module.c @@ -35,18 +35,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(dbghelp);
#define NOTE_GNU_BUILD_ID 3
-const WCHAR S_ElfW[] = {'<','e','l','f','>','\0'}; -const WCHAR S_WineLoaderW[] = {'<','w','i','n','e','-','l','o','a','d','e','r','>','\0'}; -static const WCHAR S_DotSoW[] = {'.','s','o','\0'}; -const WCHAR S_SlashW[] = {'/','\0'}; - -static const WCHAR S_AcmW[] = {'.','a','c','m','\0'}; -static const WCHAR S_DllW[] = {'.','d','l','l','\0'}; -static const WCHAR S_DrvW[] = {'.','d','r','v','\0'}; -static const WCHAR S_ExeW[] = {'.','e','x','e','\0'}; -static const WCHAR S_OcxW[] = {'.','o','c','x','\0'}; -static const WCHAR S_VxdW[] = {'.','v','x','d','\0'}; -static const WCHAR * const ext[] = {S_AcmW, S_DllW, S_DrvW, S_ExeW, S_OcxW, S_VxdW, NULL}; +const WCHAR S_ElfW[] = L"<elf>"; +const WCHAR S_WineLoaderW[] = L"<wine-loader>"; +static const WCHAR * const ext[] = {L".acm", L".dll", L".drv", L".exe", L".ocx", L".vxd", NULL};
static int match_ext(const WCHAR* ptr, size_t len) { @@ -77,8 +68,6 @@ static const WCHAR* get_filename(const WCHAR* name, const WCHAR* endptr)
static BOOL is_wine_loader(const WCHAR *module) { - static const WCHAR wineW[] = {'w','i','n','e',0}; - static const WCHAR suffixW[] = {'6','4',0}; const WCHAR *filename = get_filename(module, NULL); const char *ptr; BOOL ret = FALSE; @@ -94,14 +83,14 @@ static BOOL is_wine_loader(const WCHAR *module) } else { - buffer = heap_alloc( sizeof(wineW) + 2 * sizeof(WCHAR) ); - lstrcpyW( buffer, wineW ); + buffer = heap_alloc( sizeof(L"wine") + 2 * sizeof(WCHAR) ); + lstrcpyW( buffer, L"wine" ); }
if (!wcscmp( filename, buffer )) ret = TRUE;
- lstrcatW( buffer, suffixW ); + lstrcatW( buffer, L"64" ); if (!wcscmp( filename, buffer )) ret = TRUE;
@@ -124,9 +113,9 @@ static void module_fill_module(const WCHAR* in, WCHAR* out, size_t size) lstrcpynW(out, S_WineLoaderW, size); else { - if (len > 3 && !wcsicmp(&out[len - 3], S_DotSoW) && + if (len > 3 && !wcsicmp(&out[len - 3], L".so") && (l = match_ext(out, len - 3))) - lstrcpyW(&out[len - l - 3], S_ElfW); + lstrcpyW(&out[len - l - 3], L"<elf>"); } while ((*out = towlower(*out))) out++; } @@ -464,7 +453,7 @@ static BOOL module_is_container_loaded(const struct process* pcs, { modname = get_filename(module->module.LoadedImageName, NULL); if (!wcsnicmp(modname, filename, len) && - !memcmp(modname + len, S_DotSoW, 3 * sizeof(WCHAR))) + !memcmp(modname + len, L".so", 3 * sizeof(WCHAR))) { return TRUE; } @@ -746,7 +735,6 @@ static BOOL image_locate_build_id_target(struct image_file_map* fmap, const BYTE { static const WCHAR globalDebugDirW[] = {'/','u','s','r','/','l','i','b','/','d','e','b','u','g','/'}; static const WCHAR buildidW[] = {'.','b','u','i','l','d','-','i','d','/'}; - static const WCHAR dotDebug0W[] = {'.','d','e','b','u','g',0}; struct image_file_map* fmap_link = NULL; WCHAR* p; WCHAR* z; @@ -757,7 +745,7 @@ static BOOL image_locate_build_id_target(struct image_file_map* fmap, const BYTE
p = HeapAlloc(GetProcessHeap(), 0, sizeof(globalDebugDirW) + sizeof(buildidW) + - (idlen * 2 + 1) * sizeof(WCHAR) + sizeof(dotDebug0W)); + (idlen * 2 + 1) * sizeof(WCHAR) + sizeof(L".debug")); z = p; memcpy(z, globalDebugDirW, sizeof(globalDebugDirW)); z += ARRAY_SIZE(globalDebugDirW); @@ -778,7 +766,7 @@ static BOOL image_locate_build_id_target(struct image_file_map* fmap, const BYTE *z++ = "0123456789abcdef"[*id & 0x0F]; id++; } - memcpy(z, dotDebug0W, sizeof(dotDebug0W)); + memcpy(z, L".debug", sizeof(L".debug")); TRACE("checking %s\n", wine_dbgstr_w(p));
if (image_check_debug_link_gnu_id(p, fmap_link, idend - idlen, idlen)) diff --git a/dlls/dbghelp/path.c b/dlls/dbghelp/path.c index ba757a55b0c..f99129eac49 100644 --- a/dlls/dbghelp/path.c +++ b/dlls/dbghelp/path.c @@ -242,14 +242,11 @@ static BOOL do_searchW(PCWSTR file, PWSTR buffer, BOOL recurse, WIN32_FIND_DATAW fd; unsigned pos; BOOL found = FALSE; - static const WCHAR S_AllW[] = {'*','.','*','\0'}; - static const WCHAR S_DotW[] = {'.','\0'}; - static const WCHAR S_DotDotW[] = {'.','.','\0'};
pos = lstrlenW(buffer); if (pos == 0) return FALSE; if (buffer[pos - 1] != '\') buffer[pos++] = '\'; - lstrcpyW(buffer + pos, S_AllW); + lstrcpyW(buffer + pos, L"*.*"); if ((h = FindFirstFileW(buffer, &fd)) == INVALID_HANDLE_VALUE) return FALSE; /* doc doesn't specify how the tree is enumerated... @@ -257,7 +254,7 @@ static BOOL do_searchW(PCWSTR file, PWSTR buffer, BOOL recurse, */ do { - if (!wcscmp(fd.cFileName, S_DotW) || !wcscmp(fd.cFileName, S_DotDotW)) continue; + if (!wcscmp(fd.cFileName, L".") || !wcscmp(fd.cFileName, L"..")) continue;
lstrcpyW(buffer + pos, fd.cFileName); if (recurse && (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) @@ -723,10 +720,6 @@ BOOL search_dll_path(const struct process *process, const WCHAR *name, BOOL (*ma { const WCHAR dllsW[] = { '\','d','l','l','s','\' }; const WCHAR programsW[] = { '\','p','r','o','g','r','a','m','s','\' }; - const WCHAR dot_dllW[] = {'.','d','l','l',0}; - const WCHAR dot_exeW[] = {'.','e','x','e',0}; - const WCHAR dot_soW[] = {'.','s','o',0}; -
len = lstrlenW(env); if (!(buf = heap_alloc((len + 8 + 3 * lstrlenW(name)) * sizeof(WCHAR)))) return FALSE; @@ -735,8 +728,8 @@ BOOL search_dll_path(const struct process *process, const WCHAR *name, BOOL (*ma
memcpy(end, dllsW, sizeof(dllsW)); lstrcpyW(end + ARRAY_SIZE(dllsW), name); - if ((p = wcsrchr(end, '.')) && !lstrcmpW(p, dot_soW)) *p = 0; - if ((p = wcsrchr(end, '.')) && !lstrcmpW(p, dot_dllW)) *p = 0; + if ((p = wcsrchr(end, '.')) && !lstrcmpW(p, L".so")) *p = 0; + if ((p = wcsrchr(end, '.')) && !lstrcmpW(p, L".dll")) *p = 0; p = end + lstrlenW(end); *p++ = '\'; lstrcpyW(p, name); @@ -751,8 +744,8 @@ BOOL search_dll_path(const struct process *process, const WCHAR *name, BOOL (*ma memcpy(end, programsW, sizeof(programsW)); end += ARRAY_SIZE(programsW); lstrcpyW(end, name); - if ((p = wcsrchr(end, '.')) && !lstrcmpW(p, dot_soW)) *p = 0; - if ((p = wcsrchr(end, '.')) && !lstrcmpW(p, dot_exeW)) *p = 0; + if ((p = wcsrchr(end, '.')) && !lstrcmpW(p, L".so")) *p = 0; + if ((p = wcsrchr(end, '.')) && !lstrcmpW(p, L".exe")) *p = 0; p = end + lstrlenW(end); *p++ = '\'; lstrcpyW(p, name); diff --git a/dlls/dbghelp/symbol.c b/dlls/dbghelp/symbol.c index 1113bbc39cf..76c92414b89 100644 --- a/dlls/dbghelp/symbol.c +++ b/dlls/dbghelp/symbol.c @@ -37,8 +37,6 @@ WINE_DECLARE_DEBUG_CHANNEL(dbghelp_symt); extern char * CDECL __unDName(char *buffer, const char *mangled, int len, void * (CDECL *pfn_alloc)(size_t), void (CDECL *pfn_free)(void *), unsigned short flags);
-static const WCHAR starW[] = {'*','\0'}; - static inline int cmp_addr(ULONG64 a1, ULONG64 a2) { if (a1 > a2) return 1; @@ -1089,7 +1087,7 @@ static BOOL symt_enum_locals(struct process* pcs, const WCHAR* mask,
if (sym->symt.tag == SymTagFunction) { - return symt_enum_locals_helper(&pair, mask ? mask : starW, se, (struct symt_function*)sym, + return symt_enum_locals_helper(&pair, mask ? mask : L"*", se, (struct symt_function*)sym, &((struct symt_function*)sym)->vchildren); } return FALSE; @@ -1210,7 +1208,7 @@ static BOOL sym_enum(HANDLE hProcess, ULONG64 BaseOfDll, PCWSTR Mask, Mask = bang + 1; }
- symt_enum_module(&pair, Mask ? Mask : starW, se); + symt_enum_module(&pair, Mask ? Mask : L"*", se);
return TRUE; } @@ -2154,7 +2152,7 @@ static BOOL re_match_multi(const WCHAR** pstring, const WCHAR** pre, BOOL _case) case WILDCHAR(']'): case WILDCHAR('+'): case WILDCHAR('#'): return FALSE; case WILDCHAR('*'): /* transform '*' into '?#' */ - {static const WCHAR qmW[] = {'?',0}; re_beg = qmW;} + re_beg = L"?"; goto closure; case WILDCHAR('['): do
Signed-off-by: Eric Pouech eric.pouech@gmail.com
--- dlls/dbghelp/type.c | 3 +++ 1 file changed, 3 insertions(+)
diff --git a/dlls/dbghelp/type.c b/dlls/dbghelp/type.c index eecb83f325f..80f8eca768e 100644 --- a/dlls/dbghelp/type.c +++ b/dlls/dbghelp/type.c @@ -746,6 +746,8 @@ BOOL symt_get_info(struct module* module, const struct symt* type, case SymTagFunctionType: case SymTagFunctionArgType: case SymTagLabel: + case SymTagFuncDebugStart: + case SymTagFuncDebugEnd: return FALSE; } break; @@ -839,6 +841,7 @@ BOOL symt_get_info(struct module* module, const struct symt* type, case SymTagArrayType: case SymTagBaseType: case SymTagTypedef: + case SymTagFunction: case SymTagBlock: case SymTagFuncDebugStart: case SymTagFuncDebugEnd:
Signed-off-by: Eric Pouech eric.pouech@gmail.com
--- include/dbghelp.h | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 2 deletions(-)
diff --git a/include/dbghelp.h b/include/dbghelp.h index bc8b45fe0df..4dad9cd45e9 100644 --- a/include/dbghelp.h +++ b/include/dbghelp.h @@ -1083,6 +1083,8 @@ BOOL WINAPI SymEnumTypes(HANDLE, ULONG64, PSYM_ENUMERATESYMBOLS_CALLBACK, PVOID) BOOL WINAPI SymEnumTypesW(HANDLE, ULONG64, PSYM_ENUMERATESYMBOLS_CALLBACKW, PVOID); BOOL WINAPI SymFromAddr(HANDLE, DWORD64, DWORD64*, SYMBOL_INFO*); BOOL WINAPI SymFromAddrW(HANDLE, DWORD64, DWORD64*, SYMBOL_INFOW*); +BOOL WINAPI SymFromInlineContext(HANDLE, DWORD64, ULONG, PDWORD64, PSYMBOL_INFO); +BOOL WINAPI SymFromInlineContextW(HANDLE, DWORD64, ULONG, PDWORD64, PSYMBOL_INFOW); BOOL WINAPI SymFromToken(HANDLE, DWORD64, DWORD, PSYMBOL_INFO); BOOL WINAPI SymFromTokenW(HANDLE, DWORD64, DWORD, PSYMBOL_INFOW); BOOL WINAPI SymFromName(HANDLE, PCSTR, PSYMBOL_INFO); @@ -1137,6 +1139,8 @@ BOOL WINAPI SymEnumSourceFiles(HANDLE, ULONG64, PCSTR, PSYM_ENUMSOURCEFILES_CALL BOOL WINAPI SymEnumSourceFilesW(HANDLE, ULONG64, PCWSTR, PSYM_ENUMSOURCEFILES_CALLBACKW, PVOID); BOOL WINAPI SymGetLineFromAddr64(HANDLE, DWORD64, PDWORD, PIMAGEHLP_LINE64); BOOL WINAPI SymGetLineFromAddrW64(HANDLE, DWORD64, PDWORD, PIMAGEHLP_LINEW64); +BOOL WINAPI SymGetLineFromInlineContext(HANDLE, DWORD64, ULONG, DWORD64, PDWORD, PIMAGEHLP_LINE64); +BOOL WINAPI SymGetLineFromInlineContextW(HANDLE, DWORD64, ULONG, DWORD64, PDWORD, PIMAGEHLP_LINEW64); BOOL WINAPI SymGetLinePrev64(HANDLE, PIMAGEHLP_LINE64); BOOL WINAPI SymGetLinePrevW64(HANDLE, PIMAGEHLP_LINEW64); BOOL WINAPI SymGetLineNext64(HANDLE, PIMAGEHLP_LINE64); @@ -1244,7 +1248,9 @@ PWSTR WINAPI SymGetHomeDirectoryW(DWORD, PWSTR, size_t); * Context management * *************************/ BOOL WINAPI SymSetContext(HANDLE, PIMAGEHLP_STACK_FRAME, PIMAGEHLP_CONTEXT); - +BOOL WINAPI SymSetScopeFromIndex(HANDLE, ULONG64, ULONG); +BOOL WINAPI SymSetScopeFromAddr(HANDLE, ULONG64); +BOOL WINAPI SymSetScopeFromInlineContext(HANDLE, ULONG64, ULONG);
/************************* * Stack management * @@ -1314,6 +1320,28 @@ typedef struct _STACKFRAME64 KDHELP64 KdHelp; } STACKFRAME64, *LPSTACKFRAME64;
+#define INLINE_FRAME_CONTEXT_INIT 0 +#define INLINE_FRAME_CONTEXT_IGNORE 0xFFFFFFFF + +typedef struct _tagSTACKFRAME_EX +{ + ADDRESS64 AddrPC; + ADDRESS64 AddrReturn; + ADDRESS64 AddrFrame; + ADDRESS64 AddrStack; + ADDRESS64 AddrBStore; + PVOID FuncTableEntry; + DWORD64 Params[4]; + BOOL Far; + BOOL Virtual; + DWORD64 Reserved[3]; + KDHELP64 KdHelp; + + DWORD StackFrameSize; + DWORD InlineFrameContext; +} STACKFRAME_EX, *LPSTACKFRAME_EX; + + typedef BOOL (CALLBACK *PREAD_PROCESS_MEMORY_ROUTINE64) (HANDLE, DWORD64, PVOID, DWORD, PDWORD); typedef PVOID (CALLBACK *PFUNCTION_TABLE_ACCESS_ROUTINE64)(HANDLE, DWORD64); @@ -1324,12 +1352,33 @@ BOOL WINAPI StackWalk64(DWORD, HANDLE, HANDLE, LPSTACKFRAME64, PVOID, PFUNCTION_TABLE_ACCESS_ROUTINE64, PGET_MODULE_BASE_ROUTINE64, PTRANSLATE_ADDRESS_ROUTINE64); - +#define SYM_STKWALK_DEFAULT 0x00000000 +#define SYM_STKWALK_FORCE_FRAMEPTR 0x00000001 +BOOL WINAPI StackWalkEx(DWORD, HANDLE, HANDLE, LPSTACKFRAME_EX, PVOID, + PREAD_PROCESS_MEMORY_ROUTINE64, + PFUNCTION_TABLE_ACCESS_ROUTINE64, + PGET_MODULE_BASE_ROUTINE64, + PTRANSLATE_ADDRESS_ROUTINE64, + DWORD); PVOID WINAPI SymFunctionTableAccess64(HANDLE, DWORD64);
typedef PVOID (CALLBACK *PSYMBOL_FUNCENTRY_CALLBACK64)(HANDLE, ULONG64, ULONG64);
BOOL WINAPI SymRegisterFunctionEntryCallback64(HANDLE, PSYMBOL_FUNCENTRY_CALLBACK64, ULONG64); +BOOL WINAPI SymGetUnwindInfo(HANDLE, DWORD64, PVOID, PULONG); + +/* Inline context related APIs */ +DWORD WINAPI SymAddrIncludeInlineTrace(HANDLE, DWORD64); + +#define SYM_INLINE_COMP_ERROR 0 +#define SYM_INLINE_COMP_IDENTICAL 1 +#define SYM_INLINE_COMP_STEPIN 2 +#define SYM_INLINE_COMP_STEPOUT 3 +#define SYM_INLINE_COMP_STEPOVER 4 +#define SYM_INLINE_COMP_DIFFERENT 5 + +DWORD WINAPI SymCompareInlineTrace(HANDLE, DWORD64, DWORD, DWORD64, DWORD64, DWORD64); +BOOL WINAPI SymQueryInlineTrace(HANDLE, DWORD64, DWORD, DWORD64, DWORD64, LPDWORD, LPDWORD);
/************************* * Version, global stuff *
Signed-off-by: Eric Pouech eric.pouech@gmail.com
--- dlls/dbghelp/dbghelp.spec | 10 ++++++++++ 1 file changed, 10 insertions(+)
diff --git a/dlls/dbghelp/dbghelp.spec b/dlls/dbghelp/dbghelp.spec index 9f719bd6a6e..e45ac48acb2 100644 --- a/dlls/dbghelp/dbghelp.spec +++ b/dlls/dbghelp/dbghelp.spec @@ -32,12 +32,15 @@ @ stdcall SearchTreeForFileW(wstr wstr ptr) @ stdcall StackWalk(long long long ptr ptr ptr ptr ptr ptr) @ stdcall StackWalk64(long long long ptr ptr ptr ptr ptr ptr) +@ stub StackWalkEx @ stub SymAddSourceStream @ stub SymAddSourceStreamA @ stub SymAddSourceStreamW @ stdcall SymAddSymbol(ptr int64 str int64 long long) @ stdcall SymAddSymbolW(ptr int64 wstr int64 long long) +@ stub SymAddrIncludeInlineTrace @ stdcall SymCleanup(long) +@ stub SymCompareInlineTrace @ stub SymDeleteSymbol @ stub SymDeleteSymbolW @ stdcall SymEnumLines(ptr int64 str str ptr ptr) @@ -74,6 +77,8 @@ @ stdcall SymFromAddrW(ptr int64 ptr ptr) @ stdcall SymFromIndex(long int64 long ptr) @ stdcall SymFromIndexW(long int64 long ptr) +@ stub SymFromInlineContext +@ stub SymFromInlineContextW @ stdcall SymFromName(long str ptr) @ stdcall SymFromNameW(long wstr ptr) @ stub SymFromToken @@ -87,6 +92,8 @@ @ stdcall SymGetLineFromAddr(long long ptr ptr) @ stdcall SymGetLineFromAddr64(long int64 ptr ptr) @ stdcall SymGetLineFromAddrW64(long int64 ptr ptr) +@ stub SymGetLineFromInlineContext +@ stub SymGetLineFromInlineContextW @ stdcall SymGetLineFromName(long str str long ptr ptr) @ stdcall SymGetLineFromName64(long str str long ptr ptr) @ stdcall SymGetLineFromNameW64(long wstr wstr long ptr ptr) @@ -130,6 +137,7 @@ @ stub SymGetTypeFromNameW @ stdcall SymGetTypeInfo(ptr int64 long long ptr) @ stub SymGetTypeInfoEx +@ stub SymGetUnwindInfo @ stdcall SymInitialize(long str long) @ stdcall SymInitializeW(long wstr long) @ stdcall SymLoadModule(long long str str long long) @@ -145,6 +153,7 @@ @ stub SymNextW @ stub SymPrev @ stub SymPrevW +@ stub SymQueryInlineTrace @ stdcall SymRefreshModuleList(long) @ stdcall SymRegisterCallback(long ptr ptr) @ stdcall SymRegisterCallback64(long ptr int64) @@ -161,6 +170,7 @@ @ stdcall SymSetParentWindow(long) @ stdcall SymSetScopeFromAddr(ptr int64) @ stub SymSetScopeFromIndex +@ stub SymSetScopeFromInlineContext @ stdcall SymSetSearchPath(long str) @ stdcall SymSetSearchPathW(long wstr) @ stub SymSrvDeltaName
(simple copy of StackWalk implementation)
Signed-off-by: Eric Pouech eric.pouech@gmail.com
--- dlls/dbghelp/dbghelp.spec | 2 + dlls/dbghelp/stack.c | 75 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-)
diff --git a/dlls/dbghelp/dbghelp.spec b/dlls/dbghelp/dbghelp.spec index e45ac48acb2..e96c2e0d3fd 100644 --- a/dlls/dbghelp/dbghelp.spec +++ b/dlls/dbghelp/dbghelp.spec @@ -32,7 +32,7 @@ @ stdcall SearchTreeForFileW(wstr wstr ptr) @ stdcall StackWalk(long long long ptr ptr ptr ptr ptr ptr) @ stdcall StackWalk64(long long long ptr ptr ptr ptr ptr ptr) -@ stub StackWalkEx +@ stdcall StackWalkEx(long long long ptr ptr ptr ptr ptr ptr long) @ stub SymAddSourceStream @ stub SymAddSourceStreamA @ stub SymAddSourceStreamW diff --git a/dlls/dbghelp/stack.c b/dlls/dbghelp/stack.c index d04c0163c92..6c70fc805cb 100644 --- a/dlls/dbghelp/stack.c +++ b/dlls/dbghelp/stack.c @@ -245,6 +245,81 @@ BOOL WINAPI StackWalk64(DWORD MachineType, HANDLE hProcess, HANDLE hThread, return TRUE; }
+/* all the fields of STACKFRAME64 are present in STACKFRAME_EX at same offset + * So casting down a STACKFRAME_EX into a STACKFRAME64 is valid! + */ +C_ASSERT(sizeof(STACKFRAME64) == FIELD_OFFSET(STACKFRAME_EX, StackFrameSize)); +C_ASSERT(FIELD_OFFSET(STACKFRAME64, AddrPC) == FIELD_OFFSET(STACKFRAME_EX, AddrPC)); +C_ASSERT(FIELD_OFFSET(STACKFRAME64, AddrReturn) == FIELD_OFFSET(STACKFRAME_EX, AddrReturn)); +C_ASSERT(FIELD_OFFSET(STACKFRAME64, AddrFrame) == FIELD_OFFSET(STACKFRAME_EX, AddrFrame)); +C_ASSERT(FIELD_OFFSET(STACKFRAME64, AddrStack) == FIELD_OFFSET(STACKFRAME_EX, AddrStack)); +C_ASSERT(FIELD_OFFSET(STACKFRAME64, AddrBStore) == FIELD_OFFSET(STACKFRAME_EX, AddrBStore)); +C_ASSERT(FIELD_OFFSET(STACKFRAME64, FuncTableEntry) == FIELD_OFFSET(STACKFRAME_EX, FuncTableEntry)); +C_ASSERT(FIELD_OFFSET(STACKFRAME64, Params) == FIELD_OFFSET(STACKFRAME_EX, Params)); +C_ASSERT(FIELD_OFFSET(STACKFRAME64, Far) == FIELD_OFFSET(STACKFRAME_EX, Far)); +C_ASSERT(FIELD_OFFSET(STACKFRAME64, Virtual) == FIELD_OFFSET(STACKFRAME_EX, Virtual)); +C_ASSERT(FIELD_OFFSET(STACKFRAME64, Reserved) == FIELD_OFFSET(STACKFRAME_EX, Reserved)); +C_ASSERT(FIELD_OFFSET(STACKFRAME64, KdHelp) == FIELD_OFFSET(STACKFRAME_EX, KdHelp)); + +/*********************************************************************** + * StackWalkEx (DBGHELP.@) + */ +BOOL WINAPI StackWalkEx(DWORD MachineType, HANDLE hProcess, HANDLE hThread, + LPSTACKFRAME_EX frame, PVOID ctx, + PREAD_PROCESS_MEMORY_ROUTINE64 f_read_mem, + PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, + PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine, + PTRANSLATE_ADDRESS_ROUTINE64 f_xlat_adr, + DWORD flags) +{ + struct cpu_stack_walk csw; + struct cpu* cpu; + + TRACE("(%d, %p, %p, %p, %p, %p, %p, %p, %p, 0x%x)\n", + MachineType, hProcess, hThread, frame, ctx, + f_read_mem, FunctionTableAccessRoutine, + GetModuleBaseRoutine, f_xlat_adr, flags); + + if (!(cpu = cpu_find(MachineType))) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + if (frame->StackFrameSize != sizeof(*frame)) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + if (flags != 0) + { + FIXME("Unsupported yet flags 0x%x\n", flags); + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + if (frame->InlineFrameContext != INLINE_FRAME_CONTEXT_IGNORE) + { + FIXME("Inlined contexts are not supported yet\n"); + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + csw.hProcess = hProcess; + csw.hThread = hThread; + csw.is32 = FALSE; + csw.cpu = cpu; + /* sigh... MS isn't even consistent in the func prototypes */ + csw.u.s64.f_read_mem = (f_read_mem) ? f_read_mem : read_mem64; + csw.u.s64.f_xlat_adr = (f_xlat_adr) ? f_xlat_adr : addr_to_linear; + csw.u.s64.f_tabl_acs = (FunctionTableAccessRoutine) ? FunctionTableAccessRoutine : SymFunctionTableAccess64; + csw.u.s64.f_modl_bas = (GetModuleBaseRoutine) ? GetModuleBaseRoutine : SymGetModuleBase64; + + if (!cpu->stack_walk(&csw, (STACKFRAME64*)frame, ctx)) return FALSE; + + /* we don't handle KdHelp */ + + return TRUE; +} + /****************************************************************** * SymRegisterFunctionEntryCallback (DBGHELP.@) *
Signed-off-by: Eric Pouech eric.pouech@gmail.com
--- dlls/dbghelp/dbghelp.spec | 4 ++-- dlls/dbghelp/symbol.c | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-)
diff --git a/dlls/dbghelp/dbghelp.spec b/dlls/dbghelp/dbghelp.spec index e96c2e0d3fd..474c172df67 100644 --- a/dlls/dbghelp/dbghelp.spec +++ b/dlls/dbghelp/dbghelp.spec @@ -77,8 +77,8 @@ @ stdcall SymFromAddrW(ptr int64 ptr ptr) @ stdcall SymFromIndex(long int64 long ptr) @ stdcall SymFromIndexW(long int64 long ptr) -@ stub SymFromInlineContext -@ stub SymFromInlineContextW +@ stdcall SymFromInlineContext(long int64 long ptr ptr) +@ stdcall SymFromInlineContextW(long int64 long ptr ptr) @ stdcall SymFromName(long str ptr) @ stdcall SymFromNameW(long wstr ptr) @ stub SymFromToken diff --git a/dlls/dbghelp/symbol.c b/dlls/dbghelp/symbol.c index 76c92414b89..f6fa5c8ab43 100644 --- a/dlls/dbghelp/symbol.c +++ b/dlls/dbghelp/symbol.c @@ -2503,3 +2503,40 @@ PWSTR WINAPI SymSetHomeDirectoryW(HANDLE hProcess, PCWSTR dir)
return NULL; } + +/****************************************************************** + * SymFromInlineContext (DBGHELP.@) + * + */ +BOOL WINAPI SymFromInlineContext(HANDLE hProcess, DWORD64 addr, ULONG inline_ctx, PDWORD64 disp, PSYMBOL_INFO si) +{ + FIXME("(%p, %#I64x, 0x%x, %p, %p): stub\n", hProcess, addr, inline_ctx, disp, si); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +/****************************************************************** + * SymFromInlineContextW (DBGHELP.@) + * + */ +BOOL WINAPI SymFromInlineContextW(HANDLE hProcess, DWORD64 addr, ULONG inline_ctx, PDWORD64 disp, PSYMBOL_INFOW siW) +{ + PSYMBOL_INFO si; + unsigned len; + BOOL ret; + + TRACE("(%p, %#I64x, 0x%x, %p, %p)\n", hProcess, addr, inline_ctx, disp, siW); + + len = sizeof(*si) + siW->MaxNameLen * sizeof(WCHAR); + si = HeapAlloc(GetProcessHeap(), 0, len); + if (!si) return FALSE; + + si->SizeOfStruct = sizeof(*si); + si->MaxNameLen = siW->MaxNameLen; + if ((ret = SymFromInlineContext(hProcess, addr, inline_ctx, disp, si))) + { + copy_symbolW(siW, si); + } + HeapFree(GetProcessHeap(), 0, si); + return ret; +}
Signed-off-by: Eric Pouech eric.pouech@gmail.com
--- dlls/dbghelp/dbghelp.spec | 4 ++-- dlls/dbghelp/symbol.c | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-)
diff --git a/dlls/dbghelp/dbghelp.spec b/dlls/dbghelp/dbghelp.spec index 474c172df67..696d7640aa4 100644 --- a/dlls/dbghelp/dbghelp.spec +++ b/dlls/dbghelp/dbghelp.spec @@ -92,8 +92,8 @@ @ stdcall SymGetLineFromAddr(long long ptr ptr) @ stdcall SymGetLineFromAddr64(long int64 ptr ptr) @ stdcall SymGetLineFromAddrW64(long int64 ptr ptr) -@ stub SymGetLineFromInlineContext -@ stub SymGetLineFromInlineContextW +@ stdcall SymGetLineFromInlineContext(long int64 long int64 ptr ptr) +@ stdcall SymGetLineFromInlineContextW(long int64 long int64 ptr ptr) @ stdcall SymGetLineFromName(long str str long ptr ptr) @ stdcall SymGetLineFromName64(long str str long ptr ptr) @ stdcall SymGetLineFromNameW64(long wstr wstr long ptr ptr) diff --git a/dlls/dbghelp/symbol.c b/dlls/dbghelp/symbol.c index f6fa5c8ab43..5cd62a538af 100644 --- a/dlls/dbghelp/symbol.c +++ b/dlls/dbghelp/symbol.c @@ -2540,3 +2540,27 @@ BOOL WINAPI SymFromInlineContextW(HANDLE hProcess, DWORD64 addr, ULONG inline_ct HeapFree(GetProcessHeap(), 0, si); return ret; } + +/****************************************************************** + * SymGetLineFromInlineContext (DBGHELP.@) + * + */ +BOOL WINAPI SymGetLineFromInlineContext(HANDLE hProcess, DWORD64 addr, ULONG inline_ctx, DWORD64 mod_addr, PDWORD disp, PIMAGEHLP_LINE64 line) +{ + FIXME("(%p, %#I64x, 0x%x, %#I64x, %p, %p): stub!\n", + hProcess, addr, inline_ctx, mod_addr, disp, line); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +} + +/****************************************************************** + * SymGetLineFromInlineContextW (DBGHELP.@) + * + */ +BOOL WINAPI SymGetLineFromInlineContextW(HANDLE hProcess, DWORD64 addr, ULONG inline_ctx, DWORD64 mod_addr, PDWORD disp, PIMAGEHLP_LINEW64 line) +{ + FIXME("(%p, %#I64x, 0x%x, %#I64x, %p, %p): stub!\n", + hProcess, addr, inline_ctx, mod_addr, disp, line); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return FALSE; +}
(moving also SymSetScopeFromAddr out of symbol.c into dbghelp.c which makes more sense as modification of process' settings)
Signed-off-by: Eric Pouech eric.pouech@gmail.com
--- dlls/dbghelp/dbghelp.c | 47 +++++++++++++++++++++++++++++++++++++++++---- dlls/dbghelp/dbghelp.spec | 4 ++-- dlls/dbghelp/symbol.c | 13 ------------ 3 files changed, 45 insertions(+), 19 deletions(-)
diff --git a/dlls/dbghelp/dbghelp.c b/dlls/dbghelp/dbghelp.c index 65a57ac90dc..585fc9cada5 100644 --- a/dlls/dbghelp/dbghelp.c +++ b/dlls/dbghelp/dbghelp.c @@ -613,10 +613,10 @@ BOOL WINAPI SymSetContext(HANDLE hProcess, PIMAGEHLP_STACK_FRAME StackFrame, pcs->ctx_frame.FrameOffset == StackFrame->FrameOffset && pcs->ctx_frame.StackOffset == StackFrame->StackOffset) { - TRACE("Setting same frame {rtn=%s frm=%s stk=%s}\n", - wine_dbgstr_longlong(pcs->ctx_frame.ReturnOffset), - wine_dbgstr_longlong(pcs->ctx_frame.FrameOffset), - wine_dbgstr_longlong(pcs->ctx_frame.StackOffset)); + TRACE("Setting same frame {rtn=%I64x frm=%I64x stk=%I64x}\n", + pcs->ctx_frame.ReturnOffset, + pcs->ctx_frame.FrameOffset, + pcs->ctx_frame.StackOffset); pcs->ctx_frame.InstructionOffset = StackFrame->InstructionOffset; SetLastError(ERROR_ACCESS_DENIED); /* latest MSDN says ERROR_SUCCESS */ return FALSE; @@ -627,6 +627,45 @@ BOOL WINAPI SymSetContext(HANDLE hProcess, PIMAGEHLP_STACK_FRAME StackFrame, return TRUE; }
+/****************************************************************** + * SymSetScopeFromAddr (DBGHELP.@) + */ +BOOL WINAPI SymSetScopeFromAddr(HANDLE hProcess, ULONG64 addr) +{ + struct process* pcs; + + FIXME("(%p %#I64x): stub\n", hProcess, addr); + + if (!(pcs = process_find_by_handle(hProcess))) return FALSE; + return TRUE; +} + +/****************************************************************** + * SymSetScopeFromIndex (DBGHELP.@) + */ +BOOL WINAPI SymSetScopeFromIndex(HANDLE hProcess, ULONG64 addr, DWORD index) +{ + struct process* pcs; + + FIXME("(%p %#I64x %u): stub\n", hProcess, addr, index); + + if (!(pcs = process_find_by_handle(hProcess))) return FALSE; + return TRUE; +} + +/****************************************************************** + * SymSetScopeFromInlineContext (DBGHELP.@) + */ +BOOL WINAPI SymSetScopeFromInlineContext(HANDLE hProcess, ULONG64 addr, DWORD inlinectx) +{ + struct process* pcs; + + FIXME("(%p %#I64x %u): stub\n", hProcess, addr, inlinectx); + + if (!(pcs = process_find_by_handle(hProcess))) return FALSE; + return TRUE; +} + /****************************************************************** * reg_cb64to32 (internal) * diff --git a/dlls/dbghelp/dbghelp.spec b/dlls/dbghelp/dbghelp.spec index 696d7640aa4..471d9b6141c 100644 --- a/dlls/dbghelp/dbghelp.spec +++ b/dlls/dbghelp/dbghelp.spec @@ -169,8 +169,8 @@ @ stdcall SymSetOptions(long) @ stdcall SymSetParentWindow(long) @ stdcall SymSetScopeFromAddr(ptr int64) -@ stub SymSetScopeFromIndex -@ stub SymSetScopeFromInlineContext +@ stdcall SymSetScopeFromIndex(ptr int64 long) +@ stdcall SymSetScopeFromInlineContext(ptr int64 long) @ stdcall SymSetSearchPath(long str) @ stdcall SymSetSearchPathW(long wstr) @ stub SymSrvDeltaName diff --git a/dlls/dbghelp/symbol.c b/dlls/dbghelp/symbol.c index 5cd62a538af..19374999070 100644 --- a/dlls/dbghelp/symbol.c +++ b/dlls/dbghelp/symbol.c @@ -2351,19 +2351,6 @@ BOOL WINAPI SymAddSymbolW(HANDLE hProcess, ULONG64 BaseOfDll, PCWSTR nameW, return SymAddSymbol(hProcess, BaseOfDll, name, addr, size, flags); }
-/****************************************************************** - * SymSetScopeFromAddr (DBGHELP.@) - */ -BOOL WINAPI SymSetScopeFromAddr(HANDLE hProcess, ULONG64 addr) -{ - struct process* pcs; - - FIXME("(%p %s): stub\n", hProcess, wine_dbgstr_longlong(addr)); - - if (!(pcs = process_find_by_handle(hProcess))) return FALSE; - return TRUE; -} - /****************************************************************** * SymEnumLines (DBGHELP.@) *
Signed-off-by: Eric Pouech eric.pouech@gmail.com
--- dlls/dbghelp/dbghelp.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/dlls/dbghelp/dbghelp.c b/dlls/dbghelp/dbghelp.c index 585fc9cada5..00f02423fef 100644 --- a/dlls/dbghelp/dbghelp.c +++ b/dlls/dbghelp/dbghelp.c @@ -609,6 +609,8 @@ BOOL WINAPI SymSetContext(HANDLE hProcess, PIMAGEHLP_STACK_FRAME StackFrame, struct process* pcs = process_find_by_handle(hProcess); if (!pcs) return FALSE;
+ if (!module_find_by_addr(pcs, StackFrame->InstructionOffset, DMT_UNKNOWN)) + return FALSE; if (pcs->ctx_frame.ReturnOffset == StackFrame->ReturnOffset && pcs->ctx_frame.FrameOffset == StackFrame->FrameOffset && pcs->ctx_frame.StackOffset == StackFrame->StackOffset) @@ -618,12 +620,12 @@ BOOL WINAPI SymSetContext(HANDLE hProcess, PIMAGEHLP_STACK_FRAME StackFrame, pcs->ctx_frame.FrameOffset, pcs->ctx_frame.StackOffset); pcs->ctx_frame.InstructionOffset = StackFrame->InstructionOffset; - SetLastError(ERROR_ACCESS_DENIED); /* latest MSDN says ERROR_SUCCESS */ + SetLastError(ERROR_SUCCESS); return FALSE; }
pcs->ctx_frame = *StackFrame; - /* MSDN states that Context is not (no longer?) used */ + /* Context is not (no longer?) used */ return TRUE; }
Signed-off-by: Eric Pouech eric.pouech@gmail.com
--- dlls/dbghelp/module.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-)
diff --git a/dlls/dbghelp/module.c b/dlls/dbghelp/module.c index b645e6dbf0f..f0fd2a55016 100644 --- a/dlls/dbghelp/module.c +++ b/dlls/dbghelp/module.c @@ -1032,14 +1032,7 @@ BOOL module_remove(struct process* pcs, struct module* module) */ BOOL WINAPI SymUnloadModule(HANDLE hProcess, DWORD BaseOfDll) { - struct process* pcs; - struct module* module; - - pcs = process_find_by_handle(hProcess); - if (!pcs) return FALSE; - module = module_find_by_addr(pcs, BaseOfDll, DMT_UNKNOWN); - if (!module) return FALSE; - return module_remove(pcs, module); + return SymUnloadModule64(hProcess, BaseOfDll); }
/******************************************************************
Signed-off-by: Eric Pouech eric.pouech@gmail.com
--- dlls/dbghelp/dwarf.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/dbghelp/dwarf.c b/dlls/dbghelp/dwarf.c index 8b08799dce7..e1c77569622 100644 --- a/dlls/dbghelp/dwarf.c +++ b/dlls/dbghelp/dwarf.c @@ -3689,10 +3689,10 @@ static BOOL compute_call_frame_cfa(struct module* module, ULONG_PTR ip, struct l { case RULE_EXPRESSION: FIXME("Too complex expression for frame_CFA resolution (RULE_EXPRESSION)\n"); - break; + return FALSE; case RULE_VAL_EXPRESSION: FIXME("Too complex expression for frame_CFA resolution (RULE_VAL_EXPRESSION)\n"); - break; + return FALSE; default: frame->kind = loc_regrel; frame->reg = dbghelp_current_cpu->map_dwarf_register(info.state.cfa_reg, module, TRUE);