[PATCH 06/12] [include]: removed tools/winedump/cvinclude.h
Eric Pouech
eric.pouech at wanadoo.fr
Fri Jan 5 14:42:45 CST 2007
- got rid of tools/winedump/cvinclude.h
- moved the relevant definitions from cvinclude.h into
include/wine/mscvpdb.h
- make use of those definitions through out the code base
- rewrote the debug directory header structures so that they
all include the DWORD signature
- simplify the signature lookup by only reading (first)
the signature, then mapping the right debug structure
A+
---
dlls/dbghelp/msc.c | 47 ++++++-----
include/wine/mscvpdb.h | 121 +++++++++++++++++++++++-----
tools/winedump/cvinclude.h | 187 --------------------------------------------
tools/winedump/debug.c | 61 +++++++-------
4 files changed, 154 insertions(+), 262 deletions(-)
diff --git a/dlls/dbghelp/msc.c b/dlls/dbghelp/msc.c
index 624220c..d4d5edf 100644
--- a/dlls/dbghelp/msc.c
+++ b/dlls/dbghelp/msc.c
@@ -2295,34 +2295,35 @@ #define CODEVIEW_RSDS_SIG MAKESIG(
static BOOL codeview_process_info(const struct process* pcs,
const struct msc_debug_info* msc_dbg)
{
- const CODEVIEW_HEADER_NBxx* cv = (const CODEVIEW_HEADER_NBxx*)msc_dbg->root;
+ const DWORD* signature = (const DWORD*)msc_dbg->root;
BOOL ret = FALSE;
struct pdb_lookup pdb_lookup;
- TRACE("Processing signature %.4s\n", (const char*)&cv->dwSignature);
+ TRACE("Processing signature %.4s\n", (const char*)signature);
- switch (cv->dwSignature)
+ switch (*signature)
{
case CODEVIEW_NB09_SIG:
case CODEVIEW_NB11_SIG:
{
- const CV_DIRECTORY_HEADER* hdr = (const CV_DIRECTORY_HEADER*)(msc_dbg->root + cv->lfoDirectory);
- const CV_DIRECTORY_ENTRY* ent;
- const CV_DIRECTORY_ENTRY* prev;
- const CV_DIRECTORY_ENTRY* next;
+ const OMFSignature* cv = (const OMFSignature*)msc_dbg->root;
+ const OMFDirHeader* hdr = (const OMFDirHeader*)(msc_dbg->root + cv->filepos);
+ const OMFDirEntry* ent;
+ const OMFDirEntry* prev;
+ const OMFDirEntry* next;
unsigned int i;
codeview_init_basic_types(msc_dbg->module);
for (i = 0; i < hdr->cDir; i++)
{
- ent = (const CV_DIRECTORY_ENTRY*)((const BYTE*)hdr + hdr->cbDirHeader + i * hdr->cbDirEntry);
- if (ent->subsection == sstGlobalTypes)
+ ent = (const OMFDirEntry*)((const BYTE*)hdr + hdr->cbDirHeader + i * hdr->cbDirEntry);
+ if (ent->SubSection == sstGlobalTypes)
{
- const CV_ENTRY_GLOBAL_TYPES* types;
+ const OMFGlobalTypes* types;
struct codeview_type_parse ctp;
- types = (const CV_ENTRY_GLOBAL_TYPES*)(msc_dbg->root + ent->lfo);
+ types = (const OMFGlobalTypes*)(msc_dbg->root + ent->lfo);
ctp.module = msc_dbg->module;
ctp.offset = (const DWORD*)(types + 1);
ctp.num = types->cTypes;
@@ -2337,15 +2338,15 @@ static BOOL codeview_process_info(const
}
}
- ent = (const CV_DIRECTORY_ENTRY*)((const BYTE*)hdr + hdr->cbDirHeader);
+ ent = (const OMFDirEntry*)((const BYTE*)hdr + hdr->cbDirHeader);
for (i = 0; i < hdr->cDir; i++, ent = next)
{
next = (i == hdr->cDir-1) ? NULL :
- (const CV_DIRECTORY_ENTRY*)((const BYTE*)ent + hdr->cbDirEntry);
+ (const OMFDirEntry*)((const BYTE*)ent + hdr->cbDirEntry);
prev = (i == 0) ? NULL :
- (const CV_DIRECTORY_ENTRY*)((const BYTE*)ent - hdr->cbDirEntry);
+ (const OMFDirEntry*)((const BYTE*)ent - hdr->cbDirEntry);
- if (ent->subsection == sstAlignSym)
+ if (ent->SubSection == sstAlignSym)
{
/*
* Check the next and previous entry. If either is a
@@ -2357,13 +2358,13 @@ static BOOL codeview_process_info(const
struct codeview_linetab* linetab = NULL;
if (next && next->iMod == ent->iMod &&
- next->subsection == sstSrcModule)
+ next->SubSection == sstSrcModule)
linetab = codeview_snarf_linetab(msc_dbg->module,
msc_dbg->root + next->lfo, next->cb,
TRUE);
if (prev && prev->iMod == ent->iMod &&
- prev->subsection == sstSrcModule)
+ prev->SubSection == sstSrcModule)
linetab = codeview_snarf_linetab(msc_dbg->module,
msc_dbg->root + prev->lfo, prev->cb,
TRUE);
@@ -2387,7 +2388,7 @@ static BOOL codeview_process_info(const
case CODEVIEW_NB10_SIG:
{
- const CODEVIEW_PDB_DATA* pdb = (const CODEVIEW_PDB_DATA*)(cv + 1);
+ const CODEVIEW_PDB_DATA* pdb = (const CODEVIEW_PDB_DATA*)msc_dbg->root;
pdb_lookup.filename = pdb->name;
pdb_lookup.kind = PDB_JG;
pdb_lookup.u.jg.timestamp = pdb->timestamp;
@@ -2398,7 +2399,7 @@ static BOOL codeview_process_info(const
}
case CODEVIEW_RSDS_SIG:
{
- const CODEVIEW_HEADER_RSDS* rsds = (const CODEVIEW_HEADER_RSDS*)msc_dbg->root;
+ const OMFSignatureRSDS* rsds = (const OMFSignatureRSDS*)msc_dbg->root;
TRACE("Got RSDS type of PDB file: guid=%s unk=%08x name=%s\n",
wine_dbgstr_guid(&rsds->guid), rsds->unknown, rsds->name);
@@ -2411,14 +2412,14 @@ static BOOL codeview_process_info(const
break;
}
default:
- ERR("Unknown CODEVIEW signature %08X in module %s\n",
- cv->dwSignature, msc_dbg->module->module.ModuleName);
+ ERR("Unknown CODEVIEW signature %.4s in module %s\n",
+ (const char*)signature, msc_dbg->module->module.ModuleName);
break;
}
if (ret)
{
- msc_dbg->module->module.CVSig = cv->dwSignature;
- memcpy(msc_dbg->module->module.CVData, cv,
+ msc_dbg->module->module.CVSig = *signature;
+ memcpy(msc_dbg->module->module.CVData, msc_dbg->root,
sizeof(msc_dbg->module->module.CVData));
}
return ret;
diff --git a/include/wine/mscvpdb.h b/include/wine/mscvpdb.h
index 08366d9..064b5fa 100644
--- a/include/wine/mscvpdb.h
+++ b/include/wine/mscvpdb.h
@@ -1565,65 +1565,70 @@ #define sstPreComp 0x12f
#define sstFileIndex 0x133
#define sstStaticSym 0x134
-typedef struct _CODEVIEW_HEADER_NBxx
+/* overall structure information */
+typedef struct OMFSignature
{
- DWORD dwSignature;
- DWORD lfoDirectory;
-} CODEVIEW_HEADER_NBxx,* PCODEVIEW_HEADER_NBxx;
+ char Signature[4];
+ long filepos;
+} OMFSignature;
-typedef struct _CODEVIEW_HEADER_RSDS
+typedef struct OMFSignatureRSDS
{
- DWORD dwSignature;
+ char Signature[4];
GUID guid;
DWORD unknown;
CHAR name[1];
-} CODEVIEW_HEADER_RSDS,* PCODEVIEW_HEADER_RSDS;
+} OMFSignatureRSDS;
typedef struct _CODEVIEW_PDB_DATA
{
+ char Signature[4];
+ long filepos;
DWORD timestamp;
DWORD unknown;
CHAR name[1];
} CODEVIEW_PDB_DATA, *PCODEVIEW_PDB_DATA;
-typedef struct _CV_DIRECTORY_HEADER
+typedef struct OMFDirHeader
{
WORD cbDirHeader;
WORD cbDirEntry;
DWORD cDir;
DWORD lfoNextDir;
DWORD flags;
-} CV_DIRECTORY_HEADER, *PCV_DIRECTORY_HEADER;
+} OMFDirHeader;
-typedef struct _CV_DIRECTORY_ENTRY
+typedef struct OMFDirEntry
{
- WORD subsection;
+ WORD SubSection;
WORD iMod;
DWORD lfo;
DWORD cb;
-} CV_DIRECTORY_ENTRY, *PCV_DIRECTORY_ENTRY;
+} OMFDirEntry;
-typedef struct _CV_ENTRY_MODULE_SEGINFO
+/* sstModule subsection */
+
+typedef struct OMFSegDesc
{
- WORD seg;
+ WORD Seg;
WORD pad;
- DWORD offset;
+ DWORD Off;
DWORD cbSeg;
-} CV_ENTRY_MODULE_SEGINFO;
+} OMFSegDesc;
-typedef struct _CV_ENTRY_MODULE
+typedef struct OMFModule
{
WORD ovlNumber;
WORD iLib;
WORD cSeg;
- WORD Style;
+ char Style[2];
/*
- CV_ENTRY_MODULE_SEGINFO SegInfo[cSeg];
+ OMFSegDesc SegInfo[cSeg];
p_string Name;
*/
-} CV_ENTRY_MODULE;
+} OMFModule;
-typedef struct _CV_ENTRY_GLOBAL_TYPES
+typedef struct OMFGlobalTypes
{
DWORD flags;
DWORD cTypes;
@@ -1631,4 +1636,76 @@ typedef struct _CV_ENTRY_GLOBAL_TYPES
DWORD offset[cTypes];
types_record[];
*/
-} CV_ENTRY_GLOBAL_TYPES;
+} OMFGlobalTypes;
+
+/* sstGlobalPub section */
+
+/* Header for symbol table */
+typedef struct OMFSymHash
+{
+ unsigned short symhash;
+ unsigned short addrhash;
+ unsigned long cbSymbol;
+ unsigned long cbHSym;
+ unsigned long cbHAddr;
+} OMFSymHash;
+
+/* FIXME: to be removed (and using codeview_symbol type above)
+ * Symbol table entry */
+typedef struct DATASYM32
+{
+ unsigned short reclen;
+ unsigned short rectyp;
+ unsigned long typind;
+ unsigned long off;
+ unsigned short seg;
+} DATASYM32;
+typedef DATASYM32 PUBSYM32;
+
+/* sstSegMap section */
+
+typedef struct OMFSegMapDesc
+{
+ unsigned short flags;
+ unsigned short ovl;
+ unsigned short group;
+ unsigned short frame;
+ unsigned short iSegName;
+ unsigned short iClassName;
+ unsigned long offset;
+ unsigned long cbSeg;
+} OMFSegMapDesc;
+
+typedef struct OMFSegMap
+{
+ unsigned short cSeg;
+ unsigned short cSegLog;
+/* OMFSegMapDesc rgDesc[0];*/
+} OMFSegMap;
+
+
+/* sstSrcModule section */
+
+typedef struct OMFSourceLine
+{
+ unsigned short Seg;
+ unsigned short cLnOff;
+ unsigned long offset[1];
+ unsigned short lineNbr[1];
+} OMFSourceLine;
+
+typedef struct OMFSourceFile
+{
+ unsigned short cSeg;
+ unsigned short reserved;
+ unsigned long baseSrcLn[1];
+ unsigned short cFName;
+ char Name;
+} OMFSourceFile;
+
+typedef struct OMFSourceModule
+{
+ unsigned short cFile;
+ unsigned short cSeg;
+ unsigned long baseSrcFile[1];
+} OMFSourceModule;
diff --git a/tools/winedump/cvinclude.h b/tools/winedump/cvinclude.h
deleted file mode 100644
index 1aaf365..0000000
--- a/tools/winedump/cvinclude.h
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * CodeView 4 Debug format - declarations
- *
- * (based on cvinfo.h and cvexefmt.h from the Win32 SDK)
- *
- * Copyright 2000 John R. Sheets for CodeWeavers
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#define sstModule 0x120
-#define sstAlignSym 0x125
-#define sstSrcModule 0x127
-#define sstLibraries 0x128
-#define sstGlobalSym 0x129
-#define sstGlobalPub 0x12a
-#define sstGlobalTypes 0x12b
-#define sstSegMap 0x12d
-#define sstFileIndex 0x133
-#define sstStaticSym 0x134
-
-#if 0
-/* Old, crusty value */
-#define S_PUB32 0x0203
-#endif
-
-#define S_PUB32 0x1009
-
-#include "pshpack1.h"
-
-/*
- * CodeView headers
- */
-
-typedef struct OMFSignature
-{
- char Signature[4];
- long filepos;
-} OMFSignature;
-
-typedef struct OMFDirHeader
-{
- unsigned short cbDirHeader;
- unsigned short cbDirEntry;
- unsigned long cDir;
- long lfoNextDir;
- unsigned long flags;
-} OMFDirHeader;
-
-typedef struct OMFDirEntry
-{
- unsigned short SubSection;
- unsigned short iMod;
- long lfo;
- unsigned long cb;
-} OMFDirEntry;
-
-
-/*
- * sstModule subsection
- */
-
-typedef struct OMFSegDesc
-{
- unsigned short Seg;
- unsigned short pad;
- unsigned long Off;
- unsigned long cbSeg;
-} OMFSegDesc;
-
-/* Must chop off the OMFSegDesc* field, because we need to write this
- * struct out to a file. If we write the whole struct out, we'll end up
- * with (*OMFSegDesc), not (OMFSegDesc). See OMFModuleFull.
- */
-typedef struct OMFModule
-{
- unsigned short ovlNumber;
- unsigned short iLib;
- unsigned short cSeg;
- char Style[2];
-} OMFModule;
-
-/* Full version, with memory pointers, too. Use OMFModule for writing out to
- * a file, and OMFModuleFull for reading. If offsetof() were available, we
- * could use that instead.
- */
-typedef struct OMFModuleFull
-{
- unsigned short ovlNumber;
- unsigned short iLib;
- unsigned short cSeg;
- char Style[2];
- OMFSegDesc *SegInfo;
- char *Name;
-} OMFModuleFull;
-
-
-/*
- * sstGlobalPub section
- */
-
-/* Header for symbol table.
- */
-typedef struct OMFSymHash
-{
- unsigned short symhash;
- unsigned short addrhash;
- unsigned long cbSymbol;
- unsigned long cbHSym;
- unsigned long cbHAddr;
-} OMFSymHash;
-
-/* Symbol table entry.
- */
-typedef struct DATASYM32
-{
- unsigned short reclen;
- unsigned short rectyp;
- unsigned long typind;
- unsigned long off;
- unsigned short seg;
-} DATASYM32;
-typedef DATASYM32 PUBSYM32;
-
-/*
- * sstSegMap section
- */
-
-typedef struct OMFSegMapDesc
-{
- unsigned short flags;
- unsigned short ovl;
- unsigned short group;
- unsigned short frame;
- unsigned short iSegName;
- unsigned short iClassName;
- unsigned long offset;
- unsigned long cbSeg;
-} OMFSegMapDesc;
-
-typedef struct OMFSegMap
-{
- unsigned short cSeg;
- unsigned short cSegLog;
-/* OMFSegMapDesc rgDesc[0];*/
-} OMFSegMap;
-
-
-/*
- * sstSrcModule section
- */
-
-typedef struct OMFSourceLine
-{
- unsigned short Seg;
- unsigned short cLnOff;
- unsigned long offset[1];
- unsigned short lineNbr[1];
-} OMFSourceLine;
-
-typedef struct OMFSourceFile
-{
- unsigned short cSeg;
- unsigned short reserved;
- unsigned long baseSrcLn[1];
- unsigned short cFName;
- char Name;
-} OMFSourceFile;
-
-typedef struct OMFSourceModule
-{
- unsigned short cFile;
- unsigned short cSeg;
- unsigned long baseSrcFile[1];
-} OMFSourceModule;
diff --git a/tools/winedump/debug.c b/tools/winedump/debug.c
index 21cd9e4..d9c2eb5 100644
--- a/tools/winedump/debug.c
+++ b/tools/winedump/debug.c
@@ -44,7 +44,6 @@ #include <fcntl.h>
#include "windef.h"
#include "winbase.h"
#include "winedump.h"
-#include "cvinclude.h"
#include "wine/mscvpdb.h"
/*
@@ -99,8 +98,8 @@ #include "wine/mscvpdb.h"
* (OMFDirHeader.cDir)
*/
-extern const IMAGE_NT_HEADERS* PE_nt_headers;
-static const void* cv_base /* = 0 */;
+extern const IMAGE_NT_HEADERS* PE_nt_headers;
+static const void* cv_base /* = 0 */;
static int dump_cv_sst_module(const OMFDirEntry* omfde)
{
@@ -124,7 +123,7 @@ static int dump_cv_sst_module(const OMFD
for (i = 0; i < module->cSeg; i++)
{
- printf (" segment #%2d: offset = [0x%8lx], size = [0x%8lx]\n",
+ printf (" segment #%2d: offset = [0x%8x], size = [0x%8x]\n",
segDesc->Seg, segDesc->Off, segDesc->cbSeg);
segDesc++;
}
@@ -376,8 +375,8 @@ static void dump_codeview_all_modules(co
printf("Module #%2d (%p)\n", i + 1, &dirEntry[i]);
printf(" SubSection: %04X (%s)\n", dirEntry[i].SubSection, str);
printf(" iMod: %d\n", dirEntry[i].iMod);
- printf(" lfo: %ld\n", dirEntry[i].lfo);
- printf(" cb: %lu\n", dirEntry[i].cb);
+ printf(" lfo: %d\n", dirEntry[i].lfo);
+ printf(" cb: %u\n", dirEntry[i].cb);
switch (dirEntry[i].SubSection)
{
@@ -402,8 +401,9 @@ static void dump_codeview_all_modules(co
static void dump_codeview_headers(unsigned long base, unsigned long len)
{
const OMFDirHeader* dirHeader;
- const OMFSignature* signature;
+ const char* signature;
const OMFDirEntry* dirEntry;
+ const OMFSignature* sig;
unsigned i;
int modulecount = 0, alignsymcount = 0, srcmodulecount = 0, librariescount = 0;
int globalsymcount = 0, globalpubcount = 0, globaltypescount = 0;
@@ -415,50 +415,51 @@ static void dump_codeview_headers(unsign
signature = cv_base;
printf(" CodeView Data\n");
+ printf(" Signature: %.4s\n", signature);
- printf(" Signature: %.4s\n", signature->Signature);
- printf(" Filepos: 0x%08lX\n", signature->filepos);
-
- if (memcmp(signature->Signature, "NB10", 4) == 0)
+ if (memcmp(signature, "NB10", 4) == 0)
{
const CODEVIEW_PDB_DATA* pdb_data;
- pdb_data = (const void *)(signature + 1);
+ pdb_data = (const void *)cv_base;
- printf(" TimeStamp: %08X (%s)\n",
+ printf(" Filepos: 0x%08lX\n", pdb_data->filepos);
+ printf(" TimeStamp: %08X (%s)\n",
pdb_data->timestamp, get_time_str(pdb_data->timestamp));
- printf(" Dunno: %08X\n", pdb_data->unknown);
- printf(" Filename: %s\n", pdb_data->name);
+ printf(" Dunno: %08X\n", pdb_data->unknown);
+ printf(" Filename: %s\n", pdb_data->name);
return;
}
- if (memcmp(signature->Signature, "RSDS", 4) == 0)
+ if (memcmp(signature, "RSDS", 4) == 0)
{
- const CODEVIEW_HEADER_RSDS* rsds_data;
- char guid_str[40];
+ const OMFSignatureRSDS* rsds_data;
+ char guid_str[40];
- rsds_data = (const void *)signature;
- printf(" Signature: %08X\n",
- rsds_data->dwSignature);
- printf(" Guid: %s\n",
+ rsds_data = (const void *)cv_base;
+ printf(" Guid: %s\n",
guid_to_string(&rsds_data->guid, guid_str, sizeof(guid_str)));
- printf(" Dunno: %08X\n", rsds_data->unknown);
- printf(" Filename: %s\n", rsds_data->name);
+ printf(" Dunno: %08X\n", rsds_data->unknown);
+ printf(" Filename: %s\n", rsds_data->name);
return;
}
- if (memcmp(signature->Signature, "NB09", 4) != 0 && memcmp(signature->Signature, "NB11", 4) != 0)
+ if (memcmp(signature, "NB09", 4) != 0 && memcmp(signature, "NB11", 4) != 0)
{
- printf("Unsupported signature (%.4s), aborting\n", signature->Signature);
+ printf("Unsupported signature (%.4s), aborting\n", signature);
return;
}
- dirHeader = PRD(Offset(cv_base) + signature->filepos, sizeof(OMFDirHeader));
+ sig = cv_base;
+
+ printf(" Filepos: 0x%08lX\n", sig->filepos);
+
+ dirHeader = PRD(Offset(cv_base) + sig->filepos, sizeof(OMFDirHeader));
if (!dirHeader) {printf("Can't get debug header, aborting\n"); return;}
printf(" Size of header: 0x%4X\n", dirHeader->cbDirHeader);
printf(" Size per entry: 0x%4X\n", dirHeader->cbDirEntry);
- printf(" # of entries: 0x%8lX (%ld)\n", dirHeader->cDir, dirHeader->cDir);
- printf(" Offset to NextDir: 0x%8lX\n", dirHeader->lfoNextDir);
- printf(" Flags: 0x%8lX\n", dirHeader->flags);
+ printf(" # of entries: 0x%8X (%d)\n", dirHeader->cDir, dirHeader->cDir);
+ printf(" Offset to NextDir: 0x%8X\n", dirHeader->lfoNextDir);
+ printf(" Flags: 0x%8X\n", dirHeader->flags);
if (!dirHeader->cDir) return;
More information about the wine-patches
mailing list