[PATCH 07/10] Moving mscvpdb.h file from dlls/dbghelp to include/wine for

Eric Pouech eric.pouech at wanadoo.fr
Wed Nov 29 14:40:30 CST 2006


larger sharing of the definitions (winedump)

A+
---

 dlls/dbghelp/coff.c    |    2 
 dlls/dbghelp/msc.c     |    2 
 dlls/dbghelp/mscvpdb.h | 1558 ------------------------------------------------
 include/wine/mscvpdb.h | 1558 ++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 1560 insertions(+), 1560 deletions(-)

diff --git a/dlls/dbghelp/coff.c b/dlls/dbghelp/coff.c
index 9bdf0bf..340e8a6 100644
--- a/dlls/dbghelp/coff.c
+++ b/dlls/dbghelp/coff.c
@@ -55,7 +55,7 @@ #include "wine/exception.h"
 #include "wine/debug.h"
 #include "excpt.h"
 #include "dbghelp_private.h"
-#include "mscvpdb.h"
+#include "wine/mscvpdb.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(dbghelp_coff);
 
diff --git a/dlls/dbghelp/msc.c b/dlls/dbghelp/msc.c
index a858e50..d2c50ec 100644
--- a/dlls/dbghelp/msc.c
+++ b/dlls/dbghelp/msc.c
@@ -56,7 +56,7 @@ #include "wine/exception.h"
 #include "wine/debug.h"
 #include "excpt.h"
 #include "dbghelp_private.h"
-#include "mscvpdb.h"
+#include "wine/mscvpdb.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(dbghelp_msc);
 
