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