Module: wine Branch: master Commit: fa4dfa4325f7c77331106ffdc4b1cedbb0803e55 URL: http://source.winehq.org/git/wine.git/?a=commit;h=fa4dfa4325f7c77331106ffdc4...
Author: Sebastian Lackner sebastian@fds-team.de Date: Thu Aug 6 08:22:22 2015 +0200
dbghelp: Implement UnDecorateSymbolNameW.
Also fixes a bug in UnDecorateSymbolName when undecorated_length == 0.
---
dlls/dbghelp/dbghelp.spec | 4 +-- dlls/dbghelp/symbol.c | 63 +++++++++++++++++++++++++++++++++++++---------- 2 files changed, 52 insertions(+), 15 deletions(-)
diff --git a/dlls/dbghelp/dbghelp.spec b/dlls/dbghelp/dbghelp.spec index 4772358..6004f95 100644 --- a/dlls/dbghelp/dbghelp.spec +++ b/dlls/dbghelp/dbghelp.spec @@ -183,8 +183,8 @@ @ stdcall SymUnDName64(ptr str long) @ stdcall SymUnloadModule(long long) @ stdcall SymUnloadModule64(long int64) -@ stdcall UnDecorateSymbolName(str str long long) -@ stub UnDecorateSymbolNameW +@ stdcall UnDecorateSymbolName(str ptr long long) +@ stdcall UnDecorateSymbolNameW(wstr ptr long long) @ stdcall UnmapDebugInformation(ptr) @ stdcall WinDbgExtensionDllInit(ptr long long) #@ stub block diff --git a/dlls/dbghelp/symbol.c b/dlls/dbghelp/symbol.c index cbe232b..7569a58 100644 --- a/dlls/dbghelp/symbol.c +++ b/dlls/dbghelp/symbol.c @@ -1752,32 +1752,69 @@ BOOL WINAPI SymUnDName64(PIMAGEHLP_SYMBOL64 sym, PSTR UnDecName, DWORD UnDecName static void * CDECL und_alloc(size_t len) { return HeapAlloc(GetProcessHeap(), 0, len); } static void CDECL und_free (void* ptr) { HeapFree(GetProcessHeap(), 0, ptr); }
-/*********************************************************************** - * UnDecorateSymbolName (DBGHELP.@) - */ -DWORD WINAPI UnDecorateSymbolName(PCSTR DecoratedName, PSTR UnDecoratedName, - DWORD UndecoratedLength, DWORD Flags) +static char *und_name(char *buffer, const char *mangled, int buflen, unsigned short flags) { /* undocumented from msvcrt */ static HANDLE hMsvcrt; static char* (CDECL *p_undname)(char*, const char*, int, void* (CDECL*)(size_t), void (CDECL*)(void*), unsigned short); static const WCHAR szMsvcrt[] = {'m','s','v','c','r','t','.','d','l','l',0};
- TRACE("(%s, %p, %d, 0x%08x)\n", - debugstr_a(DecoratedName), UnDecoratedName, UndecoratedLength, Flags); - if (!p_undname) { if (!hMsvcrt) hMsvcrt = LoadLibraryW(szMsvcrt); if (hMsvcrt) p_undname = (void*)GetProcAddress(hMsvcrt, "__unDName"); - if (!p_undname) return 0; + if (!p_undname) return NULL; }
- if (!UnDecoratedName) return 0; - if (!p_undname(UnDecoratedName, DecoratedName, UndecoratedLength, - und_alloc, und_free, Flags)) + return p_undname(buffer, mangled, buflen, und_alloc, und_free, flags); +} + +/*********************************************************************** + * UnDecorateSymbolName (DBGHELP.@) + */ +DWORD WINAPI UnDecorateSymbolName(const char *decorated_name, char *undecorated_name, + DWORD undecorated_length, DWORD flags) +{ + TRACE("(%s, %p, %d, 0x%08x)\n", + debugstr_a(decorated_name), undecorated_name, undecorated_length, flags); + + if (!undecorated_name || !undecorated_length) + return 0; + if (!und_name(undecorated_name, decorated_name, undecorated_length, flags)) + return 0; + return strlen(undecorated_name); +} + +/*********************************************************************** + * UnDecorateSymbolNameW (DBGHELP.@) + */ +DWORD WINAPI UnDecorateSymbolNameW(const WCHAR *decorated_name, WCHAR *undecorated_name, + DWORD undecorated_length, DWORD flags) +{ + char *buf, *ptr; + int len, ret = 0; + + TRACE("(%s, %p, %d, 0x%08x)\n", + debugstr_w(decorated_name), undecorated_name, undecorated_length, flags); + + if (!undecorated_name || !undecorated_length) return 0; - return strlen(UnDecoratedName); + + len = WideCharToMultiByte(CP_ACP, 0, decorated_name, -1, NULL, 0, NULL, NULL); + if ((buf = HeapAlloc(GetProcessHeap(), 0, len))) + { + WideCharToMultiByte(CP_ACP, 0, decorated_name, -1, buf, len, NULL, NULL); + if ((ptr = und_name(NULL, buf, 0, flags))) + { + MultiByteToWideChar(CP_ACP, 0, ptr, -1, undecorated_name, undecorated_length); + undecorated_name[undecorated_length - 1] = 0; + ret = strlenW(undecorated_name); + und_free(ptr); + } + HeapFree(GetProcessHeap(), 0, buf); + } + + return ret; }
#define WILDCHAR(x) (-(x))