[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