Eric Pouech : winedump: Correctly support flags in public records (V1 and V2).

Alexandre Julliard julliard at winehq.org
Tue Aug 24 15:56:11 CDT 2021


Module: wine
Branch: master
Commit: 0003c64e5ba53929778774ca3f41815efa053e70
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=0003c64e5ba53929778774ca3f41815efa053e70

Author: Eric Pouech <eric.pouech at gmail.com>
Date:   Tue Aug 24 11:11:24 2021 +0200

winedump: Correctly support flags in public records (V1 and V2).

Signed-off-by: Eric Pouech <eric.pouech at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/dbghelp/msc.c     |  4 ++--
 include/wine/mscvpdb.h |  4 ++--
 tools/winedump/msc.c   | 32 +++++++++++++++++++++++++-------
 3 files changed, 29 insertions(+), 11 deletions(-)

diff --git a/dlls/dbghelp/msc.c b/dlls/dbghelp/msc.c
index 380511d0b55..f77592664ef 100644
--- a/dlls/dbghelp/msc.c
+++ b/dlls/dbghelp/msc.c
@@ -2058,7 +2058,7 @@ static BOOL codeview_snarf_public(const struct msc_debug_info* msc_dbg, const BY
             {
                 symt_new_public(msc_dbg->module, compiland,
                                 terminate_string(&sym->public_v1.p_name),
-                                sym->public_v1.symtype == SYMTYPE_FUNCTION,
+                                sym->public_v1.pubsymflags == SYMTYPE_FUNCTION,
                                 codeview_get_address(msc_dbg, sym->public_v1.segment, sym->public_v1.offset), 1);
             }
             break;
@@ -2067,7 +2067,7 @@ static BOOL codeview_snarf_public(const struct msc_debug_info* msc_dbg, const BY
             {
                 symt_new_public(msc_dbg->module, compiland,
                                 terminate_string(&sym->public_v2.p_name),
-                                sym->public_v2.symtype == SYMTYPE_FUNCTION,
+                                sym->public_v2.pubsymflags == SYMTYPE_FUNCTION,
                                 codeview_get_address(msc_dbg, sym->public_v2.segment, sym->public_v2.offset), 1);
             }
             break;
diff --git a/include/wine/mscvpdb.h b/include/wine/mscvpdb.h
index 2ed9a9fe192..9e544108bdd 100644
--- a/include/wine/mscvpdb.h
+++ b/include/wine/mscvpdb.h
@@ -1368,7 +1368,7 @@ union codeview_symbol
         unsigned short int      id;
         unsigned int            offset;
         unsigned short          segment;
-        cv_typ16_t              symtype;
+        unsigned short          pubsymflags;
         struct p_string         p_name;
     } public_v1;
 
@@ -1376,7 +1376,7 @@ union codeview_symbol
     {
         unsigned short int      len;
         unsigned short int      id;
-        cv_typ_t                symtype;
+        unsigned int            pubsymflags;
         unsigned int            offset;
         unsigned short          segment;
         struct p_string         p_name;
diff --git a/tools/winedump/msc.c b/tools/winedump/msc.c
index 7f93f3e7701..c7ca3eea77a 100644
--- a/tools/winedump/msc.c
+++ b/tools/winedump/msc.c
@@ -457,6 +457,20 @@ static const char* get_callconv(unsigned cc)
     return callconv;
 }
 
+static const char* get_pubflags(unsigned flags)
+{
+    static char ret[32];
+
+    ret[0] = '\0';
+#define X(s) {if (ret[0]) strcat(ret, ";"); strcat(ret, s);}
+    if (flags & 1) X("code");
+    if (flags & 2) X("func");
+    if (flags & 4) X("manage");
+    if (flags & 8) X("msil");
+#undef X
+    return ret;
+}
+
 static void do_field(const unsigned char* start, const unsigned char* end)
 {
     /*
@@ -1134,21 +1148,25 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
                    sym->data_v3.symtype);
             break;
 
+	case S_PUB32_16t:
+            printf("\tS-Public V1 '%s' %04x:%08x flags:%s\n",
+                   get_symbol_str(p_string(&sym->public_v1.p_name)),
+                   sym->public_v1.segment, sym->public_v1.offset,
+                   get_pubflags(sym->public_v1.pubsymflags));
+	    break;
+
 	case S_PUB32_ST:
-            printf("\tS-Public V2 '%s' %04x:%08x type:%08x\n",
+            printf("\tS-Public V2 '%s' %04x:%08x flags:%s\n",
                    get_symbol_str(p_string(&sym->public_v2.p_name)),
                    sym->public_v2.segment, sym->public_v2.offset,
-                   sym->public_v2.symtype);
+                   get_pubflags(sym->public_v2.pubsymflags));
 	    break;
 
 	case S_PUB32:
-            printf("\tS-Public V3 '%s' %04x:%08x flags%s%s%s%s\n",
+            printf("\tS-Public V3 '%s' %04x:%08x flags:%s\n",
                    get_symbol_str(sym->public_v3.name),
                    sym->public_v3.segment, sym->public_v3.offset,
-                   (sym->public_v3.pubsymflags & 1) ? "-code" : "",
-                   (sym->public_v3.pubsymflags & 2) ? "-func" : "",
-                   (sym->public_v3.pubsymflags & 4) ? "-manage" : "",
-                   (sym->public_v3.pubsymflags & 8) ? "-msil" : "");
+                   get_pubflags(sym->public_v3.pubsymflags));
 	    break;
 
 	case S_DATAREF:




More information about the wine-cvs mailing list