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