/****************************************************************** * SymGetModuleInfoW64 (DBGHELP.@) * */ BOOL WINAPI SymGetModuleInfoW64(HANDLE hProcess, DWORD64 dwAddr, PIMAGEHLP_MODULEW64 ModuleInfo) { struct process* pcs = process_find_by_handle(hProcess); struct module* module; IMAGEHLP_MODULEW64 miw64; TRACE("%p %s %p\n", hProcess, wine_dbgstr_longlong(dwAddr), ModuleInfo); if (!pcs) return FALSE; if (ModuleInfo->SizeOfStruct > sizeof(*ModuleInfo)) return FALSE; module = module_find_by_addr(pcs, dwAddr, DMT_UNKNOWN); if (!module) return FALSE; miw64 = module->module; /* update debug information from container if any */ if (module->module.SymType == SymNone) { module = module_get_container(pcs, module); if (module && module->module.SymType != SymNone) { miw64.SymType = module->module.SymType; miw64.NumSyms = module->module.NumSyms; } } memcpy(ModuleInfo, &miw64, ModuleInfo->SizeOfStruct); return TRUE; }
/****************************************************************** * SymGetModuleInfo64 (DBGHELP.@) * */ BOOL WINAPI SymGetModuleInfo64(HANDLE hProcess, DWORD64 dwAddr, PIMAGEHLP_MODULE64 ModuleInfo) { struct process* pcs = process_find_by_handle(hProcess); struct module* module; TRACE("%p %s %p\n", hProcess, wine_dbgstr_longlong(dwAddr), ModuleInfo); if (!pcs) return FALSE; if (ModuleInfo->SizeOfStruct > sizeof(*ModuleInfo)) return FALSE; module = module_find_by_addr(pcs, dwAddr, DMT_UNKNOWN); if (!module) return FALSE; memcpy(ModuleInfo, &module->module, ModuleInfo->SizeOfStruct); if (module->module.SymType == SymNone) { module = module_get_container(pcs, module); if (module && module->module.SymType != SymNone) { ModuleInfo->SymType = module->module.SymType; ModuleInfo->NumSyms = module->module.NumSyms; } } return TRUE; }
/****************************************************************** * SymGetModuleInfo (DBGHELP.@) * */ BOOL WINAPI SymGetModuleInfo(HANDLE hProcess, DWORD dwAddr, PIMAGEHLP_MODULE ModuleInfo) { struct process* pcs = process_find_by_handle(hProcess); struct module* module; IMAGEHLP_MODULE mod; if (!pcs) return FALSE; if (ModuleInfo->SizeOfStruct < sizeof(*ModuleInfo)) return FALSE; module = module_find_by_addr(pcs, dwAddr, DMT_UNKNOWN); if (!module) return FALSE; mod.SizeOfStruct = ModuleInfo->SizeOfStruct; mod.BaseOfImage = module->module.BaseOfImage; mod.ImageSize = module->module.ImageSize; mod.TimeDateStamp = module->module.TimeDateStamp; mod.CheckSum = module->module.CheckSum; mod.NumSyms = module->module.NumSyms; mod.SymType = module->module.SymType; strcpy(mod.ModuleName, module->module.ModuleName); strcpy(mod.ImageName, module->module.ImageName); strcpy(mod.LoadedImageName, module->module.LoadedImageName); if (module->module.SymType == SymNone) { module = module_get_container(pcs, module); if (module && module->module.SymType != SymNone) { mod.SymType = module->module.SymType; mod.NumSyms = module->module.NumSyms; } } memcpy(ModuleInfo, &mod, ModuleInfo->SizeOfStruct); return TRUE; }
/*********************************************************************** * SymGetModuleBase64 (DBGHELP.@) */ DWORD64 WINAPI SymGetModuleBase64(HANDLE hProcess, DWORD64 dwAddr) { struct process* pcs = process_find_by_handle(hProcess); struct module* module; if (!pcs) return 0; module = module_find_by_addr(pcs, dwAddr, DMT_UNKNOWN); if (!module) return 0; return module->module.BaseOfImage; }
/****************************************************************** * SymUnloadModule (DBGHELP.@) * */ 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); }
/*********************************************************************** * SymFunctionTableAccess64 (DBGHELP.@) */ PVOID WINAPI SymFunctionTableAccess64(HANDLE hProcess, DWORD64 AddrBase) { struct process* pcs = process_find_by_handle(hProcess); struct module* module; if (!pcs || !dbghelp_current_cpu->find_runtime_function) return NULL; module = module_find_by_addr(pcs, AddrBase, DMT_UNKNOWN); if (!module) return NULL; return dbghelp_current_cpu->find_runtime_function(module, AddrBase); }
/*********************************************************************** * module_find_by_addr * * either the addr where module is loaded, or any address inside the * module */ struct module* module_find_by_addr(const struct process* pcs, unsigned long addr, enum module_type type) { struct module* module; if (type == DMT_UNKNOWN) { if ((module = module_find_by_addr(pcs, addr, DMT_PE)) || (module = module_find_by_addr(pcs, addr, DMT_ELF))) return module; } else { for (module = pcs->lmodules; module; module = module->next) { if (type == module->type && addr >= module->module.BaseOfImage && addr < module->module.BaseOfImage + module->module.ImageSize) return module; } } SetLastError(ERROR_INVALID_ADDRESS); return module; }
/****************************************************************** * SymEnumSourceFiles (DBGHELP.@) * */ BOOL WINAPI SymEnumSourceFiles(HANDLE hProcess, ULONG64 ModBase, PCSTR Mask, PSYM_ENUMSOURCEFILES_CALLBACK cbSrcFiles, PVOID UserContext) { struct module_pair pair; SOURCEFILE sf; char* ptr; if (!cbSrcFiles) return FALSE; pair.pcs = process_find_by_handle(hProcess); if (!pair.pcs) return FALSE; if (ModBase) { 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_nameA(pair.pcs, Mask + 1); if (!module_get_debug(&pair)) return FALSE; } else { FIXME("Unsupported yet (should get info from current context)\n"); return FALSE; } } if (!pair.effective->sources) return FALSE; for (ptr = pair.effective->sources; *ptr; ptr += strlen(ptr) + 1) { /* FIXME: not using Mask */ sf.ModBase = ModBase; sf.FileName = ptr; if (!cbSrcFiles(&sf, UserContext)) break; } return TRUE; }