Eric Pouech : dbghelp: Implemented SymRegisterCallbackW64 and 64 ->
64W mapping function.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu May 11 05:56:13 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: 4a80e63a29e1b0184eab6e72bffec70d911437c5
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=4a80e63a29e1b0184eab6e72bffec70d911437c5
Author: Eric Pouech <eric.pouech at 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);
More information about the wine-cvs
mailing list