From 32c96adddd14494ce51d7d75410f15ea80fa0acb Mon Sep 17 00:00:00 2001 From: Eric Pouech Date: Fri, 24 Nov 2006 22:17:10 +0100 Subject: [PATCH] dbghelp: Added a process field to the modules pair structure. This makes the code simpler to read, a bit more efficient, and furthermore it'll be needed in future patches. --- dlls/dbghelp/dbghelp_private.h | 3 +- dlls/dbghelp/module.c | 10 +++--- dlls/dbghelp/source.c | 22 ++++++------ dlls/dbghelp/symbol.c | 66 +++++++++++++++++----------------- dlls/dbghelp/type.c | 15 ++++---- 5 files changed, 58 insertions(+), 58 deletions(-) diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h index 3d9647c73af..ee1f7118964 100644 --- a/dlls/dbghelp/dbghelp_private.h +++ b/dlls/dbghelp/dbghelp_private.h @@ -333,6 +333,7 @@ struct line_info struct module_pair { + struct process* pcs; struct module* requested; /* in: to module_get_debug() */ struct module* effective; /* out: module with debug info */ }; @@ -389,7 +390,7 @@ extern struct module* extern struct module* module_find_by_name(const struct process* pcs, const char* name, enum module_type type); -extern BOOL module_get_debug(const struct process* pcs, struct module_pair*); +extern BOOL module_get_debug(struct module_pair*); extern struct module* module_new(struct process* pcs, const char* name, enum module_type type, BOOL virtual, diff --git a/dlls/dbghelp/module.c b/dlls/dbghelp/module.c index ec3c70c667d..eecf66b762a 100644 --- a/dlls/dbghelp/module.c +++ b/dlls/dbghelp/module.c @@ -244,13 +244,13 @@ struct module* module_get_containee(const struct process* pcs, * container (and also force the ELF container's debug info loading if deferred) * - otherwise return the module itself if it has some debug info */ -BOOL module_get_debug(const struct process* pcs, struct module_pair* pair) +BOOL module_get_debug(struct module_pair* pair) { IMAGEHLP_DEFERRED_SYMBOL_LOAD64 idsl64; if (!pair->requested) return FALSE; /* for a PE builtin, always get info from container */ - if (!(pair->effective = module_get_container(pcs, pair->requested))) + if (!(pair->effective = module_get_container(pair->pcs, pair->requested))) pair->effective = pair->requested; /* if deferred, force loading */ if (pair->effective->module.SymType == SymDeferred) @@ -272,9 +272,9 @@ BOOL module_get_debug(const struct process* pcs, struct module_pair* pair) idsl64.Reparse = FALSE; idsl64.hFile = INVALID_HANDLE_VALUE; - pcs_callback(pcs, CBA_DEFERRED_SYMBOL_LOAD_START, &idsl64); - ret = pe_load_debug_info(pcs, pair->effective); - pcs_callback(pcs, + pcs_callback(pair->pcs, CBA_DEFERRED_SYMBOL_LOAD_START, &idsl64); + ret = pe_load_debug_info(pair->pcs, pair->effective); + pcs_callback(pair->pcs, ret ? CBA_DEFERRED_SYMBOL_LOAD_COMPLETE : CBA_DEFERRED_SYMBOL_LOAD_FAILURE, &idsl64); break; diff --git a/dlls/dbghelp/source.c b/dlls/dbghelp/source.c index d9fb076127c..fd0a9a889be 100644 --- a/dlls/dbghelp/source.c +++ b/dlls/dbghelp/source.c @@ -116,26 +116,25 @@ BOOL WINAPI SymEnumSourceFiles(HANDLE hProcess, ULONG64 ModBase, PCSTR Mask, PSYM_ENUMSOURCEFILES_CALLBACK cbSrcFiles, PVOID UserContext) { - struct process* pcs; struct module_pair pair; SOURCEFILE sf; char* ptr; if (!cbSrcFiles) return FALSE; - pcs = process_find_by_handle(hProcess); - if (!pcs) return FALSE; + pair.pcs = process_find_by_handle(hProcess); + if (!pair.pcs) return FALSE; if (ModBase) { - pair.requested = module_find_by_addr(pcs, ModBase, DMT_UNKNOWN); - if (!module_get_debug(pcs, &pair)) return FALSE; + pair.requested = module_find_by_addr(pair.pcs, ModBase, DMT_UNKNOWN); + if (!module_get_debug(&pair)) return FALSE; } else { if (Mask[0] == '!') { - pair.requested = module_find_by_name(pcs, Mask + 1, DMT_UNKNOWN); - if (!module_get_debug(pcs, &pair)) return FALSE; + pair.requested = module_find_by_name(pair.pcs, Mask + 1, DMT_UNKNOWN); + if (!module_get_debug(&pair)) return FALSE; } else { @@ -162,7 +161,6 @@ BOOL WINAPI SymEnumSourceFiles(HANDLE hProcess, ULONG64 ModBase, PCSTR Mask, BOOL WINAPI SymEnumLines(HANDLE hProcess, ULONG64 base, PCSTR compiland, PCSTR srcfile, PSYM_ENUMLINES_CALLBACK cb, PVOID user) { - struct process* pcs; struct module_pair pair; struct hash_table_iter hti; struct symt_ht* sym; @@ -173,8 +171,6 @@ BOOL WINAPI SymEnumLines(HANDLE hProcess, ULONG64 base, PCSTR compiland, const char* file; if (!cb) return FALSE; - pcs = process_find_by_handle(hProcess); - if (!pcs) return FALSE; if (!(dbghelp_options & SYMOPT_LOAD_LINES)) return TRUE; if (regcomp(&re, srcfile, REG_NOSUB)) { @@ -182,9 +178,11 @@ BOOL WINAPI SymEnumLines(HANDLE hProcess, ULONG64 base, PCSTR compiland, SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } + pair.pcs = process_find_by_handle(hProcess); + if (!pair.pcs) return FALSE; if (compiland) FIXME("Unsupported yet (filtering on compiland %s)\n", compiland); - pair.requested = module_find_by_addr(pcs, base, DMT_UNKNOWN); - if (!module_get_debug(pcs, &pair)) return FALSE; + pair.requested = module_find_by_addr(pair.pcs, base, DMT_UNKNOWN); + if (!module_get_debug(&pair)) return FALSE; sci.SizeOfStruct = sizeof(sci); sci.ModBase = base; diff --git a/dlls/dbghelp/symbol.c b/dlls/dbghelp/symbol.c index 1e66a32b748..0705ff687d6 100644 --- a/dlls/dbghelp/symbol.c +++ b/dlls/dbghelp/symbol.c @@ -695,13 +695,13 @@ int symt_find_nearest(struct module* module, DWORD addr) return low; } -static BOOL symt_enum_locals_helper(struct process* pcs, struct module_pair* pair, +static BOOL symt_enum_locals_helper(struct module_pair* pair, regex_t* preg, const struct sym_enum* se, struct vector* v) { struct symt** plsym = NULL; struct symt* lsym = NULL; - DWORD pc = pcs->ctx_frame.InstructionOffset; + DWORD pc = pair->pcs->ctx_frame.InstructionOffset; while ((plsym = vector_iter_up(v, plsym))) { @@ -713,7 +713,7 @@ static BOOL symt_enum_locals_helper(struct process* pcs, struct module_pair* pai struct symt_block* block = (struct symt_block*)lsym; if (pc < block->address || block->address + block->size <= pc) continue; - if (!symt_enum_locals_helper(pcs, pair, preg, se, &block->vchildren)) + if (!symt_enum_locals_helper(pair, preg, se, &block->vchildren)) return FALSE; } break; @@ -746,8 +746,9 @@ static BOOL symt_enum_locals(struct process* pcs, const char* mask, se->sym_info->SizeOfStruct = sizeof(*se->sym_info); se->sym_info->MaxNameLen = sizeof(se->buffer) - sizeof(SYMBOL_INFO); - pair.requested = module_find_by_addr(pcs, pc, DMT_UNKNOWN); - if (!module_get_debug(pcs, &pair)) return FALSE; + pair.pcs = pcs; + pair.requested = module_find_by_addr(pair.pcs, pc, DMT_UNKNOWN); + if (!module_get_debug(&pair)) return FALSE; if ((idx = symt_find_nearest(pair.effective, pc)) == -1) return FALSE; sym = pair.effective->addr_sorttab[idx]; @@ -758,7 +759,7 @@ static BOOL symt_enum_locals(struct process* pcs, const char* mask, compile_regex(mask ? mask : "*", -1, &preg, dbghelp_options & SYMOPT_CASE_INSENSITIVE); - ret = symt_enum_locals_helper(pcs, &pair, &preg, se, + ret = symt_enum_locals_helper(&pair, &preg, se, &((struct symt_function*)sym)->vchildren); regfree(&preg); return ret; @@ -801,16 +802,16 @@ static void copy_symbolW(SYMBOL_INFOW* siw, const SYMBOL_INFO* si) static BOOL sym_enum(HANDLE hProcess, ULONG64 BaseOfDll, PCSTR Mask, const struct sym_enum* se) { - struct process* pcs = process_find_by_handle(hProcess); struct module_pair pair; const char* bang; regex_t mod_regex, sym_regex; + pair.pcs = process_find_by_handle(hProcess); if (BaseOfDll == 0) { /* do local variables ? */ if (!Mask || !(bang = strchr(Mask, '!'))) - return symt_enum_locals(pcs, Mask, se); + return symt_enum_locals(pair.pcs, Mask, se); if (bang == Mask) return FALSE; @@ -818,9 +819,9 @@ static BOOL sym_enum(HANDLE hProcess, ULONG64 BaseOfDll, PCSTR Mask, compile_regex(bang + 1, -1, &sym_regex, dbghelp_options & SYMOPT_CASE_INSENSITIVE); - for (pair.requested = pcs->lmodules; pair.requested; pair.requested = pair.requested->next) + for (pair.requested = pair.pcs->lmodules; pair.requested; pair.requested = pair.requested->next) { - if (pair.requested->type == DMT_PE && module_get_debug(pcs, &pair)) + if (pair.requested->type == DMT_PE && module_get_debug(&pair)) { if (regexec(&mod_regex, pair.requested->module.ModuleName, 0, NULL, 0) == 0 && symt_enum_module(&pair, &sym_regex, se)) @@ -831,11 +832,11 @@ static BOOL sym_enum(HANDLE hProcess, ULONG64 BaseOfDll, PCSTR Mask, */ if (!pair.requested && (dbghelp_options & SYMOPT_WINE_WITH_ELF_MODULES)) { - for (pair.requested = pcs->lmodules; pair.requested; pair.requested = pair.requested->next) + for (pair.requested = pair.pcs->lmodules; pair.requested; pair.requested = pair.requested->next) { if (pair.requested->type == DMT_ELF && - !module_get_containee(pcs, pair.requested) && - module_get_debug(pcs, &pair)) + !module_get_containee(pair.pcs, pair.requested) && + module_get_debug(&pair)) { if (regexec(&mod_regex, pair.requested->module.ModuleName, 0, NULL, 0) == 0 && symt_enum_module(&pair, &sym_regex, se)) @@ -847,8 +848,8 @@ static BOOL sym_enum(HANDLE hProcess, ULONG64 BaseOfDll, PCSTR Mask, regfree(&sym_regex); return TRUE; } - pair.requested = module_find_by_addr(pcs, BaseOfDll, DMT_UNKNOWN); - if (!module_get_debug(pcs, &pair)) + pair.requested = module_find_by_addr(pair.pcs, BaseOfDll, DMT_UNKNOWN); + if (!module_get_debug(&pair)) return FALSE; /* we always ignore module name from Mask when BaseOfDll is defined */ @@ -978,14 +979,14 @@ BOOL WINAPI SymEnumerateSymbols(HANDLE hProcess, DWORD BaseOfDll, BOOL WINAPI SymFromAddr(HANDLE hProcess, DWORD64 Address, DWORD64* Displacement, PSYMBOL_INFO Symbol) { - struct process* pcs = process_find_by_handle(hProcess); struct module_pair pair; struct symt_ht* sym; int idx; - if (!pcs) return FALSE; - pair.requested = module_find_by_addr(pcs, Address, DMT_UNKNOWN); - if (!module_get_debug(pcs, &pair)) return FALSE; + pair.pcs = process_find_by_handle(hProcess); + if (!pair.pcs) return FALSE; + pair.requested = module_find_by_addr(pair.pcs, Address, DMT_UNKNOWN); + if (!module_get_debug(&pair)) return FALSE; if ((idx = symt_find_nearest(pair.effective, Address)) == -1) return FALSE; sym = pair.effective->addr_sorttab[idx]; @@ -1084,8 +1085,9 @@ static BOOL find_name(struct process* pcs, struct module* module, const char* na struct symt_ht* sym = NULL; struct module_pair pair; + pair.pcs = pcs; if (!(pair.requested = module)) return FALSE; - if (!module_get_debug(pcs, &pair)) return FALSE; + if (!module_get_debug(&pair)) return FALSE; hash_table_iter_init(&pair.effective->ht_symbols, &hti, name); while ((ptr = hash_table_iter_up(&hti))) @@ -1232,7 +1234,6 @@ BOOL WINAPI SymGetSymPrev(HANDLE hProcess, PIMAGEHLP_SYMBOL Symbol) BOOL WINAPI SymGetLineFromAddr(HANDLE hProcess, DWORD dwAddr, PDWORD pdwDisplacement, PIMAGEHLP_LINE Line) { - struct process* pcs = process_find_by_handle(hProcess); struct module_pair pair; int idx; @@ -1240,9 +1241,10 @@ BOOL WINAPI SymGetLineFromAddr(HANDLE hProcess, DWORD dwAddr, if (Line->SizeOfStruct < sizeof(*Line)) return FALSE; - if (!pcs) return FALSE; - pair.requested = module_find_by_addr(pcs, dwAddr, DMT_UNKNOWN); - if (!module_get_debug(pcs, &pair)) return FALSE; + pair.pcs = process_find_by_handle(hProcess); + if (!pair.pcs) return FALSE; + pair.requested = module_find_by_addr(pair.pcs, dwAddr, DMT_UNKNOWN); + if (!module_get_debug(&pair)) return FALSE; if ((idx = symt_find_nearest(pair.effective, dwAddr)) == -1) return FALSE; if (pair.effective->addr_sorttab[idx]->symt.tag != SymTagFunction) return FALSE; @@ -1339,7 +1341,6 @@ BOOL WINAPI SymGetLineFromAddrW64(HANDLE hProcess, DWORD64 dwAddr, */ BOOL WINAPI SymGetLinePrev(HANDLE hProcess, PIMAGEHLP_LINE Line) { - struct process* pcs = process_find_by_handle(hProcess); struct module_pair pair; struct line_info* li; BOOL in_search = FALSE; @@ -1348,9 +1349,10 @@ BOOL WINAPI SymGetLinePrev(HANDLE hProcess, PIMAGEHLP_LINE Line) if (Line->SizeOfStruct < sizeof(*Line)) return FALSE; - if (!pcs) return FALSE; - pair.requested = module_find_by_addr(pcs, Line->Address, DMT_UNKNOWN); - if (!module_get_debug(pcs, &pair)) return FALSE; + pair.pcs = process_find_by_handle(hProcess); + if (!pair.pcs) return FALSE; + pair.requested = module_find_by_addr(pair.pcs, Line->Address, DMT_UNKNOWN); + if (!module_get_debug(&pair)) return FALSE; if (Line->Key == 0) return FALSE; li = (struct line_info*)Line->Key; @@ -1425,15 +1427,15 @@ BOOL symt_get_func_line_next(struct module* module, PIMAGEHLP_LINE line) */ BOOL WINAPI SymGetLineNext(HANDLE hProcess, PIMAGEHLP_LINE Line) { - struct process* pcs = process_find_by_handle(hProcess); struct module_pair pair; TRACE("(%p %p)\n", hProcess, Line); if (Line->SizeOfStruct < sizeof(*Line)) return FALSE; - if (!pcs) return FALSE; - pair.requested = module_find_by_addr(pcs, Line->Address, DMT_UNKNOWN); - if (!module_get_debug(pcs, &pair)) return FALSE; + pair.pcs = process_find_by_handle(hProcess); + if (!pair.pcs) return FALSE; + pair.requested = module_find_by_addr(pair.pcs, Line->Address, DMT_UNKNOWN); + if (!module_get_debug(&pair)) return FALSE; if (symt_get_func_line_next(pair.effective, Line)) return TRUE; SetLastError(ERROR_NO_MORE_ITEMS); /* FIXME */ diff --git a/dlls/dbghelp/type.c b/dlls/dbghelp/type.c index f967f9a8ec3..da8d679e125 100644 --- a/dlls/dbghelp/type.c +++ b/dlls/dbghelp/type.c @@ -372,7 +372,6 @@ BOOL WINAPI SymEnumTypes(HANDLE hProcess, ULONG64 BaseOfDll, PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback, PVOID UserContext) { - struct process* pcs; struct module_pair pair; char buffer[sizeof(SYMBOL_INFO) + 256]; SYMBOL_INFO* sym_info = (SYMBOL_INFO*)buffer; @@ -385,9 +384,9 @@ BOOL WINAPI SymEnumTypes(HANDLE hProcess, ULONG64 BaseOfDll, hProcess, wine_dbgstr_longlong(BaseOfDll), EnumSymbolsCallback, UserContext); - if (!(pcs = process_find_by_handle(hProcess))) return FALSE; - pair.requested = module_find_by_addr(pcs, BaseOfDll, DMT_UNKNOWN); - if (!module_get_debug(pcs, &pair)) return FALSE; + if (!(pair.pcs = process_find_by_handle(hProcess))) return FALSE; + pair.requested = module_find_by_addr(pair.pcs, BaseOfDll, DMT_UNKNOWN); + if (!module_get_debug(&pair)) return FALSE; sym_info->SizeOfStruct = sizeof(SYMBOL_INFO); sym_info->MaxNameLen = sizeof(buffer) - sizeof(SYMBOL_INFO); @@ -787,13 +786,13 @@ BOOL WINAPI SymGetTypeInfo(HANDLE hProcess, DWORD64 ModBase, ULONG TypeId, IMAGEHLP_SYMBOL_TYPE_INFO GetType, PVOID pInfo) { - struct process* pcs = process_find_by_handle(hProcess); struct module_pair pair; - if (!pcs) return FALSE; + pair.pcs = process_find_by_handle(hProcess); + if (!pair.pcs) return FALSE; - pair.requested = module_find_by_addr(pcs, ModBase, DMT_UNKNOWN); - if (!module_get_debug(pcs, &pair)) + pair.requested = module_find_by_addr(pair.pcs, ModBase, DMT_UNKNOWN); + if (!module_get_debug(&pair)) { FIXME("Someone didn't properly set ModBase (%s)\n", wine_dbgstr_longlong(ModBase)); return FALSE;