~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Wine Cross Reference
wine/include/wine/mscvpdb.h

Version: ~ [ wine-1.1.0 ] ~ [ wine-1.0 ] ~ [ wine-1.0-rc5 ] ~ [ wine-1.0-rc4 ] ~ [ wine-1.0-rc3 ] ~ [ wine-1.0-rc2 ] ~ [ wine-1.0-rc1 ] ~ [ wine-0.9.61 ] ~ [ wine-0.9.60 ] ~ [ wine-0.9.59 ] ~ [ wine-0.9.58 ] ~ [ wine-0.9.57 ] ~ [ wine-0.9.56 ] ~ [ wine-0.9.55 ] ~ [ wine-0.9.54 ] ~ [ wine-0.9.53 ] ~ [ wine-0.9.52 ] ~ [ wine-0.9.51 ] ~ [ wine-0.9.50 ] ~ [ wine-0.9.49 ] ~ [ wine-0.9.48 ] ~ [ wine-0.9.47 ] ~ [ wine-0.9.46 ] ~ [ wine-0.9.45 ] ~ [ wine-0.9.44 ] ~ [ wine-0.9.43 ] ~ [ wine-0.9.42 ] ~ [ wine-0.9.41 ] ~ [ wine-0.9.40 ] ~ [ wine-0.9.39 ] ~ [ wine-0.9.38 ] ~ [ wine-0.9.37 ] ~ [ wine-0.9.36 ] ~ [ wine-0.9.35 ] ~ [ wine-0.9.34 ] ~ [ wine-0.9.33 ] ~ [ wine-0.9.32 ] ~ [ wine-0.9.31 ] ~ [ wine-0.9.30 ] ~ [ wine-0.9.29 ] ~ [ wine-0.9.28 ] ~ [ wine-0.9.27 ] ~ [ wine-0.9.26 ] ~ [ wine-0.9.25 ] ~ [ wine-0.9.24 ] ~ [ wine-0.9.23 ] ~ [ wine-0.9.22 ] ~ [ wine-0.9.21 ] ~ [ wine-0.9.20 ] ~ [ wine-0.9.19 ] ~ [ wine-0.9.18 ] ~ [ wine-0.9.17 ] ~ [ wine-0.9.16 ] ~ [ wine-0.9.15 ] ~ [ wine-0.9.14 ] ~ [ wine-0.9.13 ] ~ [ wine-0.9.12 ] ~ [ wine-0.9.11 ] ~ [ wine-0.9.10 ] ~ [ wine-0.9.9 ] ~ [ wine-0.9.8 ] ~ [ wine-0.9.7 ] ~ [ wine-0.9.6 ] ~ [ wine-0.9.5 ] ~ [ wine-0.9.4 ] ~ [ wine-0.9.3 ] ~ [ wine-0.9.2 ] ~ [ wine-0.9.1 ] ~ [ wine-0.9 ] ~ [ wine20050930 ] ~ [ wine20050830 ] ~ [ wine20050725 ] ~ [ wine20050628 ] ~ [ wine20050524 ] ~ [ wine20050419 ] ~ [ wine20050310 ] ~ [ wine20050211 ] ~ [ wine20050111 ] ~ [ wine20041201 ] ~ [ wine20041019 ] ~ [ wine20040914 ] ~ [ wine20040813 ] ~ [ wine20040716 ] ~ [ wine20040615 ] ~ [ wine20040505 ] ~ [ wine20040408 ] ~ [ wine20040309 ] ~ [ wine20040213 ] ~ [ wine20040121 ] ~ [ wine20031212 ] ~ [ wine20031118 ] ~ [ wine20031016 ] ~ [ wine20030911 ] ~ [ wine20030813 ] ~ [ wine20030709 ] ~ [ wine20030618 ] ~ [ wine20030508 ] ~ [ wine20030408 ] ~ [ wine20030318 ] ~ [ wine20030219 ] ~ [ wine20030115 ] ~ [ wine20021219 ] ~ [ wine20021125 ] ~ [ wine20021031 ] ~ [ wine20021007 ] ~ [ wine20020904 ] ~ [ wine20020804 ] ~ [ wine20020710 ] ~ [ wine20020605 ] ~ [ wine20020509 ] ~ [ wine20020411 ] ~ [ wine20020310 ] ~ [ wine20020228 ] ~ [ wine20011226 ] ~ [ wine20011108 ] ~ [ wine20011004 ] ~ [ wine20010824 ] ~ [ wine20010731 ] ~ [ wine20010629 ] ~ [ wine20010510 ] ~ [ wine20010418 ] ~ [ wine20010326 ] ~ [ wine20010305 ] ~ [ wine20010216 ] ~ [ wine20010112 ] ~ [ wine20001222 ] ~ [ wine20001202 ] ~ [ wine20001026 ] ~ [ wine20001002 ] ~ [ wine20000909 ] ~ [ wine20000821 ] ~ [ wine20000801 ] ~ [ wine20000716 ] ~ [ wine20000326 ] ~ [ wine20000227 ] ~ [ wine20000130 ] ~ [ wine20000109 ] ~

  1 /*
  2  * MS debug information definitions.
  3  *
  4  * Copyright (C) 1996 Eric Youngdale
  5  * Copyright (C) 1999-2000 Ulrich Weigand
  6  * Copyright (C) 2004 Eric Pouech
  7  *
  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.
 12  *
 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.
 17  *
 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
 21  */
 22 
 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).
 26  *
 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)
 32  *
 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.
 38  *
 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.
 43  *
 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).
 54  *
 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.
 62  *
 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 ??)
 80  *
 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 greater than 256), which was likely needed for
 85  * complex C++ types (nested + templates).
 86  *
 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
 91  *
 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.
 97  */
 98 
 99 #include "pshpack1.h"
