[PATCH 09/13] dbghelp/pdb: introduce codeview_init_type_parse() to handle init of type streams

Eric Pouech eric.pouech at gmail.com
Mon Nov 8 07:59:07 CST 2021


currently used for TPI stream

Signed-off-by: Eric Pouech <eric.pouech at gmail.com>

---
 dlls/dbghelp/msc.c |   87 +++++++++++++++++++++++++++++-----------------------
 1 file changed, 48 insertions(+), 39 deletions(-)

diff --git a/dlls/dbghelp/msc.c b/dlls/dbghelp/msc.c
index 0247a90f6ff..d7b1e74edcd 100644
--- a/dlls/dbghelp/msc.c
+++ b/dlls/dbghelp/msc.c
@@ -2717,53 +2717,62 @@ static HANDLE map_pdb_file(const struct process* pcs,
     return hMap;
 }
 
+static BOOL pdb_init_type_parse(const struct msc_debug_info* msc_dbg,
+                                struct codeview_type_parse* ctp,
+                                BYTE* image)
+{
+    PDB_TYPES types;
+    DWORD total;
+    const BYTE* ptr;
+    DWORD* offset;
+
+    pdb_convert_types_header(&types, image);
+
+    /* Check for unknown versions */
+    switch (types.version)
+    {
+    case 19950410:      /* VC 4.0 */
+    case 19951122:
+    case 19961031:      /* VC 5.0 / 6.0 */
+    case 19990903:      /* VC 7.0 */
+    case 20040203:      /* VC 8.0 */
+        break;
+    default:
+        ERR("-Unknown type info version %d\n", types.version);
+    }
+
+    ctp->module = msc_dbg->module;
+    /* reconstruct the types offset...
+     * FIXME: maybe it's present in the newest PDB_TYPES structures
+     */
+    total = types.last_index - types.first_index + 1;
+    offset = HeapAlloc(GetProcessHeap(), 0, sizeof(DWORD) * total);
+    if (!offset) return FALSE;
+    ctp->table = ptr = image + types.type_offset;
+    ctp->num = 0;
+    while (ptr < ctp->table + types.type_size && ctp->num < total)
+    {
+        offset[ctp->num++] = ptr - ctp->table;
+        ptr += ((const union codeview_type*)ptr)->generic.len + 2;
+    }
+    ctp->offset = offset;
+    return TRUE;
+}
+
 static void pdb_process_types(const struct msc_debug_info* msc_dbg,
                               const struct pdb_file_info* pdb_file)
 {
-    BYTE*       types_image = NULL;
+    struct codeview_type_parse ctp;
+    BYTE* types_image = pdb_read_file(pdb_file, 2);
 
-    types_image = pdb_read_file(pdb_file, 2);
     if (types_image)
     {
-        PDB_TYPES               types;
-        struct codeview_type_parse      ctp;
-        DWORD                   total;
-        const BYTE*             ptr;
-        DWORD*                  offset;
-
-        pdb_convert_types_header(&types, types_image);
-
-        /* Check for unknown versions */
-        switch (types.version)
+        if (pdb_init_type_parse(msc_dbg, &ctp, types_image))
         {
-        case 19950410:      /* VC 4.0 */
-        case 19951122:
-        case 19961031:      /* VC 5.0 / 6.0 */
-        case 19990903:      /* VC 7.0 */
-        case 20040203:      /* VC 8.0 */
-            break;
-        default:
-            ERR("-Unknown type info version %d\n", types.version);
+            /* Read type table */
+            codeview_parse_type_table(&ctp);
+            HeapFree(GetProcessHeap(), 0, (DWORD*)ctp.offset);
         }
-
-        ctp.module = msc_dbg->module;
-        /* reconstruct the types offset...
-         * FIXME: maybe it's present in the newest PDB_TYPES structures
-         */
-        total = types.last_index - types.first_index + 1;
-        offset = HeapAlloc(GetProcessHeap(), 0, sizeof(DWORD) * total);
-        ctp.table = ptr = types_image + types.type_offset;
-        ctp.num = 0;
-        while (ptr < ctp.table + types.type_size && ctp.num < total)
-        {
-            offset[ctp.num++] = ptr - ctp.table;
-            ptr += ((const union codeview_type*)ptr)->generic.len + 2;
-        }
-        ctp.offset = offset;
-
-        /* Read type table */
-        codeview_parse_type_table(&ctp);
-        HeapFree(GetProcessHeap(), 0, offset);
         pdb_free(types_image);
     }
 }




More information about the wine-devel mailing list