msi: Don't define COND_SPACE twice.
[wine/multimedia.git] / dlls / dbghelp / mscvpdb.h
blob1bc2b7b28b175c6b0f2bc0dffe80ff10ebc10377
1 /*
2 * MS debug information definitions.
4 * Copyright (C) 1996 Eric Youngdale
5 * Copyright (C) 1999-2000 Ulrich Weigand
6 * Copyright (C) 2004 Eric Pouech
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 /* MS has stored all its debug information in a set of structures
24 * which has been rather consistent across the years (ie you can grasp
25 * some continuity, and not so many drastic changes).
27 * A bit of history on the various formats
28 * MSVC 1.0 PDB v1 (new format for debug info)
29 * MSVC 2.0 Inclusion in link of debug info (PDB v2)
30 * MSVC 5.0 Types are 24 bits (instead of 16 for <= 4.x)
31 * MSVC x.0 PDB (change in internal streams layout)
33 * .DBG Contains COFF, FPO and Codeview info
34 * .PDB New format for debug info (information is
35 * derived from Codeview information)
36 * VCx0.PDB x major MSVC number, stores types, while
37 * <project>.PDB stores symbols.
39 * Debug information can either be found in the debug section of a PE
40 * module (in something close to a .DBG file), or the debug section
41 * can actually refer to an external file, which can be in turn,
42 * either a .DBG or .PDB file.
44 * Regarding PDB files:
45 * -------------------
46 * They are implemented as a set of internal files (as a small file
47 * system). The file is split into blocks, an internal file is made
48 * of a set of blocks. Internal files are accessed through
49 * numbers. For example,
50 * 1/ is the ROOT (basic information on the file)
51 * 2/ is the Symbol information (global symbols, local variables...)
52 * 3/ is the Type internal file (each the symbols can have type
53 * information associated with it).
55 * Over the years, three formats existed for the PDB:
56 * - ?? was rather linked to 16 bit code (our support shall be rather
57 * bad)
58 * - JG: it's the signature embedded in the file header. This format
59 * has been used in MSVC 2.0 => 5.0.
60 * - DS: it's the signature embedded in the file header. It's the
61 * current format supported my MS.
63 * Types internal stream
64 * ---------------------
65 * Types (from the Type internal file) have existed in three flavors
66 * (note that those flavors came as historical evolution, but there
67 * isn't a one to one link between types evolution and PDB formats'
68 * evolutions:
69 * - the first flavor (suffixed by V1 in this file), where the types
70 * and subtypes are 16 bit entities; and where strings are in Pascal
71 * format (first char is their length and are not 0 terminated)
72 * - the second flavor (suffixed by V2) differs from first flavor with
73 * types and subtypes as 32 bit entities. This forced some
74 * reordering of fields in some types
75 * - the third flavor (suffixed by V3) differs from second flavor with
76 * strings stored as C strings (ie are 0 terminated, instead of
77 * length prefixed)
78 * The different flavors can coexist in the same file (is this really
79 * true ??)
81 * For the evolution of types, the need of the second flavor was the
82 * number of types to be defined (limited to 0xFFFF, including the C
83 * basic types); the need of the third flavor is the increase of
84 * symbol size (to be greated than 256), which was likely needed for
85 * complex C++ types (nested + templates).
87 * It's somehow difficult to represent the layout of those types on
88 * disk because:
89 * - some integral values are stored as numeric leaf, which size is
90 * variable depending on its value
92 * Symbols internal stream
93 * -----------------------
94 * Here also we find three flavors (that we've suffixed with _V1, _V2
95 * and _V3) even if their evolution is closer to the evolution of
96 * types, they are not completely linked together.
99 #include "pshpack1.h"
101 /* ======================================== *
102 * Type information
103 * ======================================== */
105 struct p_string
107 unsigned char namelen;
108 char name[1];
111 union codeview_type
113 struct
115 unsigned short int len;
116 short int id;
117 } generic;
119 struct
121 unsigned short int len;
122 short int id;
123 short int attribute;
124 short int type;
125 } modifier_v1;
127 struct
129 unsigned short int len;
130 short int id;
131 int type;
132 short int attribute;
133 } modifier_v2;
135 struct
137 unsigned short int len;
138 short int id;
139 short int attribute;
140 short int datatype;
141 struct p_string p_name;
142 } pointer_v1;
144 struct
146 unsigned short int len;
147 short int id;
148 unsigned int datatype;
149 unsigned int attribute;
150 struct p_string p_name;
151 } pointer_v2;
153 struct
155 unsigned short int len;
156 short int id;
157 short int elemtype;
158 short int idxtype;
159 unsigned short int arrlen; /* numeric leaf */
160 #if 0
161 struct p_string p_name;
162 #endif
163 } array_v1;
165 struct
167 unsigned short int len;
168 short int id;
169 unsigned int elemtype;
170 unsigned int idxtype;
171 unsigned short int arrlen; /* numeric leaf */
172 #if 0
173 struct p_string p_name;
174 #endif
175 } array_v2;
177 struct
179 unsigned short int len;
180 short int id;
181 unsigned int elemtype;
182 unsigned int idxtype;
183 unsigned short int arrlen; /* numeric leaf */
184 #if 0
185 char name[1];
186 #endif
187 } array_v3;
189 struct
191 unsigned short int len;
192 short int id;
193 short int n_element;
194 short int fieldlist;
195 short int property;
196 short int derived;
197 short int vshape;
198 unsigned short int structlen; /* numeric leaf */
199 #if 0
200 struct p_string p_name;
201 #endif
202 } struct_v1;
204 struct
206 unsigned short int len;
207 short int id;
208 short int n_element;
209 short int property;
210 unsigned int fieldlist;
211 unsigned int derived;
212 unsigned int vshape;
213 unsigned short int structlen; /* numeric leaf */
214 #if 0
215 struct p_string p_name;
216 #endif
217 } struct_v2;
219 struct
221 unsigned short int len;
222 short int id;
223 short int n_element;
224 short int property;
225 unsigned int fieldlist;
226 unsigned int derived;
227 unsigned int vshape;
228 unsigned short int structlen; /* numeric leaf */
229 #if 0
230 char name[1];
231 #endif
232 } struct_v3;
234 struct
236 unsigned short int len;
237 short int id;
238 short int count;
239 short int fieldlist;
240 short int property;
241 unsigned short int un_len; /* numeric leaf */
242 #if 0
243 struct p_string p_name;
244 #endif
245 } union_v1;
247 struct
249 unsigned short int len;
250 short int id;
251 short int count;
252 short int property;
253 unsigned int fieldlist;
254 unsigned short int un_len; /* numeric leaf */
255 #if 0
256 struct p_string p_name;
257 #endif
258 } union_v2;
260 struct
262 unsigned short int len;
263 short int id;
264 short int count;
265 short int property;
266 unsigned int fieldlist;
267 unsigned short int un_len; /* numeric leaf */
268 #if 0
269 char name[1];
270 #endif
271 } union_v3;
273 struct
275 unsigned short int len;
276 short int id;
277 short int count;
278 short int type;
279 short int fieldlist;
280 short int property;
281 struct p_string p_name;
282 } enumeration_v1;
284 struct
286 unsigned short int len;
287 short int id;
288 short int count;
289 short int property;
290 unsigned int type;
291 unsigned int fieldlist;
292 struct p_string p_name;
293 } enumeration_v2;
295 struct
297 unsigned short int len;
298 short int id;
299 short int count;
300 short int property;
301 unsigned int type;
302 unsigned int fieldlist;
303 char name[1];
304 } enumeration_v3;
306 struct
308 unsigned short int len;
309 short int id;
310 unsigned short int rvtype;
311 unsigned char call;
312 unsigned char reserved;
313 unsigned short int params;
314 unsigned short int arglist;
315 } procedure_v1;
317 struct
319 unsigned short int len;
320 short int id;
321 unsigned int rvtype;
322 unsigned char call;
323 unsigned char reserved;
324 unsigned short int params;
325 unsigned int arglist;
326 } procedure_v2;
328 struct
330 unsigned short int len;
331 short int id;
332 unsigned short int rvtype;
333 unsigned short int class_type;
334 unsigned short int this_type;
335 unsigned char call;
336 unsigned char reserved;
337 unsigned short int params;
338 unsigned short int arglist;
339 unsigned int this_adjust;
340 } mfunction_v1;
342 struct
344 unsigned short int len;
345 short int id;
346 unsigned unknown1; /* could be this_type ??? */
347 unsigned int class_type;
348 unsigned int rvtype;
349 unsigned char call;
350 unsigned char reserved;
351 unsigned short params;
352 unsigned int arglist;
353 unsigned int this_adjust;
354 } mfunction_v2;
357 union codeview_reftype
359 struct
361 unsigned short int len;
362 short int id;
363 } generic;
365 struct
367 unsigned short int len;
368 short int id;
369 unsigned char list[1];
370 } fieldlist;
372 struct
374 unsigned short int len;
375 short int id;
376 unsigned char nbits;
377 unsigned char bitoff;
378 unsigned short type;
379 } bitfield_v1;
381 struct
383 unsigned short int len;
384 short int id;
385 unsigned int type;
386 unsigned char nbits;
387 unsigned char bitoff;
388 } bitfield_v2;
390 struct
392 unsigned short int len;
393 short int id;
394 unsigned short num;
395 unsigned short args[1];
396 } arglist_v1;
398 struct
400 unsigned short int len;
401 short int id;
402 unsigned num;
403 unsigned args[1];
404 } arglist_v2;
408 union codeview_fieldtype
410 struct
412 short int id;
413 } generic;
415 struct
417 short int id;
418 short int type;
419 short int attribute;
420 unsigned short int offset; /* numeric leaf */
421 } bclass_v1;
423 struct
425 short int id;
426 short int attribute;
427 unsigned int type;
428 unsigned short int offset; /* numeric leaf */
429 } bclass_v2;
431 struct
433 short int id;
434 short int btype;
435 short int vbtype;
436 short int attribute;
437 unsigned short int vbpoff; /* numeric leaf */
438 #if 0
439 unsigned short int vboff; /* numeric leaf */
440 #endif
441 } vbclass_v1;
443 struct
445 short int id;
446 short int attribute;
447 unsigned int btype;
448 unsigned int vbtype;
449 unsigned short int vbpoff; /* numeric leaf */
450 #if 0
451 unsigned short int vboff; /* numeric leaf */
452 #endif
453 } vbclass_v2;
455 struct
457 short int id;
458 short int attribute;
459 unsigned short int value; /* numeric leaf */
460 #if 0
461 struct p_string p_name;
462 #endif
463 } enumerate_v1;
465 struct
467 short int id;
468 short int attribute;
469 unsigned short int value; /* numeric leaf */
470 #if 0
471 char name[1];
472 #endif
473 } enumerate_v3;
475 struct
477 short int id;
478 short int type;
479 struct p_string p_name;
480 } friendfcn_v1;
482 struct
484 short int id;
485 short int _pad0;
486 unsigned int type;
487 struct p_string p_name;
488 } friendfcn_v2;
490 struct
492 short int id;
493 short int type;
494 short int attribute;
495 unsigned short int offset; /* numeric leaf */
496 #if 0
497 struct p_string p_name;
498 #endif
499 } member_v1;
501 struct
503 short int id;
504 short int attribute;
505 unsigned int type;
506 unsigned short int offset; /* numeric leaf */
507 #if 0
508 struct p_string p_name;
509 #endif
510 } member_v2;
512 struct
514 short int id;
515 short int attribute;
516 unsigned int type;
517 unsigned short int offset; /* numeric leaf */
518 #if 0
519 unsigned char name[1];
520 #endif
522 member_v3;
524 struct
526 short int id;
527 short int type;
528 short int attribute;
529 struct p_string p_name;
530 } stmember_v1;
532 struct
534 short int id;
535 short int attribute;
536 unsigned int type;
537 struct p_string p_name;
538 } stmember_v2;
540 struct
542 short int id;
543 short int count;
544 short int mlist;
545 struct p_string p_name;
546 } method_v1;
548 struct
550 short int id;
551 short int count;
552 unsigned int mlist;
553 struct p_string p_name;
554 } method_v2;
556 struct
558 short int id;
559 short int index;
560 struct p_string p_name;
561 } nesttype_v1;
563 struct
565 short int id;
566 short int _pad0;
567 unsigned int index;
568 struct p_string p_name;
569 } nesttype_v2;
571 struct
573 short int id;
574 short int type;
575 } vfunctab_v1;
577 struct
579 short int id;
580 short int _pad0;
581 unsigned int type;
582 } vfunctab_v2;
584 struct
586 short int id;
587 short int type;
588 } friendcls_v1;
590 struct
592 short int id;
593 short int _pad0;
594 unsigned int type;
595 } friendcls_v2;
597 struct
599 short int id;
600 short int attribute;
601 short int type;
602 struct p_string p_name;
603 } onemethod_v1;
605 struct
607 short int id;
608 short int attribute;
609 short int type;
610 unsigned int vtab_offset;
611 struct p_string p_name;
612 } onemethod_virt_v1;
614 struct
616 short int id;
617 short int attribute;
618 unsigned int type;
619 struct p_string p_name;
620 } onemethod_v2;
622 struct
624 short int id;
625 short int attribute;
626 unsigned int type;
627 unsigned int vtab_offset;
628 struct p_string p_name;
629 } onemethod_virt_v2;
631 struct
633 short int id;
634 short int type;
635 unsigned int offset;
636 } vfuncoff_v1;
638 struct
640 short int id;
641 short int _pad0;
642 unsigned int type;
643 unsigned int offset;
644 } vfuncoff_v2;
646 struct
648 short int id;
649 short int attribute;
650 short int index;
651 struct p_string p_name;
652 } nesttypeex_v1;
654 struct
656 short int id;
657 short int attribute;
658 unsigned int index;
659 struct p_string p_name;
660 } nesttypeex_v2;
662 struct
664 short int id;
665 short int attribute;
666 unsigned int type;
667 struct p_string p_name;
668 } membermodify_v2;
674 * This covers the basic datatypes that VC++ seems to be using these days.
675 * 32 bit mode only. There are additional numbers for the pointers in 16
676 * bit mode. There are many other types listed in the documents, but these
677 * are apparently not used by the compiler, or represent pointer types
678 * that are not used.
680 #define T_NOTYPE 0x0000 /* Notype */
681 #define T_ABS 0x0001 /* Abs */
682 #define T_VOID 0x0003 /* Void */
683 #define T_CHAR 0x0010 /* signed char */
684 #define T_SHORT 0x0011 /* short */
685 #define T_LONG 0x0012 /* long */
686 #define T_QUAD 0x0013 /* long long */
687 #define T_UCHAR 0x0020 /* unsigned char */
688 #define T_USHORT 0x0021 /* unsigned short */
689 #define T_ULONG 0x0022 /* unsigned long */
690 #define T_UQUAD 0x0023 /* unsigned long long */
691 #define T_REAL32 0x0040 /* float */
692 #define T_REAL64 0x0041 /* double */
693 #define T_RCHAR 0x0070 /* real char */
694 #define T_WCHAR 0x0071 /* wide char */
695 #define T_INT4 0x0074 /* int */
696 #define T_UINT4 0x0075 /* unsigned int */
698 #define T_32PVOID 0x0403 /* 32 bit near pointer to void */
699 #define T_32PCHAR 0x0410 /* 16:32 near pointer to signed char */
700 #define T_32PSHORT 0x0411 /* 16:32 near pointer to short */
701 #define T_32PLONG 0x0412 /* 16:32 near pointer to int */
702 #define T_32PQUAD 0x0413 /* 16:32 near pointer to long long */
703 #define T_32PUCHAR 0x0420 /* 16:32 near pointer to unsigned char */
704 #define T_32PUSHORT 0x0421 /* 16:32 near pointer to unsigned short */
705 #define T_32PULONG 0x0422 /* 16:32 near pointer to unsigned int */
706 #define T_32PUQUAD 0x0423 /* 16:32 near pointer to long long */
707 #define T_32PREAL32 0x0440 /* 16:32 near pointer to float */
708 #define T_32PREAL64 0x0441 /* 16:32 near pointer to float */
709 #define T_32PRCHAR 0x0470 /* 16:32 near pointer to real char */
710 #define T_32PWCHAR 0x0471 /* 16:32 near pointer to real char */
711 #define T_32PINT4 0x0474 /* 16:32 near pointer to int */
712 #define T_32PUINT4 0x0475 /* 16:32 near pointer to unsigned int */
715 #define LF_MODIFIER_V1 0x0001
716 #define LF_POINTER_V1 0x0002
717 #define LF_ARRAY_V1 0x0003
718 #define LF_CLASS_V1 0x0004
719 #define LF_STRUCTURE_V1 0x0005
720 #define LF_UNION_V1 0x0006
721 #define LF_ENUM_V1 0x0007
722 #define LF_PROCEDURE_V1 0x0008
723 #define LF_MFUNCTION_V1 0x0009
724 #define LF_VTSHAPE_V1 0x000a
725 #define LF_COBOL0_V1 0x000b
726 #define LF_COBOL1_V1 0x000c
727 #define LF_BARRAY_V1 0x000d
728 #define LF_LABEL_V1 0x000e
729 #define LF_NULL_V1 0x000f
730 #define LF_NOTTRAN_V1 0x0010
731 #define LF_DIMARRAY_V1 0x0011
732 #define LF_VFTPATH_V1 0x0012
733 #define LF_PRECOMP_V1 0x0013
734 #define LF_ENDPRECOMP_V1 0x0014
735 #define LF_OEM_V1 0x0015
736 #define LF_TYPESERVER_V1 0x0016
738 #define LF_MODIFIER_V2 0x1001 /* variants with new 32-bit type indices (V2) */
739 #define LF_POINTER_V2 0x1002
740 #define LF_ARRAY_V2 0x1003
741 #define LF_CLASS_V2 0x1004
742 #define LF_STRUCTURE_V2 0x1005
743 #define LF_UNION_V2 0x1006
744 #define LF_ENUM_V2 0x1007
745 #define LF_PROCEDURE_V2 0x1008
746 #define LF_MFUNCTION_V2 0x1009
747 #define LF_COBOL0_V2 0x100a
748 #define LF_BARRAY_V2 0x100b
749 #define LF_DIMARRAY_V2 0x100c
750 #define LF_VFTPATH_V2 0x100d
751 #define LF_PRECOMP_V2 0x100e
752 #define LF_OEM_V2 0x100f
754 #define LF_SKIP_V1 0x0200
755 #define LF_ARGLIST_V1 0x0201
756 #define LF_DEFARG_V1 0x0202
757 #define LF_LIST_V1 0x0203
758 #define LF_FIELDLIST_V1 0x0204
759 #define LF_DERIVED_V1 0x0205
760 #define LF_BITFIELD_V1 0x0206
761 #define LF_METHODLIST_V1 0x0207
762 #define LF_DIMCONU_V1 0x0208
763 #define LF_DIMCONLU_V1 0x0209
764 #define LF_DIMVARU_V1 0x020a
765 #define LF_DIMVARLU_V1 0x020b
766 #define LF_REFSYM_V1 0x020c
768 #define LF_SKIP_V2 0x1200 /* variants with new 32-bit type indices (V2) */
769 #define LF_ARGLIST_V2 0x1201
770 #define LF_DEFARG_V2 0x1202
771 #define LF_FIELDLIST_V2 0x1203
772 #define LF_DERIVED_V2 0x1204
773 #define LF_BITFIELD_V2 0x1205
774 #define LF_METHODLIST_V2 0x1206
775 #define LF_DIMCONU_V2 0x1207
776 #define LF_DIMCONLU_V2 0x1208
777 #define LF_DIMVARU_V2 0x1209
778 #define LF_DIMVARLU_V2 0x120a
780 /* Field lists */
781 #define LF_BCLASS_V1 0x0400
782 #define LF_VBCLASS_V1 0x0401
783 #define LF_IVBCLASS_V1 0x0402
784 #define LF_ENUMERATE_V1 0x0403
785 #define LF_FRIENDFCN_V1 0x0404
786 #define LF_INDEX_V1 0x0405
787 #define LF_MEMBER_V1 0x0406
788 #define LF_STMEMBER_V1 0x0407
789 #define LF_METHOD_V1 0x0408
790 #define LF_NESTTYPE_V1 0x0409
791 #define LF_VFUNCTAB_V1 0x040a
792 #define LF_FRIENDCLS_V1 0x040b
793 #define LF_ONEMETHOD_V1 0x040c
794 #define LF_VFUNCOFF_V1 0x040d
795 #define LF_NESTTYPEEX_V1 0x040e
796 #define LF_MEMBERMODIFY_V1 0x040f
798 #define LF_BCLASS_V2 0x1400 /* variants with new 32-bit type indices (V2) */
799 #define LF_VBCLASS_V2 0x1401
800 #define LF_IVBCLASS_V2 0x1402
801 #define LF_FRIENDFCN_V2 0x1403
802 #define LF_INDEX_V2 0x1404
803 #define LF_MEMBER_V2 0x1405
804 #define LF_STMEMBER_V2 0x1406
805 #define LF_METHOD_V2 0x1407
806 #define LF_NESTTYPE_V2 0x1408
807 #define LF_VFUNCTAB_V2 0x1409
808 #define LF_FRIENDCLS_V2 0x140a
809 #define LF_ONEMETHOD_V2 0x140b
810 #define LF_VFUNCOFF_V2 0x140c
811 #define LF_NESTTYPEEX_V2 0x140d
813 #define LF_ENUMERATE_V3 0x1502
814 #define LF_ARRAY_V3 0x1503
815 #define LF_CLASS_V3 0x1504
816 #define LF_STRUCTURE_V3 0x1505
817 #define LF_UNION_V3 0x1506
818 #define LF_ENUM_V3 0x1507
819 #define LF_MEMBER_V3 0x150d
821 #define LF_NUMERIC 0x8000 /* numeric leaf types */
822 #define LF_CHAR 0x8000
823 #define LF_SHORT 0x8001
824 #define LF_USHORT 0x8002
825 #define LF_LONG 0x8003
826 #define LF_ULONG 0x8004
827 #define LF_REAL32 0x8005
828 #define LF_REAL64 0x8006
829 #define LF_REAL80 0x8007
830 #define LF_REAL128 0x8008
831 #define LF_QUADWORD 0x8009
832 #define LF_UQUADWORD 0x800a
833 #define LF_REAL48 0x800b
834 #define LF_COMPLEX32 0x800c
835 #define LF_COMPLEX64 0x800d
836 #define LF_COMPLEX80 0x800e
837 #define LF_COMPLEX128 0x800f
838 #define LF_VARSTRING 0x8010
840 /* ======================================== *
841 * Symbol information
842 * ======================================== */
844 union codeview_symbol
846 struct
848 short int len;
849 short int id;
850 } generic;
852 struct
854 short int len;
855 short int id;
856 unsigned int offset;
857 unsigned short segment;
858 unsigned short symtype;
859 struct p_string p_name;
860 } data_v1;
862 struct
864 short int len;
865 short int id;
866 unsigned int symtype;
867 unsigned int offset;
868 unsigned short segment;
869 struct p_string p_name;
870 } data_v2;
872 struct
874 short int len;
875 short int id;
876 unsigned int symtype;
877 unsigned int offset;
878 unsigned short segment;
879 char name[1];
880 } data_v3;
882 struct
884 short int len;
885 short int id;
886 unsigned int pparent;
887 unsigned int pend;
888 unsigned int next;
889 unsigned int offset;
890 unsigned short segment;
891 unsigned short thunk_len;
892 unsigned char thtype;
893 struct p_string p_name;
894 } thunk_v1;
896 struct
898 short int len;
899 short int id;
900 unsigned int pparent;
901 unsigned int pend;
902 unsigned int next;
903 unsigned int offset;
904 unsigned short segment;
905 unsigned short thunk_len;
906 unsigned char thtype;
907 char name[1];
908 } thunk_v3;
910 struct
912 short int len;
913 short int id;
914 unsigned int pparent;
915 unsigned int pend;
916 unsigned int next;
917 unsigned int proc_len;
918 unsigned int debug_start;
919 unsigned int debug_end;
920 unsigned int offset;
921 unsigned short segment;
922 unsigned short proctype;
923 unsigned char flags;
924 struct p_string p_name;
925 } proc_v1;
927 struct
929 short int len;
930 short int id;
931 unsigned int pparent;
932 unsigned int pend;
933 unsigned int next;
934 unsigned int proc_len;
935 unsigned int debug_start;
936 unsigned int debug_end;
937 unsigned int proctype;
938 unsigned int offset;
939 unsigned short segment;
940 unsigned char flags;
941 struct p_string p_name;
942 } proc_v2;
944 struct
946 short int len;
947 short int id;
948 unsigned int pparent;
949 unsigned int pend;
950 unsigned int next;
951 unsigned int proc_len;
952 unsigned int debug_start;
953 unsigned int debug_end;
954 unsigned int proctype;
955 unsigned int offset;
956 unsigned short segment;
957 unsigned char flags;
958 char name[1];
959 } proc_v3;
961 struct
963 short int len; /* Total length of this entry */
964 short int id; /* Always S_BPREL_V1 */
965 unsigned int offset; /* Stack offset relative to BP */
966 unsigned short symtype;
967 struct p_string p_name;
968 } stack_v1;
970 struct
972 short int len; /* Total length of this entry */
973 short int id; /* Always S_BPREL_V2 */
974 unsigned int offset; /* Stack offset relative to EBP */
975 unsigned int symtype;
976 struct p_string p_name;
977 } stack_v2;
979 struct
981 short int len; /* Total length of this entry */
982 short int id; /* Always S_BPREL_V3 */
983 int offset; /* Stack offset relative to BP */
984 unsigned int symtype;
985 char name[1];
986 } stack_v3;
988 struct
990 short int len; /* Total length of this entry */
991 short int id; /* Always S_REGISTER */
992 unsigned short type;
993 unsigned short reg;
994 struct p_string p_name;
995 /* don't handle register tracking */
996 } register_v1;
998 struct
1000 short int len; /* Total length of this entry */
1001 short int id; /* Always S_REGISTER_V2 */
1002 unsigned int type; /* check whether type & reg are correct */
1003 unsigned short reg;
1004 struct p_string p_name;
1005 /* don't handle register tracking */
1006 } register_v2;
1008 struct
1010 short int len;
1011 short int id;
1012 unsigned int parent;
1013 unsigned int end;
1014 unsigned int length;
1015 unsigned int offset;
1016 unsigned short segment;
1017 struct p_string p_name;
1018 } block_v1;
1020 struct
1022 short int len;
1023 short int id;
1024 unsigned int parent;
1025 unsigned int end;
1026 unsigned int length;
1027 unsigned int offset;
1028 unsigned short segment;
1029 char name[1];
1030 } block_v3;
1032 struct
1034 short int len;
1035 short int id;
1036 unsigned int offset;
1037 unsigned short segment;
1038 unsigned char flags;
1039 struct p_string p_name;
1040 } label_v1;
1042 struct
1044 short int len;
1045 short int id;
1046 unsigned int offset;
1047 unsigned short segment;
1048 unsigned char flags;
1049 char name[1];
1050 } label_v3;
1052 struct
1054 short int len;
1055 short int id;
1056 unsigned short type;
1057 unsigned short cvalue; /* numeric leaf */
1058 #if 0
1059 struct p_string p_name;
1060 #endif
1061 } constant_v1;
1063 struct
1065 short int len;
1066 short int id;
1067 unsigned type;
1068 unsigned short cvalue; /* numeric leaf */
1069 #if 0
1070 struct p_string p_name;
1071 #endif
1072 } constant_v2;
1074 struct
1076 short int len;
1077 short int id;
1078 unsigned type;
1079 unsigned short cvalue;
1080 #if 0
1081 char name[1];
1082 #endif
1083 } constant_v3;
1085 struct
1087 short int len;
1088 short int id;
1089 unsigned short type;
1090 struct p_string p_name;
1091 } udt_v1;
1093 struct
1095 short int len;
1096 short int id;
1097 unsigned type;
1098 struct p_string p_name;
1099 } udt_v2;
1101 struct
1103 short int len;
1104 short int id;
1105 unsigned int type;
1106 char name[1];
1107 } udt_v3;
1109 struct
1111 short int len;
1112 short int id;
1113 char signature[4];
1114 struct p_string p_name;
1115 } objname_v1;
1117 struct
1119 short int len;
1120 short int id;
1121 unsigned int unknown;
1122 struct p_string p_name;
1123 } compile_v1;
1125 struct
1127 short int len;
1128 short int id;
1129 unsigned unknown1[4];
1130 unsigned short unknown2;
1131 struct p_string p_name;
1132 } compile_v2;
1134 struct
1136 short int len;
1137 short int id;
1138 unsigned int unknown;
1139 char name[1];
1140 } compile_v3;
1142 struct
1144 short int len;
1145 short int id;
1146 unsigned int offset;
1147 unsigned short segment;
1148 } ssearch_v1;
1151 #define S_COMPILE_V1 0x0001
1152 #define S_REGISTER_V1 0x0002
1153 #define S_CONSTANT_V1 0x0003
1154 #define S_UDT_V1 0x0004
1155 #define S_SSEARCH_V1 0x0005
1156 #define S_END_V1 0x0006
1157 #define S_SKIP_V1 0x0007
1158 #define S_CVRESERVE_V1 0x0008
1159 #define S_OBJNAME_V1 0x0009
1160 #define S_ENDARG_V1 0x000a
1161 #define S_COBOLUDT_V1 0x000b
1162 #define S_MANYREG_V1 0x000c
1163 #define S_RETURN_V1 0x000d
1164 #define S_ENTRYTHIS_V1 0x000e
1166 #define S_BPREL_V1 0x0200
1167 #define S_LDATA_V1 0x0201
1168 #define S_GDATA_V1 0x0202
1169 #define S_PUB_V1 0x0203
1170 #define S_LPROC_V1 0x0204
1171 #define S_GPROC_V1 0x0205
1172 #define S_THUNK_V1 0x0206
1173 #define S_BLOCK_V1 0x0207
1174 #define S_WITH_V1 0x0208
1175 #define S_LABEL_V1 0x0209
1176 #define S_CEXMODEL_V1 0x020a
1177 #define S_VFTPATH_V1 0x020b
1178 #define S_REGREL_V1 0x020c
1179 #define S_LTHREAD_V1 0x020d
1180 #define S_GTHREAD_V1 0x020e
1182 #define S_PROCREF_V1 0x0400
1183 #define S_DATAREF_V1 0x0401
1184 #define S_ALIGN_V1 0x0402
1185 #define S_LPROCREF_V1 0x0403
1187 #define S_REGISTER_V2 0x1001 /* Variants with new 32-bit type indices */
1188 #define S_CONSTANT_V2 0x1002
1189 #define S_UDT_V2 0x1003
1190 #define S_COBOLUDT_V2 0x1004
1191 #define S_MANYREG_V2 0x1005
1192 #define S_BPREL_V2 0x1006
1193 #define S_LDATA_V2 0x1007
1194 #define S_GDATA_V2 0x1008
1195 #define S_PUB_V2 0x1009
1196 #define S_LPROC_V2 0x100a
1197 #define S_GPROC_V2 0x100b
1198 #define S_VFTTABLE_V2 0x100c
1199 #define S_REGREL_V2 0x100d
1200 #define S_LTHREAD_V2 0x100e
1201 #define S_GTHREAD_V2 0x100f
1202 #if 0
1203 #define S_XXXXXXXXX_32 0x1012 /* seems linked to a function, content unknown */
1204 #endif
1205 #define S_COMPILE_V2 0x1013
1207 #define S_COMPILE_V3 0x1101
1208 #define S_THUNK_V3 0x1102
1209 #define S_BLOCK_V3 0x1103
1210 #define S_LABEL_V3 0x1105
1211 #define S_CONSTANT_V3 0x1107
1212 #define S_UDT_V3 0x1108
1213 #define S_BPREL_V3 0x110B
1214 #define S_LDATA_V3 0x110C
1215 #define S_GDATA_V3 0x110D
1216 #define S_PUB_DATA_V3 0x110E
1217 #define S_LPROC_V3 0x110F
1218 #define S_GPROC_V3 0x1110
1219 #define S_MSTOOL_V3 0x1116 /* not really understood */
1220 #define S_PUB_FUNC1_V3 0x1125 /* didn't get the difference between the two */
1221 #define S_PUB_FUNC2_V3 0x1127
1223 /* ======================================== *
1224 * Line number information
1225 * ======================================== */
1227 union any_size
1229 const char* c;
1230 const unsigned char* uc;
1231 const short* s;
1232 const int* i;
1233 const unsigned int* ui;
1236 struct startend
1238 unsigned int start;
1239 unsigned int end;
1242 struct codeview_linetab
1244 unsigned int nline;
1245 unsigned int segno;
1246 unsigned int start;
1247 unsigned int end;
1248 unsigned int source;
1249 const unsigned short* linetab;
1250 const unsigned int* offtab;
1254 /* ======================================== *
1255 * PDB file information
1256 * ======================================== */
1259 struct PDB_FILE
1261 DWORD size;
1262 DWORD unknown;
1265 struct PDB_JG_HEADER
1267 CHAR ident[40];
1268 DWORD signature;
1269 DWORD block_size;
1270 WORD free_list;
1271 WORD total_alloc;
1272 struct PDB_FILE toc;
1273 WORD toc_block[1];
1276 struct PDB_DS_HEADER
1278 char signature[32];
1279 DWORD block_size;
1280 DWORD unknown1;
1281 DWORD num_pages;
1282 DWORD toc_size;
1283 DWORD unknown2;
1284 DWORD toc_page;
1287 struct PDB_JG_TOC
1289 DWORD num_files;
1290 struct PDB_FILE file[1];
1293 struct PDB_DS_TOC
1295 DWORD num_files;
1296 DWORD file_size[1];
1299 struct PDB_JG_ROOT
1301 DWORD Version;
1302 DWORD TimeDateStamp;
1303 DWORD Age;
1304 DWORD cbNames;
1305 CHAR names[1];
1308 struct PDB_DS_ROOT
1310 DWORD Version;
1311 DWORD TimeDateStamp;
1312 DWORD Age;
1313 GUID guid;
1314 DWORD cbNames;
1315 CHAR names[1];
1318 typedef struct _PDB_TYPES_OLD
1320 DWORD version;
1321 WORD first_index;
1322 WORD last_index;
1323 DWORD type_size;
1324 WORD file;
1325 WORD pad;
1326 } PDB_TYPES_OLD, *PPDB_TYPES_OLD;
1328 typedef struct _PDB_TYPES
1330 DWORD version;
1331 DWORD type_offset;
1332 DWORD first_index;
1333 DWORD last_index;
1334 DWORD type_size;
1335 WORD file;
1336 WORD pad;
1337 DWORD hash_size;
1338 DWORD hash_base;
1339 DWORD hash_offset;
1340 DWORD hash_len;
1341 DWORD search_offset;
1342 DWORD search_len;
1343 DWORD unknown_offset;
1344 DWORD unknown_len;
1345 } PDB_TYPES, *PPDB_TYPES;
1347 typedef struct _PDB_SYMBOL_RANGE
1349 WORD segment;
1350 WORD pad1;
1351 DWORD offset;
1352 DWORD size;
1353 DWORD characteristics;
1354 WORD index;
1355 WORD pad2;
1356 } PDB_SYMBOL_RANGE, *PPDB_SYMBOL_RANGE;
1358 typedef struct _PDB_SYMBOL_RANGE_EX
1360 WORD segment;
1361 WORD pad1;
1362 DWORD offset;
1363 DWORD size;
1364 DWORD characteristics;
1365 WORD index;
1366 WORD pad2;
1367 DWORD timestamp;
1368 DWORD unknown;
1369 } PDB_SYMBOL_RANGE_EX, *PPDB_SYMBOL_RANGE_EX;
1371 typedef struct _PDB_SYMBOL_FILE
1373 DWORD unknown1;
1374 PDB_SYMBOL_RANGE range;
1375 WORD flag;
1376 WORD file;
1377 DWORD symbol_size;
1378 DWORD lineno_size;
1379 DWORD unknown2;
1380 DWORD nSrcFiles;
1381 DWORD attribute;
1382 CHAR filename[1];
1383 } PDB_SYMBOL_FILE, *PPDB_SYMBOL_FILE;
1385 typedef struct _PDB_SYMBOL_FILE_EX
1387 DWORD unknown1;
1388 PDB_SYMBOL_RANGE_EX range;
1389 WORD flag;
1390 WORD file;
1391 DWORD symbol_size;
1392 DWORD lineno_size;
1393 DWORD unknown2;
1394 DWORD nSrcFiles;
1395 DWORD attribute;
1396 DWORD reserved[2];
1397 CHAR filename[1];
1398 } PDB_SYMBOL_FILE_EX, *PPDB_SYMBOL_FILE_EX;
1400 typedef struct _PDB_SYMBOL_SOURCE
1402 WORD nModules;
1403 WORD nSrcFiles;
1404 WORD table[1];
1405 } PDB_SYMBOL_SOURCE, *PPDB_SYMBOL_SOURCE;
1407 typedef struct _PDB_SYMBOL_IMPORT
1409 DWORD unknown1;
1410 DWORD unknown2;
1411 DWORD TimeDateStamp;
1412 DWORD Age;
1413 CHAR filename[1];
1414 } PDB_SYMBOL_IMPORT, *PPDB_SYMBOL_IMPORT;
1416 typedef struct _PDB_SYMBOLS_OLD
1418 WORD hash1_file;
1419 WORD hash2_file;
1420 WORD gsym_file;
1421 WORD pad;
1422 DWORD module_size;
1423 DWORD offset_size;
1424 DWORD hash_size;
1425 DWORD srcmodule_size;
1426 } PDB_SYMBOLS_OLD, *PPDB_SYMBOLS_OLD;
1428 typedef struct _PDB_SYMBOLS
1430 DWORD signature;
1431 DWORD version;
1432 DWORD unknown;
1433 DWORD hash1_file;
1434 DWORD hash2_file;
1435 DWORD gsym_file;
1436 DWORD module_size;
1437 DWORD offset_size;
1438 DWORD hash_size;
1439 DWORD srcmodule_size;
1440 DWORD pdbimport_size;
1441 DWORD resvd[5];
1442 } PDB_SYMBOLS, *PPDB_SYMBOLS;
1444 #include "poppack.h"
1446 /* ----------------------------------------------
1447 * Information used for parsing
1448 * ---------------------------------------------- */
1450 typedef struct
1452 DWORD from;
1453 DWORD to;
1454 } OMAP_DATA;
1456 struct msc_debug_info
1458 struct module* module;
1459 int nsect;
1460 const IMAGE_SECTION_HEADER* sectp;
1461 int nomap;
1462 const OMAP_DATA* omapp;
1463 const BYTE* root;
1466 /* coff.c */
1467 extern BOOL coff_process_info(const struct msc_debug_info* msc_dbg);
1469 /* ===================================================
1470 * The old CodeView stuff (for NB09 and NB11)
1471 * =================================================== */
1473 #define sstModule 0x120
1474 #define sstTypes 0x121
1475 #define sstPublic 0x122
1476 #define sstPublicSym 0x123
1477 #define sstSymbols 0x124
1478 #define sstAlignSym 0x125
1479 #define sstSrcLnSeg 0x126
1480 #define sstSrcModule 0x127
1481 #define sstLibraries 0x128
1482 #define sstGlobalSym 0x129
1483 #define sstGlobalPub 0x12a
1484 #define sstGlobalTypes 0x12b
1485 #define sstMPC 0x12c
1486 #define sstSegMap 0x12d
1487 #define sstSegName 0x12e
1488 #define sstPreComp 0x12f
1489 #define sstFileIndex 0x133
1490 #define sstStaticSym 0x134
1492 typedef struct _CODEVIEW_HEADER_NBxx
1494 DWORD dwSignature;
1495 DWORD lfoDirectory;
1496 } CODEVIEW_HEADER_NBxx,* PCODEVIEW_HEADER_NBxx;
1498 typedef struct _CODEVIEW_HEADER_RSDS
1500 DWORD dwSignature;
1501 GUID guid;
1502 DWORD unknown;
1503 CHAR name[1];
1504 } CODEVIEW_HEADER_RSDS,* PCODEVIEW_HEADER_RSDS;
1506 typedef struct _CODEVIEW_PDB_DATA
1508 DWORD timestamp;
1509 DWORD unknown;
1510 CHAR name[1];
1511 } CODEVIEW_PDB_DATA, *PCODEVIEW_PDB_DATA;
1513 typedef struct _CV_DIRECTORY_HEADER
1515 WORD cbDirHeader;
1516 WORD cbDirEntry;
1517 DWORD cDir;
1518 DWORD lfoNextDir;
1519 DWORD flags;
1520 } CV_DIRECTORY_HEADER, *PCV_DIRECTORY_HEADER;
1522 typedef struct _CV_DIRECTORY_ENTRY
1524 WORD subsection;
1525 WORD iMod;
1526 DWORD lfo;
1527 DWORD cb;
1528 } CV_DIRECTORY_ENTRY, *PCV_DIRECTORY_ENTRY;
1530 typedef struct _CV_ENTRY_MODULE_SEGINFO
1532 WORD seg;
1533 WORD pad;
1534 DWORD offset;
1535 DWORD cbSeg;
1536 } CV_ENTRY_MODULE_SEGINFO;
1538 typedef struct _CV_ENTRY_MODULE
1540 WORD ovlNumber;
1541 WORD iLib;
1542 WORD cSeg;
1543 WORD Style;
1545 CV_ENTRY_MODULE_SEGINFO SegInfo[cSeg];
1546 p_string Name;
1548 } CV_ENTRY_MODULE;
1550 typedef struct _CV_ENTRY_GLOBAL_TYPES
1552 DWORD flags;
1553 DWORD cTypes;
1555 DWORD offset[cTypes];
1556 types_record[];
1558 } CV_ENTRY_GLOBAL_TYPES;