100 
101 /* ======================================== *
102  *             Type information
103  * ======================================== */
104 
105 struct p_string
106 {
107     unsigned char               namelen;
108     char                        name[1];
109 };
110 
111 union codeview_type
112 {
113     struct
114     {
115         unsigned short int      len;
116         short int               id;
117     } generic;
118 
119     struct
120     {
121         unsigned short int      len;
122         short int               id;
123         short int               attribute;
124         short int               type;
125     } modifier_v1;
126 
127     struct
128     {
129         unsigned short int      len;
130         short int               id;
131         int                     type;
132         short int               attribute;
133     } modifier_v2;
134 
135     struct
136     {
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;
143 
144     struct
145     {
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;
152 
153     struct
154     {
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;
164 
165     struct
166     {
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;
176 
177     struct
178     {
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;
188 
189     struct
190     {
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;
203 
204     struct
205     {
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;
218 
219     struct
220     {
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;
233 
234     struct
235     {
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;
246 
247     struct
248     {
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;
259 
260     struct
261     {
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;
272 
273     struct
274     {
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;
283 
284     struct
285     {
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;
294 
295     struct
296     {
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;
305 
306     struct
307     {
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;
316 
317     struct
318     {
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;
327 
328     struct
329     {
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;
341 
342     struct
343     {
344         unsigned short int      len;
345         short int               id;
346         unsigned int            rvtype;
347         unsigned int            class_type;
348         unsigned                this_type;
349         unsigned char           call;
350         unsigned char           reserved;
351         unsigned short          params;
352         unsigned int            arglist;
353         unsigned int            this_adjust;
354     } mfunction_v2;
355 };
356 
357 union codeview_reftype
358 {
359     struct
360     {
361         unsigned short int      len;
362         short int               id;
363     } generic;
364 
365     struct
366     {
367         unsigned short int      len;
368         short int               id;
369         unsigned char           list[1];
370     } fieldlist;
371 
372     struct
373     {
374         unsigned short int      len;
375         short int               id;
376         unsigned char           nbits;
377         unsigned char           bitoff;
378         unsigned short          type;
379     } bitfield_v1;
380 
381     struct
382     {
383         unsigned short int      len;
384         short int               id;
385         unsigned int            type;
386         unsigned char           nbits;
387         unsigned char           bitoff;
388     } bitfield_v2;
389 
390     struct
391     {
392         unsigned short int      len;
393         short int               id;
394         unsigned short          num;
395         unsigned short          args[1];
396     } arglist_v1;
397 
398     struct
399     {
400         unsigned short int      len;
401         short int               id;
402         unsigned                num;
403         unsigned                args[1];
404     } arglist_v2;
405 
406     struct
407     {
408         unsigned short int      len;
409         short int               id;
410         unsigned short          num;
411         unsigned short          drvdcls[1];
412     } derived_v1;
413 
414     struct
415     {
416         unsigned short int      len;
417         short int               id;
418         unsigned                num;
419         unsigned                drvdcls[1];
420     } derived_v2;
421 };
422 
423 union codeview_fieldtype
424 {
425     struct
426     {
427         short int               id;
428     } generic;
429 
430     struct
431     {
432         short int               id;
433         short int               type;
434         short int               attribute;
435         unsigned short int      offset;     /* numeric leaf */
436     } bclass_v1;
437 
438     struct
439     {
440         short int               id;
441         short int               attribute;
442         unsigned int            type;
443         unsigned short int      offset;     /* numeric leaf */
444     } bclass_v2;
445 
446     struct
447     {
448         short int               id;
449         short int               btype;
450         short int               vbtype;
451         short int               attribute;
452         unsigned short int      vbpoff;     /* numeric leaf */
453 #if 0
454         unsigned short int      vboff;      /* numeric leaf */
455 #endif
456     } vbclass_v1;
457 
458     struct
459     {
460         short int               id;
461         short int               attribute;
462         unsigned int            btype;
463         unsigned int            vbtype;
464         unsigned short int      vbpoff;     /* numeric leaf */
465 #if 0
466         unsigned short int      vboff;      /* numeric leaf */
467 #endif
468     } vbclass_v2;
469 
470     struct
471     {
472         short int               id;
473         short int               attribute;
474         unsigned short int      value;     /* numeric leaf */
475 #if 0
476         struct p_string         p_name;
477 #endif
478     } enumerate_v1;
479 
480    struct
481     {
482         short int               id;
483         short int               attribute;
484         unsigned short int      value;     /* numeric leaf */
485 #if 0
486         char                    name[1];
487 #endif
488     } enumerate_v3;
489 
490     struct
491     {
492         short int               id;
493         short int               type;
494         struct p_string         p_name;
495     } friendfcn_v1;
496 
497     struct
498     {
499         short int               id;
500         short int               _pad0;
501         unsigned int            type;
502         struct p_string         p_name;
503     } friendfcn_v2;
504 
505     struct
506     {
507         short int               id;
508         short int               type;
509         short int               attribute;
510         unsigned short int      offset;    /* numeric leaf */
511 #if 0
512         struct p_string         p_name;
513 #endif
514     } member_v1;
515 
516     struct
517     {
518         short int               id;
519         short int               attribute;
520         unsigned int            type;
521         unsigned short int      offset;    /* numeric leaf */
522 #if 0
523         struct p_string         p_name;
524 #endif
525     } member_v2;
526 
527     struct
528     {
529         short int               id;
530         short int               attribute;
531         unsigned int            type;
532         unsigned short int      offset; /* numeric leaf */
533 #if 0
534         unsigned char           name[1];
535 #endif
536     }
537     member_v3;
538 
539     struct
540     {
541         short int               id;
542         short int               type;
543         short int               attribute;
544         struct p_string         p_name;
545     } stmember_v1;
546 
547     struct
548     {
549         short int               id;
550         short int               attribute;
551         unsigned int            type;
552         struct p_string         p_name;
553     } stmember_v2;
554 
555     struct
556     {
557         short int               id;
558         short int               attribute;
559         unsigned int            type;
560         char                    name[1];
561     } stmember_v3;
562 
563     struct
564     {
565         short int               id;
566         short int               count;
567         short int               mlist;
568         struct p_string         p_name;
569     } method_v1;
570 
571     struct
572     {
573         short int               id;
574         short int               count;
575         unsigned int            mlist;
576         struct p_string         p_name;
577     } method_v2;
578 
579     struct
580     {
581         short int               id;
582         short int               count;
583         unsigned int            mlist;
584         char                    name[1];
585     } method_v3;
586 
587     struct
588     {
589         short int               id;
590         short int               type;
591         struct p_string         p_name;
592     } nesttype_v1;
593 
594     struct
595     {
596         short int               id;
597         short int               _pad0;
598         unsigned int            type;
599         struct p_string         p_name;
600     } nesttype_v2;
601 
602     struct
603     {
604         short int               id;
605         short int               _pad0;
606         unsigned int            type;
607         char                    name[1];
608     } nesttype_v3;
609 
610     struct
611     {
612         short int               id;
613         short int               type;
614     } vfunctab_v1;
615 
616     struct
617     {
618         short int               id;
619         short int               _pad0;
620         unsigned int            type;
621     } vfunctab_v2;
622 
623     struct
624     {
625         short int               id;
626         short int               type;
627     } friendcls_v1;
628 
629     struct
630     {
631         short int               id;
632         short int               _pad0;
633         unsigned int            type;
634     } friendcls_v2;
635 
636     struct
637     {
638         short int               id;
639         short int               attribute;
640         short int               type;
641         struct p_string         p_name;
642     } onemethod_v1;
643 
644     struct
645     {
646         short int               id;
647         short int               attribute;
648         unsigned int            type;
649         struct p_string         p_name;
650     } onemethod_v2;
651 
652     struct
653     {
654         short int               id;
655         short int               attribute;
656         unsigned int            type;
657         char                    name[1];
658     } onemethod_v3;
659 
660     struct
661     {
662         short int               id;
663         short int               attribute;
664         short int               type;
665         unsigned int            vtab_offset;
666         struct p_string         p_name;
667     } onemethod_virt_v1;
668 
669     struct
670     {
671         short int               id;
672         short int               attribute;
673         unsigned int            type;
674         unsigned int            vtab_offset;
675         struct p_string         p_name;
676     } onemethod_virt_v2;
677 
678     struct
679     {
680         short int               id;
681         short int               attribute;
682         unsigned int            type;
683         unsigned int            vtab_offset;
684         char                    name[1];
685     } onemethod_virt_v3;
686 
687     struct
688     {
689         short int               id;
690         short int               type;
691         unsigned int            offset;
692     } vfuncoff_v1;
693 
694     struct
695     {
696         short int               id;
697         short int               _pad0;
698         unsigned int            type;
699         unsigned int            offset;
700     } vfuncoff_v2;
701 
702     struct
703     {
704         short int               id;
705         short int               attribute;
706         short int               type;
707         struct p_string         p_name;
708     } nesttypeex_v1;
709 
710     struct
711     {
712         short int               id;
713         short int               attribute;
714         unsigned int            type;
715         struct p_string         p_name;
716     } nesttypeex_v2;
717 
718     struct
719     {
720         short int               id;
721         short int               attribute;
722         unsigned int            type;
723         struct p_string         p_name;
724     } membermodify_v2;
725 
726 };
727 
728 
729 /*
730  * This covers the basic datatypes that VC++ seems to be using these days.
731  * 32 bit mode only.  There are additional numbers for the pointers in 16
732  * bit mode.  There are many other types listed in the documents, but these
733  * are apparently not used by the compiler, or represent pointer types
734  * that are not used.
735  *
736  * Official MS documentation says that type (< 0x4000, so 12 bits) is made of:
737  *        +----------+------+------+----------+------+
738  *        |    11    | 10-8 | 7-4  |     3    | 2-0  |
739  *        +----------+------+------+----------+------+
740  *        | reserved | mode | type | reserved | size |
741  *        +----------+------+------+----------+------+
742  * In recent PDB files, type 8 exists, and is seen as an HRESULT... So we've
743  * added this basic type... as if bit 3 had been integrated into the size field
744  */
745 
746 /* the type number of a built-in type is a 16-bit value specified in the following format:
747     bit #   |   11     |   10-8   |   7-4    |    3     |    2-0   |
748     field   | reserved |   mode   |   type   | reserved |   size   |
749 
750     where
751         <type> is one of the following types:
752                 0x00 Special
753                 0x01 Signed integral value
754                 0x02 Unsigned integral value
755                 0x03 Boolean
756                 0x04 Real
757                 0x05 Complex
758                 0x06 Special2
759                 0x07 Real int value
760                 0x08 Reserved
761                 0x09 Reserved
762                 0x0a Reserved
763                 0x0b Reserved
764                 0x0c Reserved
765                 0x0d Reserved
766                 0x0e Reserved
767                 0x0f Reserved for debugger expression evaluator
768 
769         <size> is an enumerated value for each of the types.
770                 Type = special
771                     0x00 No type
772                     0x01 Absolute symbol
773                     0x02 Segment
774                     0x03 Void
775                     0x04 Basic 8-byte currency value
776                     0x05 Near Basic string
777                     0x06 Far Basic string
778                     0x07 Untranslated type from previous Microsoft symbol formats
779                 Type = signed/unsigned integral and Boolean values
780                     0x00 1 byte
781                     0x01 2 byte
782                     0x02 4 byte
783                     0x03 8 byte
784                     0x04 Reserved
785                     0x05 Reserved
786                     0x06 Reserved
787                     0x07 Reserved
788                 Type = real and complex
789                     0x00 32 bit
790                     0x01 64 bit
791                     0x02 80 bit
792                     0x03 128 bit
793                     0x04 48 bit
794                     0x05 Reserved
795                     0x06 Reserved
796                     0x07 Reserved
797                 Type = special2
798                     0x00 Bit
799                     0x01 Pascal CHAR
800                 Type = Real int
801                     0x00 Char
802                     0x01 Wide character
803                     0x02 2-byte signed integer
804                     0x03 2-byte unsigned integer
805                     0x04 4-byte signed integer
806                     0x05 4-byte unsigned integer
807                     0x06 8-byte signed integer
808                     0x07 8-byte unsigned integer
809 
810             <mode> is the pointer mode:
811                 0x00 Direct; not a pointer
812                 0x01 Near pointer
813                 0x02 Far pointer
814                 0x03 Huge pointer
815                 0x04 32-bit near pointer
816                 0x05 32-bit far pointer
817                 0x06 64-bit near pointer
818                 0x07 Reserved
819 */
820 
821 /* basic types */
822 #define T_NOTYPE            0x0000  /* Notype */
823 #define T_ABS               0x0001  /* Abs */
824 #define T_SEGMENT           0x0002  /* segment type */
825 #define T_VOID              0x0003  /* Void */
826 #define T_CURRENCY          0x0004  /* basic 8-byte currency value */
827 #define T_NBASICSTR         0x0005  /* near basic string */
828 #define T_FBASICSTR         0x0006  /* far basic string */
829 #define T_NOTTRANS          0x0007  /* untranslated type record from MS symbol format */
830 #define T_HRESULT           0x0008  /* HRESULT - or error code ??? */
831 #define T_CHAR              0x0010  /* signed char */
832 #define T_SHORT             0x0011  /* short */
833 #define T_LONG              0x0012  /* long */
834 #define T_QUAD              0x0013  /* long long */
835 #define T_UCHAR             0x0020  /* unsigned  char */
836 #define T_USHORT            0x0021  /* unsigned short */
837 #define T_ULONG             0x0022  /* unsigned long */
838 #define T_UQUAD             0x0023  /* unsigned long long */
839 #define T_BOOL08            0x0030  /* 8-bit boolean */
840 #define T_BOOL16            0x0031  /* 16-bit boolean */
841 #define T_BOOL32            0x0032  /* 32-bit boolean */
842 #define T_BOOL64            0x0033  /* 64-bit boolean */
843 #define T_REAL32            0x0040  /* float */
844 #define T_REAL64            0x0041  /* double */
845 #define T_REAL80            0x0042  /* 80-bit real */
846 #define T_REAL128           0x0043  /* 128-bit real */
847 #define T_REAL48            0x0044  /* 48-bit real */
848 #define T_CPLX32            0x0050  /* 32-bit complex number */
849 #define T_CPLX64            0x0051  /* 64-bit complex number */
850 #define T_CPLX80            0x0052  /* 80-bit complex number */
851 #define T_CPLX128           0x0053  /* 128-bit complex number */
852 #define T_BIT               0x0060  /* bit */
853 #define T_PASCHAR           0x0061  /* pascal CHAR */
854 #define T_RCHAR             0x0070  /* real char */
855 #define T_WCHAR             0x0071  /* wide char */
856 #define T_INT2              0x0072  /* real 16-bit signed int */
857 #define T_UINT2             0x0073  /* real 16-bit unsigned int */
858 #define T_INT4              0x0074  /* int */
859 #define T_UINT4             0x0075  /* unsigned int */
860 #define T_INT8              0x0076  /* 64-bit signed int */
861 #define T_UINT8             0x0077  /* 64-bit unsigned int */
862 
863 
864 /* near pointers to basic types */
865 #define T_PVOID             0x0103  /* near pointer to void */
866 #define T_PCHAR             0x0110  /* Near pointer to 8-bit signed */
867 #define T_PSHORT            0x0111  /* Near pointer to 16-bit signed */
868 #define T_PLONG             0x0112  /* Near pointer to 32-bit signed */
869 #define T_PQUAD             0x0113  /* Near pointer to 64-bit signed */
870 #define T_PUCHAR            0x0120  /* Near pointer to 8-bit unsigned */
871 #define T_PUSHORT           0x0121  /* Near pointer to 16-bit unsigned */
872 #define T_PULONG            0x0122  /* Near pointer to 32-bit unsigned */
873 #define T_PUQUAD            0x0123  /* Near pointer to 64-bit unsigned */
874 #define T_PBOOL08           0x0130  /* Near pointer to 8-bit Boolean */
875 #define T_PBOOL16           0x0131  /* Near pointer to 16-bit Boolean */
876 #define T_PBOOL32           0x0132  /* Near pointer to 32-bit Boolean */
877 #define T_PBOOL64           0x0133  /* Near pointer to 64-bit Boolean */
878 #define T_PREAL32           0x0140  /* Near pointer to 32-bit real */
879 #define T_PREAL64           0x0141  /* Near pointer to 64-bit real */
880 #define T_PREAL80           0x0142  /* Near pointer to 80-bit real */
881 #define T_PREAL128          0x0143  /* Near pointer to 128-bit real */
882 #define T_PREAL48           0x0144  /* Near pointer to 48-bit real */
883 #define T_PCPLX32           0x0150  /* Near pointer to 32-bit complex */
884 #define T_PCPLX64           0x0151  /* Near pointer to 64-bit complex */
885 #define T_PCPLX80           0x0152  /* Near pointer to 80-bit complex */
886 #define T_PCPLX128          0x0153  /* Near pointer to 128-bit complex */
887 #define T_PRCHAR            0x0170  /* Near pointer to a real char */
888 #define T_PWCHAR            0x0171  /* Near pointer to a wide char */
889 #define T_PINT2             0x0172  /* Near pointer to 16-bit signed int */
890 #define T_PUINT2            0x0173  /* Near pointer to 16-bit unsigned int */
891 #define T_PINT4             0x0174  /* Near pointer to 32-bit signed int */
892 #define T_PUINT4            0x0175  /* Near pointer to 32-bit unsigned int */
893 #define T_PINT8             0x0176  /* Near pointer to 64-bit signed int */
894 #define T_PUINT8            0x0177  /* Near pointer to 64-bit unsigned int */
895 
896 
897 /* far pointers to basic types */
898 #define T_PFVOID            0x0203  /* Far pointer to void */
899 #define T_PFCHAR            0x0210  /* Far pointer to 8-bit signed */
900 #define T_PFSHORT           0x0211  /* Far pointer to 16-bit signed */
901 #define T_PFLONG            0x0212  /* Far pointer to 32-bit signed */
902 #define T_PFQUAD            0x0213  /* Far pointer to 64-bit signed */
903 #define T_PFUCHAR           0x0220  /* Far pointer to 8-bit unsigned */
904 #define T_PFUSHORT          0x0221  /* Far pointer to 16-bit unsigned */
905 #define T_PFULONG           0x0222  /* Far pointer to 32-bit unsigned */
906 #define T_PFUQUAD           0x0223  /* Far pointer to 64-bit unsigned */
907 #define T_PFBOOL08          0x0230  /* Far pointer to 8-bit Boolean */
908 #define T_PFBOOL16          0x0231  /* Far pointer to 16-bit Boolean */
909 #define T_PFBOOL32          0x0232  /* Far pointer to 32-bit Boolean */
910 #define T_PFBOOL64          0x0233  /* Far pointer to 64-bit Boolean */
911 #define T_PFREAL32          0x0240  /* Far pointer to 32-bit real */
912 #define T_PFREAL64          0x0241  /* Far pointer to 64-bit real */
913 #define T_PFREAL80          0x0242  /* Far pointer to 80-bit real */
914 #define T_PFREAL128         0x0243  /* Far pointer to 128-bit real */
915 #define T_PFREAL48          0x0244  /* Far pointer to 48-bit real */
916 #define T_PFCPLX32          0x0250  /* Far pointer to 32-bit complex */
917 #define T_PFCPLX64          0x0251  /* Far pointer to 64-bit complex */
918 #define T_PFCPLX80          0x0252  /* Far pointer to 80-bit complex */
919 #define T_PFCPLX128         0x0253  /* Far pointer to 128-bit complex */
920 #define T_PFRCHAR           0x0270  /* Far pointer to a real char */
921 #define T_PFWCHAR           0x0271  /* Far pointer to a wide char */
922 #define T_PFINT2            0x0272  /* Far pointer to 16-bit signed int */
923 #define T_PFUINT2           0x0273  /* Far pointer to 16-bit unsigned int */
924 #define T_PFINT4            0x0274  /* Far pointer to 32-bit signed int */
925 #define T_PFUINT4           0x0275  /* Far pointer to 32-bit unsigned int */
926 #define T_PFINT8            0x0276  /* Far pointer to 64-bit signed int */
927 #define T_PFUINT8           0x0277  /* Far pointer to 64-bit unsigned int */
928 
929 
930 /* huge pointers to basic types */
931 #define T_PHVOID            0x0303  /* Huge pointer to void */
932 #define T_PHCHAR            0x0310  /* Huge pointer to 8-bit signed */
933 #define T_PHSHORT           0x0311  /* Huge pointer to 16-bit signed */
934 #define T_PHLONG            0x0312  /* Huge pointer to 32-bit signed */
935 #define T_PHQUAD            0x0313  /* Huge pointer to 64-bit signed */
936 #define T_PHUCHAR           0x0320  /* Huge pointer to 8-bit unsigned */
937 #define T_PHUSHORT          0x0321  /* Huge pointer to 16-bit unsigned */
938 #define T_PHULONG           0x0322  /* Huge pointer to 32-bit unsigned */
939 #define T_PHUQUAD           0x0323  /* Huge pointer to 64-bit unsigned */
940 #define T_PHBOOL08          0x0330  /* Huge pointer to 8-bit Boolean */
941 #define T_PHBOOL16          0x0331  /* Huge pointer to 16-bit Boolean */
942 #define T_PHBOOL32          0x0332  /* Huge pointer to 32-bit Boolean */
943 #define T_PHBOOL64          0x0333  /* Huge pointer to 64-bit Boolean */
944 #define T_PHREAL32          0x0340  /* Huge pointer to 32-bit real */
945 #define T_PHREAL64          0x0341  /* Huge pointer to 64-bit real */
946 #define T_PHREAL80          0x0342  /* Huge pointer to 80-bit real */
947 #define T_PHREAL128         0x0343  /* Huge pointer to 128-bit real */
948 #define T_PHREAL48          0x0344  /* Huge pointer to 48-bit real */
949 #define T_PHCPLX32          0x0350  /* Huge pointer to 32-bit complex */
950 #define T_PHCPLX64          0x0351  /* Huge pointer to 64-bit complex */
951 #define T_PHCPLX80          0x0352  /* Huge pointer to 80-bit complex */
952 #define T_PHCPLX128         0x0353  /* Huge pointer to 128-bit real */
953 #define T_PHRCHAR           0x0370  /* Huge pointer to a real char */
954 #define T_PHWCHAR           0x0371  /* Huge pointer to a wide char */
955 #define T_PHINT2            0x0372  /* Huge pointer to 16-bit signed int */
956 #define T_PHUINT2           0x0373  /* Huge pointer to 16-bit unsigned int */
957 #define T_PHINT4            0x0374  /* Huge pointer to 32-bit signed int */
958 #define T_PHUINT4           0x0375  /* Huge pointer to 32-bit unsigned int */
959 #define T_PHINT8            0x0376  /* Huge pointer to 64-bit signed int */
960 #define T_PHUINT8           0x0377  /* Huge pointer to 64-bit unsigned int */
961 
962 
963 /* 32-bit near pointers to basic types */
964 #define T_32PVOID           0x0403  /* 32-bit near pointer to void */
965 #define T_32PHRESULT        0x0408  /* 16:32 near pointer to HRESULT - or error code ??? */
966 #define T_32PCHAR           0x0410  /* 16:32 near pointer to 8-bit signed */
967 #define T_32PSHORT          0x0411  /* 16:32 near pointer to 16-bit signed */
968 #define T_32PLONG           0x0412  /* 16:32 near pointer to 32-bit signed */
969 #define T_32PQUAD           0x0413  /* 16:32 near pointer to 64-bit signed */
970 #define T_32PUCHAR          0x0420  /* 16:32 near pointer to 8-bit unsigned */
971 #define T_32PUSHORT         0x0421  /* 16:32 near pointer to 16-bit unsigned */
972 #define T_32PULONG          0x0422  /* 16:32 near pointer to 32-bit unsigned */
973 #define T_32PUQUAD          0x0423  /* 16:32 near pointer to 64-bit unsigned */
974 #define T_32PBOOL08         0x0430  /* 16:32 near pointer to 8-bit Boolean */
975 #define T_32PBOOL16         0x0431  /* 16:32 near pointer to 16-bit Boolean */
976 #define T_32PBOOL32         0x0432  /* 16:32 near pointer to 32-bit Boolean */
977 #define T_32PBOOL64         0x0433  /* 16:32 near pointer to 64-bit Boolean */
978 #define T_32PREAL32         0x0440  /* 16:32 near pointer to 32-bit real */
979 #define T_32PREAL64         0x0441  /* 16:32 near pointer to 64-bit real */
980 #define T_32PREAL80         0x0442  /* 16:32 near pointer to 80-bit real */
981 #define T_32PREAL128        0x0443  /* 16:32 near pointer to 128-bit real */
982 #define T_32PREAL48         0x0444  /* 16:32 near pointer to 48-bit real */
983 #define T_32PCPLX32         0x0450  /* 16:32 near pointer to 32-bit complex */
984 #define T_32PCPLX64         0x0451  /* 16:32 near pointer to 64-bit complex */
985 #define T_32PCPLX80         0x0452  /* 16:32 near pointer to 80-bit complex */
986 #define T_32PCPLX128        0x0453  /* 16:32 near pointer to 128-bit complex */
987 #define T_32PRCHAR          0x0470  /* 16:32 near pointer to a real char */
988 #define T_32PWCHAR          0x0471  /* 16:32 near pointer to a wide char */
989 #define T_32PINT2           0x0472  /* 16:32 near pointer to 16-bit signed int */
990 #define T_32PUINT2          0x0473  /* 16:32 near pointer to 16-bit unsigned int */
991 #define T_32PINT4           0x0474  /* 16:32 near pointer to 32-bit signed int */
992 #define T_32PUINT4          0x0475  /* 16:32 near pointer to 32-bit unsigned int */
993 #define T_32PINT8           0x0476  /* 16:32 near pointer to 64-bit signed int */
994 #define T_32PUINT8          0x0477  /* 16:32 near pointer to 64-bit unsigned int */
995 
996 
997 /* 32-bit far pointers to basic types */
998 #define T_32PFVOID          0x0503  /* 32-bit far pointer to void */
999 #define T_32PFCHAR          0x0510  /* 16:32 far pointer to 8-bit signed */
1000 #define T_32PFSHORT         0x0511  /* 16:32 far pointer to 16-bit signed */
1001 #define T_32PFLONG          0x0512  /* 16:32 far pointer to 32-bit signed */
1002 #define T_32PFQUAD          0x0513  /* 16:32 far pointer to 64-bit signed */
1003 #define T_32PFUCHAR         0x0520  /* 16:32 far pointer to 8-bit unsigned */
1004 #define T_32PFUSHORT        0x0521  /* 16:32 far pointer to 16-bit unsigned */
1005 #define T_32PFULONG         0x0522  /* 16:32 far pointer to 32-bit unsigned */