Eric Pouech : dbghelp: Symbol info.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Jan 23 10:35:09 CST 2006


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

Author: Eric Pouech <eric.pouech at wanadoo.fr>
Date:   Mon Jan 23 16:26:57 2006 +0100

dbghelp: Symbol info.
- better coding for SYMBOL_INFO filling
- some fixes on some fields (parameters)
- now using the max size for symbol info

---

 dlls/dbghelp/symbol.c |   26 ++++++++++++++------------
 include/dbghelp.h     |    2 ++
 2 files changed, 16 insertions(+), 12 deletions(-)

diff --git a/dlls/dbghelp/symbol.c b/dlls/dbghelp/symbol.c
index 704c8e4..4fdf134 100644
--- a/dlls/dbghelp/symbol.c
+++ b/dlls/dbghelp/symbol.c
@@ -448,13 +448,16 @@ static void symt_fill_sym_info(const str
     if (!symt_get_info(sym, TI_GET_TYPE, &sym_info->TypeIndex))
         sym_info->TypeIndex = 0;
     sym_info->info = (DWORD)sym;
+    sym_info->Reserved[0] = sym_info->Reserved[1] = 0;
     if (!symt_get_info(sym, TI_GET_LENGTH, &size) &&
-        sym_info->TypeIndex &&
-        !symt_get_info((struct symt*)sym_info->TypeIndex, TI_GET_LENGTH, &size))
+        (!sym_info->TypeIndex ||
+         !symt_get_info((struct symt*)sym_info->TypeIndex, TI_GET_LENGTH, &size)))
         size = 0;
     sym_info->Size = (DWORD)size;
     sym_info->ModBase = module->module.BaseOfImage;
     sym_info->Flags = 0;
+    sym_info->Value = 0;
+
     switch (sym->tag)
     {
     case SymTagData:
@@ -472,10 +475,9 @@ static void symt_fill_sym_info(const str
                 }
                 else
                 {
-                    if (data->u.s.offset < 0)
-                        sym_info->Flags |= SYMFLAG_LOCAL | SYMFLAG_FRAMEREL;
-                    else
-                        sym_info->Flags |= SYMFLAG_LOCAL | SYMFLAG_PARAMETER | SYMFLAG_FRAMEREL;
+                    sym_info->Flags |= SYMFLAG_LOCAL | SYMFLAG_REGREL;
+                    /* FIXME: this is i386 dependent */
+                    if (data->u.s.offset >= 0) sym_info->Flags |= SYMFLAG_PARAMETER;
                     /* FIXME: needed ? moreover, it's i386 dependent !!! */
                     sym_info->Register = CV_REG_EBP;
                     sym_info->Address = data->u.s.offset / 8;
@@ -544,7 +546,7 @@ static void symt_fill_sym_info(const str
 static BOOL symt_enum_module(struct module* module, regex_t* regex,
                              PSYM_ENUMERATESYMBOLS_CALLBACK cb, PVOID user)
 {
-    char                        buffer[sizeof(SYMBOL_INFO) + 256];
+    char                        buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME];
     SYMBOL_INFO*                sym_info = (SYMBOL_INFO*)buffer;
     void*                       ptr;
     struct symt_ht*             sym = NULL;
@@ -720,7 +722,7 @@ static BOOL symt_enum_locals(struct proc
 {
     struct module*      module;
     struct symt_ht*     sym;
-    char                buffer[sizeof(SYMBOL_INFO) + 256];
+    char                buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME];
     SYMBOL_INFO*        sym_info = (SYMBOL_INFO*)buffer;
     DWORD               pc = pcs->ctx_frame.InstructionOffset;
     int                 idx;
@@ -898,14 +900,14 @@ BOOL WINAPI SymFromAddr(HANDLE hProcess,
 BOOL WINAPI SymGetSymFromAddr(HANDLE hProcess, DWORD Address,
                               PDWORD Displacement, PIMAGEHLP_SYMBOL Symbol)
 {
-    char        buffer[sizeof(SYMBOL_INFO) + 256];
+    char        buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME];
     SYMBOL_INFO*si = (SYMBOL_INFO*)buffer;
     size_t      len;
     DWORD64     Displacement64;
 
     if (Symbol->SizeOfStruct < sizeof(*Symbol)) return FALSE;
     si->SizeOfStruct = sizeof(*si);
-    si->MaxNameLen = 256;
+    si->MaxNameLen = MAX_SYM_NAME;
     if (!SymFromAddr(hProcess, Address, &Displacement64, si))
         return FALSE;
 
@@ -977,13 +979,13 @@ BOOL WINAPI SymFromName(HANDLE hProcess,
  */
 BOOL WINAPI SymGetSymFromName(HANDLE hProcess, LPSTR Name, PIMAGEHLP_SYMBOL Symbol)
 {
-    char        buffer[sizeof(SYMBOL_INFO) + 256];
+    char        buffer[sizeof(SYMBOL_INFO) + MAX_SYM_NAME];
     SYMBOL_INFO*si = (SYMBOL_INFO*)buffer;
     size_t      len;
 
     if (Symbol->SizeOfStruct < sizeof(*Symbol)) return FALSE;
     si->SizeOfStruct = sizeof(*si);
-    si->MaxNameLen = 256;
+    si->MaxNameLen = MAX_SYM_NAME;
     if (!SymFromName(hProcess, Name, si)) return FALSE;
 
     Symbol->Address = si->Address;
diff --git a/include/dbghelp.h b/include/dbghelp.h
index c70ca15..9ef700c 100644
--- a/include/dbghelp.h
+++ b/include/dbghelp.h
@@ -726,6 +726,8 @@ BOOL    WINAPI SymUnloadModule64(HANDLE,
 #define SYMFLAG_THUNK            0x00002000
 #define SYMFLAG_TLSREL           0x00004000
 
+#define MAX_SYM_NAME    2000
+
 typedef struct _SYMBOL_INFO
 {
     ULONG       SizeOfStruct;




More information about the wine-cvs mailing list