ChangeSet ID: 21547 CVSROOT: /opt/cvs-commit Module name: wine Changes by: julliard@winehq.org 2005/11/29 05:09:13
Modified files: dlls/dbghelp : dbghelp_private.h module.c path.c include : dbghelp.h
Log message: Eric Pouech eric.pouech@wanadoo.fr Added support for 'loading' virtual modules.
Patch: http://cvs.winehq.org/patch.py?id=21547
Old revision New revision Changes Path 1.19 1.20 +1 -0 wine/dlls/dbghelp/dbghelp_private.h 1.17 1.18 +36 -10 wine/dlls/dbghelp/module.c 1.7 1.8 +1 -0 wine/dlls/dbghelp/path.c 1.22 1.23 +5 -0 wine/include/dbghelp.h
Index: wine/dlls/dbghelp/dbghelp_private.h diff -u -p wine/dlls/dbghelp/dbghelp_private.h:1.19 wine/dlls/dbghelp/dbghelp_private.h:1.20 --- wine/dlls/dbghelp/dbghelp_private.h:1.19 29 Nov 2005 11: 9:13 -0000 +++ wine/dlls/dbghelp/dbghelp_private.h 29 Nov 2005 11: 9:13 -0000 @@ -257,6 +257,7 @@ enum module_type DMT_ELF, /* a real ELF shared module */ DMT_PE, /* a native or builtin PE module */ DMT_PDB, /* PDB file */ + DMT_VIRTUAL, /* a virtual module (ie defined by caller) */ };
struct module Index: wine/dlls/dbghelp/module.c diff -u -p wine/dlls/dbghelp/module.c:1.17 wine/dlls/dbghelp/module.c:1.18 --- wine/dlls/dbghelp/module.c:1.17 29 Nov 2005 11: 9:13 -0000 +++ wine/dlls/dbghelp/module.c 29 Nov 2005 11: 9:13 -0000 @@ -68,6 +68,17 @@ static void module_fill_module(const cha while ((*out = tolower(*out))) out++; }
+static const char* get_module_type(enum module_type type) +{ + switch (type) + { + case DMT_ELF: return "ELF"; + case DMT_PE: return "PE"; + case DMT_VIRTUAL: return "Virtual"; + default: return "---"; + } +} + /*********************************************************************** * Creates and links a new module to a process */ @@ -78,7 +89,7 @@ struct module* module_new(struct process { struct module* module;
- assert(type == DMT_ELF || type == DMT_PE); + assert(type == DMT_ELF || type == DMT_PE || type == DMT_VIRTUAL); if (!(module = HeapAlloc(GetProcessHeap(), 0, sizeof(*module)))) return NULL;
@@ -88,8 +99,7 @@ struct module* module_new(struct process pcs->lmodules = module;
TRACE("=> %s %08lx-%08lx %s\n", - type == DMT_ELF ? "ELF" : (type == DMT_PE ? "PE" : "---"), - mod_addr, mod_addr + size, name); + get_module_type(type), mod_addr, mod_addr + size, name);
pool_init(&module->pool, 65536);
@@ -134,7 +144,8 @@ struct module* module_find_by_name(const if (type == DMT_UNKNOWN) { if ((module = module_find_by_name(pcs, name, DMT_PE)) || - (module = module_find_by_name(pcs, name, DMT_ELF))) + (module = module_find_by_name(pcs, name, DMT_ELF)) || + (module = module_find_by_name(pcs, name, DMT_VIRTUAL))) return module; } else @@ -226,6 +237,7 @@ struct module* module_get_debug(const st { case DMT_ELF: ret = elf_load_debug_info(module, NULL); break; case DMT_PE: ret = pe_load_debug_info(pcs, module); break; + case DMT_VIRTUAL: /* fall through */ default: ret = FALSE; break; } if (!ret) module->module.SymType = SymNone; @@ -248,7 +260,8 @@ struct module* module_find_by_addr(const if (type == DMT_UNKNOWN) { if ((module = module_find_by_addr(pcs, addr, DMT_PE)) || - (module = module_find_by_addr(pcs, addr, DMT_ELF))) + (module = module_find_by_addr(pcs, addr, DMT_ELF)) || + (module = module_find_by_addr(pcs, addr, DMT_VIRTUAL))) return module; } else @@ -381,12 +394,25 @@ DWORD64 WINAPI SymLoadModuleEx(HANDLE h PCSTR ModuleName, DWORD64 BaseOfDll, DWORD DllSize, PMODLOAD_DATA Data, DWORD Flags) { - if (Data || Flags) + if (Data) + FIXME("Unsupported load data parameter %p for %s\n", Data, ImageName); + if (!validate_addr64(BaseOfDll)) return FALSE; + if (Flags & SLMFLAG_VIRTUAL) { - FIXME("Unsupported parameters (%p, %lx) for %s\n", Data, Flags, ImageName); - if (Flags & 1) return TRUE; + struct process* pcs = process_find_by_handle(hProcess); + struct module* module; + if (!pcs) return FALSE; + + module = module_new(pcs, ImageName, DMT_VIRTUAL, (DWORD)BaseOfDll, DllSize, 0, 0); + if (!module) return FALSE; + if (ModuleName) + lstrcpynA(module->module.ModuleName, ModuleName, sizeof(module->module.ModuleName)); + + return TRUE; } - if (!validate_addr64(BaseOfDll)) return FALSE; + if (Flags & ~(SLMFLAG_VIRTUAL)) + FIXME("Unsupported Flags %08lx for %s\n", Flags, ImageName); + return SymLoadModule(hProcess, hFile, (char*)ImageName, (char*)ModuleName, (DWORD)BaseOfDll, DllSize); } @@ -477,7 +503,7 @@ BOOL WINAPI SymEnumerateModules(HANDLE
for (module = pcs->lmodules; module; module = module->next) { - if (!(dbghelp_options & SYMOPT_WINE_WITH_ELF_MODULES) && module->type != DMT_PE) + if (!(dbghelp_options & SYMOPT_WINE_WITH_ELF_MODULES) && module->type == DMT_ELF) continue; if (!EnumModulesCallback(module->module.ModuleName, module->module.BaseOfImage, UserContext)) Index: wine/dlls/dbghelp/path.c diff -u -p wine/dlls/dbghelp/path.c:1.7 wine/dlls/dbghelp/path.c:1.8 --- wine/dlls/dbghelp/path.c:1.7 29 Nov 2005 11: 9:13 -0000 +++ wine/dlls/dbghelp/path.c 29 Nov 2005 11: 9:13 -0000 @@ -276,6 +276,7 @@ static BOOL CALLBACK sffip_cb(LPCSTR buf } break; case DMT_PDB: + case DMT_VIRTUAL: FIXME("NIY on '%s'\n", buffer); break; default: Index: wine/include/dbghelp.h diff -u -p wine/include/dbghelp.h:1.22 wine/include/dbghelp.h:1.23 --- wine/include/dbghelp.h:1.22 29 Nov 2005 11: 9:13 -0000 +++ wine/include/dbghelp.h 29 Nov 2005 11: 9:13 -0000 @@ -643,6 +643,11 @@ BOOL WINAPI MiniDumpReadDumpStream(PVOID /************************* * MODULE handling * *************************/ + +/* flags for SymLoadModuleEx */ +#define SLMFLAG_VIRTUAL 0x1 +#define SLMFLAG_NO_SYMBOLS 0x4 + typedef BOOL (CALLBACK *PENUMLOADED_MODULES_CALLBACK)(PSTR, DWORD, ULONG, PVOID); BOOL WINAPI EnumerateLoadedModules(HANDLE, PENUMLOADED_MODULES_CALLBACK, PVOID); typedef BOOL (CALLBACK *PSYM_ENUMMODULES_CALLBACK)(PSTR, DWORD, PVOID);