[PATCH] [DbgHelp]: implemented SymEnumTypesW

Eric Pouech eric.pouech at wanadoo.fr
Sun Mar 4 10:00:50 CST 2007


(please use this version, other version is not clean)

A+
---

 dlls/dbghelp/dbghelp.spec      |    2 +-
 dlls/dbghelp/dbghelp_private.h |    1 +
 dlls/dbghelp/symbol.c          |    2 +-
 dlls/dbghelp/type.c            |   32 ++++++++++++++++++++++++++++++++
 include/dbghelp.h              |    1 +
 5 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/dlls/dbghelp/dbghelp.spec b/dlls/dbghelp/dbghelp.spec
index ffb51bb..63bb5af 100644
--- a/dlls/dbghelp/dbghelp.spec
+++ b/dlls/dbghelp/dbghelp.spec
@@ -43,7 +43,7 @@
 @ stub SymEnumSymbolsForAddr
 @ stub SymEnumSymbolsForAddrW
 @ stdcall SymEnumTypes(ptr double ptr ptr)
-@ stub SymEnumTypesW
+@ stdcall SymEnumTypesW(ptr double ptr ptr)
 @ stdcall SymEnumerateModules(long ptr ptr)
 @ stdcall SymEnumerateModules64(long ptr ptr)
 @ stub SymEnumerateModulesW64
diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h
index d450f8d..198c4da 100644
--- a/dlls/dbghelp/dbghelp_private.h
+++ b/dlls/dbghelp/dbghelp_private.h
@@ -503,6 +503,7 @@ extern BOOL         dwarf2_parse(struct 
 /* symbol.c */
 extern const char*  symt_get_name(const struct symt* sym);
 extern int          symt_cmp_addr(const void* p1, const void* p2);
+extern void         copy_symbolW(SYMBOL_INFOW* siw, const SYMBOL_INFO* si);
 extern struct symt_ht*
                     symt_find_nearest(struct module* module, DWORD addr);
 extern struct symt_compiland*
diff --git a/dlls/dbghelp/symbol.c b/dlls/dbghelp/symbol.c
index cf8abf3..06240d4 100644
--- a/dlls/dbghelp/symbol.c
+++ b/dlls/dbghelp/symbol.c
@@ -828,7 +828,7 @@ static BOOL symt_enum_locals(struct proc
  * Helper for transforming an ANSI symbol info into an UNICODE one.
  * Assume that MaxNameLen is the same for both version (A & W).
  */
-static void copy_symbolW(SYMBOL_INFOW* siw, const SYMBOL_INFO* si)
+void copy_symbolW(SYMBOL_INFOW* siw, const SYMBOL_INFO* si)
 {
     siw->SizeOfStruct = si->SizeOfStruct;
     siw->TypeIndex = si->TypeIndex; 
diff --git a/dlls/dbghelp/type.c b/dlls/dbghelp/type.c
index 3a36aba..4a340ad 100644
--- a/dlls/dbghelp/type.c
+++ b/dlls/dbghelp/type.c
@@ -421,6 +421,38 @@ BOOL WINAPI SymEnumTypes(HANDLE hProcess
     return TRUE;
 }
 
+struct enum_types_AtoW
+{
+    char                                buffer[sizeof(SYMBOL_INFOW) + 256 * sizeof(WCHAR)];
+    void*                               user;
+    PSYM_ENUMERATESYMBOLS_CALLBACKW     callback;
+};
+
+BOOL CALLBACK enum_types_AtoW(PSYMBOL_INFO si, ULONG addr, PVOID _et)
+{
+    struct enum_types_AtoW*     et = _et;
+    SYMBOL_INFOW*               siW = (SYMBOL_INFOW*)et->buffer;
+
+    copy_symbolW(siW, si);
+    return et->callback(siW, addr, et->user);
+}
+
+/******************************************************************
+ *		SymEnumTypesW (DBGHELP.@)
+ *
+ */
+BOOL WINAPI SymEnumTypesW(HANDLE hProcess, ULONG64 BaseOfDll,
+                          PSYM_ENUMERATESYMBOLS_CALLBACKW EnumSymbolsCallback,
+                          PVOID UserContext)
+{
+    struct enum_types_AtoW     et;
+
+    et.callback = EnumSymbolsCallback;
+    et.user = UserContext;
+
+    return SymEnumTypes(hProcess, BaseOfDll, enum_types_AtoW, &et);
+}
+
 /******************************************************************
  *		symt_get_info
  *
diff --git a/include/dbghelp.h b/include/dbghelp.h
index b777224..eb2442a 100644
--- a/include/dbghelp.h
+++ b/include/dbghelp.h
@@ -911,6 +911,7 @@ BOOL WINAPI SymGetTypeInfo(HANDLE, DWORD
 typedef BOOL (CALLBACK *PSYM_ENUMERATESYMBOLS_CALLBACK)(PSYMBOL_INFO, ULONG, PVOID);
 typedef BOOL (CALLBACK *PSYM_ENUMERATESYMBOLS_CALLBACKW)(PSYMBOL_INFOW, ULONG, PVOID);
 BOOL WINAPI SymEnumTypes(HANDLE, ULONG64, PSYM_ENUMERATESYMBOLS_CALLBACK, PVOID);
+BOOL WINAPI SymEnumTypesW(HANDLE, ULONG64, PSYM_ENUMERATESYMBOLS_CALLBACKW, PVOID);
 BOOL WINAPI SymFromAddr(HANDLE, DWORD64, DWORD64*, SYMBOL_INFO*);
 BOOL WINAPI SymFromAddrW(HANDLE, DWORD64, DWORD64*, SYMBOL_INFOW*);
 BOOL WINAPI SymFromToken(HANDLE, DWORD64, DWORD, PSYMBOL_INFO);



More information about the wine-patches mailing list