Repository URL to install this package:
Version:
9.0~241217-2.fc42 ▾
|
/*
* Interactive disassembler (IDA).
* Copyright (c) 1990-98 by Ilfak Guilfanov.
* ALL RIGHTS RESERVED.
* E-mail: ig@estar.msk.su
* FIDO: 2:5020/209
*
*/
#ifndef __CV_HPP
#define __CV_HPP
#pragma pack(push, 1)
//----------------------------------------------------------------------
// Codeview debug data
//----------------------------------------------------------------------
#define CV_NB00 "NB00" // Not supported.
#define CV_NB01 "NB01" // Not supported.
#define CV_NB02 "NB02" // CodeView 3
#define CV_NB03 "NB03" // Not supported.
#define CV_NB04 "NB04" // Not supported.
#define CV_NB05 "NB05" // Emitted by LINK, version 5.20 and later linkers for
// a file before it has been packed.
#define CV_NB06 "NB06" // Not supported.
#define CV_NB07 "NB07" // Used for Quick C for Windows 1.0 only.
#define CV_NB08 "NB08" // Used by Microsoft CodeView debugger, versions 4.00
// through 4.05, for a file after it has been packed.
// Microsoft CodeView, version 4.00 through 4.05 will
// not process a file that does not have this
// signature.
#define CV_NB09 "NB09" // Used by Microsoft CodeView, version 4.10 for a file
// after it has been packed. Microsoft CodeView 4.10
// will not process a file that does not have this
// signature.
#define CV_NB10 "NB10" // The signature for an executable with the debug
// information stored in a separate PDB file. Corresponds
// with the formats set forth in NB09 or NB11.
#define CV_NB11 "NB11" // The signature for Visual C++ 5.0 debug information that
// has been packed and bonded to the executable. This
// includes all 32-bit type indices.
//----------------------------------------------------------------------
bool inline is_codeview_magic(const char *data)
{
return strncmp(data,CV_NB02,4) == 0
|| strncmp(data,CV_NB05,4) == 0
|| strncmp(data,CV_NB08,4) == 0
|| strncmp(data,CV_NB09,4) == 0
|| strncmp(data,CV_NB11,4) == 0;
}
#define CV_SIGNATURE 0x00000001 // flags should be equal to this
#define CV_SIGNATUR2 0x00000002 // NB11: flags should be equal to this
#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 unused 0x130
#define sstNames 0x130 // in tds ONLY
#define sstBrowse 0x131 // in tds ONLY
#define sstOffsetMap16 0x131
#define sstOffsetMap32 0x132
#define sstFileIndex 0x133
#define sstStaticSym 0x134
struct cv_dir_header_t
{
uint16 cbDirHeader; // Length of directory header.
uint16 cbDirEntry; // Length of each directory entry.
uint32 cDir; // Number of directory entries.
uint32 lfoNextDir; // Offset from lfaBase of next directory. This field
// is currently unused, but is intended for use by
// the incremental linker to point to the next
// directory containing Symbol and Type OMF
// information from an incremental link.
// TDS: 0
uint32 flags; // Flags describing directory and subsection tables.
// No values have been defined for this field.
// TDS: 0
};
struct cv_dir_entry_t
{
uint16 subsection; // Subdirectory index. See the table below for a
// listing of the valid subsection indices.
uint16 iMod; // Module index. This number is 1 based and zero (0)
// is never a valid index. The index 0xffff is
// reserved for tables that are not associated
// with a specific module. These tables include
// sstLibraries, sstGlobalSym, sstGlobalPub,
// and sstGlobalTypes.
// TDS: 0-value used for sstGlobal... & sstNames
uint32 lfo; // Offset from the base address lfaBase.
// TDS: offset from start of tds
uint32 cb; // Number of bytes in subsection.
};
//----------------------------------------------------------------------
//
// Type information
//
// 11 reserved
//
// 10 - 8 mode
// 0 -
// 1 - near*
// 2 - far*
// 3 - huge*
// 4 - near32*
// 5 - far32*
// 6 - near64*
// 7 - *??*
//
// 7 - 4 type
// 0 -
// 1 - int
// 2 - uint
// 3 - bool
// 4 - real
// 5 - complex
// ...
// 0xF - CVuse
//
// 3 reserved
//
// 2 - 0 size
// if ( !type ) {
// 0 -
// 1 - ABS
// 2 - Segment
// 3 - void
// 4 - BasicCurr
// 5 - NearBasicCurr
// 6 - FarBasicCurr
// 7 - CV3x
// }
// if ( type == 6 ) {
// 0 - Bit
// 1 - PasChar
// 2 - UndefExternal
// 3 - void
// 4 - BasicCurr
// 5 - NearBasicCurr
// 6 - FarBasicCurr
// 7 - CV3x
// }
// if ( type == 7 ) {
// 0 - char
// 1 - wchar
// 2 - rint16
// 3 - ruint16
// 4 - rint32
// 5 - ruint32
// 6 - rint64
// 7 - ruint64
// }
//
// Special Types
#define CV_T_NOTYPE 0x0000 // Uncharacterized type (no type)
#define CV_T_ABS 0x0001 // Absolute symbol
#define CV_T_SEGMENT 0x0002 // Segment type
#define CV_T_VOID 0x0003 // Void
#define CV_T_PVOID 0x0103 // Near pointer to void
#define CV_T_PFVOID 0x0203 // Far pointer to void
#define CV_T_PHVOID 0x0303 // Huge pointer to void
#define CV_T_32PVOID 0x0403 // 32-bit near pointer to void
#define CV_T_32PFVOID 0x0503 // 32-bit far pointer to void
#define CV_T_CURRENCY 0x0004 // Basic 8-byte currency value
#define CV_T_NBASICSTR 0x0005 // Near Basic string
#define CV_T_FBASICSTR 0x0006 // Far Basic string
#define CV_T_NOTTRANS 0x0007 // Untranslated type record from Microsoft symbol format
#define CV_T_BIT 0x0060 // Bit
#define CV_T_PASCHAR 0x0061 // Pascal CHAR
// Character Types
#define CV_T_CHAR 0x0010 // 8-bit signed
#define CV_T_UCHAR 0x0020 // 8-bit unsigned
#define CV_T_PCHAR 0x0110 // Near pointer to 8-bit signed
#define CV_T_PUCHAR 0x0120 // Near pointer to 8-bit unsigned
#define CV_T_PFCHAR 0x0210 // Far pointer to 8-bit signed
#define CV_T_PFUCHAR 0x0220 // Far pointer to 8-bit unsigned
#define CV_T_PHCHAR 0x0310 // Huge pointer to 8-bit signed
#define CV_T_PHUCHAR 0x0320 // Huge pointer to 8-bit unsigned
#define CV_T_32PCHAR 0x0410 // 16:32 near pointer to 8-bit signed
#define CV_T_32PUCHAR 0x0420 // 16:32 near pointer to 8-bit unsigned
#define CV_T_32PFCHAR 0x0510 // 16:32 far pointer to 8-bit signed
#define CV_T_32PFUCHAR 0x0520 // 16:32 far pointer to 8-bit unsigned
// Real Character Types
#define CV_T_RCHAR 0x0070 // Real char
#define CV_T_PRCHAR 0x0170 // Near pointer to a real char
#define CV_T_PFRCHAR 0x0270 // Far pointer to a real char
#define CV_T_PHRCHAR 0x0370 // Huge pointer to a real char
#define CV_T_32PRCHAR 0x0470 // 16:32 near pointer to a real char
#define CV_T_32PFRCHAR 0x0570 // 16:32 far pointer to a real char
// Wide Character Types
#define CV_T_WCHAR 0x0071 // Wide char
#define CV_T_PWCHAR 0x0171 // Near pointer to a wide char
#define CV_T_PFWCHAR 0x0271 // Far pointer to a wide char
#define CV_T_PHWCHAR 0x0371 // Huge pointer to a wide char
#define CV_T_32PWCHAR 0x0471 // 16:32 near pointer to a wide char
#define CV_T_32PFWCHAR 0x0571 // 16:32 far pointer to a wide char
// Real 16-bit Integer Types
#define CV_T_INT2 0x0072 // Real 16-bit signed int
#define CV_T_UINT2 0x0073 // Real 16-bit unsigned int
#define CV_T_PINT2 0x0172 // Near pointer to 16-bit signed int
#define CV_T_PUINT2 0x0173 // Near pointer to 16-bit unsigned int
#define CV_T_PFINT2 0x0272 // Far pointer to 16-bit signed int
#define CV_T_PFUINT2 0x0273 // Far pointer to 16-bit unsigned int
#define CV_T_PHINT2 0x0372 // Huge pointer to 16-bit signed int
#define CV_T_PHUINT2 0x0373 // Huge pointer to 16-bit unsigned int
#define CV_T_32PINT2 0x0472 // 16:32 near pointer to 16-bit signed int
#define CV_T_32PUINT2 0x0473 // 16:32 near pointer to 16-bit unsigned int
#define CV_T_32PFINT2 0x0572 // 16:32 far pointer to 16-bit signed int
#define CV_T_32PFUINT2 0x0573 // 16:32 far pointer to 16-bit unsigned int
// 16-bit Short Types
#define CV_T_SHORT 0x0011 // 16-bit signed
#define CV_T_USHORT 0x0021 // 16-bit unsigned
#define CV_T_PSHORT 0x0111 // Near pointer to 16-bit signed
#define CV_T_PUSHORT 0x0121 // Near pointer to 16-bit unsigned
#define CV_T_PFSHORT 0x0211 // Far pointer to 16-bit signed
#define CV_T_PFUSHORT 0x0221 // Far pointer to 16-bit unsigned
#define CV_T_PHSHORT 0x0311 // Huge pointer to 16-bit signed
#define CV_T_PHUSHORT 0x0321 // Huge pointer to 16-bit unsigned
#define CV_T_32PSHORT 0x0411 // 16:32 near pointer to 16-bit signed
#define CV_T_32PUSHORT 0x0421 // 16:32 near pointer to 16-bit unsigned
#define CV_T_32PFSHORT 0x0511 // 16:32 far pointer to 16-bit signed
#define CV_T_32PFUSHORT 0x0521 // 16:32 far pointer to 16-bit unsigned
// Real 32-bit Integer Types
#define CV_T_INT4 0x0074 // Real 32-bit signed int
#define CV_T_UINT4 0x0075 // Real 32-bit unsigned int
#define CV_T_PINT4 0x0174 // Near pointer to 32-bit signed int
#define CV_T_PUINT4 0x0175 // Near pointer to 32-bit unsigned int
#define CV_T_PFINT4 0x0274 // Far pointer to 32-bit signed int
#define CV_T_PFUINT4 0x0275 // Far pointer to 32-bit unsigned int
#define CV_T_PHINT4 0x0374 // Huge pointer to 32-bit signed int
#define CV_T_PHUINT4 0x0375 // Huge pointer to 32-bit unsigned int
#define CV_T_32PINT4 0x0474 // 16:32 near pointer to 32-bit signed int
#define CV_T_32PUINT4 0x0475 // 16:32 near pointer to 32-bit unsigned int
#define CV_T_32PFINT4 0x0574 // 16:32 far pointer to 32-bit signed int
#define CV_T_32PFUINT4 0x0575 // 16:32 far pointer to 32-bit unsigned int
// 32-bit Long Types
#define CV_T_LONG 0x0012 // 32-bit signed
#define CV_T_ULONG 0x0022 // 32-bit unsigned
#define CV_T_PLONG 0x0112 // Near pointer to 32-bit signed
#define CV_T_PULONG 0x0122 // Near pointer to 32-bit unsigned
#define CV_T_PFLONG 0x0212 // Far pointer to 32-bit signed
#define CV_T_PFULONG 0x0222 // Far pointer to 32-bit unsigned
#define CV_T_PHLONG 0x0312 // Huge pointer to 32-bit signed
#define CV_T_PHULONG 0x0322 // Huge pointer to 32-bit unsigned
#define CV_T_32PLONG 0x0412 // 16:32 near pointer to 32-bit signed
#define CV_T_32PULONG 0x0422 // 16:32 near pointer to 32-bit unsigned
#define CV_T_32PFLONG 0x0512 // 16:32 far pointer to 32-bit signed
#define CV_T_32PFULONG 0x0522 // 16:32 far pointer to 32-bit unsigned
// Real 64-bit int Types
#define CV_T_INT8 0x0076 // 64-bit signed int
#define CV_T_UINT8 0x0077 // 64-bit unsigned int
#define CV_T_PINT8 0x0176 // Near pointer to 64-bit signed int
#define CV_T_PUINT8 0x0177 // Near pointer to 64-bit unsigned int
#define CV_T_PFINT8 0x0276 // Far pointer to 64-bit signed int
#define CV_T_PFUINT8 0x0277 // Far pointer to 64-bit unsigned int
#define CV_T_PHINT8 0x0376 // Huge pointer to 64-bit signed int
#define CV_T_PHUINT8 0x0377 // Huge pointer to 64-bit unsigned int
#define CV_T_32PINT8 0x0476 // 16:32 near pointer to 64-bit signed int
#define CV_T_32PUINT8 0x0477 // 16:32 near pointer to 64-bit unsigned int
#define CV_T_32PFINT8 0x0576 // 16:32 far pointer to 64-bit signed int
#define CV_T_32PFUINT8 0x0577 // 16:32 far pointer to 64-bit unsigned int
// 64-bit Integral Types
#define CV_T_QUAD 0x0013 // 64-bit signed
#define CV_T_UQUAD 0x0023 // 64-bit unsigned
#define CV_T_PQUAD 0x0113 // Near pointer to 64-bit signed
#define CV_T_PUQUAD 0x0123 // Near pointer to 64-bit unsigned
#define CV_T_PFQUAD 0x0213 // Far pointer to 64-bit signed
#define CV_T_PFUQUAD 0x0223 // Far pointer to 64-bit unsigned
#define CV_T_PHQUAD 0x0313 // Huge pointer to 64-bit signed
#define CV_T_PHUQUAD 0x0323 // Huge pointer to 64-bit unsigned
#define CV_T_32PQUAD 0x0413 // 16:32 near pointer to 64-bit signed
#define CV_T_32PUQUAD 0x0423 // 16:32 near pointer to 64-bit unsigned
#define CV_T_32PFQUAD 0x0513 // 16:32 far pointer to 64-bit signed
#define CV_T_32PFUQUAD 0x0523 // 16:32 far pointer to 64-bit unsigned
// 32-bit Real Types
#define CV_T_REAL32 0x0040 // 32-bit real
#define CV_T_PREAL32 0x0140 // Near pointer to 32-bit real
#define CV_T_PFREAL32 0x0240 // Far pointer to 32-bit real
#define CV_T_PHREAL32 0x0340 // Huge pointer to 32-bit real
#define CV_T_32PREAL32 0x0440 // 16:32 near pointer to 32-bit real
#define CV_T_32PFREAL32 0x0540 // 16:32 far pointer to 32-bit real
// 48-bit Real Types
#define CV_T_REAL48 0x0044 // 48-bit real
#define CV_T_PREAL48 0x0144 // Near pointer to 48-bit real
#define CV_T_PFREAL48 0x0244 // Far pointer to 48-bit real
#define CV_T_PHREAL48 0x0344 // Huge pointer to 48-bit real
#define CV_T_32PREAL48 0x0444 // 16:32 near pointer to 48-bit real
#define CV_T_32PFREAL48 0x0544 // 16:32 far pointer to 48-bit real
// 64-bit Real Types
#define CV_T_REAL64 0x0041 // 64-bit real
#define CV_T_PREAL64 0x0141 // Near pointer to 64-bit real
#define CV_T_PFREAL64 0x0241 // Far pointer to 64-bit real
#define CV_T_PHREAL64 0x0341 // Huge pointer to 64-bit real
#define CV_T_32PREAL64 0x0441 // 16:32 near pointer to 64-bit real
#define CV_T_32PFREAL64 0x0541 // 16:32 far pointer to 64-bit real
// 80-bit Real Types
#define CV_T_REAL80 0x0042 // 80-bit real
#define CV_T_PREAL80 0x0142 // Near pointer to 80-bit real
#define CV_T_PFREAL80 0x0242 // Far pointer to 80-bit real
#define CV_T_PHREAL80 0x0342 // Huge pointer to 80-bit real
#define CV_T_32PREAL80 0x0442 // 16:32 near pointer to 80-bit real
#define CV_T_32PFREAL80 0x0542 // 16:32 far pointer to 80-bit real
// 128-bit Real Types
#define CV_T_REAL128 0x0043 // 128-bit real
#define CV_T_PREAL128 0x0143 // Near pointer to 128-bit real
#define CV_T_PFREAL128 0x0243 // Far pointer to 128-bit real
#define CV_T_PHREAL128 0x0343 // Huge pointer to 128-bit real
#define CV_T_32PREAL128 0x0443 // 16:32 near pointer to 128-bit real
#define CV_T_32PFREAL128 0x0543 // 16:32 far pointer to 128-bit real
// 32-bit Complex Types
#define CV_T_CPLX32 0x0050 // 32-bit complex
#define CV_T_PCPLX32 0x0150 // Near pointer to 32-bit complex
#define CV_T_PFCPLX32 0x0250 // Far pointer to 32-bit complex
#define CV_T_PHCPLX32 0x0350 // Huge pointer to 32-bit complex
#define CV_T_32PCPLX32 0x0450 // 16:32 near pointer to 32-bit complex
#define CV_T_32PFCPLX32 0x0550 // 16:32 far pointer to 32-bit complex
// 64-bit Complex Types
#define CV_T_CPLX64 0x0051 // 64-bit complex
#define CV_T_PCPLX64 0x0151 // Near pointer to 64-bit complex
#define CV_T_PFCPLX64 0x0251 // Far pointer to 64-bit complex
#define CV_T_PHCPLX64 0x0351 // Huge pointer to 64-bit complex
#define CV_T_32PCPLX64 0x0451 // 16:32 near pointer to 64-bit complex
#define CV_T_32PFCPLX64 0x0551 // 16:32 far pointer to 64-bit complex
// 80-bit Complex Types
#define CV_T_CPLX80 0x0052 // 80-bit complex
#define CV_T_PCPLX80 0x0152 // Near pointer to 80-bit complex
#define CV_T_PFCPLX80 0x0252 // Far pointer to 80-bit complex
#define CV_T_PHCPLX80 0x0352 // Huge pointer to 80-bit complex
#define CV_T_32PCPLX80 0x0452 // 16:32 near pointer to 80-bit complex
#define CV_T_32PFCPLX80 0x0552 // 16:32 far pointer to 80-bit complex
// 128-bit Complex Types
#define CV_T_CPLX128 0x0053 // 128-bit complex
#define CV_T_PCPLX128 0x0153 // Near pointer to 128-bit complex
#define CV_T_PFCPLX128 0x0253 // Far pointer to 128-bit complex
#define CV_T_PHCPLX128 0x0353 // Huge pointer to 128-bit real
#define CV_T_32PCPLX128 0x0453 // 16:32 near pointer to 128-bit complex
#define CV_T_32PFCPLX128 0x0553 // 16:32 far pointer to 128-bit complex
// Boolean Types
#define CV_T_BOOL08 0x0030 // 8-bit Boolean
#define CV_T_BOOL16 0x0031 // 16-bit Boolean
#define CV_T_BOOL32 0x0032 // 32-bit Boolean
#define CV_T_BOOL64 0x0033 // 64-bit Boolean
#define CV_T_PBOOL08 0x0130 // Near pointer to 8-bit Boolean
#define CV_T_PBOOL16 0x0131 // Near pointer to 16-bit Boolean
#define CV_T_PBOOL32 0x0132 // Near pointer to 32-bit Boolean
#define CV_T_PBOOL64 0x0133 // Near pointer to 64-bit Boolean
#define CV_T_PFBOOL08 0x0230 // Far pointer to 8-bit Boolean
#define CV_T_PFBOOL16 0x0231 // Far pointer to 16-bit Boolean
#define CV_T_PFBOOL32 0x0232 // Far pointer to 32-bit Boolean
#define CV_T_PFBOOL64 0x0233 // Far pointer to 64-bit Boolean
#define CV_T_PHBOOL08 0x0330 // Huge pointer to 8-bit Boolean
#define CV_T_PHBOOL16 0x0331 // Huge pointer to 16-bit Boolean
#define CV_T_PHBOOL32 0x0332 // Huge pointer to 32-bit Boolean
#define CV_T_PHBOOL64 0x0333 // Huge pointer to 64-bit Boolean
#define CV_T_32PBOOL08 0x0430 // 16:32 near pointer to 8-bit Boolean
#define CV_T_32PBOOL16 0x0431 // 16:32 near pointer to 16-bit Boolean
#define CV_T_32PBOOL32 0x0432 // 16:32 near pointer to 32-bit Boolean
#define CV_T_32PBOOL64 0x0433 // 16:32 near pointer to 64-bit Boolean
#define CV_T_32PFBOOL08 0x0530 // 16:32 far pointer to 8-bit Boolean
#define CV_T_32PFBOOL16 0x0531 // 16:32 far pointer to 16-bit Boolean
#define CV_T_32PFBOOL32 0x0532 // 16:32 far pointer to 32-bit Boolean
#define CV_T_32PFBOOL64 0x0533 // 16:32 far pointer to 64-bit Boolean
//----------------------------------------------------------------------
#define CV_FIRST_NONPRIM 0x1000
//----------------------------------------------------------------------
// Leaf indices for type records that can be referenced from symbols
// are the following:
#define LF_MODIFIER 0x0001
#define LF_POINTER 0x0002
#define LF_ARRAY 0x0003
#define LF_CLASS 0x0004
#define LF_STRUCTURE 0x0005
#define LF_UNION 0x0006
#define LF_ENUM 0x0007
#define LF_PROCEDURE 0x0008
#define LF_MFUNCTION 0x0009
#define LF_VTSHAPE 0x000A
#define LF_COBOL0 0x000B
#define LF_COBOL1 0x000C
#define LF_BARRAY 0x000D
#define LF_LABEL 0x000E
#define LF_NULL 0x000F // LF_OEM
#define LF_NOTTRAN 0x0010
#define LF_DIMARRAY 0x0011
#define LF_VFTPATH 0x0012
#define LF_PRECOMP 0x0013
#define LF_ENDPRECOMP 0x0014
#define LF_OEM 0x0015 // LF_OEM2
#define LF_Reserved 0x0016
// Borland specific
#define BLF_SET 0x030
#define BLF_SUBRANGE 0x031
#define BLF_PARRAY 0x032
#define BLF_PSTRING 0x033
#define BLF_CLOSURE 0x034
#define BLF_PROPERTY 0x035
#define BLF_LSTRING 0x036
#define BLF_VARIANT 0x037
#define BLF_CLASSREF 0x038
#define BLF_WIDESTRING 0x039
#define BLF_UNRESEXT 0x00EF
// Leaf indices for type records that can be referenced from other type
// records are the following:
#define LF_SKIP 0x0200
#define LF_ARGLIST 0x0201
#define LF_DEFARG 0x0202
#define LF_LIST 0x0203
#define LF_FIELDLIST 0x0204
#define LF_DERIVED 0x0205
#define LF_BITFIELD 0x0206
#define LF_METHODLIST 0x0207
#define LF_DIMCONU 0x0208
#define LF_DIMCONLU 0x0209
#define LF_DIMVARU 0x020A
#define LF_DIMVARLU 0x020B
#define LF_REFSYM 0x020C
// Leaf indices for fields of complex lists are the following:
#define LF_BCLASS 0x0400
#define LF_VBCLASS 0x0401
#define LF_IVBCLASS 0x0402
#define LF_ENUMERATE 0x0403
#define LF_FRIENDFCN 0x0404
#define LF_INDEX 0x0405
#define LF_MEMBER 0x0406
#define LF_STMEMBER 0x0407
#define LF_METHOD 0x0408
#define LF_NESTTYPE 0x0409
#define LF_VFUNCTAB 0x040A
#define LF_FRIENDCLS 0x040B
#define LF_ONEMETHOD 0x040C
#define LF_VFUNCOFF 0x040D
// Leaf indices for numeric fields of symbols and type records
// are the following:
#define LF_NUMERIC 0x8000
#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 // ushort len followed by char[len]
#define LF_PAD0 0xF0
#define LF_PAD1 0xF1
#define LF_PAD2 0xF2
#define LF_PAD3 0xF3
#define LF_PAD4 0xF4
#define LF_PAD5 0xF5
#define LF_PAD6 0xF6
#define LF_PAD7 0xF7
#define LF_PAD8 0xF8
#define LF_PAD9 0xF9
#define LF_PAD10 0xFA
#define LF_PAD11 0xFB
#define LF_PAD12 0xFC
#define LF_PAD13 0xFD
#define LF_PAD14 0xFE
#define LF_PAD15 0xFF
// new leaf types for NB11
#define NLF_MODIFIER 0x1001
#define NLF_POINTER 0x1002
#define NLF_ARRAY 0x1003
#define NLF_CLASS 0x1004
#define NLF_STRUCTURE 0x1005
#define NLF_UNION 0x1006
#define NLF_ENUM 0x1007
#define NLF_PROCEDURE 0x1008
#define NLF_MFUNCTION 0x1009
#define NLF_VTSHAPE 0x000a
#define NLF_COBOL0 0x100a
#define NLF_COBOL1 0x000c
#define NLF_BARRAY 0x100b
#define NLF_DIMARRAY 0x100c
#define NLF_VFTPATH 0x100d
#define NLF_PRECOMP 0x100e
#define NLF_OEM 0x100f
#define NLF_ALIAS 0x1010 // MLF_extender
#define NLF_OEM2 0x1011 // MLF_extender
#define NLF_TYPESERVER 0x0016
#define NLF_SKIP 0x1200
#define NLF_ARGLIST 0x1201
#define NLF_DEFARG 0x1202
#define NLF_FIELDLIST 0x1203
#define NLF_DERIVED 0x1204
#define NLF_BITFIELD 0x1205
#define NLF_METHODLIST 0x1206
#define NLF_DIMCONU 0x1207
#define NLF_DIMCONLU 0x1208
#define NLF_DIMVARU 0x1209
#define NLF_DIMVARLU 0x120a
#define NLF_BCLASS 0x1400
#define NLF_VBCLASS 0x1401
#define NLF_IVBCLASS 0x1402
#define NLF_FRIENDFCN 0x1403
#define NLF_INDEX 0x1404
#define NLF_MEMBER 0x1405
#define NLF_STMEMBER 0x1406
#define NLF_METHOD 0x1407
#define NLF_NESTTYPE 0x1408
#define NLF_VFUNCTAB 0x1409
#define NLF_FRIENDCLS 0x140a
#define NLF_ONEMETHOD 0x140b
#define NLF_VFUNCOFF 0x140c
#define NLF_NESTTYPEEX 0x140d
#define NLF_MEMBERMODIFY 0x140e
#define NLF_MANAGED 0x140f // MLF_extender
// new leaf types for vc7
#define MLF_TYPESERVER 0x1501
#define MLF_ENUMERATE 0x1502
#define MLF_ARRAY 0x1503
#define MLF_CLASS 0x1504
#define MLF_STRUCTURE 0x1505
#define MLF_UNION 0x1506
#define MLF_ENUM 0x1507
#define MLF_DIMARRAY 0x1508
#define MLF_PRECOMP 0x1509
#define MLF_ALIAS 0x150a
#define MLF_DEFARG 0x150b
#define MLF_FRIENDFCN 0x150c
#define MLF_MEMBER 0x150d
#define MLF_STMEMBER 0x150e
#define MLF_METHOD 0x150f
#define MLF_NESTTYPE 0x1510
#define MLF_ONEMETHOD 0x1511
#define MLF_NESTTYPEEX 0x1512 // unus?
#define MLF_MEMBERMODIFY 0x1513 // unus?
#define MLF_MANAGED 0x1514
#define MLF_TYPESERVER2 0x1515
// Member Attribute Field
// Several of the type records below reference a field attribute bit field.
// This bit field has the following format:
struct member_attr_t
{
unsigned access:2; // Specifies the access protection of the item
// 0 No access protection
// 1 Private
// 2 Protected
// 3 Public
unsigned mprop :3; // Specifies the properties for methods
// 0 Vanilla method
// 1 Virtual method
// 2 Static method
// 3 Friend method
// 4 Introducing virtual method
// 5 Pure virtual method
// 6 Pure introducing virtual method
// 7 Reserved
unsigned pseudo :1; // True if the method is never instantiated by the compiler
unsigned noinherit:1; // True if the class cannot be inherited
unsigned noconstruct:1;// True if the class cannot be constructed
unsigned reserved :8;
};
//----------------------------------------------------------------------
struct leaf_t
{
ushort type;
void *value;
void print(void);
void print(char *buf, size_t bufsize);
bool get_value(idc_value_t *v);
};
//----------------------------------------------------------------------
// LF_POINTER bits:
inline unsigned get_ptrtype(ushort attr) { return (attr >> 0) & 0x1F; }
#define PTRTYPE_NEAR 0 // Near
#define PTRTYPE_FAR 1 // Far
#define PTRTYPE_HUGE 2 // Huge
#define PTRTYPE_SEG 3 // Based on segment
#define PTRTYPE_VAL 4 // Based on value
#define PTRTYPE_VALSEG 5 // Based on segment of value
#define PTRTYPE_SYM 6 // Based on address of symbol
#define PTRTYPE_SYMSEG 7 // Based on segment of symbol address
#define PTRTYPE_TYPE 8 // Based on type
#define PTRTYPE_SELF 9 // Based on self
#define PTRTYPE_NEAR32 10 // Near 32-bit pointer
#define PTRTYPE_FAR32 11 // Far 32-bit pointer
inline unsigned get_ptrmode(ushort attr) { return (attr >> 5) & 0x07; }
#define PTRMODE_PTR 0 // Pointer
#define PTRMODE_REF 1 // Reference
#define PTRMODE_MEM 2 // Pointer to data member
#define PTRMODE_MET 3 // Pointer to method
#define LFTP_ISFLAT 0x0010 // True if 16:32 pointer
#define LFTP_VOLATILE 0x0020 // True if pointer is volatile
#define LFTP_CONST 0x0040 // True if pointer is const
#define LFTP_UNALIGNED 0x0080 // True if pointer is unaligned
//----------------------------------------------------------------------
// Class/structure type property bits
#define LF_CLS_PACKED 0x0001 // Structure is packed
#define LF_CLS_CTOR 0x0002 // Class has constructors and/or destructors
#define LF_CLS_OVEROPS 0x0004 // Class has overloaded operators
#define LF_CLS_ISNESTED 0x0008 // Class is a nested class
#define LF_CLS_CNESTED 0x0010 // Class contains nested classes
#define LF_CLS_OPASSIGN 0x0020 // Class has overloaded assignment
#define LF_CLS_OPCAST 0x0040 // Class has casting methods
#define LF_CLS_FWDREF 0x0080 // Class/structure is a forward (incomplete) reference
#define LF_CLS_SCOPED 0x0100 // This is a scoped definition
//----------------------------------------------------------------------
// LF_MODIFIER atribute bits
#define LFTM_CONST 0x0001
#define LFTM_VOLATILE 0x0002
#define LFTM_UNALIGNED 0x0004
//----------------------------------------------------------------------
// Symbol record types
#define S_COMPILE 0x0001 // Compile flags symbol
#define S_REGISTER 0x0002 // Register variable
#define S_CONSTANT 0x0003 // Constant symbol
#define S_UDT 0x0004 // User-defined Type
#define S_SSEARCH 0x0005 // Start search
#define S_END 0x0006 // End block, procedure, with, or thunk
#define S_SKIP 0x0007 // Skip - Reserve symbol space
#define S_CVRESERVE 0x0008 // Reserved for internal use by the Microsoft debugger
#define S_OBJNAME 0x0009 // Specify name of object file
#define S_ENDARG 0x000a // Specify end of arguments in function symbols
#define S_COBOLUDT 0x000b // Microfocus COBOL user-defined type
#define S_MANYREG 0x000c // Many register symbol
#define S_RETURN 0x000d // Function return description
#define S_ENTRYTHIS 0x000e // Description of this pointer at entry
// Borland specific
#define BS_GPROCREF 0x0020 // global procedure forward reference
#define BS_GDATAREF 0x0021 // global data -"-
#define BS_EDATA 0x0022 // OBJ only - force GDATAREF creation
#define BS_EPROC 0x0023 // OBJ - mangled name for tasm-pass
#define BS_USES 0x0024 // refernce to module
#define BS_NAMESPACE 0x0025
#define BS_USING 0x0026
#define BS_PCONSTANT 0x0027
#define S_BPREL16 0x0100 // BP relative 16:16
#define S_LDATA16 0x0101 // Local data 16:16
#define S_GDATA16 0x0102 // Global data 16:16
#define S_PUB16 0x0103 // Public symbol 16:16
#define S_LPROC16 0x0104 // Local procedure start 16:16
#define S_GPROC16 0x0105 // Global procedure start 16:16
#define S_THUNK16 0x0106 // Thunk start 16:16
#define S_BLOCK16 0x0107 // Block start 16:16
#define S_WITH16 0x0108 // With start 16:16
#define S_LABEL16 0x0109 // Code label 16:16
#define S_CEXMODEL16 0x010a // Change execution model 16:16
#define S_VFTPATH16 0x010b // Virtual function table path descriptor 16:16
#define S_REGREL16 0x010c // Specify 16:16 offset relative to arbitrary register
// Borland specific
#define BS_ENTRY16 0x0110
#define BS_OPTVAR16 0x0111 // variable line rangle for REGISTER/BPREL
#define BS_PROCRET16 0x0112 // epilogue indicator
#define BS_SAVEREGS16 0x0113
#define S_BPREL32 0x0200 // BP relative 16:32
#define S_LDATA32 0x0201 // Local data 16:32
#define S_GDATA32 0x0202 // Global data 16:32
#define S_PUB32 0x0203 // Public symbol 16:32
#define S_LPROC32 0x0204 // Local procedure start 16:32
#define S_GPROC32 0x0205 // Global procedure start 16:32
#define S_THUNK32 0x0206 // Thunk start 16:32
#define S_BLOCK32 0x0207 // Block start 16:32
#define S_WITH32 0x0208 // With start 16:32
#define S_LABEL32 0x0209 // Code label 16:32
#define S_CEXMODEL32 0x020a // Change execution model 16:32
#define S_VFTPATH32 0x020b // Virtual function table path descriptor 16:32
#define S_REGREL32 0x020c // 16:32 offset relative to arbitrary register
#define S_LTHREAD32 0x020d // Local Thread Storage data
#define S_GTHREAD32 0x020e // Global Thread Storage data
#define S_SLINK32 0x020f // MS_extender
// Borland specific
#define BS_ENTRY32 0x0210
#define BS_OPTVAR32 0x0211
#define BS_PROCRET32 0x0212
#define BS_SAVEREGS32 0x0213
#define BS_SLINK 0x0230
#define S_LPROCMIPS 0x0300 // Local procedure start MIPS
#define S_GPROCMIPS 0x0301 // Global procedure start MIPS
#define S_PROCREF 0x0400 // Reference to a procedure
#define S_DATAREF 0x0401 // Reference to data
#define S_ALIGN 0x0402 // Page align symbols
// new symbol types from NB11:
#define NS_REGISTER 0x1001 // Register variable
#define NS_CONSTANT 0x1002 // Constant symbol
#define NS_UDT 0x1003 // User-defined type
#define NS_COBOLUDT 0x1004 // Microfocus COBOL user-defined type
#define NS_MANYREG 0x1005 // Many register symbol
#define NS_BPREL32 0x1006 // BP relative 16:32
#define NS_LDATA32 0x1007 // Local data 16:32
#define NS_GDATA32 0x1008 // Global data 16:32
#define NS_PUB32 0x1009 // Public symbol 16:32
#define NS_LPROC32 0x100a // Local procedure start 16:32
#define NS_GPROC32 0x100b // Global procedure start 16:32
#define NS_VFTTABLE32 0x100c // Virtual function table path descriptor 16:32
#define NS_REGREL32 0x100d // 16:32 offset relative to arbitrary register
#define NS_LTHREAD32 0x100e // Local Thread Storage data
#define NS_GTHREAD32 0x100f // Global Thread Storage data
#define NS_LPROCMIPS 0x1010 // Local procedure start MIPS
#define NS_GPROCMIPS 0x1011 // Global procedure start MIPS
// Undocumented symbols:
#define NS_FRAMEPROC 0x1012 // MS_extender
#define NS_COMPILE2 0x1013 // start - as S_COMPILE, then ms-flags
#define NS_MANYREG2 0x1014 // MS_extender
#define NS_LPROCIA64 0x1015 // MS_extender
#define NS_LOCALSLOT 0x1017 // MS_extender
#define NS_PARAMSLOT 0x1018 // MS_extender
#define NS_ANNOTATION 0x1019 // MS_extender
#define NS_GMANPROC 0x101a // MS_extender
#define NS_LMANPROC 0x101b // MS_extender
#define NS_RESERVED1 0x101c // MS_extender
#define NS_RESERVED2 0x101d // MS_extender
#define NS_RESERVED3 0x101e // MS_extender
#define NS_RESERVED4 0x101f // MS_extender
#define NS_LMANDATA 0x1020 // MS_extender
#define NS_GMANDATA 0x1021 // MS_extender
#define NS_MANFRAMEREL 0x1022 // MS_extender
#define NS_MANREGISTER 0x1023 // MS_extender
#define NS_MANSLOT 0x1024 // MS_extender
#define NS_MANMANYREG 0x1025 // MS_extender
#define NS_MANREGREL 0x1026 // MS_extender
#define NS_MANMANYREG2 0x1027 // MS_extender
#define NS_MANTYPEREF 0x1028 // MS_extender
#define NS_UNAMESPACE 0x1029 // MS_extender
// new symbol types from vc7
#define MS_OBJNAME 0x1101 // Specify name of object file
#define MS_THUNK32 0x1102 // Thunk start 16:32
#define MS_BLOCK32 0x1103 // Block start 16:32
#define MS_WITH32 0x1104 // With start 16:32
#define MS_LABEL32 0x1105 // Code label 16:32
#define MS_REGISTER 0x1106 // Register variable
#define MS_CONSTANT 0x1107 // Constant symbol
#define MS_UDT 0x1108 // User-defined type
#define MS_COBOLUDT 0x1109 // Microfocus COBOL user-defined type
#define MS_MANYREG 0x110a // Many register symbol
#define MS_BPREL32 0x110b // BP relative 16:32
#define MS_LDATA32 0x110c // Local data 16:32
#define MS_GDATA32 0x110d // Global data 16:32
#define MS_PUB32 0x110e // Public symbol 16:32
#define MS_LPROC32 0x110f // Local procedure start 16:32
#define MS_GPROC32 0x1110 // Global procedure start 16:32
#define MS_REGREL32 0x1111 // 16:32 offset relative to arbitrary register
#define MS_LTHREAD32 0x1112 // Local Thread Storage data
#define MS_GTHREAD32 0x1113 // Global Thread Storage data
#define MS_LPROCMIPS 0x1114 // Local procedure start MIPS
#define MS_GPROCMIPS 0x1115 // Global procedure start MIPS
#define MS_COMPILE2 0x1116 // compilator information
#define MS_MANYREG2 0x1117
#define MS_LPROCIA64 0x1118
#define MS_GPROCIA64 0x1119
#define MS_LOCALSLOT 0x111a
#define MS_PARAMSLOT 0x111b
#define MS_LMANDATA 0x111c
#define MS_GMANDATA 0x111d
#define MS_MANFRAMEREL 0x111e
#define MS_MANREGISTER 0x111f
#define MS_MANSLOT 0x1120
#define MS_MANMANYREG 0x1121
#define MS_MANREGREL 0x1122
#define MS_MANMANYREG2 0x1123
#define MS_UNAMESPACE 0x1124
#define MS_PROCREF 0x1125 // Reference to a procedure
#define MS_DATAREF 0x1126 // Reference to data
#define MS_LPROCREF 0x1127 // Reference to a procedure
#define MS_ANNOTATIONREF 0x1128
#define MS_TOKENREF 0x1129
#define MS_GMANPROC 0x112a
#define MS_LMANPROC 0x112b
#define MS_TRAMPOLINE 0x112c
#define MS_MANCONSTANT 0x112d
#define MS_ATTRFRAMEREL 0x112e
#define MS_ATTRREGISTER 0x112f
#define MS_ATTREGREL 0x1130
#define MS_ATTMANYREG 0x1131
#define MS_SEPCODE 0x1132
#define MS_UNKNOWN 0x1133
//----------------------------------------------------------------------
// S_COMPILE machine types
#define CV_CPU_I8080 0x00
#define CV_CPU_I8086 0x01
#define CV_CPU_I80286 0x02
#define CV_CPU_I80386 0x03
#define CV_CPU_I80486 0x04
#define CV_CPU_PENTIUM 0x05
#define CV_CPU_PENTIUM_PRO 0x06
#define CV_CPU_R4000 0x10
#define CV_CPU_MIPS_FUTURE1 0x11
#define CV_CPU_MIPS_FUTURE2 0x12
#define CV_CPU_MC68000 0x20
#define CV_CPU_MC68010 0x21
#define CV_CPU_MC68020 0x22
#define CV_CPU_MC68030 0x23
#define CV_CPU_MC68040 0x24
#define CV_CPU_ALPHA 0x30
#define CV_CPU_PPC601 0x40
#define CV_CPU_PPC603 0x41
#define CV_CPU_PPC604 0x42
#define CV_CPU_PPC620 0x43
// S_COMPILER language types
#define CV_LANG_C 0
#define CV_LANG_CPP 1
#define CV_LANG_FORTRAN 2
#define CV_LANG_MASM 3
#define CV_LANG_PASCAL 4
#define CV_LANG_BASIC 5
#define CV_LANG_COBOL 6
#define CV_LANG_LINKER 7
// S_COMPILER model bits
#define CV_COMPILE_PCODE 0x0001 // Pcode is present
#define CV_COMPILE_FPREC 0x0006 // Float precision (1-ANSI)
#define CV_COMPILE_FPACK 0x0018 // Float package:
#define CV_COMPILE_FP_HW 0
#define CV_COMPILE_FP_EMU 1
#define CV_COMPILE_FP_ALT 2
#define CV_COMPILE_AMBDATA 0x00E0 // Data model
#define CV_COMPILE_AMBCODE 0x0700 // Code model
#define CV_COMPILE_MODE32 0x0800 // 32bit application
#define CV_COMPILE_MODEL_NEAR 0
#define CV_COMPILE_MODEL_FAR 1
#define CV_COMPILE_MODEL_HUGE 2
// borland specific
#define BCV_COMPILE_CHSIGN 0x1000 // 'char' is signed
//----------------------------------------------------------------------
// S_THUNK types
#define CV_THUNK16_NOTYPE 0
#define CV_THUNK16_ADJUSTOR 1
#define CV_THUNK16_VCALL 2
#define CV_THUNK16_PCODE 3
//----------------------------------------------------------------------
// Procedure attribute bits
#define CV_PROC16_FPO 0x0001 // function has frame pointer omitted.
#define CV_PROC16_INTR 0x0002 // function is interrupt routine.
#define CV_PROC16_FAR 0x0004 // function performs far return.
#define CV_PROC16_NORET 0x0008 // function never returns.
//----------------------------------------------------------------------
// S_RETURN flag bits
#define CV_RETURN_CSTYLE 0x0001 // push varargs right to left
#define CV_RETURN_RSCLEAN 0x0002 // returnee stack cleanup
// S_RETURN styles
#define CV_RETURN_VOID 0x00 // void return
#define CV_RETURN_DATA 0x01 // return value is in the registers specified in data
#define CV_RETURN_CNEAR 0x02 // indirect caller-allocated near
#define CV_RETURN_CFAR 0x03 // indirect caller-allocated far
#define CV_RETURN_RNEAR 0x04 // indirect returnee-allocated near
#define CV_RETURN_RFAR 0x05 // indirect returnee-allocated far
//----------------------------------------------------------------------
// Segment descriptor
struct cv_seg_desc_t
{
uint16 flags;
#define CV_SEG_READ 0x0001
#define CV_SEG_WRITE 0x0002
#define CV_SEG_EXEC 0x0004
#define CV_SEG_32BIT 0x0008
#define CV_SEG_SEL 0x0100
#define CV_SEG_ABS 0x0200
#define CV_SEG_GROUP 0x1000
uint16 ovl; // Logical overlay number.
uint16 group; // Group index into the descriptor array. The group
// index must either be 0 or cSegLog <= group < cSeg.
uint16 frame; // This value has the following different meanings
// depending upon the values of fAbs and fSel in the
// flags bit array and ovl:
// abs sel ovl description
// 0 0 0 frame is added to PSP+0x10 if not a .com file
// 0 0 0 frame is added to PSP if it is a .com file
// 0 0 !=0 frame is added to currnet overlay base
// 1 0 x frame is absolute address
// 1 0 x frame is contains a selector
uint16 iSegName; // Byte index of the segment or group name in the
// sstSegName table. A value of 0xffff indicates that
// there is no name.
uint16 iClassName; // Byte index of the class name in the sstSegName
// table. A value of 0xffff indicates that there is
// no name.
uint32 offset; // Byte offset of the logical segment within the
// specified physical segment. If fGroup is set in
// flags, offset is the offset of the group in
// the physical segment. Currently all groups define
// physical segments, so offset will be zero for
// groups.
uint32 cbseg; // Byte count of the logical segment or group.
};
//----------------------------------------------------------------------
// sstModule descriptions
struct cv_module_t
{
uint16 seg; // 1-based segment index that this structure describes
uint16 oFlags; // OBJ: padding for alignment. for future use
// TDS: // 1-code, 0-data (0xFF00 ulink:skip)
uint32 offset; // offset in segment where code starts
uint32 cbSeg; // number of byte in segment
};
// ---------------------------------------------------------------------------
struct bad_cv_t
{
};
// ---------------------------------------------------------------------------
template <typename T>
static const T *data_alias_at(const void *data, size_t size, size_t off, uint32 count = 1)
{
if ( sizeof(T) != 1 && !is_mul_ok<uint32>(count, (uint32) sizeof(T)) )
throw bad_cv_t();
const char *cdata = (const char *) data;
const char *cend = cdata + size;
const char *ptr = cdata + off;
const char *end = ptr + count * sizeof(T);
if ( end > cend
|| ptr < cdata
|| ptr > end
|| (count > 0 && ptr == end) )
{
throw bad_cv_t();
}
return (const T*)ptr;
}
// ---------------------------------------------------------------------------
struct cv_data_t
{
cv_data_t(const void *_data, size_t _size, bool _iswide)
: data(_data), size(_size), iswide(_iswide) {}
uint32 offset_in_data(const void *ptr) const
{
const uchar *p = (const uchar *) ptr;
const uchar *d = (const uchar *) data;
if ( p < d || p > (d + size) )
throw bad_cv_t();
return p - d;
}
const void *data;
size_t size;
bool iswide;
};
// ---------------------------------------------------------------------------
template <typename T>
static const T *data_alias_at(const cv_data_t &cvdata, size_t off, uint32 count = 1)
{
return data_alias_at<T>(cvdata.data, cvdata.size, off, count);
}
// ---------------------------------------------------------------------------
struct cv_stream_t
{
const cv_data_t &cvdata;
const uchar *start;
const uchar *ptr;
const uchar *end;
cv_stream_t(const cv_data_t &_cvdata, const void *_ptr, size_t _size)
: cvdata(_cvdata)
{
start = (uchar *)_ptr;
ptr = start;
end = start + _size;
QASSERT(30473, start <= end);
}
uchar get_uchar()
{
ensure_left(1);
return *ptr++;
}
ushort get_ushort()
{
ensure_left(2);
uint16 x = *(uint16*) ptr;
ptr += sizeof(uint16);
return x;
}
uint32 get_ulong()
{
ensure_left(4);
uint32 x = *(uint32*) ptr;
ptr += sizeof(uint32);
return x;
}
uint32 get_wd(bool is32)
{
return is32 ? get_ulong() : get_ushort();
}
int get_leaf(leaf_t &leaf)
{
leaf.type = get_ushort();
if ( leaf.type < LF_NUMERIC )
{
leaf.value = &leaf.type;
return 1;
}
leaf.value = (void *)ptr;
uint32 toskip = 0;
switch ( leaf.type )
{
case LF_CHAR: toskip = 1; break;
case LF_SHORT: toskip = 2; break;
case LF_USHORT: toskip = 2; break;
case LF_LONG: toskip = 4; break;
case LF_ULONG: toskip = 4; break;
case LF_REAL32: toskip = 4; break;
case LF_REAL64: toskip = 8; break;
case LF_REAL80: toskip = 10; break;
case LF_REAL128: toskip = 16; break;
case LF_QUADWORD: toskip = 8; break;
case LF_UQUADWORD: toskip = 8; break;
case LF_REAL48: toskip = 6; break;
case LF_COMPLEX32: toskip = 8; break;
case LF_COMPLEX64: toskip = 16; break;
case LF_COMPLEX80: toskip = 20; break;
case LF_COMPLEX128: toskip = 32; break;
case LF_VARSTRING: toskip = get_ushort(); break;
default:
return 0;
}
skip(toskip);
return 1;
}
char *get_name(char *buf, size_t bufsize)
{
ensure_left(1);
size_t len = *ptr++;
if ( len >= bufsize )
len = bufsize - 1;
len = qmin(len, bytes_left());
ensure_left(len);
memcpy(buf, ptr, len);
buf[len] = '\0';
ptr += len;
return buf;
}
cv_stream_t get_substream_for_symbol(uint16 *type)
{
uint16 len = get_ushort() - 2;
uint16 t = get_ushort();
if ( type != nullptr )
*type = t;
ensure_left(len);
cv_stream_t sym_stream(cvdata, ptr, len);
skip(len);
return sym_stream;
}
cv_stream_t get_substream_from_start(uint32 offset)
{
const uchar *p = data_alias_at<uchar>(start, end-start, offset);
return cv_stream_t(cvdata, p, end-p);
}
void skip(uint32 elsize, uint32 elcount)
{
if ( !is_mul_ok<uint32>(elcount, elsize) )
throw bad_cv_t();
skip(elcount * elsize);
}
void skip(uint32 n)
{
ensure_left(n);
ptr += n;
}
void rewind(uint32 n)
{
if ( (ptr - start) < n )
throw bad_cv_t();
ptr -= n;
}
uint32 bytes_left()
{
if ( ptr > end )
return 0;
return end - ptr;
}
void narrow(const uchar *new_end)
{
if ( new_end == nullptr || new_end > end || new_end < ptr )
throw bad_cv_t();
end = new_end;
}
void ensure_left(uint32 n)
{
const uchar *p = ptr + n;
if ( p > end || p < ptr )
throw bad_cv_t();
}
};
// //----------------------------------------------------------------------
// inline uchar get_uchar(const uchar *&ptr) {
// return *ptr++;
// }
// //----------------------------------------------------------------------
// inline ushort get_ushort(const uchar *&ptr)
// {
// uint16 x = *(uint16 *)ptr;
// ptr += sizeof(uint16);
// return x;
// }
// //----------------------------------------------------------------------
// inline uint32 get_ulong(const uchar *&ptr)
// {
// uint32 x = *(uint32 *)ptr;
// ptr += sizeof(uint32);
// return x;
// }
// NB02 (CodeView3) format desctription
// Most of info taken from Watcom's hll.h
// subsection type constants
enum cv3_sst
{
cv3_sstModule = 0x101, // Basic info. about object module
cv3_sstModules = cv3_sstModule, /* misnomer. */
cv3_sstPublics, // Public symbols
cv3_sstTypes, // Type information
cv3_sstSymbols, // Symbol Data
cv3_sstSrcLines, // Source line information
cv3_sstLibraries, // Names of all library files used
cv3_sstImports, // Symbols for DLL fixups
cv3_sstCompacted, // Compacted types section
cv3_sstSrcLnSeg, // Same as source lines, contains segment
cv3_sstHLLSrc = 0x10B
};
/* CV3 debug directory entry. */
struct cv3_dir_entry
{
uint16 subsection; /* The subsection type, cv3_sst. */
uint16 iMod; /* The module index. (1 based) */
uint32 lfo; /* The offset of the subsection (NBxx relative). */
uint16 cb; /* The size of the subsection. */
};
/* CV3 16-bit segment info. */
struct cv3_seginfo_16
{
uint16 Seg;
uint16 offset;
uint16 cbSeg;
};
/* CV3 32-bit segment info. */
struct cv3_seginfo_32
{
uint16 Seg;
uint32 offset;
uint32 cbSeg;
};
struct cv3_module_16
{
cv3_seginfo_16 SegInfo; /* The segment info for the first [code] segment. */
uint16 ovlNumber; /* The overlay number. */
uint16 iLib; /* The index of the library to which we belong. */
uint8 cSeg; /* The number of segment info pieces (includes SegInfo). */
uint8 reserved;
uint8 name_len; /* The name length. */
// char name[1];
// cv3_seginfo_16 arnsg[];
};
struct cv3_module_32
{
cv3_seginfo_32 SegInfo; /* The segment info for the first [code] segment. */
uint16 ovlNumber; /* The overlay number. */
uint16 iLib; /* The index of the library to which we belong. */
uint8 cSeg; /* The number of segment info pieces (includes SegInfo). */
uint8 reserved;
uint8 name_len; /* The name length. */
// char name[1];
// cv3_seginfo_32 arnsg[];
};
/* CV3 16-bit public symbol record. */
struct cv3_public_16
{
uint16 offset;
uint16 seg;
uint16 type;
uint8 name_len;
// char name[1];
};
/* CV3 32-bit public symbol record. */
struct cv3_public_32
{
uint32 offset;
uint16 seg;
uint16 type;
uint8 name_len;
// char name[];
};
struct cv_linnum_seg
{
// char name[1];
uint16 seg;
uint16 cPair;
// line_offset_parms[1];
};
/* obsolete */
struct cv_srcln_off_16
{
uint16 line;
uint16 offset;
};
/* CV3 16-bit line number entry. (cv3_sstSrcLnSeg & cv3_sstSrcLines) */
struct cv3_linnum_entry_16
{
uint16 line;
uint16 offset;
};
/* CV3 32-bit line number entry. (cv3_sstSrcLnSeg) */
struct cv3_linnum_entry_32
{
uint16 line;
uint32 offset;
};
#pragma pack(pop)
#endif // define __CV_HPP