Module: wine Branch: refs/heads/master Commit: 4a80e63a29e1b0184eab6e72bffec70d911437c5 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=4a80e63a29e1b0184eab6e72...
Author: Eric Pouech eric.pouech@wanadoo.fr Date: Wed May 10 21:35:11 2006 +0200
dbghelp: Implemented SymRegisterCallbackW64 and 64 -> 64W mapping function.
---
dlls/dbghelp/dbghelp.c | 76 ++++++++++++++++++++++++++++++++++++---- dlls/dbghelp/dbghelp.spec | 2 + dlls/dbghelp/dbghelp_private.h | 1 + include/dbghelp.h | 13 +++++++ 4 files changed, 84 insertions(+), 8 deletions(-)
diff --git a/dlls/dbghelp/dbghelp.c b/dlls/dbghelp/dbghelp.c index dbd3cfb..d7e0cf3 100644 --- a/dlls/dbghelp/dbghelp.c +++ b/dlls/dbghelp/dbghelp.c @@ -479,10 +479,64 @@ static BOOL CALLBACK reg_cb64to32(HANDLE BOOL pcs_callback(const struct process* pcs, ULONG action, void* data) { TRACE("%p %lu %p\n", pcs, action, data); + if (!pcs->reg_cb) return FALSE; + if (pcs->reg_is_unicode) + { + IMAGEHLP_DEFERRED_SYMBOL_LOAD64* idsl; + IMAGEHLP_DEFERRED_SYMBOL_LOADW64 idslW; + + switch (action) + { + case CBA_DEBUG_INFO: + case CBA_DEFERRED_SYMBOL_LOAD_CANCEL: + case CBA_SET_OPTIONS: + case CBA_SYMBOLS_UNLOADED: + break; + case CBA_DEFERRED_SYMBOL_LOAD_COMPLETE: + case CBA_DEFERRED_SYMBOL_LOAD_FAILURE: + case CBA_DEFERRED_SYMBOL_LOAD_PARTIAL: + case CBA_DEFERRED_SYMBOL_LOAD_START: + idsl = (IMAGEHLP_DEFERRED_SYMBOL_LOAD64*)(DWORD)data; + idslW.SizeOfStruct = sizeof(idslW); + idslW.BaseOfImage = idsl->BaseOfImage; + idslW.CheckSum = idsl->CheckSum; + idslW.TimeDateStamp = idsl->TimeDateStamp; + MultiByteToWideChar(CP_ACP, 0, idsl->FileName, -1, + idslW.FileName, sizeof(idslW.FileName) / sizeof(WCHAR)); + idslW.Reparse = idsl->Reparse; + data = &idslW; + break; + case CBA_DUPLICATE_SYMBOL: + case CBA_EVENT: + case CBA_READ_MEMORY: + default: + FIXME("No mapping for action %lu\n", action); + return FALSE; + } + } return pcs->reg_cb(pcs->handle, action, (ULONG64)(DWORD_PTR)data, pcs->reg_user); }
+/****************************************************************** + * sym_register_cb + * + * Helper for registering a callback. + */ +static BOOL sym_register_cb(HANDLE hProcess, + PSYMBOL_REGISTERED_CALLBACK64 cb, + DWORD64 user, BOOL unicode) +{ + struct process* pcs = process_find_by_handle(hProcess); + + if (!pcs) return FALSE; + pcs->reg_cb = cb; + pcs->reg_is_unicode = unicode; + pcs->reg_user = user; + + return TRUE; +} + /*********************************************************************** * SymRegisterCallback (DBGHELP.@) */ @@ -491,7 +545,9 @@ BOOL WINAPI SymRegisterCallback(HANDLE h PVOID UserContext) { DWORD64 tmp = ((ULONGLONG)(DWORD)CallbackFunction << 32) | (DWORD)UserContext; - return SymRegisterCallback64(hProcess, reg_cb64to32, tmp); + TRACE("(%p, %p, %p)\n", + hProcess, CallbackFunction, UserContext); + return sym_register_cb(hProcess, reg_cb64to32, tmp, FALSE); }
/*********************************************************************** @@ -501,15 +557,21 @@ BOOL WINAPI SymRegisterCallback64(HANDLE PSYMBOL_REGISTERED_CALLBACK64 CallbackFunction, ULONG64 UserContext) { - struct process* pcs = process_find_by_handle(hProcess); - TRACE("(%p, %p, %s)\n", hProcess, CallbackFunction, wine_dbgstr_longlong(UserContext)); - if (!pcs) return FALSE; - pcs->reg_cb = CallbackFunction; - pcs->reg_user = UserContext; + return sym_register_cb(hProcess, CallbackFunction, UserContext, FALSE); +}
- return TRUE; +/*********************************************************************** + * SymRegisterCallbackW64 (DBGHELP.@) + */ +BOOL WINAPI SymRegisterCallbackW64(HANDLE hProcess, + PSYMBOL_REGISTERED_CALLBACK64 CallbackFunction, + ULONG64 UserContext) +{ + TRACE("(%p, %p, %s)\n", + hProcess, CallbackFunction, wine_dbgstr_longlong(UserContext)); + return sym_register_cb(hProcess, CallbackFunction, UserContext, TRUE); }
/* This is imagehlp version not dbghelp !! */ diff --git a/dlls/dbghelp/dbghelp.spec b/dlls/dbghelp/dbghelp.spec index 69d4ffa..8641f43 100644 --- a/dlls/dbghelp/dbghelp.spec +++ b/dlls/dbghelp/dbghelp.spec @@ -130,7 +130,7 @@ @ stub SymRefreshModuleList @ stdcall SymRegisterCallback(long ptr ptr) @ stdcall SymRegisterCallback64(long ptr double) -@ stub SymRegisterCallbackW64 +@ stdcall SymRegisterCallbackW64(long ptr double) @ stdcall SymRegisterFunctionEntryCallback(ptr ptr ptr) @ stdcall SymRegisterFunctionEntryCallback64(ptr ptr double) @ stdcall SymSearch(long double long long str double ptr ptr long) diff --git a/dlls/dbghelp/dbghelp_private.h b/dlls/dbghelp/dbghelp_private.h index efc5ceb..cfc9f92 100644 --- a/dlls/dbghelp/dbghelp_private.h +++ b/dlls/dbghelp/dbghelp_private.h @@ -294,6 +294,7 @@ struct process WCHAR* search_path;
PSYMBOL_REGISTERED_CALLBACK64 reg_cb; + BOOL reg_is_unicode; DWORD64 reg_user;
struct module* lmodules; diff --git a/include/dbghelp.h b/include/dbghelp.h index 85e6a73..49f4d7e 100644 --- a/include/dbghelp.h +++ b/include/dbghelp.h @@ -287,6 +287,18 @@ typedef struct _IMAGEHLP_DEFERRED_SYMBOL DWORD Flags; } IMAGEHLP_DEFERRED_SYMBOL_LOAD64, *PIMAGEHLP_DEFERRED_SYMBOL_LOAD64;
+typedef struct _IMAGEHLP_DEFERRED_SYMBOL_LOADW64 +{ + DWORD SizeOfStruct; + DWORD64 BaseOfImage; + DWORD CheckSum; + DWORD TimeDateStamp; + WCHAR FileName[MAX_PATH + 1]; + BOOLEAN Reparse; + HANDLE hFile; + DWORD Flags; +} IMAGEHLP_DEFERRED_SYMBOL_LOADW64, *PIMAGEHLP_DEFERRED_SYMBOL_LOADW64; + typedef struct _IMAGEHLP_DUPLICATE_SYMBOL { DWORD SizeOfStruct; @@ -889,6 +901,7 @@ typedef BOOL (CALLBACK *PSYMBOL_REGISTER BOOL WINAPI SymRegisterCallback(HANDLE, PSYMBOL_REGISTERED_CALLBACK, PVOID); typedef BOOL (CALLBACK *PSYMBOL_REGISTERED_CALLBACK64)(HANDLE, ULONG, ULONG64, ULONG64); BOOL WINAPI SymRegisterCallback64(HANDLE, PSYMBOL_REGISTERED_CALLBACK64, ULONG64); +BOOL WINAPI SymRegisterCallbackW64(HANDLE, PSYMBOL_REGISTERED_CALLBACK64, ULONG64); BOOL WINAPI SymUnDName(PIMAGEHLP_SYMBOL, PSTR, DWORD); BOOL WINAPI SymUnDName64(PIMAGEHLP_SYMBOL64, PSTR, DWORD); DWORD WINAPI UnDecorateSymbolName(LPCSTR, LPSTR, DWORD, DWORD);