Eric Pouech : dbghelp: Rewrote the loaded modules enumeration so that Unicode version is the core .

Alexandre Julliard julliard at wine.codeweavers.com
Thu Feb 22 05:56:40 CST 2007


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

Author: Eric Pouech <eric.pouech at wanadoo.fr>
Date:   Wed Feb 21 21:54:44 2007 +0100

dbghelp: Rewrote the loaded modules enumeration so that Unicode version is the core.

---

 dlls/dbghelp/module.c |  111 +++++++++++++++++++++++++------------------------
 1 files changed, 57 insertions(+), 54 deletions(-)

diff --git a/dlls/dbghelp/module.c b/dlls/dbghelp/module.c
index ebee8d9..14731d7 100644
--- a/dlls/dbghelp/module.c
+++ b/dlls/dbghelp/module.c
@@ -628,100 +628,103 @@ BOOL  WINAPI SymEnumerateModules64(HANDLE hProcess,
  *		EnumerateLoadedModules64 (DBGHELP.@)
  *
  */
+struct enum_load_modW64_64
+{
+    PENUMLOADED_MODULES_CALLBACK64      cb;
+    PVOID                               user;
+    char                                module[MAX_PATH];
+};
+
+static BOOL CALLBACK enum_load_modW64_64(PWSTR name, DWORD64 base, ULONG size,
+                                         PVOID user)
+{
+    struct enum_load_modW64_64* x = user;
+
+    WideCharToMultiByte(CP_ACP, 0, name, -1, x->module, sizeof(x->module), NULL, NULL);
+    return x->cb(x->module, base, size, x->user);
+}
+
 BOOL  WINAPI EnumerateLoadedModules64(HANDLE hProcess,
                                       PENUMLOADED_MODULES_CALLBACK64 EnumLoadedModulesCallback,
                                       PVOID UserContext)
 {
-    HMODULE*    hMods;
-    char        base[256], mod[256];
-    DWORD       i, sz;
-    MODULEINFO  mi;
+    struct enum_load_modW64_64  x;
 
-    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)) ||
-            !GetModuleBaseNameA(hProcess, hMods[i], base, sizeof(base)))
-            continue;
-        module_fill_module(base, mod, sizeof(mod));
-        EnumLoadedModulesCallback(mod, (DWORD_PTR)mi.lpBaseOfDll, mi.SizeOfImage,
-                                  UserContext);
-    }
-    HeapFree(GetProcessHeap(), 0, hMods);
+    x.cb = EnumLoadedModulesCallback;
+    x.user = UserContext;
 
-    return sz != 0 && i == sz;
+    return EnumerateLoadedModulesW64(hProcess, enum_load_modW64_64, &x);
 }
 
 /******************************************************************
  *		EnumerateLoadedModules (DBGHELP.@)
  *
  */
-struct enum_load_mod64_32
+struct enum_load_modW64_32
 {
     PENUMLOADED_MODULES_CALLBACK        cb;
     PVOID                               user;
+    char                                module[MAX_PATH];
 };
 
-static BOOL CALLBACK enum_load_mod64_32(PSTR name, DWORD64 base, ULONG size,
-                                        PVOID user)
+static BOOL CALLBACK enum_load_modW64_32(PWSTR name, DWORD64 base, ULONG size,
+                                         PVOID user)
 {
-    struct enum_load_mod64_32*  x = user;
-    return x->cb(name, (DWORD)base, size, x->user);
+    struct enum_load_modW64_32* x = user;
+    WideCharToMultiByte(CP_ACP, 0, name, -1, x->module, sizeof(x->module), NULL, NULL);
+    return x->cb(x->module, (DWORD)base, size, x->user);
 }
 
 BOOL  WINAPI EnumerateLoadedModules(HANDLE hProcess,
                                     PENUMLOADED_MODULES_CALLBACK EnumLoadedModulesCallback,
                                     PVOID UserContext)
 {
-    struct enum_load_mod64_32   x;
+    struct enum_load_modW64_32  x;
 
     x.cb = EnumLoadedModulesCallback;
     x.user = UserContext;
 
-    return EnumerateLoadedModules64(hProcess, enum_load_mod64_32, &x);
+    return EnumerateLoadedModulesW64(hProcess, enum_load_modW64_32, &x);
 }
 
 /******************************************************************
  *		EnumerateLoadedModulesW64 (DBGHELP.@)
  *
  */
-struct enum_load_mod64_W64
-{
-    PENUMLOADED_MODULES_CALLBACKW64     cb;
-    PVOID                               user;
-    WCHAR                               module[MAX_PATH];
-};
-
-static BOOL CALLBACK enum_load_mod64_W64(PSTR name, DWORD64 base, ULONG size,
-                                         PVOID user)
-{
-    struct enum_load_mod64_W64* x = user;
-
-    MultiByteToWideChar(CP_ACP, 0, name, -1,
-                        x->module, sizeof(x->module) / sizeof(WCHAR));
-    return x->cb(x->module, base, size, x->user);
-}
-
 BOOL  WINAPI EnumerateLoadedModulesW64(HANDLE hProcess,
                                        PENUMLOADED_MODULES_CALLBACKW64 EnumLoadedModulesCallback,
                                        PVOID UserContext)
 {
-    struct enum_load_mod64_W64  x;
+    HMODULE*    hMods;
+    char        base[256], mod[256];
+    WCHAR       modW[256];
+    DWORD       i, sz;
+    MODULEINFO  mi;
 
-    x.cb = EnumLoadedModulesCallback;
-    x.user = UserContext;
+    hMods = HeapAlloc(GetProcessHeap(), 0, 256 * sizeof(hMods[0]));
+    if (!hMods) return FALSE;
 
-    return EnumerateLoadedModules64(hProcess, enum_load_mod64_W64, &x);
+    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)) ||
+            !GetModuleBaseNameA(hProcess, hMods[i], base, sizeof(base)))
+            continue;
+        module_fill_module(base, mod, sizeof(mod));
+        MultiByteToWideChar(CP_ACP, 0, mod, -1, modW, sizeof(modW) / sizeof(modW));
+        EnumLoadedModulesCallback(modW, (DWORD_PTR)mi.lpBaseOfDll, mi.SizeOfImage,
+                                  UserContext);
+    }
+    HeapFree(GetProcessHeap(), 0, hMods);
+
+    return sz != 0 && i == sz;
 }
 
 /******************************************************************




More information about the wine-cvs mailing list