diff --git a/dlls/dbghelp/mscvpdb.h b/dlls/dbghelp/mscvpdb.h
deleted file mode 100644
index 1bc2b7b..0000000
--- a/dlls/dbghelp/mscvpdb.h
+++ /dev/null
@@ -1,1558 +0,0 @@
-/*
- * MS debug information definitions.
- *
- * Copyright (C) 1996 Eric Youngdale
- * Copyright (C) 1999-2000 Ulrich Weigand
- * Copyright (C) 2004 Eric Pouech
- *
- * 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
- */
-
-/* MS has stored all its debug information in a set of structures
- * which has been rather consistent across the years (ie you can grasp
- * some continuity, and not so many drastic changes).
- *
- * A bit of history on the various formats
- *      MSVC 1.0        PDB v1 (new format for debug info)
- *      MSVC 2.0        Inclusion in link of debug info (PDB v2)
- *      MSVC 5.0        Types are 24 bits (instead of 16 for <= 4.x)
- *      MSVC x.0        PDB (change in internal streams layout)
- *        
- *      .DBG            Contains COFF, FPO and Codeview info
- *      .PDB            New format for debug info (information is
- *                      derived from Codeview information)
- *      VCx0.PDB        x major MSVC number, stores types, while
- *                      <project>.PDB stores symbols.
- *
- * Debug information can either be found in the debug section of a PE
- * module (in something close to a .DBG file), or the debug section
- * can actually refer to an external file, which can be in turn,
- * either a .DBG or .PDB file. 
- *
- * Regarding PDB files:
- * -------------------
- * They are implemented as a set of internal files (as a small file
- * system). The file is split into blocks, an internal file is made
- * of a set of blocks. Internal files are accessed through
- * numbers. For example, 
- * 1/ is the ROOT (basic information on the file)
- * 2/ is the Symbol information (global symbols, local variables...)
- * 3/ is the Type internal file (each the symbols can have type
- * information associated with it).
- *
- * Over the years, three formats existed for the PDB:
- * - ?? was rather linked to 16 bit code (our support shall be rather
- *   bad)
- * - JG: it's the signature embedded in the file header. This format
- *   has been used in MSVC 2.0 => 5.0.
- * - DS: it's the signature embedded in the file header. It's the
- *   current format supported my MS.
- *
- * Types internal stream
- * ---------------------
- * Types (from the Type internal file) have existed in three flavors
- * (note that those flavors came as historical evolution, but there
- * isn't a one to one link between types evolution and PDB formats'
- * evolutions:
- * - the first flavor (suffixed by V1 in this file), where the types
- *   and subtypes are 16 bit entities; and where strings are in Pascal
- *   format (first char is their length and are not 0 terminated) 
- * - the second flavor (suffixed by V2) differs from first flavor with
- *   types and subtypes as 32 bit entities. This forced some
- *   reordering of fields in some types
- * - the third flavor (suffixed by V3) differs from second flavor with
- *   strings stored as C strings (ie are 0 terminated, instead of
- *   length prefixed)
- * The different flavors can coexist in the same file (is this really
- * true ??)
- * 
- * For the evolution of types, the need of the second flavor was the
- * number of types to be defined (limited to 0xFFFF, including the C
- * basic types); the need of the third flavor is the increase of
- * symbol size (to be greated than 256), which was likely needed for
- * complex C++ types (nested + templates).
- *
- * It's somehow difficult to represent the layout of those types on
- * disk because:
- * - some integral values are stored as numeric leaf, which size is
- *   variable depending on its value
- * 
- * Symbols internal stream
- * -----------------------
- * Here also we find three flavors (that we've suffixed with _V1, _V2
- * and _V3) even if their evolution is closer to the evolution of
- * types, they are not completely linked together.
- */
-
-#include "pshpack1.h"
-
-/* ======================================== *
- *             Type information
- * ======================================== */
-
-struct p_string
-{
-    unsigned char               namelen;
-    char                        name[1];
-};
-
-union codeview_type
-{
-    struct
-    {
-        unsigned short int      len;
-        short int               id;
-    } generic;
-
-    struct
-    {
-        unsigned short int      len;
-        short int               id;
-        short int               attribute;
-        short int               type;
-    } modifier_v1;
-
-    struct
-    {
-        unsigned short int      len;
-        short int               id;
-        int                     type;
-        short int               attribute;
-    } modifier_v2;
-
-    struct
-    {
-        unsigned short int      len;
-        short int               id;
-        short int               attribute;
-        short int               datatype;
-        struct p_string         p_name;
-    } pointer_v1;
-
-    struct
-    {
-        unsigned short int      len;
-        short int               id;
-        unsigned int            datatype;
-        unsigned int            attribute;
-        struct p_string         p_name;
-    } pointer_v2;
-
-    struct
-    {
-        unsigned short int      len;
-        short int               id;
-        short int               elemtype;
-        short int               idxtype;
-        unsigned short int      arrlen;     /* numeric leaf */
-#if 0
-        struct p_string         p_name;
-#endif
-    } array_v1;
-
-    struct
-    {
-        unsigned short int      len;
-        short int               id;
-        unsigned int            elemtype;
-        unsigned int            idxtype;
-        unsigned short int      arrlen;    /* numeric leaf */
-#if 0
-        struct p_string         p_name;
-#endif
-    } array_v2;
-
-    struct
-    {
-        unsigned short int      len;
-        short int               id;
-        unsigned int            elemtype;
-        unsigned int            idxtype;
-        unsigned short int      arrlen;    /* numeric leaf */
-#if 0
-        char                    name[1];
-#endif
-    } array_v3;
-
-    struct
-    {
-        unsigned short int      len;
-        short int               id;
-        short int               n_element;
-        short int               fieldlist;
-        short int               property;
-        short int               derived;
-        short int               vshape;
-        unsigned short int      structlen;  /* numeric leaf */
-#if 0
-        struct p_string         p_name;
-#endif
-    } struct_v1;
-
-    struct
-    {
-        unsigned short int      len;
-        short int               id;
-        short int               n_element;
-        short int               property;
-        unsigned int            fieldlist;
-        unsigned int            derived;
-        unsigned int            vshape;
-        unsigned short int      structlen;  /* numeric leaf */
-#if 0
-        struct p_string         p_name;
-#endif
-    } struct_v2;
-
-    struct
-    {
-        unsigned short int      len;
-        short int               id;
-        short int               n_element;
-        short int               property;
-        unsigned int            fieldlist;
-        unsigned int            derived;
-        unsigned int            vshape;
-        unsigned short int      structlen;  /* numeric leaf */
-#if 0
-        char                    name[1];
-#endif
-    } struct_v3;
-
-    struct
-    {
-        unsigned short int      len;
-        short int               id;
-        short int               count;
-        short int               fieldlist;
-        short int               property;
-        unsigned short int      un_len;     /* numeric leaf */
-#if 0
-        struct p_string         p_name;
-#endif
-    } union_v1;
-
-    struct
-    {
-        unsigned short int      len;
-        short int               id;
-        short int               count;
-        short int               property;
-        unsigned int            fieldlist;
-        unsigned short int      un_len;     /* numeric leaf */
-#if 0
-        struct p_string         p_name;
-#endif
-    } union_v2;
-
-    struct
-    {
-        unsigned short int      len;
-        short int               id;
-        short int               count;
-        short int               property;
-        unsigned int            fieldlist;
-        unsigned short int      un_len;     /* numeric leaf */
-#if 0
-        char                    name[1];
-#endif
-    } union_v3;
-
-    struct
-    {
-        unsigned short int      len;
-        short int               id;
-        short int               count;
-        short int               type;
-        short int               fieldlist;
-        short int               property;
-        struct p_string         p_name;
-    } enumeration_v1;
-
-    struct
-    {
-        unsigned short int      len;
-        short int               id;
-        short int               count;
-        short int               property;
-        unsigned int            type;
-        unsigned int            fieldlist;
-        struct p_string         p_name;
-    } enumeration_v2;
-
-    struct
-    {
-        unsigned short int      len;
-        short int               id;
-        short int               count;
-        short int               property;
-        unsigned int            type;
-        unsigned int            fieldlist;
-        char                    name[1];
-    } enumeration_v3;
-
-    struct
-    {
-        unsigned short int      len;
-        short int               id;
-        unsigned short int      rvtype;
-        unsigned char           call;
-        unsigned char           reserved;
-        unsigned short int      params;
-        unsigned short int      arglist;
-    } procedure_v1;
-
-    struct
-    {
-        unsigned short int      len;
-        short int               id;
-        unsigned int            rvtype;
-        unsigned char           call;
-        unsigned char           reserved;
-        unsigned short int      params;
-        unsigned int            arglist;
-    } procedure_v2;
-
-    struct
-    {
-        unsigned short int      len;
-        short int               id;
-        unsigned short int      rvtype;
-        unsigned short int      class_type;
-        unsigned short int      this_type;
-        unsigned char           call;
-        unsigned char           reserved;
-        unsigned short int      params;
-        unsigned short int      arglist;
-        unsigned int            this_adjust;
-    } mfunction_v1;
-
-    struct
-    {
-        unsigned short int      len;
-        short int               id;
-        unsigned                unknown1; /* could be this_type ??? */
-        unsigned int            class_type;
-        unsigned int            rvtype;
-        unsigned char           call;
-        unsigned char           reserved;
-        unsigned short          params;
-        unsigned int            arglist;
-        unsigned int            this_adjust;
-    } mfunction_v2;
-};
-
-union codeview_reftype
-{
-    struct
-    {
-        unsigned short int      len;
-        short int               id;
-    } generic;
-
-    struct
-    {
-        unsigned short int      len;
-        short int               id;
-        unsigned char           list[1];
-    } fieldlist;
-
-    struct
-    {
-        unsigned short int      len;
-        short int               id;
-        unsigned char           nbits;
-        unsigned char           bitoff;
-        unsigned short          type;
-    } bitfield_v1;
-    
-    struct
-    {
-        unsigned short int      len;
-        short int               id;
-        unsigned int            type;
-        unsigned char           nbits;
-        unsigned char           bitoff;
-    } bitfield_v2;
-
-    struct
-    {
-        unsigned short int      len;
-        short int               id;
-        unsigned short          num;
-        unsigned short          args[1];
-    } arglist_v1;
-
-    struct
-    {
-        unsigned short int      len;
-        short int               id;
-        unsigned                num;
-        unsigned                args[1];
-    } arglist_v2;
-
-};
-
-union codeview_fieldtype
-{
-    struct
-    {
-        short int		id;
-    } generic;
-
-    struct
-    {
-        short int		id;
-        short int		type;
-        short int		attribute;
-        unsigned short int	offset;     /* numeric leaf */
-    } bclass_v1;
-
-    struct
-    {
-        short int		id;
-        short int		attribute;
-        unsigned int	        type;
-        unsigned short int	offset;     /* numeric leaf */
-    } bclass_v2;
-
-    struct
-    {
-        short int		id;
-        short int		btype;
-        short int		vbtype;
-        short int		attribute;
-        unsigned short int	vbpoff;     /* numeric leaf */
-#if 0
-        unsigned short int	vboff;      /* numeric leaf */
-#endif
-    } vbclass_v1;
-
-    struct
-    {
-        short int		id;
-        short int		attribute;
-        unsigned int	        btype;
-        unsigned int	        vbtype;
-        unsigned short int	vbpoff;     /* numeric leaf */
-#if 0
-        unsigned short int	vboff;      /* numeric leaf */
-#endif
-    } vbclass_v2;
-
-    struct
-    {
-        short int		id;
-        short int		attribute;
-        unsigned short int	value;     /* numeric leaf */
-#if 0
-        struct p_string         p_name;
-#endif
-    } enumerate_v1;
-
-   struct
-    {
-        short int               id;
-        short int               attribute;
-        unsigned short int      value;     /* numeric leaf */
-#if 0
-        char                    name[1];
-#endif
-    } enumerate_v3;
-
-    struct
-    {
-        short int		id;
-        short int		type;
-        struct p_string         p_name;
-    } friendfcn_v1;
-
-    struct
-    {
-        short int		id;
-        short int		_pad0;
-        unsigned int	        type;
-        struct p_string         p_name;
-    } friendfcn_v2;
-
-    struct
-    {
-        short int		id;
-        short int		type;
-        short int		attribute;
-        unsigned short int	offset;    /* numeric leaf */
-#if 0
-        struct p_string         p_name;
-#endif
-    } member_v1;
-
-    struct
-    {
-        short int		id;
-        short int		attribute;
-        unsigned int	        type;
-        unsigned short int	offset;    /* numeric leaf */
-#if 0
-        struct p_string         p_name;
-#endif
-    } member_v2;
-
-    struct
-    {
-        short int               id;
-        short int               attribute;
-        unsigned int            type;
-        unsigned short int      offset; /* numeric leaf */
-#if 0
-        unsigned char           name[1];
-#endif
-    }
-    member_v3;
-
-    struct
-    {
-        short int		id;
-        short int		type;
-        short int		attribute;
-        struct p_string         p_name;
-    } stmember_v1;
-
-    struct
-    {
-        short int		id;
-        short int		attribute;
-        unsigned int	        type;
-        struct p_string         p_name;
-    } stmember_v2;
-
-    struct
-    {
-        short int		id;
-        short int		count;
-        short int		mlist;
-        struct p_string         p_name;
-    } method_v1;
-
-    struct
-    {
-        short int		id;
-        short int		count;
-        unsigned int	        mlist;
-        struct p_string         p_name;
-    } method_v2;
-
-    struct
-    {
-        short int		id;
-        short int		index;
-        struct p_string         p_name;
-    } nesttype_v1;
-
-    struct
-    {
-        short int		id;
-        short int		_pad0;
-        unsigned int	        index;
-        struct p_string         p_name;
-    } nesttype_v2;
-
-    struct
-    {
-        short int		id;
-        short int		type;
-    } vfunctab_v1;
-
-    struct
-    {
-        short int		id;
-        short int		_pad0;
-        unsigned int	        type;
-    } vfunctab_v2;
-
-    struct
-    {
-        short int		id;
-        short int		type;
-    } friendcls_v1;
-
-    struct
-    {
-        short int		id;
-        short int		_pad0;
-        unsigned int	        type;
-    } friendcls_v2;
-
-    struct
-    {
-        short int		id;
-        short int		attribute;
-        short int		type;
-        struct p_string         p_name;
-    } onemethod_v1;
-
-    struct
-    {
-        short int		id;
-        short int		attribute;
-        short int		type;
-        unsigned int	        vtab_offset;
-        struct p_string         p_name;
-    } onemethod_virt_v1;
-
-    struct
-    {
-        short int		id;
-        short int		attribute;
-        unsigned int 	        type;
-        struct p_string         p_name;
-    } onemethod_v2;
-
-    struct
-    {
-        short int		id;
-        short int		attribute;
-        unsigned int	        type;
-        unsigned int	        vtab_offset;
-        struct p_string         p_name;
-    } onemethod_virt_v2;
-
-    struct
-    {
-        short int		id;
-        short int		type;
-        unsigned int	        offset;
-    } vfuncoff_v1;
-
-    struct
-    {
-        short int		id;
-        short int		_pad0;
-        unsigned int	        type;
-        unsigned int	        offset;
-    } vfuncoff_v2;
-
-    struct
-    {
-        short int		id;
-        short int		attribute;
-        short int		index;
-        struct p_string         p_name;
-    } nesttypeex_v1;
-
-    struct
-    {
-        short int		id;
-        short int		attribute;
-        unsigned int	        index;
-        struct p_string         p_name;
-    } nesttypeex_v2;
-
-    struct
-    {
-        short int		id;
-        short int		attribute;
-        unsigned int	        type;
-        struct p_string         p_name;
-    } membermodify_v2;
-
-};
-
-
-/*
- * This covers the basic datatypes that VC++ seems to be using these days.
- * 32 bit mode only.  There are additional numbers for the pointers in 16
- * bit mode.  There are many other types listed in the documents, but these
- * are apparently not used by the compiler, or represent pointer types
- * that are not used.
- */
-#define T_NOTYPE	        0x0000	/* Notype */
-#define T_ABS		        0x0001	/* Abs */
-#define T_VOID		        0x0003	/* Void */
-#define T_CHAR		        0x0010	/* signed char */
-#define T_SHORT		        0x0011	/* short */
-#define T_LONG		        0x0012	/* long */
-#define T_QUAD		        0x0013	/* long long */
-#define T_UCHAR		        0x0020	/* unsigned  char */
-#define T_USHORT	        0x0021	/* unsigned short */
-#define T_ULONG		        0x0022	/* unsigned long */
-#define T_UQUAD		        0x0023	/* unsigned long long */
-#define T_REAL32	        0x0040	/* float */
-#define T_REAL64	        0x0041	/* double */
-#define T_RCHAR		        0x0070	/* real char */
-#define T_WCHAR		        0x0071	/* wide char */
-#define T_INT4		        0x0074	/* int */
-#define T_UINT4		        0x0075	/* unsigned int */
-
-#define T_32PVOID	        0x0403	/* 32 bit near pointer to void */
-#define T_32PCHAR	        0x0410  /* 16:32 near pointer to signed char */
-#define T_32PSHORT	        0x0411  /* 16:32 near pointer to short */
-#define T_32PLONG	        0x0412  /* 16:32 near pointer to int */
-#define T_32PQUAD	        0x0413  /* 16:32 near pointer to long long */
-#define T_32PUCHAR	        0x0420  /* 16:32 near pointer to unsigned char */
-#define T_32PUSHORT	        0x0421  /* 16:32 near pointer to unsigned short */
-#define T_32PULONG	        0x0422	/* 16:32 near pointer to unsigned int */
-#define T_32PUQUAD	        0x0423  /* 16:32 near pointer to long long */
-#define T_32PREAL32	        0x0440	/* 16:32 near pointer to float */
-#define T_32PREAL64	        0x0441	/* 16:32 near pointer to float */
-#define T_32PRCHAR	        0x0470	/* 16:32 near pointer to real char */
-#define T_32PWCHAR	        0x0471	/* 16:32 near pointer to real char */
-#define T_32PINT4	        0x0474	/* 16:32 near pointer to int */
-#define T_32PUINT4	        0x0475  /* 16:32 near pointer to unsigned int */
-
-
-#define LF_MODIFIER_V1          0x0001
-#define LF_POINTER_V1           0x0002
-#define LF_ARRAY_V1             0x0003
-#define LF_CLASS_V1             0x0004
-#define LF_STRUCTURE_V1         0x0005
-#define LF_UNION_V1             0x0006
-#define LF_ENUM_V1              0x0007
-#define LF_PROCEDURE_V1         0x0008
-#define LF_MFUNCTION_V1         0x0009
-#define LF_VTSHAPE_V1           0x000a
-#define LF_COBOL0_V1            0x000b
-#define LF_COBOL1_V1            0x000c
-#define LF_BARRAY_V1            0x000d
-#define LF_LABEL_V1             0x000e
-#define LF_NULL_V1              0x000f
-#define LF_NOTTRAN_V1           0x0010
-#define LF_DIMARRAY_V1          0x0011
-#define LF_VFTPATH_V1           0x0012
-#define LF_PRECOMP_V1           0x0013
-#define LF_ENDPRECOMP_V1        0x0014
-#define LF_OEM_V1               0x0015
-#define LF_TYPESERVER_V1        0x0016
-
-#define LF_MODIFIER_V2          0x1001     /* variants with new 32-bit type indices (V2) */
-#define LF_POINTER_V2           0x1002
-#define LF_ARRAY_V2             0x1003
-#define LF_CLASS_V2             0x1004
-#define LF_STRUCTURE_V2         0x1005
-#define LF_UNION_V2             0x1006
-#define LF_ENUM_V2              0x1007
-#define LF_PROCEDURE_V2         0x1008
-#define LF_MFUNCTION_V2         0x1009
-#define LF_COBOL0_V2            0x100a
-#define LF_BARRAY_V2            0x100b
-#define LF_DIMARRAY_V2          0x100c
-#define LF_VFTPATH_V2           0x100d
-#define LF_PRECOMP_V2           0x100e
-#define LF_OEM_V2               0x100f
-
-#define LF_SKIP_V1              0x0200
-#define LF_ARGLIST_V1           0x0201
-#define LF_DEFARG_V1            0x0202
-#define LF_LIST_V1              0x0203
-#define LF_FIELDLIST_V1         0x0204
-#define LF_DERIVED_V1           0x0205
-#define LF_BITFIELD_V1          0x0206
-#define LF_METHODLIST_V1        0x0207
-#define LF_DIMCONU_V1           0x0208
-#define LF_DIMCONLU_V1          0x0209
-#define LF_DIMVARU_V1           0x020a
-#define LF_DIMVARLU_V1          0x020b
-#define LF_REFSYM_V1            0x020c
-
-#define LF_SKIP_V2              0x1200    /* variants with new 32-bit type indices (V2) */
-#define LF_ARGLIST_V2           0x1201
-#define LF_DEFARG_V2            0x1202
-#define LF_FIELDLIST_V2         0x1203
-#define LF_DERIVED_V2           0x1204
-#define LF_BITFIELD_V2          0x1205
-#define LF_METHODLIST_V2        0x1206
-#define LF_DIMCONU_V2           0x1207
-#define LF_DIMCONLU_V2          0x1208
-#define LF_DIMVARU_V2           0x1209
-#define LF_DIMVARLU_V2          0x120a
-
-/* Field lists */
-#define LF_BCLASS_V1            0x0400
-#define LF_VBCLASS_V1           0x0401
-#define LF_IVBCLASS_V1          0x0402
-#define LF_ENUMERATE_V1         0x0403
-#define LF_FRIENDFCN_V1         0x0404
-#define LF_INDEX_V1             0x0405
-#define LF_MEMBER_V1            0x0406
-#define LF_STMEMBER_V1          0x0407
-#define LF_METHOD_V1            0x0408
-#define LF_NESTTYPE_V1          0x0409
-#define LF_VFUNCTAB_V1          0x040a
-#define LF_FRIENDCLS_V1         0x040b
-#define LF_ONEMETHOD_V1         0x040c
-#define LF_VFUNCOFF_V1          0x040d
-#define LF_NESTTYPEEX_V1        0x040e
-#define LF_MEMBERMODIFY_V1      0x040f
-
-#define LF_BCLASS_V2            0x1400    /* variants with new 32-bit type indices (V2) */
-#define LF_VBCLASS_V2           0x1401
-#define LF_IVBCLASS_V2          0x1402
-#define LF_FRIENDFCN_V2         0x1403
-#define LF_INDEX_V2             0x1404
-#define LF_MEMBER_V2            0x1405
-#define LF_STMEMBER_V2          0x1406
-#define LF_METHOD_V2            0x1407
-#define LF_NESTTYPE_V2          0x1408
-#define LF_VFUNCTAB_V2          0x1409
-#define LF_FRIENDCLS_V2         0x140a
-#define LF_ONEMETHOD_V2         0x140b
-#define LF_VFUNCOFF_V2          0x140c
-#define LF_NESTTYPEEX_V2        0x140d
-
-#define LF_ENUMERATE_V3         0x1502
-#define LF_ARRAY_V3             0x1503
-#define LF_CLASS_V3             0x1504
-#define LF_STRUCTURE_V3         0x1505
-#define LF_UNION_V3             0x1506
-#define LF_ENUM_V3              0x1507
-#define LF_MEMBER_V3            0x150d
-
-#define LF_NUMERIC              0x8000    /* numeric leaf types */
-#define LF_CHAR                 0x8000
-#define LF_SHORT                0x8001
-#define LF_USHORT               0x8002
-#define LF_LONG                 0x8003
-#define LF_ULONG                0x8004
-#define LF_REAL32               0x8005
-#define LF_REAL64               0x8006
-#define LF_REAL80               0x8007
-#define LF_REAL128              0x8008
-#define LF_QUADWORD             0x8009
-#define LF_UQUADWORD            0x800a
-#define LF_REAL48               0x800b
-#define LF_COMPLEX32            0x800c
-#define LF_COMPLEX64            0x800d
-#define LF_COMPLEX80            0x800e
-#define LF_COMPLEX128           0x800f
-#define LF_VARSTRING            0x8010
-
-/* ======================================== *
- *            Symbol information
- * ======================================== */
-
-union codeview_symbol
-{
-    struct
-    {
-        short int	        len;
-        short int	        id;
-    } generic;
-
-    struct
-    {
-	short int	        len;
-	short int	        id;
-	unsigned int	        offset;
-	unsigned short	        segment;
-	unsigned short	        symtype;
-        struct p_string         p_name;
-    } data_v1;
-
-    struct
-    {
-	short int	        len;
-	short int	        id;
-	unsigned int	        symtype;
-	unsigned int	        offset;
-	unsigned short	        segment;
-        struct p_string         p_name;
-    } data_v2;
-
-    struct
-    {
-        short int               len;
-        short int               id;
-        unsigned int            symtype;
-        unsigned int            offset;
-        unsigned short          segment;
-        char                    name[1];
-    } data_v3;
-
-    struct
-    {
-	short int	        len;
-	short int	        id;
-	unsigned int	        pparent;
-	unsigned int	        pend;
-	unsigned int	        next;
-	unsigned int	        offset;
-	unsigned short	        segment;
-	unsigned short	        thunk_len;
-	unsigned char	        thtype;
-        struct p_string         p_name;
-    } thunk_v1;
-
-    struct
-    {
-        short int               len;
-        short int               id;
-        unsigned int            pparent;
-        unsigned int            pend;
-        unsigned int            next;
-        unsigned int            offset;
-        unsigned short          segment;
-        unsigned short          thunk_len;
-        unsigned char           thtype;
-        char                    name[1];
-    } thunk_v3;
-
-    struct
-    {
-	short int	        len;
-	short int	        id;
-	unsigned int	        pparent;
-	unsigned int	        pend;
-	unsigned int	        next;
-	unsigned int	        proc_len;
-	unsigned int	        debug_start;
-	unsigned int	        debug_end;
-	unsigned int	        offset;
-	unsigned short	        segment;
-	unsigned short	        proctype;
-	unsigned char	        flags;
-        struct p_string         p_name;
-    } proc_v1;
-
-    struct
-    {
-	short int	        len;
-	short int	        id;
-	unsigned int	        pparent;
-	unsigned int	        pend;
-	unsigned int	        next;
-	unsigned int	        proc_len;
-	unsigned int	        debug_start;
-	unsigned int	        debug_end;
-	unsigned int	        proctype;
-	unsigned int	        offset;
-	unsigned short	        segment;
-	unsigned char	        flags;
-        struct p_string         p_name;
-    } proc_v2;
-
-    struct
-    {
-        short int               len;
-        short int               id;
-        unsigned int            pparent;
-        unsigned int            pend;
-        unsigned int            next;
-        unsigned int            proc_len;
-        unsigned int            debug_start;
-        unsigned int            debug_end;
-        unsigned int            proctype;
-        unsigned int            offset;
-        unsigned short          segment;
-        unsigned char           flags;
-        char                    name[1];
-    } proc_v3;
-
-    struct
-    {
-	short int	        len;	        /* Total length of this entry */
-	short int	        id;		/* Always S_BPREL_V1 */
-	unsigned int	        offset;	        /* Stack offset relative to BP */
-	unsigned short	        symtype;
-        struct p_string         p_name;
-    } stack_v1;
-
-    struct
-    {
-	short int	        len;	        /* Total length of this entry */
-	short int	        id;		/* Always S_BPREL_V2 */
-	unsigned int	        offset;	        /* Stack offset relative to EBP */
-	unsigned int	        symtype;
-        struct p_string         p_name;
-    } stack_v2;
-
-    struct
-    {
-        short int               len;            /* Total length of this entry */
-        short int               id;             /* Always S_BPREL_V3 */
-        int                     offset;         /* Stack offset relative to BP */
-        unsigned int            symtype;
-        char                    name[1];
-    } stack_v3;
-
-    struct
-    {
-	short int	        len;	        /* Total length of this entry */
-	short int	        id;		/* Always S_REGISTER */
-        unsigned short          type;
-        unsigned short          reg;
-        struct p_string         p_name;
-        /* don't handle register tracking */
-    } register_v1;
-
-    struct
-    {
-	short int	        len;	        /* Total length of this entry */
-	short int	        id;		/* Always S_REGISTER_V2 */
-        unsigned int            type;           /* check whether type & reg are correct */
-        unsigned short          reg;
-        struct p_string         p_name;
-        /* don't handle register tracking */
-    } register_v2;
-
-    struct
-    {
-        short int               len;
-        short int               id;
-        unsigned int            parent;
-        unsigned int            end;
-        unsigned int            length;
-        unsigned int            offset;
-        unsigned short          segment;
-        struct p_string         p_name;
-    } block_v1;
-
-    struct
-    {
-        short int               len;
-        short int               id;
-        unsigned int            parent;
-        unsigned int            end;
-        unsigned int            length;
-        unsigned int            offset;
-        unsigned short          segment;
-        char                    name[1];
-    } block_v3;
-
-    struct
-    {
-        short int               len;
-        short int               id;
-        unsigned int            offset;
-        unsigned short          segment;
-        unsigned char           flags;
-        struct p_string         p_name;
-    } label_v1;
-
-    struct
-    {
-        short int               len;
-        short int               id;
-        unsigned int            offset;
-        unsigned short          segment;
-        unsigned char           flags;
-        char                    name[1];
-    } label_v3;
-
-    struct
-    {
-        short int               len;
-        short int               id;
-        unsigned short          type;
-        unsigned short          cvalue;         /* numeric leaf */
-#if 0
-        struct p_string         p_name;
-#endif
-    } constant_v1;
-
-    struct
-    {
-        short int               len;
-        short int               id;
-        unsigned                type;
-        unsigned short          cvalue;         /* numeric leaf */
-#if 0
-        struct p_string         p_name;
-#endif
-    } constant_v2;
-
-    struct
-    {
-        short int               len;
-        short int               id;
-        unsigned                type;
-        unsigned short          cvalue;
-#if 0
-        char                    name[1];
-#endif
-    } constant_v3;
-
-    struct
-    {
-        short int               len;
-        short int               id;
-        unsigned short          type;
-        struct p_string         p_name;
-    } udt_v1;
-
-    struct
-    {
-        short int               len;
-        short int               id;
-        unsigned                type;
-        struct p_string         p_name;
-    } udt_v2;
-
-    struct
-    {
-        short int               len;
-        short int               id;
-        unsigned int            type;
-        char                    name[1];
-    } udt_v3;
-
-    struct
-    {
-        short int               len;
-        short int               id;
-        char                    signature[4];
-        struct p_string         p_name;
-    } objname_v1;
-
-    struct
-    {
-        short int               len;
-        short int               id;
-        unsigned int            unknown;
-        struct p_string         p_name;
-    } compile_v1;
-
-    struct
-    {
-        short int               len;
-        short int               id;
-        unsigned                unknown1[4];
-        unsigned short          unknown2;
-        struct p_string         p_name;
-    } compile_v2;
-
-    struct
-    {
-        short int               len;
-        short int               id;
-        unsigned int            unknown;
-        char                    name[1];
-    } compile_v3;
-
-    struct
-    {
-        short int               len;
-        short int               id;
-        unsigned int            offset;
-        unsigned short          segment;
-    } ssearch_v1;
-};
-
-#define S_COMPILE_V1    0x0001
-#define S_REGISTER_V1   0x0002
-#define S_CONSTANT_V1   0x0003
-#define S_UDT_V1        0x0004
-#define S_SSEARCH_V1    0x0005
-#define S_END_V1        0x0006
-#define S_SKIP_V1       0x0007
-#define S_CVRESERVE_V1  0x0008
-#define S_OBJNAME_V1    0x0009
-#define S_ENDARG_V1     0x000a
-#define S_COBOLUDT_V1   0x000b
-#define S_MANYREG_V1    0x000c
-#define S_RETURN_V1     0x000d
-#define S_ENTRYTHIS_V1  0x000e
-
-#define S_BPREL_V1      0x0200
-#define S_LDATA_V1      0x0201
-#define S_GDATA_V1      0x0202
-#define S_PUB_V1        0x0203
-#define S_LPROC_V1      0x0204
-#define S_GPROC_V1      0x0205
-#define S_THUNK_V1      0x0206
-#define S_BLOCK_V1      0x0207
-#define S_WITH_V1       0x0208
-#define S_LABEL_V1      0x0209
-#define S_CEXMODEL_V1   0x020a
-#define S_VFTPATH_V1    0x020b
-#define S_REGREL_V1     0x020c
-#define S_LTHREAD_V1    0x020d
-#define S_GTHREAD_V1    0x020e
-
-#define S_PROCREF_V1    0x0400
-#define S_DATAREF_V1    0x0401
-#define S_ALIGN_V1      0x0402
-#define S_LPROCREF_V1   0x0403
-
-#define S_REGISTER_V2   0x1001 /* Variants with new 32-bit type indices */
-#define S_CONSTANT_V2   0x1002
-#define S_UDT_V2        0x1003
-#define S_COBOLUDT_V2   0x1004
-#define S_MANYREG_V2    0x1005
-#define S_BPREL_V2      0x1006
-#define S_LDATA_V2      0x1007
-#define S_GDATA_V2      0x1008
-#define S_PUB_V2        0x1009
-#define S_LPROC_V2      0x100a
-#define S_GPROC_V2      0x100b
-#define S_VFTTABLE_V2   0x100c
-#define S_REGREL_V2     0x100d
-#define S_LTHREAD_V2    0x100e
-#define S_GTHREAD_V2    0x100f
-#if 0
-#define S_XXXXXXXXX_32  0x1012  /* seems linked to a function, content unknown */
-#endif
-#define S_COMPILE_V2    0x1013
-
-#define S_COMPILE_V3    0x1101
-#define S_THUNK_V3      0x1102
-#define S_BLOCK_V3      0x1103
-#define S_LABEL_V3      0x1105
-#define S_CONSTANT_V3   0x1107
-#define S_UDT_V3        0x1108
-#define S_BPREL_V3      0x110B
-#define S_LDATA_V3      0x110C
-#define S_GDATA_V3      0x110D
-#define S_PUB_DATA_V3   0x110E
-#define S_LPROC_V3      0x110F
-#define S_GPROC_V3      0x1110
-#define S_MSTOOL_V3     0x1116  /* not really understood */
-#define S_PUB_FUNC1_V3  0x1125  /* didn't get the difference between the two */
-#define S_PUB_FUNC2_V3  0x1127
-
-/* ======================================== *
- *          Line number information
- * ======================================== */
-
-union any_size
-{
-    const char*                 c;
-    const unsigned char*        uc;
-    const short*                s;
-    const int*                  i;
-    const unsigned int*         ui;
-};
-
-struct startend
-{
-    unsigned int	        start;
-    unsigned int	        end;
-};
-
-struct codeview_linetab
-{
-    unsigned int		nline;
-    unsigned int		segno;
-    unsigned int		start;
-    unsigned int		end;
-    unsigned int                source;
-    const unsigned short*       linetab;
-    const unsigned int*         offtab;
-};
-
-
-/* ======================================== *
- *            PDB file information
- * ======================================== */
-
-
-struct PDB_FILE
-{
-    DWORD               size;
-    DWORD               unknown;
-};
-
-struct PDB_JG_HEADER
-{
-    CHAR                ident[40];
-    DWORD               signature;
-    DWORD               block_size;
-    WORD                free_list;
-    WORD                total_alloc;
-    struct PDB_FILE     toc;
-    WORD                toc_block[1];
-};
-
-struct PDB_DS_HEADER
-{
-    char                signature[32];
-    DWORD               block_size;
-    DWORD               unknown1;
-    DWORD               num_pages;
-    DWORD               toc_size;
-    DWORD               unknown2;
-    DWORD               toc_page;
-};
-
-struct PDB_JG_TOC
-{
-    DWORD               num_files;
-    struct PDB_FILE     file[1];
-};
-
-struct PDB_DS_TOC
-{
-    DWORD               num_files;
-    DWORD               file_size[1];
-};
-
-struct PDB_JG_ROOT
-{
-    DWORD               Version;
-    DWORD               TimeDateStamp;
-    DWORD               Age;
-    DWORD               cbNames;
-    CHAR                names[1];
-};
-
-struct PDB_DS_ROOT
-{
-    DWORD               Version;
-    DWORD               TimeDateStamp;
-    DWORD               Age;
-    GUID                guid;
-    DWORD               cbNames;
-    CHAR                names[1];
-};
-
-typedef struct _PDB_TYPES_OLD
-{
-    DWORD       version;
-    WORD        first_index;
-    WORD        last_index;
-    DWORD       type_size;
-    WORD        file;
-    WORD        pad;
-} PDB_TYPES_OLD, *PPDB_TYPES_OLD;
-
-typedef struct _PDB_TYPES
-{
-    DWORD       version;
-    DWORD       type_offset;
-    DWORD       first_index;
-    DWORD       last_index;
-    DWORD       type_size;
-    WORD        file;
-    WORD        pad;
-    DWORD       hash_size;
-    DWORD       hash_base;
-    DWORD       hash_offset;
-    DWORD       hash_len;
-    DWORD       search_offset;
-    DWORD       search_len;
-    DWORD       unknown_offset;
-    DWORD       unknown_len;
-} PDB_TYPES, *PPDB_TYPES;
-
-typedef struct _PDB_SYMBOL_RANGE
-{
-    WORD        segment;
-    WORD        pad1;
-    DWORD       offset;
-    DWORD       size;
-    DWORD       characteristics;
-    WORD        index;
-    WORD        pad2;
-} PDB_SYMBOL_RANGE, *PPDB_SYMBOL_RANGE;
-
-typedef struct _PDB_SYMBOL_RANGE_EX
-{
-    WORD        segment;
-    WORD        pad1;
-    DWORD       offset;
-    DWORD       size;
-    DWORD       characteristics;
-    WORD        index;
-    WORD        pad2;
-    DWORD       timestamp;
-    DWORD       unknown;
-} PDB_SYMBOL_RANGE_EX, *PPDB_SYMBOL_RANGE_EX;
-
-typedef struct _PDB_SYMBOL_FILE
-{
-    DWORD       unknown1;
-    PDB_SYMBOL_RANGE range;
-    WORD        flag;
-    WORD        file;
-    DWORD       symbol_size;
-    DWORD       lineno_size;
-    DWORD       unknown2;
-    DWORD       nSrcFiles;
-    DWORD       attribute;
-    CHAR        filename[1];
-} PDB_SYMBOL_FILE, *PPDB_SYMBOL_FILE;
-
-typedef struct _PDB_SYMBOL_FILE_EX
-{
-    DWORD       unknown1;
-    PDB_SYMBOL_RANGE_EX range;
-    WORD        flag;
-    WORD        file;
-    DWORD       symbol_size;
-    DWORD       lineno_size;
-    DWORD       unknown2;
-    DWORD       nSrcFiles;
-    DWORD       attribute;
-    DWORD       reserved[2];
-    CHAR        filename[1];
-} PDB_SYMBOL_FILE_EX, *PPDB_SYMBOL_FILE_EX;
-
-typedef struct _PDB_SYMBOL_SOURCE
-{
-    WORD        nModules;
-    WORD        nSrcFiles;
-    WORD        table[1];
-} PDB_SYMBOL_SOURCE, *PPDB_SYMBOL_SOURCE;
-
-typedef struct _PDB_SYMBOL_IMPORT
-{
-    DWORD       unknown1;
-    DWORD       unknown2;
-    DWORD       TimeDateStamp;
-    DWORD       Age;
-    CHAR        filename[1];
-} PDB_SYMBOL_IMPORT, *PPDB_SYMBOL_IMPORT;
-
-typedef struct _PDB_SYMBOLS_OLD
-{
-    WORD        hash1_file;
-    WORD        hash2_file;
-    WORD        gsym_file;
-    WORD        pad;
-    DWORD       module_size;
-    DWORD       offset_size;
-    DWORD       hash_size;
-    DWORD       srcmodule_size;
-} PDB_SYMBOLS_OLD, *PPDB_SYMBOLS_OLD;
-
-typedef struct _PDB_SYMBOLS
-{
-    DWORD       signature;
-    DWORD       version;
-    DWORD       unknown;
-    DWORD       hash1_file;
-    DWORD       hash2_file;
-    DWORD       gsym_file;
-    DWORD       module_size;
-    DWORD       offset_size;
-    DWORD       hash_size;
-    DWORD       srcmodule_size;
-    DWORD       pdbimport_size;
-    DWORD       resvd[5];
-} PDB_SYMBOLS, *PPDB_SYMBOLS;
-
-#include "poppack.h"
-
-/* ----------------------------------------------
- * Information used for parsing
- * ---------------------------------------------- */
-
-typedef struct
-{
-    DWORD  from;
-    DWORD  to;
-} OMAP_DATA;
-
-struct msc_debug_info
-{
-    struct module*              module;
-    int			        nsect;
-    const IMAGE_SECTION_HEADER* sectp;
-    int			        nomap;
-    const OMAP_DATA*            omapp;
-    const BYTE*                 root;
-};
-
-/* coff.c */
-extern BOOL coff_process_info(const struct msc_debug_info* msc_dbg);
-
-/* ===================================================
- * The old CodeView stuff (for NB09 and NB11)
- * =================================================== */
-
-#define sstModule      0x120
-#define sstTypes       0x121
-#define sstPublic      0x122
-#define sstPublicSym   0x123
-#define sstSymbols     0x124
-#define sstAlignSym    0x125
-#define sstSrcLnSeg    0x126
-#define sstSrcModule   0x127
-#define sstLibraries   0x128
-#define sstGlobalSym   0x129
-#define sstGlobalPub   0x12a
-#define sstGlobalTypes 0x12b
-#define sstMPC         0x12c
-#define sstSegMap      0x12d
-#define sstSegName     0x12e
-#define sstPreComp     0x12f
-#define sstFileIndex   0x133
-#define sstStaticSym   0x134
-
-typedef struct _CODEVIEW_HEADER_NBxx
-{
-    DWORD       dwSignature;
-    DWORD       lfoDirectory;
-} CODEVIEW_HEADER_NBxx,* PCODEVIEW_HEADER_NBxx;
-
-typedef struct _CODEVIEW_HEADER_RSDS
-{
-    DWORD       dwSignature;
-    GUID        guid;
-    DWORD       unknown;
-    CHAR        name[1];
-} CODEVIEW_HEADER_RSDS,* PCODEVIEW_HEADER_RSDS;
-
-typedef struct _CODEVIEW_PDB_DATA
-{
-    DWORD       timestamp;
-    DWORD       unknown;
-    CHAR        name[1];
-} CODEVIEW_PDB_DATA, *PCODEVIEW_PDB_DATA;
-
-typedef struct _CV_DIRECTORY_HEADER
-{
-    WORD        cbDirHeader;
-    WORD        cbDirEntry;
-    DWORD       cDir;
-    DWORD       lfoNextDir;
-    DWORD       flags;
-} CV_DIRECTORY_HEADER, *PCV_DIRECTORY_HEADER;
-
-typedef struct _CV_DIRECTORY_ENTRY
-{
-    WORD        subsection;
-    WORD        iMod;
-    DWORD       lfo;
-    DWORD       cb;
-} CV_DIRECTORY_ENTRY, *PCV_DIRECTORY_ENTRY;
-
-typedef struct _CV_ENTRY_MODULE_SEGINFO
-{
-    WORD        seg;
-    WORD        pad;
-    DWORD       offset;
-    DWORD       cbSeg;
-} CV_ENTRY_MODULE_SEGINFO;
-
-typedef struct _CV_ENTRY_MODULE
-{
-    WORD        ovlNumber;
-    WORD        iLib;
-    WORD        cSeg;
-    WORD        Style;
-/*
-    CV_ENTRY_MODULE_SEGINFO     SegInfo[cSeg];
-    p_string    Name;
-*/
-} CV_ENTRY_MODULE;
-
-typedef struct _CV_ENTRY_GLOBAL_TYPES
-{
-    DWORD       flags;
-    DWORD       cTypes;
-/*
-    DWORD       offset[cTypes];
-                types_record[];
-*/
-} CV_ENTRY_GLOBAL_TYPES;
diff --git a/include/wine/mscvpdb.h b/include/wine/mscvpdb.h
new file mode 100644
index 0000000..1bc2b7b
--- /dev/null
+++ b/include/wine/mscvpdb.h
@@ -0,0 +1,1558 @@
+/*
+ * MS debug information definitions.
+ *
+ * Copyright (C) 1996 Eric Youngdale
+ * Copyright (C) 1999-2000 Ulrich Weigand
+ * Copyright (C) 2004 Eric Pouech
+ *
+ * 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
+ */
+
+/* MS has stored all its debug information in a set of structures
+ * which has been rather consistent across the years (ie you can grasp
+ * some continuity, and not so many drastic changes).
+ *
+ * A bit of history on the various formats
+ *      MSVC 1.0        PDB v1 (new format for debug info)
+ *      MSVC 2.0        Inclusion in link of debug info (PDB v2)
+ *      MSVC 5.0        Types are 24 bits (instead of 16 for <= 4.x)
+ *      MSVC x.0        PDB (change in internal streams layout)
+ *        
+ *      .DBG            Contains COFF, FPO and Codeview info
+ *      .PDB            New format for debug info (information is
+ *                      derived from Codeview information)
+ *      VCx0.PDB        x major MSVC number, stores types, while
+ *                      <project>.PDB stores symbols.
+ *
+ * Debug information can either be found in the debug section of a PE
+ * module (in something close to a .DBG file), or the debug section
+ * can actually refer to an external file, which can be in turn,
+ * either a .DBG or .PDB file. 
+ *
+ * Regarding PDB files:
+ * -------------------
+ * They are implemented as a set of internal files (as a small file
+ * system). The file is split into blocks, an internal file is made
+ * of a set of blocks. Internal files are accessed through
+ * numbers. For example, 
+ * 1/ is the ROOT (basic information on the file)
+ * 2/ is the Symbol information (global symbols, local variables...)
+ * 3/ is the Type internal file (each the symbols can have type
+ * information associated with it).
+ *
+ * Over the years, three formats existed for the PDB:
+ * - ?? was rather linked to 16 bit code (our support shall be rather
+ *   bad)
+ * - JG: it's the signature embedded in the file header. This format
+ *   has been used in MSVC 2.0 => 5.0.
+ * - DS: it's the signature embedded in the file header. It's the
+ *   current format supported my MS.
+ *
+ * Types internal stream
+ * ---------------------
+ * Types (from the Type internal file) have existed in three flavors
+ * (note that those flavors came as historical evolution, but there
+ * isn't a one to one link between types evolution and PDB formats'
+ * evolutions:
+ * - the first flavor (suffixed by V1 in this file), where the types
+ *   and subtypes are 16 bit entities; and where strings are in Pascal
+ *   format (first char is their length and are not 0 terminated) 
+ * - the second flavor (suffixed by V2) differs from first flavor with
+ *   types and subtypes as 32 bit entities. This forced some
+ *   reordering of fields in some types
+ * - the third flavor (suffixed by V3) differs from second flavor with
+ *   strings stored as C strings (ie are 0 terminated, instead of
+ *   length prefixed)
+ * The different flavors can coexist in the same file (is this really
+ * true ??)
+ * 
+ * For the evolution of types, the need of the second flavor was the
+ * number of types to be defined (limited to 0xFFFF, including the C
+ * basic types); the need of the third flavor is the increase of
+ * symbol size (to be greated than 256), which was likely needed for
+ * complex C++ types (nested + templates).
+ *
+ * It's somehow difficult to represent the layout of those types on
+ * disk because:
+ * - some integral values are stored as numeric leaf, which size is
+ *   variable depending on its value
+ * 
+ * Symbols internal stream
+ * -----------------------
+ * Here also we find three flavors (that we've suffixed with _V1, _V2
+ * and _V3) even if their evolution is closer to the evolution of
+ * types, they are not completely linked together.
+ */
+
+#include "pshpack1.h"
+
+/* ======================================== *
+ *             Type information
+ * ======================================== */
+
+struct p_string
+{
+    unsigned char               namelen;
+    char                        name[1];
+};
+
+union codeview_type
+{
+    struct
+    {
+        unsigned short int      len;
+        short int               id;
+    } generic;
+
+    struct
+    {
+        unsigned short int      len;
+        short int               id;
+        short int               attribute;
+        short int               type;
+    } modifier_v1;
+
+    struct
+    {
+        unsigned short int      len;
+        short int               id;
+        int                     type;
+        short int               attribute;
+    } modifier_v2;
+
+    struct
+    {
+        unsigned short int      len;
+        short int               id;
+        short int               attribute;
+        short int               datatype;
+        struct p_string         p_name;
+    } pointer_v1;
+
+    struct
+    {
+        unsigned short int      len;
+        short int               id;
+        unsigned int            datatype;
+        unsigned int            attribute;
+        struct p_string         p_name;
+    } pointer_v2;
+
+    struct
+    {
+        unsigned short int      len;
+        short int               id;
+        short int               elemtype;
+        short int               idxtype;
+        unsigned short int      arrlen;     /* numeric leaf */
+#if 0
+        struct p_string         p_name;
+#endif
+    } array_v1;
+
+    struct
+    {
+        unsigned short int      len;
+        short int               id;
+        unsigned int            elemtype;
+        unsigned int            idxtype;
+        unsigned short int      arrlen;    /* numeric leaf */
+#if 0
+        struct p_string         p_name;
+#endif
+    } array_v2;
+
+    struct
+    {
+        unsigned short int      len;
+        short int               id;
+        unsigned int            elemtype;
+        unsigned int            idxtype;
+        unsigned short int      arrlen;    /* numeric leaf */
+#if 0
+        char                    name[1];
+#endif
+    } array_v3;
+
+    struct
+    {
+        unsigned short int      len;
+        short int               id;
+        short int               n_element;
+        short int               fieldlist;
+        short int               property;
+        short int               derived;
+        short int               vshape;
+        unsigned short int      structlen;  /* numeric leaf */
+#if 0
+        struct p_string         p_name;
+#endif
+    } struct_v1;
+
+    struct
+    {
+        unsigned short int      len;
+        short int               id;
+        short int               n_element;
+        short int               property;
+        unsigned int            fieldlist;
+        unsigned int            derived;
+        unsigned int            vshape;
+        unsigned short int      structlen;  /* numeric leaf */
+#if 0
+        struct p_string         p_name;
+#endif
+    } struct_v2;
+
+    struct
+    {
+        unsigned short int      len;
+        short int               id;
+        short int               n_element;
+        short int               property;
+        unsigned int            fieldlist;
+        unsigned int            derived;
+        unsigned int            vshape;
+        unsigned short int      structlen;  /* numeric leaf */
+#if 0
+        char                    name[1];
+#endif
+    } struct_v3;
+
+    struct
+    {
+        unsigned short int      len;
+        short int               id;
+        short int               count;
+        short int               fieldlist;
+        short int               property;
+        unsigned short int      un_len;     /* numeric leaf */
+#if 0
+        struct p_string         p_name;
+#endif
+    } union_v1;
+
+    struct
+    {
+        unsigned short int      len;
+        short int               id;
+        short int               count;
+        short int               property;
+        unsigned int            fieldlist;
+        unsigned short int      un_len;     /* numeric leaf */
+#if 0
+        struct p_string         p_name;
+#endif
+    } union_v2;
+
+    struct
+    {
+        unsigned short int      len;
+        short int               id;
+        short int               count;
+        short int               property;
+        unsigned int            fieldlist;
+        unsigned short int      un_len;     /* numeric leaf */
+#if 0
+        char                    name[1];
+#endif
+    } union_v3;
+
+    struct
+    {
+        unsigned short int      len;
+        short int               id;
+        short int               count;
+        short int               type;
+        short int               fieldlist;
+        short int               property;
+        struct p_string         p_name;
+    } enumeration_v1;
+
+    struct
+    {
+        unsigned short int      len;
+        short int               id;
+        short int               count;
+        short int               property;
+        unsigned int            type;
+        unsigned int            fieldlist;
+        struct p_string         p_name;
+    } enumeration_v2;
+
+    struct
+    {
+        unsigned short int      len;
+        short int               id;
+        short int               count;
+        short int               property;
+        unsigned int            type;
+        unsigned int            fieldlist;
+        char                    name[1];
+    } enumeration_v3;
+
+    struct
+    {
+        unsigned short int      len;
+        short int               id;
+        unsigned short int      rvtype;
+        unsigned char           call;
+        unsigned char           reserved;
+        unsigned short int      params;
+        unsigned short int      arglist;
+    } procedure_v1;
+
+    struct
+    {
+        unsigned short int      len;
+        short int               id;
+        unsigned int            rvtype;
+        unsigned char           call;
+        unsigned char           reserved;
+        unsigned short int      params;
+        unsigned int            arglist;
+    } procedure_v2;
+
+    struct
+    {
+        unsigned short int      len;
+        short int               id;
+        unsigned short int      rvtype;
+        unsigned short int      class_type;
+        unsigned short int      this_type;
+        unsigned char           call;
+        unsigned char           reserved;
+        unsigned short int      params;
+        unsigned short int      arglist;
+        unsigned int            this_adjust;
+    } mfunction_v1;
+
+    struct
+    {
+        unsigned short int      len;
+        short int               id;
+        unsigned                unknown1; /* could be this_type ??? */
+        unsigned int            class_type;
+        unsigned int            rvtype;
+        unsigned char           call;
+        unsigned char           reserved;
+        unsigned short          params;
+        unsigned int            arglist;
+        unsigned int            this_adjust;
+    } mfunction_v2;
+};
+
+union codeview_reftype
+{
+    struct
+    {
+        unsigned short int      len;
+        short int               id;
+    } generic;
+
+    struct
+    {
+        unsigned short int      len;
+        short int               id;
+        unsigned char           list[1];
+    } fieldlist;
+
+    struct
+    {
+        unsigned short int      len;
+        short int               id;
+        unsigned char           nbits;
+        unsigned char           bitoff;
+        unsigned short          type;
+    } bitfield_v1;
+    
+    struct
+    {
+        unsigned short int      len;
+        short int               id;
+        unsigned int            type;
+        unsigned char           nbits;
+        unsigned char           bitoff;
+    } bitfield_v2;
+
+    struct
+    {
+        unsigned short int      len;
+        short int               id;
+        unsigned short          num;
+        unsigned short          args[1];
+    } arglist_v1;
+
+    struct
+    {
+        unsigned short int      len;
+        short int               id;
+        unsigned                num;
+        unsigned                args[1];
+    } arglist_v2;
+
+};
+
+union codeview_fieldtype
+{
+    struct
+    {
+        short int		id;
+    } generic;
+
+    struct
+    {
+        short int		id;
+        short int		type;
+        short int		attribute;
+        unsigned short int	offset;     /* numeric leaf */
+    } bclass_v1;
+
+    struct
+    {
+        short int		id;
+        short int		attribute;
+        unsigned int	        type;
+        unsigned short int	offset;     /* numeric leaf */
+    } bclass_v2;
+
+    struct
+    {
+        short int		id;
+        short int		btype;
+        short int		vbtype;
+        short int		attribute;
+        unsigned short int	vbpoff;     /* numeric leaf */
+#if 0
+        unsigned short int	vboff;      /* numeric leaf */
+#endif
+    } vbclass_v1;
+
+    struct
+    {
+        short int		id;
+        short int		attribute;
+        unsigned int	        btype;
+        unsigned int	        vbtype;
+        unsigned short int	vbpoff;     /* numeric leaf */
+#if 0
+        unsigned short int	vboff;      /* numeric leaf */
+#endif
+    } vbclass_v2;
+
+    struct
+    {
+        short int		id;
+        short int		attribute;
+        unsigned short int	value;     /* numeric leaf */
+#if 0
+        struct p_string         p_name;
+#endif
+    } enumerate_v1;
+
+   struct
+    {
+        short int               id;
+        short int               attribute;
+        unsigned short int      value;     /* numeric leaf */
+#if 0
+        char                    name[1];
+#endif
+    } enumerate_v3;
+
+    struct
+    {
+        short int		id;
+        short int		type;
+        struct p_string         p_name;
+    } friendfcn_v1;
+
+    struct
+    {
+        short int		id;
+        short int		_pad0;
+        unsigned int	        type;
+        struct p_string         p_name;
+    } friendfcn_v2;
+
+    struct
+    {
+        short int		id;
+        short int		type;
+        short int		attribute;
+        unsigned short int	offset;    /* numeric leaf */
+#if 0
+        struct p_string         p_name;
+#endif
+    } member_v1;
+
+    struct
+    {
+        short int		id;
+        short int		attribute;
+        unsigned int	        type;
+        unsigned short int	offset;    /* numeric leaf */
+#if 0
+        struct p_string         p_name;
+#endif
+    } member_v2;
+
+    struct
+    {
+        short int               id;
+        short int               attribute;
+        unsigned int            type;
+        unsigned short int      offset; /* numeric leaf */
+#if 0
+        unsigned char           name[1];
+#endif
+    }
+    member_v3;
+
+    struct
+    {
+        short int		id;
+        short int		type;
+        short int		attribute;
+        struct p_string         p_name;
+    } stmember_v1;
+
+    struct
+    {
+        short int		id;
+        short int		attribute;
+        unsigned int	        type;
+        struct p_string         p_name;
+    } stmember_v2;
+
+    struct
+    {
+        short int		id;
+        short int		count;
+        short int		mlist;
+        struct p_string         p_name;
+    } method_v1;
+
+    struct
+    {
+        short int		id;
+        short int		count;
+        unsigned int	        mlist;
+        struct p_string         p_name;
+    } method_v2;
+
+    struct
+    {
+        short int		id;
+        short int		index;
+        struct p_string         p_name;
+    } nesttype_v1;
+
+    struct
+    {
+        short int		id;
+        short int		_pad0;
+        unsigned int	        index;
+        struct p_string         p_name;
+    } nesttype_v2;
+
+    struct
+    {
+        short int		id;
+        short int		type;
+    } vfunctab_v1;
+
+    struct
+    {
+        short int		id;
+        short int		_pad0;
+        unsigned int	        type;
+    } vfunctab_v2;
+
+    struct
+    {
+        short int		id;
+        short int		type;
+    } friendcls_v1;
+
+    struct
+    {
+        short int		id;
+        short int		_pad0;
+        unsigned int	        type;
+    } friendcls_v2;
+
+    struct
+    {
+        short int		id;
+        short int		attribute;
+        short int		type;
+        struct p_string         p_name;
+    } onemethod_v1;
+
+    struct
+    {
+        short int		id;
+        short int		attribute;
+        short int		type;
+        unsigned int	        vtab_offset;
+        struct p_string         p_name;
+    } onemethod_virt_v1;
+
+    struct
+    {
+        short int		id;
+        short int		attribute;
+        unsigned int 	        type;
+        struct p_string         p_name;
+    } onemethod_v2;
+
+    struct
+    {
+        short int		id;
+        short int		attribute;
+        unsigned int	        type;
+        unsigned int	        vtab_offset;
+        struct p_string         p_name;
+    } onemethod_virt_v2;
+
+    struct
+    {
+        short int		id;
+        short int		type;
+        unsigned int	        offset;
+    } vfuncoff_v1;
+
+    struct
+    {
+        short int		id;
+        short int		_pad0;
+        unsigned int	        type;
+        unsigned int	        offset;
+    } vfuncoff_v2;
+
+    struct
+    {
+        short int		id;
+        short int		attribute;
+        short int		index;
+        struct p_string         p_name;
+    } nesttypeex_v1;
+
+    struct
+    {
+        short int		id;
+        short int		attribute;
+        unsigned int	        index;
+        struct p_string         p_name;
+    } nesttypeex_v2;
+
+    struct
+    {
+        short int		id;
+        short int		attribute;
+        unsigned int	        type;
+        struct p_string         p_name;
+    } membermodify_v2;
+
+};
+
+
+/*
+ * This covers the basic datatypes that VC++ seems to be using these days.
+ * 32 bit mode only.  There are additional numbers for the pointers in 16
+ * bit mode.  There are many other types listed in the documents, but these
+ * are apparently not used by the compiler, or represent pointer types
+ * that are not used.
+ */
+#define T_NOTYPE	        0x0000	/* Notype */
+#define T_ABS		        0x0001	/* Abs */
+#define T_VOID		        0x0003	/* Void */
+#define T_CHAR		        0x0010	/* signed char */
+#define T_SHORT		        0x0011	/* short */
+#define T_LONG		        0x0012	/* long */
+#define T_QUAD		        0x0013	/* long long */
+#define T_UCHAR		        0x0020	/* unsigned  char */
+#define T_USHORT	        0x0021	/* unsigned short */
+#define T_ULONG		        0x0022	/* unsigned long */
+#define T_UQUAD		        0x0023	/* unsigned long long */
+#define T_REAL32	        0x0040	/* float */
+#define T_REAL64	        0x0041	/* double */
+#define T_RCHAR		        0x0070	/* real char */
+#define T_WCHAR		        0x0071	/* wide char */
+#define T_INT4		        0x0074	/* int */
+#define T_UINT4		        0x0075	/* unsigned int */
+
+#define T_32PVOID	        0x0403	/* 32 bit near pointer to void */
+#define T_32PCHAR	        0x0410  /* 16:32 near pointer to signed char */
+#define T_32PSHORT	        0x0411  /* 16:32 near pointer to short */
+#define T_32PLONG	        0x0412  /* 16:32 near pointer to int */
+#define T_32PQUAD	        0x0413  /* 16:32 near pointer to long long */
+#define T_32PUCHAR	        0x0420  /* 16:32 near pointer to unsigned char */
+#define T_32PUSHORT	        0x0421  /* 16:32 near pointer to unsigned short */
+#define T_32PULONG	        0x0422	/* 16:32 near pointer to unsigned int */
+#define T_32PUQUAD	        0x0423  /* 16:32 near pointer to long long */
+#define T_32PREAL32	        0x0440	/* 16:32 near pointer to float */
+#define T_32PREAL64	        0x0441	/* 16:32 near pointer to float */
+#define T_32PRCHAR	        0x0470	/* 16:32 near pointer to real char */
+#define T_32PWCHAR	        0x0471	/* 16:32 near pointer to real char */
+#define T_32PINT4	        0x0474	/* 16:32 near pointer to int */
+#define T_32PUINT4	        0x0475  /* 16:32 near pointer to unsigned int */
+
+
+#define LF_MODIFIER_V1          0x0001
+#define LF_POINTER_V1           0x0002
+#define LF_ARRAY_V1             0x0003
+#define LF_CLASS_V1             0x0004
+#define LF_STRUCTURE_V1         0x0005
+#define LF_UNION_V1             0x0006
+#define LF_ENUM_V1              0x0007
+#define LF_PROCEDURE_V1         0x0008
+#define LF_MFUNCTION_V1         0x0009
+#define LF_VTSHAPE_V1           0x000a
+#define LF_COBOL0_V1            0x000b
+#define LF_COBOL1_V1            0x000c
+#define LF_BARRAY_V1            0x000d
+#define LF_LABEL_V1             0x000e
+#define LF_NULL_V1              0x000f
+#define LF_NOTTRAN_V1           0x0010
+#define LF_DIMARRAY_V1          0x0011
+#define LF_VFTPATH_V1           0x0012
+#define LF_PRECOMP_V1           0x0013
+#define LF_ENDPRECOMP_V1        0x0014
+#define LF_OEM_V1               0x0015
+#define LF_TYPESERVER_V1        0x0016
+
+#define LF_MODIFIER_V2          0x1001     /* variants with new 32-bit type indices (V2) */
+#define LF_POINTER_V2           0x1002
+#define LF_ARRAY_V2             0x1003
+#define LF_CLASS_V2             0x1004
+#define LF_STRUCTURE_V2         0x1005
+#define LF_UNION_V2             0x1006
+#define LF_ENUM_V2              0x1007
+#define LF_PROCEDURE_V2         0x1008
+#define LF_MFUNCTION_V2         0x1009
+#define LF_COBOL0_V2            0x100a
+#define LF_BARRAY_V2            0x100b
+#define LF_DIMARRAY_V2          0x100c
+#define LF_VFTPATH_V2           0x100d
+#define LF_PRECOMP_V2           0x100e
+#define LF_OEM_V2               0x100f
+
+#define LF_SKIP_V1              0x0200
+#define LF_ARGLIST_V1           0x0201
+#define LF_DEFARG_V1            0x0202
+#define LF_LIST_V1              0x0203
+#define LF_FIELDLIST_V1         0x0204
+#define LF_DERIVED_V1           0x0205
+#define LF_BITFIELD_V1          0x0206
+#define LF_METHODLIST_V1        0x0207
+#define LF_DIMCONU_V1           0x0208
+#define LF_DIMCONLU_V1          0x0209
+#define LF_DIMVARU_V1           0x020a
+#define LF_DIMVARLU_V1          0x020b
+#define LF_REFSYM_V1            0x020c
+
+#define LF_SKIP_V2              0x1200    /* variants with new 32-bit type indices (V2) */
+#define LF_ARGLIST_V2           0x1201
+#define LF_DEFARG_V2            0x1202
+#define LF_FIELDLIST_V2         0x1203
+#define LF_DERIVED_V2           0x1204
+#define LF_BITFIELD_V2          0x1205
+#define LF_METHODLIST_V2        0x1206
+#define LF_DIMCONU_V2           0x1207
+#define LF_DIMCONLU_V2          0x1208
+#define LF_DIMVARU_V2           0x1209
+#define LF_DIMVARLU_V2          0x120a
+
+/* Field lists */
+#define LF_BCLASS_V1            0x0400
+#define LF_VBCLASS_V1           0x0401
+#define LF_IVBCLASS_V1          0x0402
+#define LF_ENUMERATE_V1         0x0403
+#define LF_FRIENDFCN_V1         0x0404
+#define LF_INDEX_V1             0x0405
+#define LF_MEMBER_V1            0x0406
+#define LF_STMEMBER_V1          0x0407
+#define LF_METHOD_V1            0x0408
+#define LF_NESTTYPE_V1          0x0409
+#define LF_VFUNCTAB_V1          0x040a
+#define LF_FRIENDCLS_V1         0x040b
+#define LF_ONEMETHOD_V1         0x040c
+#define LF_VFUNCOFF_V1          0x040d
+#define LF_NESTTYPEEX_V1        0x040e
+#define LF_MEMBERMODIFY_V1      0x040f
+
+#define LF_BCLASS_V2            0x1400    /* variants with new 32-bit type indices (V2) */
+#define LF_VBCLASS_V2           0x1401
+#define LF_IVBCLASS_V2          0x1402
+#define LF_FRIENDFCN_V2         0x1403
+#define LF_INDEX_V2             0x1404
+#define LF_MEMBER_V2            0x1405
+#define LF_STMEMBER_V2          0x1406
+#define LF_METHOD_V2            0x1407
+#define LF_NESTTYPE_V2          0x1408
+#define LF_VFUNCTAB_V2          0x1409
+#define LF_FRIENDCLS_V2         0x140a
+#define LF_ONEMETHOD_V2         0x140b
+#define LF_VFUNCOFF_V2          0x140c
+#define LF_NESTTYPEEX_V2        0x140d
+
+#define LF_ENUMERATE_V3         0x1502
+#define LF_ARRAY_V3             0x1503
+#define LF_CLASS_V3             0x1504
+#define LF_STRUCTURE_V3         0x1505
+#define LF_UNION_V3             0x1506
+#define LF_ENUM_V3              0x1507
+#define LF_MEMBER_V3            0x150d
+
+#define LF_NUMERIC              0x8000    /* numeric leaf types */
+#define LF_CHAR                 0x8000
+#define LF_SHORT                0x8001
+#define LF_USHORT               0x8002
+#define LF_LONG                 0x8003
+#define LF_ULONG                0x8004
+#define LF_REAL32               0x8005
+#define LF_REAL64               0x8006
+#define LF_REAL80               0x8007
+#define LF_REAL128              0x8008
+#define LF_QUADWORD             0x8009
+#define LF_UQUADWORD            0x800a
+#define LF_REAL48               0x800b
+#define LF_COMPLEX32            0x800c
+#define LF_COMPLEX64            0x800d
+#define LF_COMPLEX80            0x800e
+#define LF_COMPLEX128           0x800f
+#define LF_VARSTRING            0x8010
+
+/* ======================================== *
+ *            Symbol information
+ * ======================================== */
+
+union codeview_symbol
+{
+    struct
+    {
+        short int	        len;
+        short int	        id;
+    } generic;
+
+    struct
+    {
+	short int	        len;
+	short int	        id;
+	unsigned int	        offset;
+	unsigned short	        segment;
+	unsigned short	        symtype;
+        struct p_string         p_name;
+    } data_v1;
+
+    struct
+    {
+	short int	        len;
+	short int	        id;
+	unsigned int	        symtype;
+	unsigned int	        offset;
+	unsigned short	        segment;
+        struct p_string         p_name;
+    } data_v2;
+
+    struct
+    {
+        short int               len;
+        short int               id;
+        unsigned int            symtype;
+        unsigned int            offset;
+        unsigned short          segment;
+        char                    name[1];
+    } data_v3;
+
+    struct
+    {
+	short int	        len;
+	short int	        id;
+	unsigned int	        pparent;
+	unsigned int	        pend;
+	unsigned int	        next;
+	unsigned int	        offset;
+	unsigned short	        segment;
+	unsigned short	        thunk_len;
+	unsigned char	        thtype;
+        struct p_string         p_name;
+    } thunk_v1;
+
+    struct
+    {
+        short int               len;
+        short int               id;
+        unsigned int            pparent;
+        unsigned int            pend;
+        unsigned int            next;
+        unsigned int            offset;
+        unsigned short          segment;
+        unsigned short          thunk_len;
+        unsigned char           thtype;
+        char                    name[1];
+    } thunk_v3;
+
+    struct
+    {
+	short int	        len;
+	short int	        id;
+	unsigned int	        pparent;
+	unsigned int	        pend;
+	unsigned int	        next;
+	unsigned int	        proc_len;
+	unsigned int	        debug_start;
+	unsigned int	        debug_end;
+	unsigned int	        offset;
+	unsigned short	        segment;
+	unsigned short	        proctype;
+	unsigned char	        flags;
+        struct p_string         p_name;
+    } proc_v1;
+
+    struct
+    {
+	short int	        len;
+	short int	        id;
+	unsigned int	        pparent;
+	unsigned int	        pend;
+	unsigned int	        next;
+	unsigned int	        proc_len;
+	unsigned int	        debug_start;
+	unsigned int	        debug_end;
+	unsigned int	        proctype;
+	unsigned int	        offset;
+	unsigned short	        segment;
+	unsigned char	        flags;
+        struct p_string         p_name;
+    } proc_v2;
+
+    struct
+    {
+        short int               len;
+        short int               id;
+        unsigned int            pparent;
+        unsigned int            pend;
+        unsigned int            next;
+        unsigned int            proc_len;
+        unsigned int            debug_start;
+        unsigned int            debug_end;
+        unsigned int            proctype;
+        unsigned int            offset;
+        unsigned short          segment;
+        unsigned char           flags;
+        char                    name[1];
+    } proc_v3;
+
+    struct
+    {
+	short int	        len;	        /* Total length of this entry */
+	short int	        id;		/* Always S_BPREL_V1 */
+	unsigned int	        offset;	        /* Stack offset relative to BP */
+	unsigned short	        symtype;
+        struct p_string         p_name;
+    } stack_v1;
+
+    struct
+    {
+	short int	        len;	        /* Total length of this entry */
+	short int	        id;		/* Always S_BPREL_V2 */
+	unsigned int	        offset;	        /* Stack offset relative to EBP */
+	unsigned int	        symtype;
+        struct p_string         p_name;
+    } stack_v2;
+
+    struct
+    {
+        short int               len;            /* Total length of this entry */
+        short int               id;             /* Always S_BPREL_V3 */
+        int                     offset;         /* Stack offset relative to BP */
+        unsigned int            symtype;
+        char                    name[1];
+    } stack_v3;
+
+    struct
+    {
+	short int	        len;	        /* Total length of this entry */
+	short int	        id;		/* Always S_REGISTER */
+        unsigned short          type;
+        unsigned short          reg;
+        struct p_string         p_name;
+        /* don't handle register tracking */
+    } register_v1;
+
+    struct
+    {
+	short int	        len;	        /* Total length of this entry */
+	short int	        id;		/* Always S_REGISTER_V2 */
+        unsigned int            type;           /* check whether type & reg are correct */
+        unsigned short          reg;
+        struct p_string         p_name;
+        /* don't handle register tracking */
+    } register_v2;
+
+    struct
+    {
+        short int               len;
+        short int               id;
+        unsigned int            parent;
+        unsigned int            end;
+        unsigned int            length;
+        unsigned int            offset;
+        unsigned short          segment;
+        struct p_string         p_name;
+    } block_v1;
+
+    struct
+    {
+        short int               len;
+        short int               id;
+        unsigned int            parent;
+        unsigned int            end;
+        unsigned int            length;
+        unsigned int            offset;
+        unsigned short          segment;
+        char                    name[1];
+    } block_v3;
+
+    struct
+    {
+        short int               len;
+        short int               id;
+        unsigned int            offset;
+        unsigned short          segment;
+        unsigned char           flags;
+        struct p_string         p_name;
+    } label_v1;
+
+    struct
+    {
+        short int               len;
+        short int               id;
+        unsigned int            offset;
+        unsigned short          segment;
+        unsigned char           flags;
+        char                    name[1];
+    } label_v3;
+
+    struct
+    {
+        short int               len;
+        short int               id;
+        unsigned short          type;
+        unsigned short          cvalue;         /* numeric leaf */
+#if 0
+        struct p_string         p_name;
+#endif
+    } constant_v1;
+
+    struct
+    {
+        short int               len;
+        short int               id;
+        unsigned                type;
+        unsigned short          cvalue;         /* numeric leaf */
+#if 0
+        struct p_string         p_name;
+#endif
+    } constant_v2;
+
+    struct
+    {
+        short int               len;
+        short int               id;
+        unsigned                type;
+        unsigned short          cvalue;
+#if 0
+        char                    name[1];
+#endif
+    } constant_v3;
+
+    struct
+    {
+        short int               len;
+        short int               id;
+        unsigned short          type;
+        struct p_string         p_name;
+    } udt_v1;
+
+    struct
+    {
+        short int               len;
+        short int               id;
+        unsigned                type;
+        struct p_string         p_name;
+    } udt_v2;
+
+    struct
+    {
+        short int               len;
+        short int               id;
+        unsigned int            type;
+        char                    name[1];
+    } udt_v3;
+
+    struct
+    {
+        short int               len;
+        short int               id;
+        char                    signature[4];
+        struct p_string         p_name;
+    } objname_v1;
+
+    struct
+    {
+        short int               len;
+        short int               id;
+        unsigned int            unknown;
+        struct p_string         p_name;
+    } compile_v1;
+
+    struct
+    {
+        short int               len;
+        short int               id;
+        unsigned                unknown1[4];
+        unsigned short          unknown2;
+        struct p_string         p_name;
+    } compile_v2;
+
+    struct
+    {
+        short int               len;
+        short int               id;
+        unsigned int            unknown;
+        char                    name[1];
+    } compile_v3;
+
+    struct
+    {
+        short int               len;
+        short int               id;
+        unsigned int            offset;
+        unsigned short          segment;
+    } ssearch_v1;
+};
+
+#define S_COMPILE_V1    0x0001
+#define S_REGISTER_V1   0x0002
+#define S_CONSTANT_V1   0x0003
+#define S_UDT_V1        0x0004
+#define S_SSEARCH_V1    0x0005
+#define S_END_V1        0x0006
+#define S_SKIP_V1       0x0007
+#define S_CVRESERVE_V1  0x0008
+#define S_OBJNAME_V1    0x0009
+#define S_ENDARG_V1     0x000a
+#define S_COBOLUDT_V1   0x000b
+#define S_MANYREG_V1    0x000c
+#define S_RETURN_V1     0x000d
+#define S_ENTRYTHIS_V1  0x000e
+
+#define S_BPREL_V1      0x0200
+#define S_LDATA_V1      0x0201
+#define S_GDATA_V1      0x0202
+#define S_PUB_V1        0x0203
+#define S_LPROC_V1      0x0204
+#define S_GPROC_V1      0x0205
+#define S_THUNK_V1      0x0206
+#define S_BLOCK_V1      0x0207
+#define S_WITH_V1       0x0208
+#define S_LABEL_V1      0x0209
+#define S_CEXMODEL_V1   0x020a
+#define S_VFTPATH_V1    0x020b
+#define S_REGREL_V1     0x020c
+#define S_LTHREAD_V1    0x020d
+#define S_GTHREAD_V1    0x020e
+
+#define S_PROCREF_V1    0x0400
+#define S_DATAREF_V1    0x0401
+#define S_ALIGN_V1      0x0402
+#define S_LPROCREF_V1   0x0403
+
+#define S_REGISTER_V2   0x1001 /* Variants with new 32-bit type indices */
+#define S_CONSTANT_V2   0x1002
+#define S_UDT_V2        0x1003
+#define S_COBOLUDT_V2   0x1004
+#define S_MANYREG_V2    0x1005
+#define S_BPREL_V2      0x1006
+#define S_LDATA_V2      0x1007
+#define S_GDATA_V2      0x1008
+#define S_PUB_V2        0x1009
+#define S_LPROC_V2      0x100a
+#define S_GPROC_V2      0x100b
+#define S_VFTTABLE_V2   0x100c
+#define S_REGREL_V2     0x100d
+#define S_LTHREAD_V2    0x100e
+#define S_GTHREAD_V2    0x100f
+#if 0
+#define S_XXXXXXXXX_32  0x1012  /* seems linked to a function, content unknown */
+#endif
+#define S_COMPILE_V2    0x1013
+
+#define S_COMPILE_V3    0x1101
+#define S_THUNK_V3      0x1102
+#define S_BLOCK_V3      0x1103
+#define S_LABEL_V3      0x1105
+#define S_CONSTANT_V3   0x1107
+#define S_UDT_V3        0x1108
+#define S_BPREL_V3      0x110B
+#define S_LDATA_V3      0x110C
+#define S_GDATA_V3      0x110D
+#define S_PUB_DATA_V3   0x110E
+#define S_LPROC_V3      0x110F
+#define S_GPROC_V3      0x1110
+#define S_MSTOOL_V3     0x1116  /* not really understood */
+#define S_PUB_FUNC1_V3  0x1125  /* didn't get the difference between the two */
+#define S_PUB_FUNC2_V3  0x1127
+
+/* ======================================== *
+ *          Line number information
+ * ======================================== */
+
+union any_size
+{
+    const char*                 c;
+    const unsigned char*        uc;
+    const short*                s;
+    const int*                  i;
+    const unsigned int*         ui;
+};
+
+struct startend
+{
+    unsigned int	        start;
+    unsigned int	        end;
+};
+
+struct codeview_linetab
+{
+    unsigned int		nline;
+    unsigned int		segno;
+    unsigned int		start;
+    unsigned int		end;
+    unsigned int                source;
+    const unsigned short*       linetab;
+    const unsigned int*         offtab;
+};
+
+
+/* ======================================== *
+ *            PDB file information
+ * ======================================== */
+
+
+struct PDB_FILE
+{
+    DWORD               size;
+    DWORD               unknown;
+};
+
+struct PDB_JG_HEADER
+{
+    CHAR                ident[40];
+    DWORD               signature;
+    DWORD               block_size;
+    WORD                free_list;
+    WORD                total_alloc;
+    struct PDB_FILE     toc;
+    WORD                toc_block[1];
+};
+
+struct PDB_DS_HEADER
+{
+    char                signature[32];
+    DWORD               block_size;
+    DWORD               unknown1;
+    DWORD               num_pages;
+    DWORD               toc_size;
+    DWORD               unknown2;
+    DWORD               toc_page;
+};
+
+struct PDB_JG_TOC
+{
+    DWORD               num_files;
+    struct PDB_FILE     file[1];
+};
+
+struct PDB_DS_TOC
+{
+    DWORD               num_files;
+    DWORD               file_size[1];
+};
+
+struct PDB_JG_ROOT
+{
+    DWORD               Version;
+    DWORD               TimeDateStamp;
+    DWORD               Age;
+    DWORD               cbNames;
+    CHAR                names[1];
+};
+
+struct PDB_DS_ROOT
+{
+    DWORD               Version;
+    DWORD               TimeDateStamp;
+    DWORD               Age;
+    GUID                guid;
+    DWORD               cbNames;
+    CHAR                names[1];
+};
+
+typedef struct _PDB_TYPES_OLD
+{
+    DWORD       version;
+    WORD        first_index;
+    WORD        last_index;
+    DWORD       type_size;
+    WORD        file;
+    WORD        pad;
+} PDB_TYPES_OLD, *PPDB_TYPES_OLD;
+
+typedef struct _PDB_TYPES
+{
+    DWORD       version;
+    DWORD       type_offset;
+    DWORD       first_index;
+    DWORD       last_index;
+    DWORD       type_size;
+    WORD        file;
+    WORD        pad;
+    DWORD       hash_size;
+    DWORD       hash_base;
+    DWORD       hash_offset;
+    DWORD       hash_len;
+    DWORD       search_offset;
+    DWORD       search_len;
+    DWORD       unknown_offset;
+    DWORD       unknown_len;
+} PDB_TYPES, *PPDB_TYPES;
+
+typedef struct _PDB_SYMBOL_RANGE
+{
+    WORD        segment;
+    WORD        pad1;
+    DWORD       offset;
+    DWORD       size;
+    DWORD       characteristics;
+    WORD        index;
+    WORD        pad2;
+} PDB_SYMBOL_RANGE, *PPDB_SYMBOL_RANGE;
+
+typedef struct _PDB_SYMBOL_RANGE_EX
+{
+    WORD        segment;
+    WORD        pad1;
+    DWORD       offset;
+    DWORD       size;
+    DWORD       characteristics;
+    WORD        index;
+    WORD        pad2;
+    DWORD       timestamp;
+    DWORD       unknown;
+} PDB_SYMBOL_RANGE_EX, *PPDB_SYMBOL_RANGE_EX;
+
+typedef struct _PDB_SYMBOL_FILE
+{
+    DWORD       unknown1;
+    PDB_SYMBOL_RANGE range;
+    WORD        flag;
+    WORD        file;
+    DWORD       symbol_size;
+    DWORD       lineno_size;
+    DWORD       unknown2;
+    DWORD       nSrcFiles;
+    DWORD       attribute;
+    CHAR        filename[1];
+} PDB_SYMBOL_FILE, *PPDB_SYMBOL_FILE;
+
+typedef struct _PDB_SYMBOL_FILE_EX
+{
+    DWORD       unknown1;
+    PDB_SYMBOL_RANGE_EX range;
+    WORD        flag;
+    WORD        file;
+    DWORD       symbol_size;
+    DWORD       lineno_size;
+    DWORD       unknown2;
+    DWORD       nSrcFiles;
+    DWORD       attribute;
+    DWORD       reserved[2];
+    CHAR        filename[1];
+} PDB_SYMBOL_FILE_EX, *PPDB_SYMBOL_FILE_EX;
+
+typedef struct _PDB_SYMBOL_SOURCE
+{
+    WORD        nModules;
+    WORD        nSrcFiles;
+    WORD        table[1];
+} PDB_SYMBOL_SOURCE, *PPDB_SYMBOL_SOURCE;
+
+typedef struct _PDB_SYMBOL_IMPORT
+{
+    DWORD       unknown1;
+    DWORD       unknown2;
+    DWORD       TimeDateStamp;
+    DWORD       Age;
+    CHAR        filename[1];
+} PDB_SYMBOL_IMPORT, *PPDB_SYMBOL_IMPORT;
+
+typedef struct _PDB_SYMBOLS_OLD
+{
+    WORD        hash1_file;
+    WORD        hash2_file;
+    WORD        gsym_file;
+    WORD        pad;
+    DWORD       module_size;
+    DWORD       offset_size;
+    DWORD       hash_size;
+    DWORD       srcmodule_size;
+} PDB_SYMBOLS_OLD, *PPDB_SYMBOLS_OLD;
+
+typedef struct _PDB_SYMBOLS
+{
+    DWORD       signature;
+    DWORD       version;
+    DWORD       unknown;
+    DWORD       hash1_file;
+    DWORD       hash2_file;
+    DWORD       gsym_file;
+    DWORD       module_size;
+    DWORD       offset_size;
+    DWORD       hash_size;
+    DWORD       srcmodule_size;
+    DWORD       pdbimport_size;
+    DWORD       resvd[5];
+} PDB_SYMBOLS, *PPDB_SYMBOLS;
+
+#include "poppack.h"
+
+/* ----------------------------------------------
+ * Information used for parsing
+ * ---------------------------------------------- */
+
+typedef struct
+{
+    DWORD  from;
+    DWORD  to;
+} OMAP_DATA;
+
+struct msc_debug_info
+{
+    struct module*              module;
+    int			        nsect;
+    const IMAGE_SECTION_HEADER* sectp;
+    int			        nomap;
+    const OMAP_DATA*            omapp;
+    const BYTE*                 root;
+};
+
+/* coff.c */
+extern BOOL coff_process_info(const struct msc_debug_info* msc_dbg);
+
+/* ===================================================
+ * The old CodeView stuff (for NB09 and NB11)
+ * =================================================== */
+
+#define sstModule      0x120
+#define sstTypes       0x121
+#define sstPublic      0x122
+#define sstPublicSym   0x123
+#define sstSymbols     0x124
+#define sstAlignSym    0x125
+#define sstSrcLnSeg    0x126
+#define sstSrcModule   0x127
+#define sstLibraries   0x128
+#define sstGlobalSym   0x129
+#define sstGlobalPub   0x12a
+#define sstGlobalTypes 0x12b
+#define sstMPC         0x12c
+#define sstSegMap      0x12d
+#define sstSegName     0x12e
+#define sstPreComp     0x12f
+#define sstFileIndex   0x133
+#define sstStaticSym   0x134
+
+typedef struct _CODEVIEW_HEADER_NBxx
+{
+    DWORD       dwSignature;
+    DWORD       lfoDirectory;
+} CODEVIEW_HEADER_NBxx,* PCODEVIEW_HEADER_NBxx;
+
+typedef struct _CODEVIEW_HEADER_RSDS
+{
+    DWORD       dwSignature;
+    GUID        guid;
+    DWORD       unknown;
+    CHAR        name[1];
+} CODEVIEW_HEADER_RSDS,* PCODEVIEW_HEADER_RSDS;
+
+typedef struct _CODEVIEW_PDB_DATA
+{
+    DWORD       timestamp;
+    DWORD       unknown;
+    CHAR        name[1];
+} CODEVIEW_PDB_DATA, *PCODEVIEW_PDB_DATA;
+
+typedef struct _CV_DIRECTORY_HEADER
+{
+    WORD        cbDirHeader;
+    WORD        cbDirEntry;
+    DWORD       cDir;
+    DWORD       lfoNextDir;
+    DWORD       flags;
+} CV_DIRECTORY_HEADER, *PCV_DIRECTORY_HEADER;
+
+typedef struct _CV_DIRECTORY_ENTRY
+{
+    WORD        subsection;
+    WORD        iMod;
+    DWORD       lfo;
+    DWORD       cb;
+} CV_DIRECTORY_ENTRY, *PCV_DIRECTORY_ENTRY;
+
+typedef struct _CV_ENTRY_MODULE_SEGINFO
+{
+    WORD        seg;
+    WORD        pad;
+    DWORD       offset;
+    DWORD       cbSeg;
+} CV_ENTRY_MODULE_SEGINFO;
+
+typedef struct _CV_ENTRY_MODULE
+{
+    WORD        ovlNumber;
+    WORD        iLib;
+    WORD        cSeg;
+    WORD        Style;
+/*
+    CV_ENTRY_MODULE_SEGINFO     SegInfo[cSeg];
+    p_string    Name;
+*/
+} CV_ENTRY_MODULE;
+
+typedef struct _CV_ENTRY_GLOBAL_TYPES
+{
+    DWORD       flags;
+    DWORD       cTypes;
+/*
+    DWORD       offset[cTypes];
+                types_record[];
+*/
+} CV_ENTRY_GLOBAL_TYPES;



More information about the wine-patches mailing list