Eric Pouech : dbghelp: Rewrote SymEnumerateModules with Unicode basis, and implemented SymEnumerateModulesW64.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Mar 15 08:19:20 CDT 2007


Module: wine
Branch: master
Commit: f1436139fc5fa6c36861d382b3c816da0ec6e343
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=f1436139fc5fa6c36861d382b3c816da0ec6e343

Author: Eric Pouech <eric.pouech at wanadoo.fr>
Date:   Tue Mar 13 17:26:39 2007 +0100

dbghelp: Rewrote SymEnumerateModules with Unicode basis, and implemented SymEnumerateModulesW64.

---

 dlls/dbghelp/dbghelp.spec |    2 +-
 dlls/dbghelp/module.c     |   66 +++++++++++++++++++++++++++++++++++---------
 include/dbghelp.h         |    2 +
 3 files changed, 55 insertions(+), 15 deletions(-)

diff --git a/dlls/dbghelp/dbghelp.spec b/dlls/dbghelp/dbghelp.spec
index 63bb5af..b023f3d 100644
--- a/dlls/dbghelp/dbghelp.spec
+++ b/dlls/dbghelp/dbghelp.spec
@@ -46,7 +46,7 @@
 @ stdcall SymEnumTypesW(ptr double ptr ptr)
 @ stdcall SymEnumerateModules(long ptr ptr)
 @ stdcall SymEnumerateModules64(long ptr ptr)
-@ stub SymEnumerateModulesW64
+@ stdcall SymEnumerateModulesW64(long ptr ptr)
 @ stdcall SymEnumerateSymbols(long long ptr ptr)
 @ stub SymEnumerateSymbols64
 @ stub SymEnumerateSymbolsW
diff --git a/dlls/dbghelp/module.c b/dlls/dbghelp/module.c
index 40e09b8..5b8718d 100644
--- a/dlls/dbghelp/module.c
+++ b/dlls/dbghelp/module.c
@@ -632,34 +632,72 @@ BOOL WINAPI SymUnloadModule64(HANDLE hProcess, DWORD64 BaseOfDll)
  *		SymEnumerateModules (DBGHELP.@)
  *
  */
+struct enum_modW64_32
+{
+    PSYM_ENUMMODULES_CALLBACK   cb;
+    PVOID                       user;
+    char                        module[MAX_PATH];
+};
+
+static BOOL CALLBACK enum_modW64_32(PWSTR name, DWORD64 base, PVOID user)
+{
+    struct enum_modW64_32*      x = user;
+
+    WideCharToMultiByte(CP_ACP, 0, name, -1, x->module, sizeof(x->module), NULL, NULL);
+    return x->cb(x->module, (DWORD)base, x->user);
+}
+
 BOOL  WINAPI SymEnumerateModules(HANDLE hProcess,
                                  PSYM_ENUMMODULES_CALLBACK EnumModulesCallback,  
                                  PVOID UserContext)
 {
-    struct process*     pcs = process_find_by_handle(hProcess);
-    struct module*      module;
+    struct enum_modW64_32       x;
 
-    if (!pcs) return FALSE;
-    
-    for (module = pcs->lmodules; module; module = module->next)
-    {
-        if (!(dbghelp_options & SYMOPT_WINE_WITH_ELF_MODULES) && module->type == DMT_ELF)
-            continue;
-        if (!EnumModulesCallback(module->module_name,
-                                 module->module.BaseOfImage, UserContext))
-            break;
-    }
-    return TRUE;
+    x.cb = EnumModulesCallback;
+    x.user = UserContext;
+
+    return SymEnumerateModulesW64(hProcess, enum_modW64_32, &x);
 }
 
 /******************************************************************
  *		SymEnumerateModules64 (DBGHELP.@)
  *
  */
+struct enum_modW64_64
+{
+    PSYM_ENUMMODULES_CALLBACK64 cb;
+    PVOID                       user;
+    char                        module[MAX_PATH];
+};
+
+static BOOL CALLBACK enum_modW64_64(PWSTR name, DWORD64 base, PVOID user)
+{
+    struct enum_modW64_64*      x = user;
+
+    WideCharToMultiByte(CP_ACP, 0, name, -1, x->module, sizeof(x->module), NULL, NULL);
+    return x->cb(x->module, base, x->user);
+}
+
 BOOL  WINAPI SymEnumerateModules64(HANDLE hProcess,
                                    PSYM_ENUMMODULES_CALLBACK64 EnumModulesCallback,  
                                    PVOID UserContext)
 {
+    struct enum_modW64_64       x;
+
+    x.cb = EnumModulesCallback;
+    x.user = UserContext;
+
+    return SymEnumerateModulesW64(hProcess, enum_modW64_64, &x);
+}
+
+/******************************************************************
+ *		SymEnumerateModulesW64 (DBGHELP.@)
+ *
+ */
+BOOL  WINAPI SymEnumerateModulesW64(HANDLE hProcess,
+                                    PSYM_ENUMMODULES_CALLBACKW64 EnumModulesCallback,
+                                    PVOID UserContext)
+{
     struct process*     pcs = process_find_by_handle(hProcess);
     struct module*      module;
 
@@ -669,7 +707,7 @@ BOOL  WINAPI SymEnumerateModules64(HANDLE hProcess,
     {
         if (!(dbghelp_options & SYMOPT_WINE_WITH_ELF_MODULES) && module->type == DMT_ELF)
             continue;
-        if (!EnumModulesCallback(module->module_name,
+        if (!EnumModulesCallback(module->module.ModuleName,
                                  module->module.BaseOfImage, UserContext))
             break;
     }
diff --git a/include/dbghelp.h b/include/dbghelp.h
index eb2442a..e818096 100644
--- a/include/dbghelp.h
+++ b/include/dbghelp.h
@@ -764,6 +764,8 @@ typedef BOOL (CALLBACK *PSYM_ENUMMODULES_CALLBACK)(PSTR, ULONG, PVOID);
 BOOL    WINAPI SymEnumerateModules(HANDLE, PSYM_ENUMMODULES_CALLBACK, PVOID);
 typedef BOOL (CALLBACK *PSYM_ENUMMODULES_CALLBACK64)(PSTR, DWORD64, PVOID);
 BOOL    WINAPI SymEnumerateModules64(HANDLE, PSYM_ENUMMODULES_CALLBACK64, PVOID);
+typedef BOOL (CALLBACK *PSYM_ENUMMODULES_CALLBACKW64)(PWSTR, DWORD64, PVOID);
+BOOL    WINAPI SymEnumerateModulesW64(HANDLE, PSYM_ENUMMODULES_CALLBACKW64, PVOID);
 BOOL    WINAPI SymGetModuleInfo(HANDLE, DWORD, PIMAGEHLP_MODULE);
 BOOL    WINAPI SymGetModuleInfoW(HANDLE, DWORD, PIMAGEHLP_MODULEW);
 BOOL    WINAPI SymGetModuleInfo64(HANDLE, DWORD64, PIMAGEHLP_MODULE64);




More information about the wine-cvs mailing list