Module: wine Branch: refs/heads/master Commit: 7d4194f57b07c14992bc502b6e9cc3a908ac8f85 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=7d4194f57b07c14992bc502b...
Author: Eric Pouech eric.pouech@wanadoo.fr Date: Wed May 10 21:35:22 2006 +0200
dbghelp: Implemented SymFromAddrW.
---
dlls/dbghelp/dbghelp.spec | 2 +- dlls/dbghelp/symbol.c | 51 +++++++++++++++++++++++++++++++++++++++++++++ include/dbghelp.h | 20 ++++++++++++++++++ 3 files changed, 72 insertions(+), 1 deletions(-)
diff --git a/dlls/dbghelp/dbghelp.spec b/dlls/dbghelp/dbghelp.spec index 9ec1802..7b35397 100644 --- a/dlls/dbghelp/dbghelp.spec +++ b/dlls/dbghelp/dbghelp.spec @@ -56,7 +56,7 @@ @ stdcall SymFindFileInPath(long str str ptr long long long ptr ptr ptr) @ stub SymFindFileInPathW @ stdcall SymFromAddr(ptr double ptr ptr) -@ stub SymFromAddrW +@ stdcall SymFromAddrW(ptr double ptr ptr) @ stub SymFromIndex @ stub SymFromIndexW @ stdcall SymFromName(long str ptr) diff --git a/dlls/dbghelp/symbol.c b/dlls/dbghelp/symbol.c index 753c0b7..1fb1c37 100644 --- a/dlls/dbghelp/symbol.c +++ b/dlls/dbghelp/symbol.c @@ -36,6 +36,7 @@ #endif
#include "wine/debug.h" #include "dbghelp_private.h" +#include "winnls.h"
WINE_DEFAULT_DEBUG_CHANNEL(dbghelp); WINE_DECLARE_DEBUG_CHANNEL(dbghelp_symt); @@ -763,6 +764,31 @@ static BOOL symt_enum_locals(struct proc }
/****************************************************************** + * copy_symbolW + * + * 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) +{ + siw->SizeOfStruct = si->SizeOfStruct; + siw->TypeIndex = si->TypeIndex; + siw->Reserved[0] = si->Reserved[0]; + siw->Reserved[1] = si->Reserved[1]; + siw->Index = si->info; /* FIXME: see dbghelp.h */ + siw->Size = si->Size; + siw->ModBase = si->ModBase; + siw->Flags = si->Flags; + siw->Value = si->Value; + siw->Address = si->Address; + siw->Register = si->Register; + siw->Scope = si->Scope; + siw->Tag = si->Tag; + siw->NameLen = si->NameLen; + siw->MaxNameLen = si->MaxNameLen; + MultiByteToWideChar(CP_ACP, 0, si->Name, -1, siw->Name, siw->MaxNameLen); +} +/****************************************************************** * SymEnumSymbols (DBGHELP.@) * * cases BaseOfDll = 0 @@ -901,6 +927,31 @@ BOOL WINAPI SymFromAddr(HANDLE hProcess, }
/****************************************************************** + * SymFromAddrW (DBGHELP.@) + * + */ +BOOL WINAPI SymFromAddrW(HANDLE hProcess, DWORD64 Address, + DWORD64* Displacement, PSYMBOL_INFOW Symbol) +{ + PSYMBOL_INFO si; + unsigned len; + BOOL ret; + + len = sizeof(*si) + Symbol->MaxNameLen * sizeof(WCHAR); + si = HeapAlloc(GetProcessHeap(), 0, len); + if (!si) return FALSE; + + si->SizeOfStruct = sizeof(*si); + si->MaxNameLen = Symbol->MaxNameLen; + if ((ret = SymFromAddr(hProcess, Address, Displacement, si))) + { + copy_symbolW(Symbol, si); + } + HeapFree(GetProcessHeap(), 0, si); + return ret; +} + +/****************************************************************** * SymGetSymFromAddr (DBGHELP.@) * */ diff --git a/include/dbghelp.h b/include/dbghelp.h index b6ceaa8..79f97b3 100644 --- a/include/dbghelp.h +++ b/include/dbghelp.h @@ -817,6 +817,25 @@ typedef struct _SYMBOL_INFO CHAR Name[1]; } SYMBOL_INFO, *PSYMBOL_INFO;
+typedef struct _SYMBOL_INFOW +{ + ULONG SizeOfStruct; + ULONG TypeIndex; + ULONG64 Reserved[2]; + ULONG Index; + ULONG Size; + ULONG64 ModBase; + ULONG Flags; + ULONG64 Value; + ULONG64 Address; + ULONG Register; + ULONG Scope; + ULONG Tag; + ULONG NameLen; + ULONG MaxNameLen; + WCHAR Name[1]; +} SYMBOL_INFOW, *PSYMBOL_INFOW; + typedef enum _IMAGEHLP_SYMBOL_TYPE_INFO { TI_GET_SYMTAG, @@ -881,6 +900,7 @@ BOOL WINAPI SymGetTypeInfo(HANDLE, DWORD typedef BOOL (CALLBACK *PSYM_ENUMERATESYMBOLS_CALLBACK)(PSYMBOL_INFO, ULONG, PVOID); BOOL WINAPI SymEnumTypes(HANDLE, ULONG64, PSYM_ENUMERATESYMBOLS_CALLBACK, 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); BOOL WINAPI SymFromName(HANDLE, PCSTR, PSYMBOL_INFO); BOOL WINAPI SymGetSymFromAddr(HANDLE, DWORD, PDWORD, PIMAGEHLP_SYMBOL);