Eric Pouech : dbghelp: Improved SymSearch (now using tag, index and address ).

Alexandre Julliard julliard at wine.codeweavers.com
Thu May 11 05:56:21 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: 96efcbc47b06a8d39fafb3a3ae02f028987bd00c
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=96efcbc47b06a8d39fafb3a3ae02f028987bd00c

Author: Eric Pouech <eric.pouech at wanadoo.fr>
Date:   Wed May 10 21:35:37 2006 +0200

dbghelp: Improved SymSearch (now using tag, index and address).

---

 dlls/dbghelp/symbol.c |   58 ++++++++++++++++++++++++++-----------------------
 1 files changed, 31 insertions(+), 27 deletions(-)

diff --git a/dlls/dbghelp/symbol.c b/dlls/dbghelp/symbol.c
index b0ecf2a..7707078 100644
--- a/dlls/dbghelp/symbol.c
+++ b/dlls/dbghelp/symbol.c
@@ -562,11 +562,24 @@ struct sym_enum
     PSYM_ENUMERATESYMBOLS_CALLBACK      cb;
     PVOID                               user;
     SYMBOL_INFO*                        sym_info;
+    DWORD                               index;
+    DWORD                               tag;
+    DWORD64                             addr;
     char                                buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME];
 };
+
+static BOOL send_symbol(const struct sym_enum* se, struct module_pair* pair,
+                        const struct symt* sym)
+{
+    symt_fill_sym_info(pair, sym, se->sym_info);
+    if (se->index && se->sym_info->info != se->index) return FALSE;
+    if (se->tag && se->sym_info->Tag != se->tag) return FALSE;
+    if (se->addr && !(se->addr >= se->sym_info->Address && se->addr < se->sym_info->Address + se->sym_info->Size)) return FALSE;
+    return !se->cb(se->sym_info, se->sym_info->Size, se->user);
+}
+
 static BOOL symt_enum_module(struct module_pair* pair, regex_t* regex,
                              const struct sym_enum* se)
-    
 {
     void*                       ptr;
     struct symt_ht*             sym = NULL;
@@ -581,8 +594,7 @@ static BOOL symt_enum_module(struct modu
         {
             se->sym_info->SizeOfStruct = sizeof(SYMBOL_INFO);
             se->sym_info->MaxNameLen = sizeof(se->buffer) - sizeof(SYMBOL_INFO);
-            symt_fill_sym_info(pair, &sym->symt, se->sym_info);
-            if (!se->cb(se->sym_info, se->sym_info->Size, se->user)) return TRUE;
+            if (send_symbol(se, pair, &sym->symt)) return TRUE;
         }
     }   
     return FALSE;
@@ -713,9 +725,7 @@ static BOOL symt_enum_locals_helper(stru
         case SymTagData:
             if (regexec(preg, symt_get_name(lsym), 0, NULL, 0) == 0)
             {
-                symt_fill_sym_info(pair, lsym, se->sym_info);
-                if (!se->cb(se->sym_info, se->sym_info->Size, se->user))
-                    return FALSE;
+                if (send_symbol(se, pair, lsym)) return FALSE;
             }
             break;
         case SymTagLabel:
@@ -759,8 +769,7 @@ static BOOL symt_enum_locals(struct proc
         return ret;
         
     }
-    symt_fill_sym_info(&pair, &sym->symt, se->sym_info);
-    return se->cb(se->sym_info, se->sym_info->Size, se->user);
+    return send_symbol(se, &pair, &sym->symt);
 }
 
 /******************************************************************
@@ -885,6 +894,9 @@ BOOL WINAPI SymEnumSymbols(HANDLE hProce
 
     se.cb = EnumSymbolsCallback;
     se.user = UserContext;
+    se.index = 0;
+    se.tag = 0;
+    se.addr = 0;
     se.sym_info = (PSYMBOL_INFO)se.buffer;
 
     return sym_enum(hProcess, BaseOfDll, Mask, &se);
@@ -1456,34 +1468,26 @@ BOOL WINAPI SymSearch(HANDLE hProcess, U
                       PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback,
                       PVOID UserContext, DWORD Options)
 {
+    struct sym_enum     se;
+
     TRACE("(%p %s %lu %lu %s %s %p %p %lx)\n",
           hProcess, wine_dbgstr_longlong(BaseOfDll), Index, SymTag, Mask, 
           wine_dbgstr_longlong(Address), EnumSymbolsCallback,
           UserContext, Options);
 
-    if (Index != 0)
-    {
-        FIXME("Unsupported searching for a given Index (%lu)\n", Index);
-        SetLastError(ERROR_INVALID_PARAMETER);
-        return FALSE;
-    }
-    if (SymTag != 0)
-    {
-        FIXME("Unsupported searching for a given SymTag (%lu)\n", SymTag);
-        SetLastError(ERROR_INVALID_PARAMETER);
-        return FALSE;
-    }
-    if (Address != 0)
-    {
-        FIXME("Unsupported searching for a given Address (%s)\n", wine_dbgstr_longlong(Address));
-        SetLastError(ERROR_INVALID_PARAMETER);
-        return FALSE;
-    }
     if (Options != SYMSEARCH_GLOBALSONLY)
     {
         FIXME("Unsupported searching with options (%lx)\n", Options);
         SetLastError(ERROR_INVALID_PARAMETER);
         return FALSE;
     }
-    return SymEnumSymbols(hProcess, BaseOfDll, Mask, EnumSymbolsCallback, UserContext);
+
+    se.cb = EnumSymbolsCallback;
+    se.user = UserContext;
+    se.index = Index;
+    se.tag = SymTag;
+    se.addr = Address;
+    se.sym_info = (PSYMBOL_INFO)se.buffer;
+
+    return sym_enum(hProcess, BaseOfDll, Mask, &se);
 }




More information about the wine-cvs mailing list