/****************************************************************** * EnumerateLoadedModulesW64 (DBGHELP.@) * */ BOOL WINAPI EnumerateLoadedModulesW64(HANDLE hProcess, PENUMLOADED_MODULES_CALLBACKW64 EnumLoadedModulesCallback, PVOID UserContext) { HMODULE* hMods; WCHAR baseW[256], modW[256]; DWORD i, sz; MODULEINFO mi; hMods = HeapAlloc(GetProcessHeap(), 0, 256 * sizeof(hMods[0])); if (!hMods) return FALSE; if (!EnumProcessModules(hProcess, hMods, 256 * sizeof(hMods[0]), &sz)) { /* hProcess should also be a valid process handle !! */ FIXME("If this happens, bump the number in mod\n"); HeapFree(GetProcessHeap(), 0, hMods); return FALSE; } sz /= sizeof(HMODULE); for (i = 0; i < sz; i++) { if (!GetModuleInformation(hProcess, hMods[i], &mi, sizeof(mi)) || !GetModuleBaseNameW(hProcess, hMods[i], baseW, sizeof(baseW) / sizeof(WCHAR))) continue; module_fill_module(baseW, modW, sizeof(modW) / sizeof(CHAR)); EnumLoadedModulesCallback(modW, (DWORD_PTR)mi.lpBaseOfDll, mi.SizeOfImage, UserContext); } HeapFree(GetProcessHeap(), 0, hMods); return sz != 0 && i == sz; }
/*********************************************************************** * module_find_by_name * */ struct module* module_find_by_name(const struct process* pcs, const char* name, enum module_type type) { struct module* module; if (type == DMT_UNKNOWN) { if ((module = module_find_by_name(pcs, name, DMT_PE)) || (module = module_find_by_name(pcs, name, DMT_ELF))) return module; } else { char modname[MAX_PATH]; for (module = pcs->lmodules; module; module = module->next) { if (type == module->type && !strcasecmp(name, module->module.LoadedImageName)) return module; } module_fill_module(name, modname, sizeof(modname)); for (module = pcs->lmodules; module; module = module->next) { if (type == module->type && !strcasecmp(modname, module->module.ModuleName)) return module; } } SetLastError(ERROR_INVALID_NAME); return NULL; }
static BOOL module_is_elf_container_loaded(struct process* pcs, const char* ImageName, const char* ModuleName) { char buffer[MAX_PATH]; size_t len; struct module* module; if (!ModuleName) { module_fill_module(ImageName, buffer, sizeof(buffer)); ModuleName = buffer; } len = strlen(ModuleName); for (module = pcs->lmodules; module; module = module->next) { if (!strncasecmp(module->module.ModuleName, ModuleName, len) && module->type == DMT_ELF && !strcmp(module->module.ModuleName + len, "<elf>")) return TRUE; } return FALSE; }
void module_set_module(struct module* module, const WCHAR* name) { module_fill_module(name, module->module.ModuleName, sizeof(module->module.ModuleName)); }
/*********************************************************************** * Creates and links a new module to a process */ struct module* module_new(struct process* pcs, const char* name, enum module_type type, BOOL virtual, unsigned long mod_addr, unsigned long size, unsigned long stamp, unsigned long checksum) { struct module* module; assert(type == DMT_ELF || type == DMT_PE); if (!(module = HeapAlloc(GetProcessHeap(), 0, sizeof(*module)))) return NULL; memset(module, 0, sizeof(*module)); module->next = pcs->lmodules; pcs->lmodules = module; TRACE("=> %s %08lx-%08lx %s\n", get_module_type(type, virtual), mod_addr, mod_addr + size, name); pool_init(&module->pool, 65536); module->module.SizeOfStruct = sizeof(module->module); module->module.BaseOfImage = mod_addr; module->module.ImageSize = size; module_fill_module(name, module->module.ModuleName, sizeof(module->module.ModuleName)); module->module.ImageName[0] = '\0'; lstrcpynA(module->module.LoadedImageName, name, sizeof(module->module.LoadedImageName)); module->module.SymType = SymNone; module->module.NumSyms = 0; module->module.TimeDateStamp = stamp; module->module.CheckSum = checksum; memset(module->module.LoadedPdbName, 0, sizeof(module->module.CVData)); module->module.CVSig = 0; memset(module->module.CVData, 0, sizeof(module->module.CVData)); module->module.PdbSig = 0; memset(&module->module.PdbSig70, 0, sizeof(module->module.PdbSig70)); module->module.PdbAge = 0; module->module.PdbUnmatched = FALSE; module->module.DbgUnmatched = FALSE; module->module.LineNumbers = FALSE; module->module.GlobalSymbols = FALSE; module->module.TypeInfo = FALSE; module->module.SourceIndexed = 0; module->module.Publics = 0; module->type = type; module->is_virtual = virtual ? TRUE : FALSE; module->sortlist_valid = FALSE; module->addr_sorttab = NULL; /* FIXME: this seems a bit too high (on a per module basis) * need some statistics about this */ hash_table_init(&module->pool, &module->ht_symbols, 4096); hash_table_init(&module->pool, &module->ht_types, 4096); vector_init(&module->vtypes, sizeof(struct symt*), 32); module->sources_used = 0; module->sources_alloc = 0; module->sources = 0; return module; }