wine/ dlls/dbghelp/dbghelp_private.h dlls/dbgh ...
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Nov 29 05:09:13 CST 2005
ChangeSet ID: 21547
CVSROOT: /opt/cvs-commit
Module name: wine
Changes by: julliard at 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 at 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);
More information about the wine-cvs
mailing list