diff --git a/bfd/pdb-types.h b/bfd/pdb-types.h new file mode 100644 index 0000000..0ae3b13 --- /dev/null +++ b/bfd/pdb-types.h @@ -0,0 +1,1304 @@ +/* Includes code from radare2: + radare - LGPL - Copyright 2014 - inisider + (https://github.com/radareorg/radare2) */ + +#ifndef PDB_TYPES_H +#define PDB_TYPES_H + +#define _R_LIST_C +#include + +#define READ_PAGE_FAIL 0x01 + +// TODO: Move to a general macros in r_util/r_types + +/////////////////////////////////////////////////////////////////////////////// +#define GET_PAGE(pn, off, pos, page_size) { \ + (pn) = (pos) / (page_size); \ + (off) = (pos) % (page_size); \ +} + +/////////////////////////////////////////////////////////////////////////////// +#define READ_PAGES(start_indx, end_indx) { \ + for (i = start_indx; i < end_indx; i++) { \ + fseek(stream_file->fp, stream_file->pages[i] * stream_file->page_size, SEEK_SET); \ + fread(tmp, stream_file->page_size, 1, stream_file->fp); \ + tmp += stream_file->page_size; \ + } \ +} + +/////////////////////////////////////////////////////////////////////////////// +#define SWAP_UINT16(x) (((x) >> 8) | ((x) << 8)) + +/////////////////////////////////////////////////////////////////////////////// +#define SWAP_UINT32(x) (((x) >> 24) | (((x) & 0x00FF0000) >> 8) | (((x) & 0x0000FF00) << 8) | ((x) << 24)) + +/////////////////////////////////////////////////////////////////////////////// +#define CAN_READ(curr_read_bytes, bytes_for_read, max_len) { \ + if ((((curr_read_bytes) + (bytes_for_read)) >= (max_len))) { \ + return 0; \ + } \ +} + +/////////////////////////////////////////////////////////////////////////////// +#define UPDATE_DATA(src, curr_read_bytes, bytes_for_read) { \ + (src) += (bytes_for_read); \ + (curr_read_bytes) += (bytes_for_read); \ +} + +/////////////////////////////////////////////////////////////////////////////// +#define PEEK_READ1(curr_read_bytes, max_len, dst, src, type_name) { \ + CAN_READ((curr_read_bytes), 1, (max_len)); \ + (dst) = *(type_name *) (src); \ +} +#define PEEK_READ2(curr_read_bytes, max_len, dst, src, type_name) { \ + CAN_READ((curr_read_bytes), 2, (max_len)); \ + (dst) = (type_name) r_read_le16 (src); \ +} +#define PEEK_READ4(curr_read_bytes, max_len, dst, src, type_name) { \ + CAN_READ((curr_read_bytes), 4, (max_len)); \ + (dst) = (type_name) r_read_le32 (src); \ +} +#define PEEK_READ8(curr_read_bytes, max_len, dst, src, type_name) { \ + CAN_READ((curr_read_bytes), 8, (max_len)); \ + (dst) = (type_name) r_read_le64 (src); \ +} +/////////////////////////////////////////////////////////////////////////////// +#define READ1(curr_read_bytes, max_len, dst, src, type_name) { \ + PEEK_READ1((curr_read_bytes), (max_len), (dst), (src), type_name); \ + UPDATE_DATA((src), (curr_read_bytes), 1); \ +} + +#define READ2(curr_read_bytes, max_len, dst, src, type_name) { \ + PEEK_READ2((curr_read_bytes), (max_len), (dst), (src), type_name); \ + UPDATE_DATA((src), (curr_read_bytes), 2); \ +} + +#define READ4(curr_read_bytes, max_len, dst, src, type_name) { \ + PEEK_READ4((curr_read_bytes), (max_len), (dst), (src), type_name); \ + UPDATE_DATA((src), (curr_read_bytes), 4); \ +} + +#define READ8(curr_read_bytes, max_len, dst, src, type_name) { \ + PEEK_READ8((curr_read_bytes), (max_len), (dst), (src), type_name); \ + UPDATE_DATA((src), (curr_read_bytes), 8); \ +} + +/////////////////////////////////////////////////////////////////////////////// +#define PAD_ALIGN(pad, curr_read_bytes, src, max_len) { \ + int tmp = 0; \ + if ((pad) > 0xF0) { \ + tmp = (pad) & 0x0F; \ + CAN_READ((curr_read_bytes), (tmp), (len)); \ + UPDATE_DATA((src), (curr_read_bytes), (tmp)); \ + } \ +} + +typedef struct R_STREAM_FILE_ { + // FILE *fp; + RBuffer *buf; + int *pages; + int page_size; + int pages_amount; + int end; + int pos; + int error; +} R_STREAM_FILE; + +typedef void (*free_func) (void *); +typedef void (*get_value_name) (void *type, char **res_name); +typedef void (*get_value) (void *type, int *res); +typedef void (*get_value_name_len) (void *type, int *res); +typedef void (*get_member_list) (void *type, RList **l); +typedef int (*get_arg_type_) (void *type, void **ret_type); +typedef int (*get_val_type) (void *type, void **ret_type); + +typedef get_val_type get_element_type_; +typedef get_val_type get_index_type_; +typedef get_val_type get_base_type_; +typedef get_arg_type_ get_derived_; +typedef get_arg_type_ get_vshape_; +typedef get_arg_type_ get_utype_; +typedef get_val_type get_return_type_; +typedef get_val_type get_class_type_; +typedef get_val_type get_this_type_; +typedef get_arg_type_ get_arglist_; +typedef get_arg_type_ get_index_; +typedef get_arg_type_ get_mlist_; +typedef get_arg_type_ get_modified_type_; +typedef get_value get_index_val; +typedef get_value_name get_print_type_; + +typedef enum { + eT_NOTYPE = 0x00000000, + eT_ABS = 0x00000001, + eT_SEGMENT = 0x00000002, + eT_VOID = 0x00000003, + + eT_HRESULT = 0x00000008, + eT_32PHRESULT = 0x00000408, + eT_64PHRESULT = 0x00000608, + + eT_PVOID = 0x00000103, + eT_PFVOID = 0x00000203, + eT_PHVOID = 0x00000303, + eT_32PVOID = 0x00000403, + eT_32PFVOID = 0x00000503, + eT_64PVOID = 0x00000603, + + eT_CURRENCY = 0x00000004, + eT_NBASICSTR = 0x00000005, + eT_FBASICSTR = 0x00000006, + eT_NOTTRANS = 0x00000007, + eT_BIT = 0x00000060, + eT_PASCHAR = 0x00000061, + + eT_CHAR = 0x00000010, + eT_PCHAR = 0x00000110, + eT_PFCHAR = 0x00000210, + eT_PHCHAR = 0x00000310, + eT_32PCHAR = 0x00000410, + eT_32PFCHAR = 0x00000510, + eT_64PCHAR = 0x00000610, + + eT_UCHAR = 0x00000020, + eT_PUCHAR = 0x00000120, + eT_PFUCHAR = 0x00000220, + eT_PHUCHAR = 0x00000320, + eT_32PUCHAR = 0x00000420, + eT_32PFUCHAR = 0x00000520, + eT_64PUCHAR = 0x00000620, + + eT_RCHAR = 0x00000070, + eT_PRCHAR = 0x00000170, + eT_PFRCHAR = 0x00000270, + eT_PHRCHAR = 0x00000370, + eT_32PRCHAR = 0x00000470, + eT_32PFRCHAR = 0x00000570, + eT_64PRCHAR = 0x00000670, + + eT_WCHAR = 0x00000071, + eT_PWCHAR = 0x00000171, + eT_PFWCHAR = 0x00000271, + eT_PHWCHAR = 0x00000371, + eT_32PWCHAR = 0x00000471, + eT_32PFWCHAR = 0x00000571, + eT_64PWCHAR = 0x00000671, + + eT_INT1 = 0x00000068, + eT_PINT1 = 0x00000168, + eT_PFINT1 = 0x00000268, + eT_PHINT1 = 0x00000368, + eT_32PINT1 = 0x00000468, + eT_32PFINT1 = 0x00000568, + eT_64PINT1 = 0x00000668, + + eT_UINT1 = 0x00000069, + eT_PUINT1 = 0x00000169, + eT_PFUINT1 = 0x00000269, + eT_PHUINT1 = 0x00000369, + eT_32PUINT1 = 0x00000469, + eT_32PFUINT1 = 0x00000569, + eT_64PUINT1 = 0x00000669, + + eT_SHORT = 0x00000011, + eT_PSHORT = 0x00000111, + eT_PFSHORT = 0x00000211, + eT_PHSHORT = 0x00000311, + eT_32PSHORT = 0x00000411, + eT_32PFSHORT = 0x00000511, + eT_64PSHORT = 0x00000611, + + eT_USHORT = 0x00000021, + eT_PUSHORT = 0x00000121, + eT_PFUSHORT = 0x00000221, + eT_PHUSHORT = 0x00000321, + eT_32PUSHORT = 0x00000421, + eT_32PFUSHORT = 0x00000521, + eT_64PUSHORT = 0x00000621, + + eT_INT2 = 0x00000072, + eT_PINT2 = 0x00000172, + eT_PFINT2 = 0x00000272, + eT_PHINT2 = 0x00000372, + eT_32PINT2 = 0x00000472, + eT_32PFINT2 = 0x00000572, + eT_64PINT2 = 0x00000672, + + eT_UINT2 = 0x00000073, + eT_PUINT2 = 0x00000173, + eT_PFUINT2 = 0x00000273, + eT_PHUINT2 = 0x00000373, + eT_32PUINT2 = 0x00000473, + eT_32PFUINT2 = 0x00000573, + eT_64PUINT2 = 0x00000673, + + eT_LONG = 0x00000012, + eT_PLONG = 0x00000112, + eT_PFLONG = 0x00000212, + eT_PHLONG = 0x00000312, + eT_32PLONG = 0x00000412, + eT_32PFLONG = 0x00000512, + eT_64PLONG = 0x00000612, + + eT_ULONG = 0x00000022, + eT_PULONG = 0x00000122, + eT_PFULONG = 0x00000222, + eT_PHULONG = 0x00000322, + eT_32PULONG = 0x00000422, + eT_32PFULONG = 0x00000522, + eT_64PULONG = 0x00000622, + + eT_INT4 = 0x00000074, + eT_PINT4 = 0x00000174, + eT_PFINT4 = 0x00000274, + eT_PHINT4 = 0x00000374, + eT_32PINT4 = 0x00000474, + eT_32PFINT4 = 0x00000574, + eT_64PINT4 = 0x00000674, + + eT_UINT4 = 0x00000075, + eT_PUINT4 = 0x00000175, + eT_PFUINT4 = 0x00000275, + eT_PHUINT4 = 0x00000375, + eT_32PUINT4 = 0x00000475, + eT_32PFUINT4 = 0x00000575, + eT_64PUINT4 = 0x00000675, + + eT_QUAD = 0x00000013, + eT_PQUAD = 0x00000113, + eT_PFQUAD = 0x00000213, + eT_PHQUAD = 0x00000313, + eT_32PQUAD = 0x00000413, + eT_32PFQUAD = 0x00000513, + eT_64PQUAD = 0x00000613, + + eT_UQUAD = 0x00000023, + eT_PUQUAD = 0x00000123, + eT_PFUQUAD = 0x00000223, + eT_PHUQUAD = 0x00000323, + eT_32PUQUAD = 0x00000423, + eT_32PFUQUAD = 0x00000523, + eT_64PUQUAD = 0x00000623, + + eT_INT8 = 0x00000076, + eT_PINT8 = 0x00000176, + eT_PFINT8 = 0x00000276, + eT_PHINT8 = 0x00000376, + eT_32PINT8 = 0x00000476, + eT_32PFINT8 = 0x00000576, + eT_64PINT8 = 0x00000676, + + eT_UINT8 = 0x00000077, + eT_PUINT8 = 0x00000177, + eT_PFUINT8 = 0x00000277, + eT_PHUINT8 = 0x00000377, + eT_32PUINT8 = 0x00000477, + eT_32PFUINT8 = 0x00000577, + eT_64PUINT8 = 0x00000677, + + eT_OCT = 0x00000014, + eT_POCT = 0x00000114, + eT_PFOCT = 0x00000214, + eT_PHOCT = 0x00000314, + eT_32POCT = 0x00000414, + eT_32PFOCT = 0x00000514, + eT_64POCT = 0x00000614, + + eT_UOCT = 0x00000024, + eT_PUOCT = 0x00000124, + eT_PFUOCT = 0x00000224, + eT_PHUOCT = 0x00000324, + eT_32PUOCT = 0x00000424, + eT_32PFUOCT = 0x00000524, + eT_64PUOCT = 0x00000624, + + eT_INT16 = 0x00000078, + eT_PINT16 = 0x00000178, + eT_PFINT16 = 0x00000278, + eT_PHINT16 = 0x00000378, + eT_32PINT16 = 0x00000478, + eT_32PFINT16 = 0x00000578, + eT_64PINT16 = 0x00000678, + + eT_UINT16 = 0x00000079, + eT_PUINT16 = 0x00000179, + eT_PFUINT16 = 0x00000279, + eT_PHUINT16 = 0x00000379, + eT_32PUINT16 = 0x00000479, + eT_32PFUINT16 = 0x00000579, + eT_64PUINT16 = 0x00000679, + + eT_REAL32 = 0x00000040, + eT_PREAL32 = 0x00000140, + eT_PFREAL32 = 0x00000240, + eT_PHREAL32 = 0x00000340, + eT_32PREAL32 = 0x00000440, + eT_32PFREAL32 = 0x00000540, + eT_64PREAL32 = 0x00000640, + + eT_REAL48 = 0x00000044, + eT_PREAL48 = 0x00000144, + eT_PFREAL48 = 0x00000244, + eT_PHREAL48 = 0x00000344, + eT_32PREAL48 = 0x00000444, + eT_32PFREAL48 = 0x00000544, + eT_64PREAL48 = 0x00000644, + + eT_REAL64 = 0x00000041, + eT_PREAL64 = 0x00000141, + eT_PFREAL64 = 0x00000241, + eT_PHREAL64 = 0x00000341, + eT_32PREAL64 = 0x00000441, + eT_32PFREAL64 = 0x00000541, + eT_64PREAL64 = 0x00000641, + + eT_REAL80 = 0x00000042, + eT_PREAL80 = 0x00000142, + eT_PFREAL80 = 0x00000242, + eT_PHREAL80 = 0x00000342, + eT_32PREAL80 = 0x00000442, + eT_32PFREAL80 = 0x00000542, + eT_64PREAL80 = 0x00000642, + + eT_REAL128 = 0x00000043, + eT_PREAL128 = 0x00000143, + eT_PFREAL128 = 0x00000243, + eT_PHREAL128 = 0x00000343, + eT_32PREAL128 = 0x00000443, + eT_32PFREAL128 = 0x00000543, + eT_64PREAL128 = 0x00000643, + + eT_CPLX32 = 0x00000050, + eT_PCPLX32 = 0x00000150, + eT_PFCPLX32 = 0x00000250, + eT_PHCPLX32 = 0x00000350, + eT_32PCPLX32 = 0x00000450, + eT_32PFCPLX32 = 0x00000550, + eT_64PCPLX32 = 0x00000650, + + eT_CPLX64 = 0x00000051, + eT_PCPLX64 = 0x00000151, + eT_PFCPLX64 = 0x00000251, + eT_PHCPLX64 = 0x00000351, + eT_32PCPLX64 = 0x00000451, + eT_32PFCPLX64 = 0x00000551, + eT_64PCPLX64 = 0x00000651, + + eT_CPLX80 = 0x00000052, + eT_PCPLX80 = 0x00000152, + eT_PFCPLX80 = 0x00000252, + eT_PHCPLX80 = 0x00000352, + eT_32PCPLX80 = 0x00000452, + eT_32PFCPLX80 = 0x00000552, + eT_64PCPLX80 = 0x00000652, + + eT_CPLX128 = 0x00000053, + eT_PCPLX128 = 0x00000153, + eT_PFCPLX128 = 0x00000253, + eT_PHCPLX128 = 0x00000353, + eT_32PCPLX128 = 0x00000453, + eT_32PFCPLX128 = 0x00000553, + eT_64PCPLX128 = 0x00000653, + + eT_BOOL08 = 0x00000030, + eT_PBOOL08 = 0x00000130, + eT_PFBOOL08 = 0x00000230, + eT_PHBOOL08 = 0x00000330, + eT_32PBOOL08 = 0x00000430, + eT_32PFBOOL08 = 0x00000530, + eT_64PBOOL08 = 0x00000630, + + eT_BOOL16 = 0x00000031, + eT_PBOOL16 = 0x00000131, + eT_PFBOOL16 = 0x00000231, + eT_PHBOOL16 = 0x00000331, + eT_32PBOOL16 = 0x00000431, + eT_32PFBOOL16 = 0x00000531, + eT_64PBOOL16 = 0x00000631, + + eT_BOOL32 = 0x00000032, + eT_PBOOL32 = 0x00000132, + eT_PFBOOL32 = 0x00000232, + eT_PHBOOL32 = 0x00000332, + eT_32PBOOL32 = 0x00000432, + eT_32PFBOOL32 = 0x00000532, + eT_64PBOOL32 = 0x00000632, + + eT_BOOL64 = 0x00000033, + eT_PBOOL64 = 0x00000133, + eT_PFBOOL64 = 0x00000233, + eT_PHBOOL64 = 0x00000333, + eT_32PBOOL64 = 0x00000433, + eT_32PFBOOL64 = 0x00000533, + eT_64PBOOL64 = 0x00000633, + + eT_NCVPTR = 0x000001F0, + eT_FCVPTR = 0x000002F0, + eT_HCVPTR = 0x000003F0, + eT_32NCVPTR = 0x000004F0, + eT_32FCVPTR = 0x000005F0, + eT_64NCVPTR = 0x000006F0, +} EBASE_TYPES; + +typedef enum { + eNEAR_C = 0x00000000, + eFAR_C = 0x00000001, + eNEAR_PASCAL = 0x00000002, + eFAR_PASCAL = 0x00000003, + eNEAR_FAST = 0x00000004, + eFAR_FAST = 0x00000005, + eSKIPPED = 0x00000006, + eNEAR_STD = 0x00000007, + eFAR_STD = 0x00000008, + eNEAR_SYS = 0x00000009, + eFAR_SYS = 0x0000000A, + eTHISCALL = 0x0000000B, + eMIPSCALL = 0x0000000C, + eGENERIC = 0x0000000D, + eALPHACALL = 0x0000000E, + ePPCCALL = 0x0000000F, + eSHCALL = 0x00000010, + eARMCALL = 0x00000011, + eAM33CALL = 0x00000012, + eTRICALL = 0x00000013, + eSH5CALL = 0x00000014, + eM32RCALL = 0x00000015, + eRESERVED = 0x00000016, + eMAX_CV_CALL +} ECV_CALL; + +typedef union { + struct { + ut8 scoped: 1; + ut8 reserved: 7; // swapped + ut8 packed: 1; + ut8 ctor: 1; + ut8 ovlops: 1; + ut8 isnested: 1; + ut8 cnested: 1; + ut8 opassign: 1; + ut8 opcast: 1; + ut8 fwdref: 1; + } bits; + ut16 cv_property; +} UCV_PROPERTY; + +typedef enum { + eMTvanilla = 0x00, + eMTvirtual = 0x01, + eMTstatic = 0x02, + eMTfriend = 0x03, + eMTintro = 0x04, + eMTpurevirt = 0x05, + eMTpureintro = 0x06, + eMT_MAX +} EMPROP; + +typedef enum { + ePrivate = 1, + eProtected = 2, + ePublic = 3, + eAccessMax +} EACCESS; + +//### CodeView bitfields and enums +//# NOTE: Construct assumes big-endian +//# ordering for BitStructs +typedef union { + struct { + ut8 access: 2; + ut8 mprop: 3; + ut8 pseudo: 1; + ut8 noinherit: 1; + ut8 noconstruct: 1; + ut8 padding: 7; + ut8 compgenx: 1; + } bits; + ut16 fldattr; +} UCV_fldattr; + +R_PACKED ( + typedef struct { + ut32 return_type; + ECV_CALL call_conv; + ut8 reserved; + ut16 parm_count; + ut32 arg_list; + ut8 pad; + }) SLF_PROCEDURE; + + R_PACKED( + typedef struct { + ut32 return_type; + ut32 class_type; + ut32 this_type; + ECV_CALL call_conv; // 1 byte + ut8 reserved; + ut16 parm_count; + ut32 arglist; + st32 this_adjust; + ut8 pad; + }) +SLF_MFUNCTION; + +R_PACKED ( + typedef struct { + ut32 count; + ut32 *arg_type; + ut8 pad; + }) SLF_ARGLIST; + + R_PACKED( + typedef struct { + ut32 modified_type; + union { + struct { + ut8 pad2: 8; + ut8 const_: 1; + ut8 volatile_: 1; + ut8 unaligned: 1; + ut8 pad1: 5; + } bits; + ut16 modifier; + } umodifier; + ut8 pad; + }) +SLF_MODIFIER; + +typedef enum { + ePTR_MODE_PTR = 0x00000000, + ePTR_MODE_REF = 0x00000001, + ePTR_MODE_PMEM = 0x00000002, + ePTR_MODE_PMFUNC = 0x00000003, + ePTR_MODE_RESERVED = 0x00000004, + eModeMax +} EMode; + +typedef enum { + ePTR_NEAR = 0x00000000, + ePTR_FAR = 0x00000001, + ePTR_HUGE = 0x00000002, + ePTR_BASE_SEG = 0x00000003, + ePTR_BASE_VAL = 0x00000004, + ePTR_BASE_SEGVAL = 0x00000005, + ePTR_BASE_ADDR = 0x00000006, + ePTR_BASE_SEGADDR = 0x00000007, + ePTR_BASE_TYPE = 0x00000008, + ePTR_BASE_SELF = 0x00000009, + ePTR_NEAR32 = 0x0000000A, + ePTR_FAR32 = 0x0000000B, + ePTR_64 = 0x0000000C, + ePTR_UNUSEDPTR = 0x0000000D, + eTypeMax +} EType; + +R_PACKED ( + typedef union { + struct { + ut8 pad[2]; + ut8 flat32: 1; + ut8 volatile_: 1; + ut8 const_: 1; + ut8 unaligned: 1; + ut8 restrict_: 1; + ut8 pad1: 3; + ut8 type: 5; + ut8 mode: 3; + } bits; + ut32 ptr_attr; + }) UPTR_ATTR; + + R_PACKED( + typedef struct { + ut32 utype; + UPTR_ATTR ptr_attr; + ut8 pad; + }) +SLF_POINTER; + +R_PACKED ( + typedef struct { + st32 stream_size; + st32 num_pages; + ut8 *stream_pages; + }) SPage; + + typedef struct { + // FILE *fp; + RBuffer *buf; + int *pages; + int pages_amount; + int indx; + int page_size; + int size; + R_STREAM_FILE stream_file; + // int fast_load; + // ... parent; + + free_func free_; + } R_PDB_STREAM; + + typedef struct R_PDB7_ROOT_STREAM { + R_PDB_STREAM pdb_stream; + int num_streams; + RList *streams_list; + } R_PDB7_ROOT_STREAM; + + typedef enum EStream_ { + ePDB_STREAM_ROOT = 0, // PDB_ROOT_DIRECTORY + ePDB_STREAM_PDB, // PDB STREAM INFO + ePDB_STREAM_TPI, // TYPE INFO + ePDB_STREAM_DBI, // DEBUG INFO + + ePDB_STREAM_GSYM, + ePDB_STREAM_SECT_HDR, + ePDB_STREAM_SECT__HDR_ORIG, + ePDB_STREAM_OMAP_TO_SRC, + ePDB_STREAM_OMAP_FROM_SRC, + ePDB_STREAM_FPO, + ePDB_STREAM_FPO_NEW, + ePDB_STREAM_XDATA, + ePDB_STREAM_PDATA, + ePDB_STREAM_TOKEN_RID_MAP, + ePDB_STREAM_MAX + } EStream; + + typedef void (*f_load) (void *parsed_pdb_stream, R_STREAM_FILE *stream); + + typedef struct { + R_PDB_STREAM *pdb_stream; + f_load load; + } SParsedPDBStream; + + R_PACKED( + typedef struct { + char *name; + ut32 size; + }) +SCString; + +R_PACKED ( + typedef struct { + SCString name; + }) SNoVal; + + R_PACKED( + typedef struct { + char value; + SCString name; + }) +SVal_LF_CHAR; + +R_PACKED ( + typedef struct { + st16 value; + SCString name; + }) SVal_LF_SHORT; + + R_PACKED( + typedef struct { + ut16 value; + SCString name; + }) +SVal_LF_USHORT; + +typedef struct { + st32 value; + SCString name; +} SVal_LF_LONG; + +typedef struct { + ut32 value; + SCString name; +} SVal_LF_ULONG; + +typedef struct { + st64 value; + SCString name; +} SVal_LF_QUADWORD; + +typedef struct { + ut64 value; + SCString name; +} SVal_LF_UQUADWORD; + +R_PACKED ( + typedef struct { + ut16 value_or_type; + void *name_or_val; + }) SVal; + + R_PACKED( + typedef struct { + ut32 element_type; + ut32 index_type; + SVal size; + ut8 pad; + }) +SLF_ARRAY; + +R_PACKED ( + typedef struct { + ut16 count; + UCV_PROPERTY prop; + ut32 field_list; + ut32 derived; + ut32 vshape; + SVal size; + ut8 pad; + }) SLF_STRUCTURE, SLF_CLASS; + + R_PACKED( + typedef struct { + ut16 count; + UCV_PROPERTY prop; + ut32 field_list; + SVal size; + ut32 pad; + }) +SLF_UNION; + +R_PACKED ( + typedef struct { + ut32 base_type; + ut8 length; + ut8 position; + ut8 pad; + }) SLF_BITFIELD; + + R_PACKED( + typedef struct { + ut16 count; + char *vt_descriptors; + ut8 pad; + }) +SLF_VTSHAPE; + +R_PACKED ( + typedef struct { + ut16 count; + UCV_PROPERTY prop; + ut32 utype; + ut32 field_list; + SCString name; + ut8 pad; + }) SLF_ENUM; + + R_PACKED( + typedef struct { + UCV_fldattr fldattr; + SVal enum_value; + ut8 pad; + + free_func free_; + }) +SLF_ENUMERATE; + +R_PACKED ( + typedef struct { + ut16 pad; + ut32 index; + SCString name; + + free_func free_; + }) SLF_NESTTYPE; + + R_PACKED( + typedef struct { + ut16 count; + ut32 mlist; + SCString name; + ut8 pad; + + free_func free_; + }) +SLF_METHOD; + +R_PACKED ( + typedef struct { + UCV_fldattr fldattr; + ut32 index; + SVal offset; + ut8 pad; + + // TODO: remove free_ + free_func free_; + }) SLF_MEMBER; + + R_PACKED( + typedef struct { + ut32 val; + SCString str_data; + }) +SLF_ONEMETHOD_VAL; + +R_PACKED ( + typedef struct { + UCV_fldattr fldattr; + ut32 index; + SLF_ONEMETHOD_VAL val; + ut8 pad; + }) SLF_ONEMETHOD; + + typedef struct { + // ELeafType leaf_type; + RList *substructs; + } SLF_FIELDLIST; + + typedef struct { + st32 off; + st32 cb; + } SOffCb; + + typedef struct { + st16 sn; + st16 padding; + st32 hash_key; + st32 buckets; + SOffCb hash_vals; + SOffCb ti_off; + SOffCb hash_adj; + } STPI; + + typedef struct { + ut32 version; + st32 hdr_size; + ut32 ti_min; + ut32 ti_max; + ut32 follow_size; + STPI tpi; + } STPIHeader; + + typedef enum { + eLF_MODIFIER_16t = 0x00000001, + eLF_POINTER_16t = 0x00000002, + eLF_ARRAY_16t = 0x00000003, + eLF_CLASS_16t = 0x00000004, + eLF_STRUCTURE_16t = 0x00000005, + eLF_UNION_16t = 0x00000006, + eLF_ENUM_16t = 0x00000007, + eLF_PROCEDURE_16t = 0x00000008, + eLF_MFUNCTION_16t = 0x00000009, + eLF_VTSHAPE = 0x0000000A, + eLF_COBOL0_16t = 0x0000000B, + eLF_COBOL1 = 0x0000000C, + eLF_BARRAY_16t = 0x0000000D, + eLF_LABEL = 0x0000000E, + eLF_NULL = 0x0000000F, + eLF_NOTTRAN = 0x00000010, + eLF_DIMARRAY_16t = 0x00000011, + eLF_VFTPATH_16t = 0x00000012, + eLF_PRECOMP_16t = 0x00000013, + eLF_ENDPRECOMP = 0x00000014, + eLF_OEM_16t = 0x00000015, + eLF_TYPESERVER_ST = 0x00000016, + eLF_SKIP_16t = 0x00000200, + eLF_ARGLIST_16t = 0x00000201, + eLF_DEFARG_16t = 0x00000202, + eLF_LIST = 0x00000203, + eLF_FIELDLIST_16t = 0x00000204, + eLF_DERIVED_16t = 0x00000205, + eLF_BITFIELD_16t = 0x00000206, + eLF_METHODLIST_16t = 0x00000207, + eLF_DIMCONU_16t = 0x00000208, + eLF_DIMCONLU_16t = 0x00000209, + eLF_DIMVARU_16t = 0x0000020A, + eLF_DIMVARLU_16t = 0x0000020B, + eLF_REFSYM = 0x0000020C, + eLF_BCLASS_16t = 0x00000400, + eLF_VBCLASS_16t = 0x00000401, + eLF_IVBCLASS_16t = 0x00000402, + eLF_ENUMERATE_ST = 0x00000403, + eLF_FRIENDFCN_16t = 0x00000404, + eLF_INDEX_16t = 0x00000405, + eLF_MEMBER_16t = 0x00000406, + eLF_STMEMBER_16t = 0x00000407, + eLF_METHOD_16t = 0x00000408, + eLF_NESTTYPE_16t = 0x00000409, + eLF_VFUNCTAB_16t = 0x0000040A, + eLF_FRIENDCLS_16t = 0x0000040B, + eLF_ONEMETHOD_16t = 0x0000040C, + eLF_VFUNCOFF_16t = 0x0000040D, + eLF_TI16_MAX = 0x00001000, + eLF_MODIFIER = 0x00001001, + eLF_POINTER = 0x00001002, + eLF_ARRAY_ST = 0x00001003, + eLF_CLASS_ST = 0x00001004, + eLF_STRUCTURE_ST = 0x00001005, + eLF_UNION_ST = 0x00001006, + eLF_ENUM_ST = 0x00001007, + eLF_PROCEDURE = 0x00001008, + eLF_MFUNCTION = 0x00001009, + eLF_COBOL0 = 0x0000100A, + eLF_BARRAY = 0x0000100B, + eLF_DIMARRAY_ST = 0x0000100C, + eLF_VFTPATH = 0x0000100D, + eLF_PRECOMP_ST = 0x0000100E, + eLF_OEM = 0x0000100F, + eLF_ALIAS_ST = 0x00001010, + eLF_OEM2 = 0x00001011, + eLF_SKIP = 0x00001200, + eLF_ARGLIST = 0x00001201, + eLF_DEFARG_ST = 0x00001202, + eLF_FIELDLIST = 0x00001203, + eLF_DERIVED = 0x00001204, + eLF_BITFIELD = 0x00001205, + eLF_METHODLIST = 0x00001206, + eLF_DIMCONU = 0x00001207, + eLF_DIMCONLU = 0x00001208, + eLF_DIMVARU = 0x00001209, + eLF_DIMVARLU = 0x0000120A, + eLF_BCLASS = 0x00001400, + eLF_VBCLASS = 0x00001401, + eLF_IVBCLASS = 0x00001402, + eLF_FRIENDFCN_ST = 0x00001403, + eLF_INDEX = 0x00001404, + eLF_MEMBER_ST = 0x00001405, + eLF_STMEMBER_ST = 0x00001406, + eLF_METHOD_ST = 0x00001407, + eLF_NESTTYPE_ST = 0x00001408, + eLF_VFUNCTAB = 0x00001409, + eLF_FRIENDCLS = 0x0000140A, + eLF_ONEMETHOD_ST = 0x0000140B, + eLF_VFUNCOFF = 0x0000140C, + eLF_NESTTYPEEX_ST = 0x0000140D, + eLF_MEMBERMODIFY_ST = 0x0000140E, + eLF_MANAGED_ST = 0x0000140F, + eLF_ST_MAX = 0x00001500, + eLF_TYPESERVER = 0x00001501, + eLF_ENUMERATE = 0x00001502, + eLF_ARRAY = 0x00001503, + eLF_CLASS = 0x00001504, + eLF_STRUCTURE = 0x00001505, + eLF_UNION = 0x00001506, + eLF_ENUM = 0x00001507, + eLF_DIMARRAY = 0x00001508, + eLF_PRECOMP = 0x00001509, + eLF_ALIAS = 0x0000150A, + eLF_DEFARG = 0x0000150B, + eLF_FRIENDFCN = 0x0000150C, + eLF_MEMBER = 0x0000150D, + eLF_STMEMBER = 0x0000150E, + eLF_METHOD = 0x0000150F, + eLF_NESTTYPE = 0x00001510, + eLF_ONEMETHOD = 0x00001511, + eLF_NESTTYPEEX = 0x00001512, + eLF_MEMBERMODIFY = 0x00001513, + eLF_MANAGED = 0x00001514, + eLF_TYPESERVER2 = 0x00001515, + eLF_CHAR = 0x00008000, + eLF_SHORT = 0x00008001, + eLF_USHORT = 0x00008002, + eLF_LONG = 0x00008003, + eLF_ULONG = 0x00008004, + eLF_REAL32 = 0x00008005, + eLF_REAL64 = 0x00008006, + eLF_REAL80 = 0x00008007, + eLF_REAL128 = 0x00008008, + eLF_QUADWORD = 0x00008009, + eLF_UQUADWORD = 0x0000800A, + eLF_REAL48 = 0x0000800B, + eLF_COMPLEX32 = 0x0000800C, + eLF_COMPLEX64 = 0x0000800D, + eLF_COMPLEX80 = 0x0000800E, + eLF_COMPLEX128 = 0x0000800F, + eLF_VARSTRING = 0x00008010, + eLF_OCTWORD = 0x00008017, + eLF_UOCTWORD = 0x00008018, + eLF_DECIMAL = 0x00008019, + eLF_DATE = 0x0000801A, + eLF_UTF8STRING = 0x0000801B, + eLF_PAD0 = 0x000000F0, + eLF_PAD1 = 0x000000F1, + eLF_PAD2 = 0x000000F2, + eLF_PAD3 = 0x000000F3, + eLF_PAD4 = 0x000000F4, + eLF_PAD5 = 0x000000F5, + eLF_PAD6 = 0x000000F6, + eLF_PAD7 = 0x000000F7, + eLF_PAD8 = 0x000000F8, + eLF_PAD9 = 0x000000F9, + eLF_PAD10 = 0x000000FA, + eLF_PAD11 = 0x000000FB, + eLF_PAD12 = 0x000000FC, + eLF_PAD13 = 0x000000FD, + eLF_PAD14 = 0x000000FE, + eLF_PAD15 = 0x000000FF, + eLF_MAX = 0xFFFFFFFF + } ELeafType; + + R_PACKED( + typedef struct { + ELeafType leaf_type; + void *type_info; + + free_func free_; + get_value_name get_name; + get_value get_val; + get_value_name_len get_name_len; + get_member_list get_members; + get_arg_type_ get_arg_type; + get_element_type_ get_element_type; + get_index_type_ get_index_type; + get_base_type_ get_base_type; + get_derived_ get_derived; + get_vshape_ get_vshape; + get_utype_ get_utype; + get_return_type_ get_return_type; + get_class_type_ get_class_type; + get_this_type_ get_this_type; + get_arglist_ get_arglist; + get_index_ get_index; + get_mlist_ get_mlist; + get_modified_type_ get_modified_type; + get_value is_fwdref; + get_print_type_ get_print_type; + + }) +STypeInfo; + +R_PACKED ( + typedef struct { + ut16 length; + ut32 tpi_idx; + STypeInfo type_data; + + // free_func free_; + }) SType; + + typedef struct { + STPIHeader header; + RList *types; + + free_func free_; + } STpiStream; + + typedef struct { + ut32 data1; + ut16 data2; + ut16 data3; + ut8 data4[8]; + } SGUID; + + typedef struct { + ut32 version; + ut32 time_date_stamp; + ut32 age; + SGUID guid; + ut32 cb_names; + char *names; + + free_func free_; + } SPDBInfoStream/*D*/; + +// dbi stream structures start here + + typedef enum { + eIMAGE_FILE_MACHINE_UNKNOWN = 0x0, + eIMAGE_FILE_MACHINE_I386 = 0x014c, + eIMAGE_FILE_MACHINE_IA64 = 0x0200, + eIMAGE_FILE_MACHINE_AMD64 = 0x8664, + eMaxMachine + } EMachine; + + R_PACKED( + typedef struct { + ut16 section; + ut16 padding1; + st32 offset; + st32 size; + ut32 flags; + st32 module; + st16 padding2; + ut32 data_crc; + ut32 reloc_crc; + }) +SSymbolRange; + +R_PACKED ( + typedef struct { + ut32 opened; + SSymbolRange range; + ut16 flags; + st16 stream; + ut32 symSize; + ut32 oldLineSize; + ut32 lineSize; + st16 nSrcFiles; + st16 padding1; + ut32 offsets; + ut32 niSource; + ut32 niCompiler; + SCString modName; + SCString objName; + }) SDBIExHeader; + + R_PACKED( + typedef struct { + st16 sn_fpo; + st16 sn_exception; + st16 sn_fixup; + st16 sn_omap_to_src; + st16 sn_omap_from_src; + st16 sn_section_hdr; + st16 sn_token_rid_map; + st16 sn_xdata; + st16 sn_pdata; + st16 sn_new_fpo; + st16 sn_section_hdr_orig; + }) +SDbiDbgHeader; + +R_PACKED ( + typedef struct { + ut32 magic; + ut32 version; + ut32 age; + st16 gssymStream; + ut16 vers; + st16 pssymStream; + ut16 pdbver; + st16 symrecStream; + ut16 pdbver2; + ut32 module_size; + ut32 seccon_size; + ut32 secmap_size; + ut32 filinf_size; + ut32 tsmap_size; + ut32 mfc_index; + ut32 dbghdr_size; + ut32 ecinfo_size; + ut16 flags; + EMachine machine; // read just 2 bytes + ut32 resvd; + }) SDBIHeader; + + typedef struct { + SDBIHeader dbi_header; + SDbiDbgHeader dbg_header; + RList *dbiexhdrs; + + free_func free_; + } SDbiStream; +// end of dbi stream structures + +// start of FPO stream structures + typedef union { + struct { + ut8 cbRegs: 3; + ut8 fHashSEH: 1; + ut8 fUseBp: 1; + ut8 reserved: 1; + ut8 cbFrame: 2; + ut8 cbProlog: 8; + } bits; + ut16 bit_values; + } UBit_values; + + R_PACKED( + typedef struct { + ut32 ul_off_start; + ut32 cb_proc_size; + ut32 cdw_locals; + ut16 cdw_params; + UBit_values bit_values; + }) +SFPO_DATA; + +typedef struct { + RList *fpo_data_list; +} SFPOStream; + +typedef enum { + eSEH = 1, + eCPPEH = 2, + eFnStart = 4, + eFPO_DATA_FLAGS_MAX +} EFPO_DATA_FLAGS; + +R_PACKED ( + typedef struct { + ut32 ul_off_start; + ut32 cb_proc_size; + ut32 cdw_locals; + ut32 cdw_params; + ut32 max_stack; + ut32 programm_string_offset; + ut16 cb_prolog; + ut16 cb_save_regs; + EFPO_DATA_FLAGS flags; + }) SFPO_DATA_V2; + + typedef struct { + RList *fpo_data_list; + } SFPONewStream; +// end of FPO stream structures + +// GDATA structrens + typedef struct { + RList *globals_list; + } SGDATAStream; + + R_PACKED ( + typedef struct { + ut16 leaf_type; + ut32 symtype; + ut32 offset; + ut16 segment; + SCString name; + }) +SGlobal; +// end GDATA structures + +// PE stream structures +// TODO: Support 64bit addressing! +typedef union { + ut32 physical_address; + ut32 virtual_address; +} UMISC; + +#define PDB_SIZEOF_SECTION_NAME 8 + +R_PACKED ( + typedef struct { + char name[PDB_SIZEOF_SECTION_NAME]; + UMISC misc; + ut32 virtual_address; + ut32 size_of_raw_data; + ut32 pointer_to_raw_data; + ut32 pointer_to_relocations; + ut32 pointer_to_line_numbers; + ut16 number_of_relocations; + ut16 number_of_line_numbers; + ut32 charactestics; + }) SIMAGE_SECTION_HEADER; + + typedef struct { + RList *sections_hdrs; + } SPEStream; +// end PE stream structures + +// omap structures + typedef struct { + ut32 from; + ut32 to; + } SOmapEntry; + + typedef struct { + RList *omap_entries; + ut32 *froms; + } SOmapStream; +// end of omap structures + + typedef void (*parse_stream_) (void *stream, R_STREAM_FILE *stream_file); + + typedef struct { + int indx; + parse_stream_ parse_stream; + void *stream; + EStream type; + free_func free; + } SStreamParseFunc; + +#endif // PDB_TYPES_H \ No newline at end of file diff --git a/bfd/pdb.c b/bfd/pdb.c index 384510f..858512e 100644 --- a/bfd/pdb.c +++ b/bfd/pdb.c @@ -6,6 +6,7 @@ bfd_boolean bfd_pdb_close_and_cleanup (bfd *abfd) { + abfd->tdata.pdb_data->pdb->finish_pdb_parse (abfd->tdata.pdb_data->pdb); return TRUE; } @@ -17,11 +18,7 @@ bfd_pdb_bfd_free_cached_info (bfd *abfd) } /* Called when a new section is created. */ -bfd_boolean -bfd_pdb_new_section_hook (bfd *abfd, asection *sec) -{ - return FALSE; -} +#define bfd_pdb_new_section_hook _bfd_generic_new_section_hook /* Read the contents of a section. */ #define bfd_pdb_get_section_contents _bfd_generic_get_section_contents @@ -39,11 +36,7 @@ bfd_pdb_canonicalize_symtab (bfd *abfd, asymbol **alocation) return -1; } -asymbol * -bfd_pdb_make_empty_symbol (bfd *abfd) -{ - return NULL; -} +#define bfd_pdb_make_empty_symbol _bfd_generic_make_empty_symbol void bfd_pdb_print_symbol (bfd *abfd, @@ -84,10 +77,10 @@ bfd_pdb_find_nearest_line (bfd *abfd, /* Back-door to allow format-aware applications to create debug symbols while using BFD for everything else. Currently used by the assembler when creating COFF files. */ -#define bfd_pdb_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol +#define bfd_pdb_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol -#define bfd_pdb_read_minisymbols _bfd_generic_read_minisymbols -#define bfd_pdb_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol +#define bfd_pdb_read_minisymbols _bfd_nosymbols_read_minisymbols +#define bfd_pdb_minisymbol_to_symbol _bfd_nosymbols_minisymbol_to_symbol static st64 r_buffer_read (RBuffer *buffer, ut8 *out, ut64 length) @@ -126,14 +119,65 @@ get_bfd_pdb_data (bfd *abfd) return NULL; } +void +bfd_pdb_get_sections (bfd *abfd) +{ + R_PDB *r_pdb = abfd->tdata.pdb_data->pdb; + + SPEStream *section_stream = NULL; + + RListIter *it = r_list_iterator (r_pdb->pdb_streams2); + while (r_list_iter_next (it)) + { + SStreamParseFunc *stream = r_list_iter_get (it); + if (stream->type == ePDB_STREAM_SECT_HDR) + section_stream = stream->stream; + } + + if (!section_stream) + { + _bfd_error_handler (_("%pB: no sections found in PDB"), abfd); + return; + } + + it = r_list_iterator (section_stream->sections_hdrs); + while (r_list_iter_next (it)) + { + SIMAGE_SECTION_HEADER *section_header = r_list_iter_get (it); + if (section_header) + { + //FIXME: These flags are probably not correct + asection *section = bfd_make_section_with_flags (abfd, + section_header->name, + SEC_LOAD); + section->vma = section_header->virtual_address; + section->size = section_header->size_of_raw_data; + //section->userdata = section_header; + } + } +} + const bfd_target * bfd_pdb_check_format (bfd *abfd) { if ((abfd->tdata.pdb_data = get_bfd_pdb_data (abfd))) { + R_PDB *r_pdb = abfd->tdata.pdb_data->pdb; + + if (r_pdb->pdb_parse (r_pdb)) + { + bfd_pdb_get_sections (abfd); + } + else + { + _bfd_error_handler (_("%pB: malformed PDB file"), abfd); + goto fail; + } + return abfd->xvec; } + fail: bfd_set_error (bfd_error_wrong_format); return NULL; } diff --git a/bfd/pdb.h b/bfd/pdb.h index b861bdc..c8672ed 100644 --- a/bfd/pdb.h +++ b/bfd/pdb.h @@ -5,8 +5,8 @@ #include "libbfd.h" #include +#include "pdb-types.h" -typedef struct pdb_data_struct -{ - R_PDB* pdb; +typedef struct pdb_data_struct { + R_PDB *pdb; } bfd_pdb_data_struct; diff --git a/gdb/coffread.c b/gdb/coffread.c index 4f73487..fdbdd3a 100644 --- a/gdb/coffread.c +++ b/gdb/coffread.c @@ -726,8 +726,7 @@ coff_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags) symbol_file_add_separate (debug_bfd.get (), debugfile.c_str (), symfile_flags, objfile); } - - if (debugfile.empty ()) + else { gdb_bfd_ref_ptr debug_bfd (try_load_pdb_bfd (objfile)); if (debug_bfd.get ()) diff --git a/gdb/pdb.c b/gdb/pdb.c index bdfcd47..8112371 100644 --- a/gdb/pdb.c +++ b/gdb/pdb.c @@ -45,19 +45,7 @@ extern "C" { #include "psympriv.h" -//BEGIN radare2 imports -#include "pdb_types.h" - -typedef void (*parse_stream_) (void *stream, R_STREAM_FILE *stream_file); - -typedef struct { - int indx; - parse_stream_ parse_stream; - void *stream; - EStream type; - free_func free; -} SStreamParseFunc; -//END radare2 imports +#include "bfd/pdb-types.h" struct find_section_by_name_args { const char *name; @@ -199,13 +187,8 @@ get_codeview_pdb_path (objfile *objfile) return nullopt; bfd_byte *data = nullptr; - //TODO: Check if this leaks memory (data isn't freed) if (!bfd_malloc_and_get_section (abfd, section, &data)) - { - if (data != nullptr) - free (data); - return nullopt; - } + return nullopt; for (auto i = 0; i < size / sizeof (struct external_IMAGE_DEBUG_DIRECTORY); i++) { @@ -240,6 +223,8 @@ get_pdb_paths (struct objfile *objfile) if (!codeview_pdb_path) return paths; //if there is no CodeView PDB path, we assume no PDB exists + //TODO: Only push_back 'target:' paths if we have a remote target + paths.push_back (*codeview_pdb_path); paths.push_back ("target:" + *codeview_pdb_path); @@ -387,3 +372,43 @@ read_pdb (struct objfile *objfile, minimal_symbol_reader & reader) pdb->finish_pdb_parse (pdb.get ()); } + +static void +pdb_sym_new_init (objfile *objfile) +{ +} + +static void +pdb_sym_init (objfile *objfile) +{ +} + +static void +pdb_sym_read (objfile *objfile, symfile_add_flags symfile_flags) +{ +} + +static void +pdb_sym_finish (objfile *objfile) +{ +} + +const struct sym_fns pdb_sym_fns = { + pdb_sym_new_init, + pdb_sym_init, + pdb_sym_read, + nullptr, /* sym_read_psymbols */ + pdb_sym_finish, + default_symfile_offsets, + default_symfile_segments, + nullptr, /* sym_read_linetable */ + default_symfile_relocate, + nullptr, /* sym_probe_fns */ + &psym_functions +}; + +void +_initialize_pdb () +{ + add_symtab_fns (bfd_target_pdb_flavour, &pdb_sym_fns); +} \ No newline at end of file diff --git a/gdb/pdb_types.h b/gdb/pdb_types.h deleted file mode 100644 index 768c9f1..0000000 --- a/gdb/pdb_types.h +++ /dev/null @@ -1,1277 +0,0 @@ -/* Includes code from radare2: - radare - LGPL - Copyright 2014 - inisider - (https://github.com/radareorg/radare2) */ - -#ifndef PDB_TYPES_H -#define PDB_TYPES_H - -#define _R_LIST_C -#include - -#define READ_PAGE_FAIL 0x01 - -// TODO: Move to a general macros in r_util/r_types - -/////////////////////////////////////////////////////////////////////////////// -#define GET_PAGE(pn, off, pos, page_size) { \ - (pn) = (pos) / (page_size); \ - (off) = (pos) % (page_size); \ -} - -/////////////////////////////////////////////////////////////////////////////// -#define READ_PAGES(start_indx, end_indx) { \ - for (i = start_indx; i < end_indx; i++) { \ - fseek(stream_file->fp, stream_file->pages[i] * stream_file->page_size, SEEK_SET); \ - fread(tmp, stream_file->page_size, 1, stream_file->fp); \ - tmp += stream_file->page_size; \ - } \ -} - -/////////////////////////////////////////////////////////////////////////////// -#define SWAP_UINT16(x) (((x) >> 8) | ((x) << 8)) - -/////////////////////////////////////////////////////////////////////////////// -#define SWAP_UINT32(x) (((x) >> 24) | (((x) & 0x00FF0000) >> 8) | (((x) & 0x0000FF00) << 8) | ((x) << 24)) - -/////////////////////////////////////////////////////////////////////////////// -#define CAN_READ(curr_read_bytes, bytes_for_read, max_len) { \ - if ((((curr_read_bytes) + (bytes_for_read)) >= (max_len))) { \ - return 0; \ - } \ -} - -/////////////////////////////////////////////////////////////////////////////// -#define UPDATE_DATA(src, curr_read_bytes, bytes_for_read) { \ - (src) += (bytes_for_read); \ - (curr_read_bytes) += (bytes_for_read); \ -} - -/////////////////////////////////////////////////////////////////////////////// -#define PEEK_READ1(curr_read_bytes, max_len, dst, src, type_name) { \ - CAN_READ((curr_read_bytes), 1, (max_len)); \ - (dst) = *(type_name *) (src); \ -} -#define PEEK_READ2(curr_read_bytes, max_len, dst, src, type_name) { \ - CAN_READ((curr_read_bytes), 2, (max_len)); \ - (dst) = (type_name) r_read_le16 (src); \ -} -#define PEEK_READ4(curr_read_bytes, max_len, dst, src, type_name) { \ - CAN_READ((curr_read_bytes), 4, (max_len)); \ - (dst) = (type_name) r_read_le32 (src); \ -} -#define PEEK_READ8(curr_read_bytes, max_len, dst, src, type_name) { \ - CAN_READ((curr_read_bytes), 8, (max_len)); \ - (dst) = (type_name) r_read_le64 (src); \ -} -/////////////////////////////////////////////////////////////////////////////// -#define READ1(curr_read_bytes, max_len, dst, src, type_name) { \ - PEEK_READ1((curr_read_bytes), (max_len), (dst), (src), type_name); \ - UPDATE_DATA((src), (curr_read_bytes), 1); \ -} - -#define READ2(curr_read_bytes, max_len, dst, src, type_name) { \ - PEEK_READ2((curr_read_bytes), (max_len), (dst), (src), type_name); \ - UPDATE_DATA((src), (curr_read_bytes), 2); \ -} - -#define READ4(curr_read_bytes, max_len, dst, src, type_name) { \ - PEEK_READ4((curr_read_bytes), (max_len), (dst), (src), type_name); \ - UPDATE_DATA((src), (curr_read_bytes), 4); \ -} - -#define READ8(curr_read_bytes, max_len, dst, src, type_name) { \ - PEEK_READ8((curr_read_bytes), (max_len), (dst), (src), type_name); \ - UPDATE_DATA((src), (curr_read_bytes), 8); \ -} - -/////////////////////////////////////////////////////////////////////////////// -#define PAD_ALIGN(pad, curr_read_bytes, src, max_len) { \ - int tmp = 0; \ - if ((pad) > 0xF0) { \ - tmp = (pad) & 0x0F; \ - CAN_READ((curr_read_bytes), (tmp), (len)); \ - UPDATE_DATA((src), (curr_read_bytes), (tmp)); \ - } \ -} - -typedef struct R_STREAM_FILE_{ - // FILE *fp; - RBuffer *buf; - int *pages; - int page_size; - int pages_amount; - int end; - int pos; - int error; -} R_STREAM_FILE; - -typedef void (*free_func)(void *); -typedef void (*get_value_name)(void *type, char **res_name); -typedef void (*get_value)(void *type, int *res); -typedef void (*get_value_name_len)(void *type, int *res); -typedef void (*get_member_list)(void *type, RList **l); -typedef int (*get_arg_type_)(void *type, void **ret_type); -typedef int (*get_val_type)(void *type, void **ret_type); - -typedef get_val_type get_element_type_; -typedef get_val_type get_index_type_; -typedef get_val_type get_base_type_; -typedef get_arg_type_ get_derived_; -typedef get_arg_type_ get_vshape_; -typedef get_arg_type_ get_utype_; -typedef get_val_type get_return_type_; -typedef get_val_type get_class_type_; -typedef get_val_type get_this_type_; -typedef get_arg_type_ get_arglist_; -typedef get_arg_type_ get_index_; -typedef get_arg_type_ get_mlist_; -typedef get_arg_type_ get_modified_type_; -typedef get_value get_index_val; -typedef get_value_name get_print_type_; - -typedef enum { - eT_NOTYPE = 0x00000000, - eT_ABS = 0x00000001, - eT_SEGMENT = 0x00000002, - eT_VOID = 0x00000003, - - eT_HRESULT = 0x00000008, - eT_32PHRESULT = 0x00000408, - eT_64PHRESULT = 0x00000608, - - eT_PVOID = 0x00000103, - eT_PFVOID = 0x00000203, - eT_PHVOID = 0x00000303, - eT_32PVOID = 0x00000403, - eT_32PFVOID = 0x00000503, - eT_64PVOID = 0x00000603, - - eT_CURRENCY = 0x00000004, - eT_NBASICSTR = 0x00000005, - eT_FBASICSTR = 0x00000006, - eT_NOTTRANS = 0x00000007, - eT_BIT = 0x00000060, - eT_PASCHAR = 0x00000061, - - eT_CHAR = 0x00000010, - eT_PCHAR = 0x00000110, - eT_PFCHAR = 0x00000210, - eT_PHCHAR = 0x00000310, - eT_32PCHAR = 0x00000410, - eT_32PFCHAR = 0x00000510, - eT_64PCHAR = 0x00000610, - - eT_UCHAR = 0x00000020, - eT_PUCHAR = 0x00000120, - eT_PFUCHAR = 0x00000220, - eT_PHUCHAR = 0x00000320, - eT_32PUCHAR = 0x00000420, - eT_32PFUCHAR = 0x00000520, - eT_64PUCHAR = 0x00000620, - - eT_RCHAR = 0x00000070, - eT_PRCHAR = 0x00000170, - eT_PFRCHAR = 0x00000270, - eT_PHRCHAR = 0x00000370, - eT_32PRCHAR = 0x00000470, - eT_32PFRCHAR = 0x00000570, - eT_64PRCHAR = 0x00000670, - - eT_WCHAR = 0x00000071, - eT_PWCHAR = 0x00000171, - eT_PFWCHAR = 0x00000271, - eT_PHWCHAR = 0x00000371, - eT_32PWCHAR = 0x00000471, - eT_32PFWCHAR = 0x00000571, - eT_64PWCHAR = 0x00000671, - - eT_INT1 = 0x00000068, - eT_PINT1 = 0x00000168, - eT_PFINT1 = 0x00000268, - eT_PHINT1 = 0x00000368, - eT_32PINT1 = 0x00000468, - eT_32PFINT1 = 0x00000568, - eT_64PINT1 = 0x00000668, - - eT_UINT1 = 0x00000069, - eT_PUINT1 = 0x00000169, - eT_PFUINT1 = 0x00000269, - eT_PHUINT1 = 0x00000369, - eT_32PUINT1 = 0x00000469, - eT_32PFUINT1 = 0x00000569, - eT_64PUINT1 = 0x00000669, - - eT_SHORT = 0x00000011, - eT_PSHORT = 0x00000111, - eT_PFSHORT = 0x00000211, - eT_PHSHORT = 0x00000311, - eT_32PSHORT = 0x00000411, - eT_32PFSHORT = 0x00000511, - eT_64PSHORT = 0x00000611, - - eT_USHORT = 0x00000021, - eT_PUSHORT = 0x00000121, - eT_PFUSHORT = 0x00000221, - eT_PHUSHORT = 0x00000321, - eT_32PUSHORT = 0x00000421, - eT_32PFUSHORT = 0x00000521, - eT_64PUSHORT = 0x00000621, - - eT_INT2 = 0x00000072, - eT_PINT2 = 0x00000172, - eT_PFINT2 = 0x00000272, - eT_PHINT2 = 0x00000372, - eT_32PINT2 = 0x00000472, - eT_32PFINT2 = 0x00000572, - eT_64PINT2 = 0x00000672, - - eT_UINT2 = 0x00000073, - eT_PUINT2 = 0x00000173, - eT_PFUINT2 = 0x00000273, - eT_PHUINT2 = 0x00000373, - eT_32PUINT2 = 0x00000473, - eT_32PFUINT2 = 0x00000573, - eT_64PUINT2 = 0x00000673, - - eT_LONG = 0x00000012, - eT_PLONG = 0x00000112, - eT_PFLONG = 0x00000212, - eT_PHLONG = 0x00000312, - eT_32PLONG = 0x00000412, - eT_32PFLONG = 0x00000512, - eT_64PLONG = 0x00000612, - - eT_ULONG = 0x00000022, - eT_PULONG = 0x00000122, - eT_PFULONG = 0x00000222, - eT_PHULONG = 0x00000322, - eT_32PULONG = 0x00000422, - eT_32PFULONG = 0x00000522, - eT_64PULONG = 0x00000622, - - eT_INT4 = 0x00000074, - eT_PINT4 = 0x00000174, - eT_PFINT4 = 0x00000274, - eT_PHINT4 = 0x00000374, - eT_32PINT4 = 0x00000474, - eT_32PFINT4 = 0x00000574, - eT_64PINT4 = 0x00000674, - - eT_UINT4 = 0x00000075, - eT_PUINT4 = 0x00000175, - eT_PFUINT4 = 0x00000275, - eT_PHUINT4 = 0x00000375, - eT_32PUINT4 = 0x00000475, - eT_32PFUINT4 = 0x00000575, - eT_64PUINT4 = 0x00000675, - - eT_QUAD = 0x00000013, - eT_PQUAD = 0x00000113, - eT_PFQUAD = 0x00000213, - eT_PHQUAD = 0x00000313, - eT_32PQUAD = 0x00000413, - eT_32PFQUAD = 0x00000513, - eT_64PQUAD = 0x00000613, - - eT_UQUAD = 0x00000023, - eT_PUQUAD = 0x00000123, - eT_PFUQUAD = 0x00000223, - eT_PHUQUAD = 0x00000323, - eT_32PUQUAD = 0x00000423, - eT_32PFUQUAD = 0x00000523, - eT_64PUQUAD = 0x00000623, - - eT_INT8 = 0x00000076, - eT_PINT8 = 0x00000176, - eT_PFINT8 = 0x00000276, - eT_PHINT8 = 0x00000376, - eT_32PINT8 = 0x00000476, - eT_32PFINT8 = 0x00000576, - eT_64PINT8 = 0x00000676, - - eT_UINT8 = 0x00000077, - eT_PUINT8 = 0x00000177, - eT_PFUINT8 = 0x00000277, - eT_PHUINT8 = 0x00000377, - eT_32PUINT8 = 0x00000477, - eT_32PFUINT8 = 0x00000577, - eT_64PUINT8 = 0x00000677, - - eT_OCT = 0x00000014, - eT_POCT = 0x00000114, - eT_PFOCT = 0x00000214, - eT_PHOCT = 0x00000314, - eT_32POCT = 0x00000414, - eT_32PFOCT = 0x00000514, - eT_64POCT = 0x00000614, - - eT_UOCT = 0x00000024, - eT_PUOCT = 0x00000124, - eT_PFUOCT = 0x00000224, - eT_PHUOCT = 0x00000324, - eT_32PUOCT = 0x00000424, - eT_32PFUOCT = 0x00000524, - eT_64PUOCT = 0x00000624, - - eT_INT16 = 0x00000078, - eT_PINT16 = 0x00000178, - eT_PFINT16 = 0x00000278, - eT_PHINT16 = 0x00000378, - eT_32PINT16 = 0x00000478, - eT_32PFINT16 = 0x00000578, - eT_64PINT16 = 0x00000678, - - eT_UINT16 = 0x00000079, - eT_PUINT16 = 0x00000179, - eT_PFUINT16 = 0x00000279, - eT_PHUINT16 = 0x00000379, - eT_32PUINT16 = 0x00000479, - eT_32PFUINT16 = 0x00000579, - eT_64PUINT16 = 0x00000679, - - eT_REAL32 = 0x00000040, - eT_PREAL32 = 0x00000140, - eT_PFREAL32 = 0x00000240, - eT_PHREAL32 = 0x00000340, - eT_32PREAL32 = 0x00000440, - eT_32PFREAL32 = 0x00000540, - eT_64PREAL32 = 0x00000640, - - eT_REAL48 = 0x00000044, - eT_PREAL48 = 0x00000144, - eT_PFREAL48 = 0x00000244, - eT_PHREAL48 = 0x00000344, - eT_32PREAL48 = 0x00000444, - eT_32PFREAL48 = 0x00000544, - eT_64PREAL48 = 0x00000644, - - eT_REAL64 = 0x00000041, - eT_PREAL64 = 0x00000141, - eT_PFREAL64 = 0x00000241, - eT_PHREAL64 = 0x00000341, - eT_32PREAL64 = 0x00000441, - eT_32PFREAL64 = 0x00000541, - eT_64PREAL64 = 0x00000641, - - eT_REAL80 = 0x00000042, - eT_PREAL80 = 0x00000142, - eT_PFREAL80 = 0x00000242, - eT_PHREAL80 = 0x00000342, - eT_32PREAL80 = 0x00000442, - eT_32PFREAL80 = 0x00000542, - eT_64PREAL80 = 0x00000642, - - eT_REAL128 = 0x00000043, - eT_PREAL128 = 0x00000143, - eT_PFREAL128 = 0x00000243, - eT_PHREAL128 = 0x00000343, - eT_32PREAL128 = 0x00000443, - eT_32PFREAL128 = 0x00000543, - eT_64PREAL128 = 0x00000643, - - eT_CPLX32 = 0x00000050, - eT_PCPLX32 = 0x00000150, - eT_PFCPLX32 = 0x00000250, - eT_PHCPLX32 = 0x00000350, - eT_32PCPLX32 = 0x00000450, - eT_32PFCPLX32 = 0x00000550, - eT_64PCPLX32 = 0x00000650, - - eT_CPLX64 = 0x00000051, - eT_PCPLX64 = 0x00000151, - eT_PFCPLX64 = 0x00000251, - eT_PHCPLX64 = 0x00000351, - eT_32PCPLX64 = 0x00000451, - eT_32PFCPLX64 = 0x00000551, - eT_64PCPLX64 = 0x00000651, - - eT_CPLX80 = 0x00000052, - eT_PCPLX80 = 0x00000152, - eT_PFCPLX80 = 0x00000252, - eT_PHCPLX80 = 0x00000352, - eT_32PCPLX80 = 0x00000452, - eT_32PFCPLX80 = 0x00000552, - eT_64PCPLX80 = 0x00000652, - - eT_CPLX128 = 0x00000053, - eT_PCPLX128 = 0x00000153, - eT_PFCPLX128 = 0x00000253, - eT_PHCPLX128 = 0x00000353, - eT_32PCPLX128 = 0x00000453, - eT_32PFCPLX128 = 0x00000553, - eT_64PCPLX128 = 0x00000653, - - eT_BOOL08 = 0x00000030, - eT_PBOOL08 = 0x00000130, - eT_PFBOOL08 = 0x00000230, - eT_PHBOOL08 = 0x00000330, - eT_32PBOOL08 = 0x00000430, - eT_32PFBOOL08 = 0x00000530, - eT_64PBOOL08 = 0x00000630, - - eT_BOOL16 = 0x00000031, - eT_PBOOL16 = 0x00000131, - eT_PFBOOL16 = 0x00000231, - eT_PHBOOL16 = 0x00000331, - eT_32PBOOL16 = 0x00000431, - eT_32PFBOOL16 = 0x00000531, - eT_64PBOOL16 = 0x00000631, - - eT_BOOL32 = 0x00000032, - eT_PBOOL32 = 0x00000132, - eT_PFBOOL32 = 0x00000232, - eT_PHBOOL32 = 0x00000332, - eT_32PBOOL32 = 0x00000432, - eT_32PFBOOL32 = 0x00000532, - eT_64PBOOL32 = 0x00000632, - - eT_BOOL64 = 0x00000033, - eT_PBOOL64 = 0x00000133, - eT_PFBOOL64 = 0x00000233, - eT_PHBOOL64 = 0x00000333, - eT_32PBOOL64 = 0x00000433, - eT_32PFBOOL64 = 0x00000533, - eT_64PBOOL64 = 0x00000633, - - eT_NCVPTR = 0x000001F0, - eT_FCVPTR = 0x000002F0, - eT_HCVPTR = 0x000003F0, - eT_32NCVPTR = 0x000004F0, - eT_32FCVPTR = 0x000005F0, - eT_64NCVPTR = 0x000006F0, -} EBASE_TYPES; - -typedef enum { - eNEAR_C = 0x00000000, - eFAR_C = 0x00000001, - eNEAR_PASCAL = 0x00000002, - eFAR_PASCAL = 0x00000003, - eNEAR_FAST = 0x00000004, - eFAR_FAST = 0x00000005, - eSKIPPED = 0x00000006, - eNEAR_STD = 0x00000007, - eFAR_STD = 0x00000008, - eNEAR_SYS = 0x00000009, - eFAR_SYS = 0x0000000A, - eTHISCALL = 0x0000000B, - eMIPSCALL = 0x0000000C, - eGENERIC = 0x0000000D, - eALPHACALL = 0x0000000E, - ePPCCALL = 0x0000000F, - eSHCALL = 0x00000010, - eARMCALL = 0x00000011, - eAM33CALL = 0x00000012, - eTRICALL = 0x00000013, - eSH5CALL = 0x00000014, - eM32RCALL = 0x00000015, - eRESERVED = 0x00000016, - eMAX_CV_CALL -} ECV_CALL; - -typedef union { - struct { - ut8 scoped : 1; - ut8 reserved : 7; // swapped - ut8 packed : 1; - ut8 ctor : 1; - ut8 ovlops : 1; - ut8 isnested : 1; - ut8 cnested : 1; - ut8 opassign : 1; - ut8 opcast : 1; - ut8 fwdref : 1; - } bits; - ut16 cv_property; -} UCV_PROPERTY; - -typedef enum { - eMTvanilla = 0x00, - eMTvirtual = 0x01, - eMTstatic = 0x02, - eMTfriend = 0x03, - eMTintro = 0x04, - eMTpurevirt = 0x05, - eMTpureintro = 0x06, - eMT_MAX -} EMPROP; - -typedef enum { - ePrivate = 1, - eProtected = 2, - ePublic = 3, - eAccessMax -} EACCESS; - -//### CodeView bitfields and enums -//# NOTE: Construct assumes big-endian -//# ordering for BitStructs -typedef union { - struct { - ut8 access : 2; - ut8 mprop : 3; - ut8 pseudo : 1; - ut8 noinherit : 1; - ut8 noconstruct : 1; - ut8 padding : 7; - ut8 compgenx : 1; - } bits; - ut16 fldattr; -} UCV_fldattr; - -R_PACKED( - typedef struct { - ut32 return_type; - ECV_CALL call_conv; - ut8 reserved; - ut16 parm_count; - ut32 arg_list; - ut8 pad; - }) SLF_PROCEDURE; - -R_PACKED( - typedef struct { - ut32 return_type; - ut32 class_type; - ut32 this_type; - ECV_CALL call_conv; // 1 byte - ut8 reserved; - ut16 parm_count; - ut32 arglist; - st32 this_adjust; - ut8 pad; - }) SLF_MFUNCTION; - -R_PACKED( - typedef struct { - ut32 count; - ut32 *arg_type; - ut8 pad; - }) SLF_ARGLIST; - -R_PACKED( - typedef struct { - ut32 modified_type; - union { - struct { - ut8 pad2 : 8; - ut8 const_ : 1; - ut8 volatile_ : 1; - ut8 unaligned : 1; - ut8 pad1 : 5; - } bits; - ut16 modifier; - } umodifier; - ut8 pad; - }) SLF_MODIFIER; - -typedef enum { - ePTR_MODE_PTR = 0x00000000, - ePTR_MODE_REF = 0x00000001, - ePTR_MODE_PMEM = 0x00000002, - ePTR_MODE_PMFUNC = 0x00000003, - ePTR_MODE_RESERVED = 0x00000004, - eModeMax -} EMode; - -typedef enum { - ePTR_NEAR = 0x00000000, - ePTR_FAR = 0x00000001, - ePTR_HUGE = 0x00000002, - ePTR_BASE_SEG = 0x00000003, - ePTR_BASE_VAL = 0x00000004, - ePTR_BASE_SEGVAL = 0x00000005, - ePTR_BASE_ADDR = 0x00000006, - ePTR_BASE_SEGADDR = 0x00000007, - ePTR_BASE_TYPE = 0x00000008, - ePTR_BASE_SELF = 0x00000009, - ePTR_NEAR32 = 0x0000000A, - ePTR_FAR32 = 0x0000000B, - ePTR_64 = 0x0000000C, - ePTR_UNUSEDPTR = 0x0000000D, - eTypeMax -} EType; - -R_PACKED( - typedef union { - struct { - ut8 pad[2]; - ut8 flat32 : 1; - ut8 volatile_ : 1; - ut8 const_ : 1; - ut8 unaligned : 1; - ut8 restrict_ : 1; - ut8 pad1 : 3; - ut8 type : 5; - ut8 mode : 3; - } bits; - ut32 ptr_attr; - }) UPTR_ATTR; - -R_PACKED( - typedef struct { - ut32 utype; - UPTR_ATTR ptr_attr; - ut8 pad; - }) SLF_POINTER; - -R_PACKED( - typedef struct { - st32 stream_size; - st32 num_pages; - ut8 *stream_pages; - }) SPage; - -typedef struct { - // FILE *fp; - RBuffer *buf; - int *pages; - int pages_amount; - int indx; - int page_size; - int size; - R_STREAM_FILE stream_file; - // int fast_load; - // ... parent; - - free_func free_; -} R_PDB_STREAM; - -typedef struct R_PDB7_ROOT_STREAM{ - R_PDB_STREAM pdb_stream; - int num_streams; - RList *streams_list; -} R_PDB7_ROOT_STREAM; - -typedef enum EStream_{ - ePDB_STREAM_ROOT = 0, // PDB_ROOT_DIRECTORY - ePDB_STREAM_PDB, // PDB STREAM INFO - ePDB_STREAM_TPI, // TYPE INFO - ePDB_STREAM_DBI, // DEBUG INFO - - ePDB_STREAM_GSYM, - ePDB_STREAM_SECT_HDR, - ePDB_STREAM_SECT__HDR_ORIG, - ePDB_STREAM_OMAP_TO_SRC, - ePDB_STREAM_OMAP_FROM_SRC, - ePDB_STREAM_FPO, - ePDB_STREAM_FPO_NEW, - ePDB_STREAM_XDATA, - ePDB_STREAM_PDATA, - ePDB_STREAM_TOKEN_RID_MAP, - ePDB_STREAM_MAX -} EStream; - -typedef void (*f_load)(void *parsed_pdb_stream, R_STREAM_FILE *stream); - -typedef struct { - R_PDB_STREAM *pdb_stream; - f_load load; -} SParsedPDBStream; - -R_PACKED( - typedef struct { - char *name; - ut32 size; - }) SCString; - -R_PACKED( - typedef struct { - SCString name; - }) SNoVal; - -R_PACKED( - typedef struct { - char value; - SCString name; - }) SVal_LF_CHAR; - -R_PACKED( - typedef struct { - st16 value; - SCString name; - }) SVal_LF_SHORT; - -R_PACKED( - typedef struct { - ut16 value; - SCString name; - }) SVal_LF_USHORT; - -typedef struct { - st32 value; - SCString name; -} SVal_LF_LONG; - -typedef struct { - ut32 value; - SCString name; -} SVal_LF_ULONG; - -typedef struct { - st64 value; - SCString name; -} SVal_LF_QUADWORD; - -typedef struct { - ut64 value; - SCString name; -} SVal_LF_UQUADWORD; - -R_PACKED( - typedef struct { - ut16 value_or_type; - void *name_or_val; - }) SVal; - -R_PACKED( - typedef struct { - ut32 element_type; - ut32 index_type; - SVal size; - ut8 pad; - }) SLF_ARRAY; - -R_PACKED( - typedef struct { - ut16 count; - UCV_PROPERTY prop; - ut32 field_list; - ut32 derived; - ut32 vshape; - SVal size; - ut8 pad; - }) SLF_STRUCTURE, SLF_CLASS; - -R_PACKED( - typedef struct { - ut16 count; - UCV_PROPERTY prop; - ut32 field_list; - SVal size; - ut32 pad; - }) SLF_UNION; - -R_PACKED( - typedef struct { - ut32 base_type; - ut8 length; - ut8 position; - ut8 pad; - }) SLF_BITFIELD; - -R_PACKED( - typedef struct { - ut16 count; - char *vt_descriptors; - ut8 pad; - }) SLF_VTSHAPE; - -R_PACKED( - typedef struct { - ut16 count; - UCV_PROPERTY prop; - ut32 utype; - ut32 field_list; - SCString name; - ut8 pad; - }) SLF_ENUM; - -R_PACKED( - typedef struct { - UCV_fldattr fldattr; - SVal enum_value; - ut8 pad; - - free_func free_; - }) SLF_ENUMERATE; - -R_PACKED( - typedef struct { - ut16 pad; - ut32 index; - SCString name; - - free_func free_; - }) SLF_NESTTYPE; - -R_PACKED( - typedef struct { - ut16 count; - ut32 mlist; - SCString name; - ut8 pad; - - free_func free_; - }) SLF_METHOD; - -R_PACKED( - typedef struct { - UCV_fldattr fldattr; - ut32 index; - SVal offset; - ut8 pad; - - // TODO: remove free_ - free_func free_; - }) SLF_MEMBER; - -R_PACKED( - typedef struct { - ut32 val; - SCString str_data; - }) SLF_ONEMETHOD_VAL; - -R_PACKED( - typedef struct { - UCV_fldattr fldattr; - ut32 index; - SLF_ONEMETHOD_VAL val; - ut8 pad; - }) SLF_ONEMETHOD; - -typedef struct { - // ELeafType leaf_type; - RList *substructs; -} SLF_FIELDLIST; - -typedef struct { - st32 off; - st32 cb; -} SOffCb; - -typedef struct { - st16 sn; - st16 padding; - st32 hash_key; - st32 buckets; - SOffCb hash_vals; - SOffCb ti_off; - SOffCb hash_adj; -} STPI; - -typedef struct { - ut32 version; - st32 hdr_size; - ut32 ti_min; - ut32 ti_max; - ut32 follow_size; - STPI tpi; -} STPIHeader; - -typedef enum { - eLF_MODIFIER_16t = 0x00000001, - eLF_POINTER_16t = 0x00000002, - eLF_ARRAY_16t = 0x00000003, - eLF_CLASS_16t = 0x00000004, - eLF_STRUCTURE_16t = 0x00000005, - eLF_UNION_16t = 0x00000006, - eLF_ENUM_16t = 0x00000007, - eLF_PROCEDURE_16t = 0x00000008, - eLF_MFUNCTION_16t = 0x00000009, - eLF_VTSHAPE = 0x0000000A, - eLF_COBOL0_16t = 0x0000000B, - eLF_COBOL1 = 0x0000000C, - eLF_BARRAY_16t = 0x0000000D, - eLF_LABEL = 0x0000000E, - eLF_NULL = 0x0000000F, - eLF_NOTTRAN = 0x00000010, - eLF_DIMARRAY_16t = 0x00000011, - eLF_VFTPATH_16t = 0x00000012, - eLF_PRECOMP_16t = 0x00000013, - eLF_ENDPRECOMP = 0x00000014, - eLF_OEM_16t = 0x00000015, - eLF_TYPESERVER_ST = 0x00000016, - eLF_SKIP_16t = 0x00000200, - eLF_ARGLIST_16t = 0x00000201, - eLF_DEFARG_16t = 0x00000202, - eLF_LIST = 0x00000203, - eLF_FIELDLIST_16t = 0x00000204, - eLF_DERIVED_16t = 0x00000205, - eLF_BITFIELD_16t = 0x00000206, - eLF_METHODLIST_16t = 0x00000207, - eLF_DIMCONU_16t = 0x00000208, - eLF_DIMCONLU_16t = 0x00000209, - eLF_DIMVARU_16t = 0x0000020A, - eLF_DIMVARLU_16t = 0x0000020B, - eLF_REFSYM = 0x0000020C, - eLF_BCLASS_16t = 0x00000400, - eLF_VBCLASS_16t = 0x00000401, - eLF_IVBCLASS_16t = 0x00000402, - eLF_ENUMERATE_ST = 0x00000403, - eLF_FRIENDFCN_16t = 0x00000404, - eLF_INDEX_16t = 0x00000405, - eLF_MEMBER_16t = 0x00000406, - eLF_STMEMBER_16t = 0x00000407, - eLF_METHOD_16t = 0x00000408, - eLF_NESTTYPE_16t = 0x00000409, - eLF_VFUNCTAB_16t = 0x0000040A, - eLF_FRIENDCLS_16t = 0x0000040B, - eLF_ONEMETHOD_16t = 0x0000040C, - eLF_VFUNCOFF_16t = 0x0000040D, - eLF_TI16_MAX = 0x00001000, - eLF_MODIFIER = 0x00001001, - eLF_POINTER = 0x00001002, - eLF_ARRAY_ST = 0x00001003, - eLF_CLASS_ST = 0x00001004, - eLF_STRUCTURE_ST = 0x00001005, - eLF_UNION_ST = 0x00001006, - eLF_ENUM_ST = 0x00001007, - eLF_PROCEDURE = 0x00001008, - eLF_MFUNCTION = 0x00001009, - eLF_COBOL0 = 0x0000100A, - eLF_BARRAY = 0x0000100B, - eLF_DIMARRAY_ST = 0x0000100C, - eLF_VFTPATH = 0x0000100D, - eLF_PRECOMP_ST = 0x0000100E, - eLF_OEM = 0x0000100F, - eLF_ALIAS_ST = 0x00001010, - eLF_OEM2 = 0x00001011, - eLF_SKIP = 0x00001200, - eLF_ARGLIST = 0x00001201, - eLF_DEFARG_ST = 0x00001202, - eLF_FIELDLIST = 0x00001203, - eLF_DERIVED = 0x00001204, - eLF_BITFIELD = 0x00001205, - eLF_METHODLIST = 0x00001206, - eLF_DIMCONU = 0x00001207, - eLF_DIMCONLU = 0x00001208, - eLF_DIMVARU = 0x00001209, - eLF_DIMVARLU = 0x0000120A, - eLF_BCLASS = 0x00001400, - eLF_VBCLASS = 0x00001401, - eLF_IVBCLASS = 0x00001402, - eLF_FRIENDFCN_ST = 0x00001403, - eLF_INDEX = 0x00001404, - eLF_MEMBER_ST = 0x00001405, - eLF_STMEMBER_ST = 0x00001406, - eLF_METHOD_ST = 0x00001407, - eLF_NESTTYPE_ST = 0x00001408, - eLF_VFUNCTAB = 0x00001409, - eLF_FRIENDCLS = 0x0000140A, - eLF_ONEMETHOD_ST = 0x0000140B, - eLF_VFUNCOFF = 0x0000140C, - eLF_NESTTYPEEX_ST = 0x0000140D, - eLF_MEMBERMODIFY_ST = 0x0000140E, - eLF_MANAGED_ST = 0x0000140F, - eLF_ST_MAX = 0x00001500, - eLF_TYPESERVER = 0x00001501, - eLF_ENUMERATE = 0x00001502, - eLF_ARRAY = 0x00001503, - eLF_CLASS = 0x00001504, - eLF_STRUCTURE = 0x00001505, - eLF_UNION = 0x00001506, - eLF_ENUM = 0x00001507, - eLF_DIMARRAY = 0x00001508, - eLF_PRECOMP = 0x00001509, - eLF_ALIAS = 0x0000150A, - eLF_DEFARG = 0x0000150B, - eLF_FRIENDFCN = 0x0000150C, - eLF_MEMBER = 0x0000150D, - eLF_STMEMBER = 0x0000150E, - eLF_METHOD = 0x0000150F, - eLF_NESTTYPE = 0x00001510, - eLF_ONEMETHOD = 0x00001511, - eLF_NESTTYPEEX = 0x00001512, - eLF_MEMBERMODIFY = 0x00001513, - eLF_MANAGED = 0x00001514, - eLF_TYPESERVER2 = 0x00001515, - eLF_CHAR = 0x00008000, - eLF_SHORT = 0x00008001, - eLF_USHORT = 0x00008002, - eLF_LONG = 0x00008003, - eLF_ULONG = 0x00008004, - eLF_REAL32 = 0x00008005, - eLF_REAL64 = 0x00008006, - eLF_REAL80 = 0x00008007, - eLF_REAL128 = 0x00008008, - eLF_QUADWORD = 0x00008009, - eLF_UQUADWORD = 0x0000800A, - eLF_REAL48 = 0x0000800B, - eLF_COMPLEX32 = 0x0000800C, - eLF_COMPLEX64 = 0x0000800D, - eLF_COMPLEX80 = 0x0000800E, - eLF_COMPLEX128 = 0x0000800F, - eLF_VARSTRING = 0x00008010, - eLF_OCTWORD = 0x00008017, - eLF_UOCTWORD = 0x00008018, - eLF_DECIMAL = 0x00008019, - eLF_DATE = 0x0000801A, - eLF_UTF8STRING = 0x0000801B, - eLF_PAD0 = 0x000000F0, - eLF_PAD1 = 0x000000F1, - eLF_PAD2 = 0x000000F2, - eLF_PAD3 = 0x000000F3, - eLF_PAD4 = 0x000000F4, - eLF_PAD5 = 0x000000F5, - eLF_PAD6 = 0x000000F6, - eLF_PAD7 = 0x000000F7, - eLF_PAD8 = 0x000000F8, - eLF_PAD9 = 0x000000F9, - eLF_PAD10 = 0x000000FA, - eLF_PAD11 = 0x000000FB, - eLF_PAD12 = 0x000000FC, - eLF_PAD13 = 0x000000FD, - eLF_PAD14 = 0x000000FE, - eLF_PAD15 = 0x000000FF, - eLF_MAX = 0xFFFFFFFF -} ELeafType; - -R_PACKED( - typedef struct { - ELeafType leaf_type; - void *type_info; - - free_func free_; - get_value_name get_name; - get_value get_val; - get_value_name_len get_name_len; - get_member_list get_members; - get_arg_type_ get_arg_type; - get_element_type_ get_element_type; - get_index_type_ get_index_type; - get_base_type_ get_base_type; - get_derived_ get_derived; - get_vshape_ get_vshape; - get_utype_ get_utype; - get_return_type_ get_return_type; - get_class_type_ get_class_type; - get_this_type_ get_this_type; - get_arglist_ get_arglist; - get_index_ get_index; - get_mlist_ get_mlist; - get_modified_type_ get_modified_type; - get_value is_fwdref; - get_print_type_ get_print_type; - - }) STypeInfo; - -R_PACKED( - typedef struct { - ut16 length; - ut32 tpi_idx; - STypeInfo type_data; - - // free_func free_; - }) SType; - -typedef struct { - STPIHeader header; - RList *types; - - free_func free_; -} STpiStream; - -typedef struct { - ut32 data1; - ut16 data2; - ut16 data3; - ut8 data4[8]; -} SGUID; - -typedef struct { - ut32 version; - ut32 time_date_stamp; - ut32 age; - SGUID guid; - ut32 cb_names; - char *names; - - free_func free_; -} SPDBInfoStream/*D*/; - -// dbi stream structures start here - -typedef enum { - eIMAGE_FILE_MACHINE_UNKNOWN = 0x0, - eIMAGE_FILE_MACHINE_I386 = 0x014c, - eIMAGE_FILE_MACHINE_IA64 = 0x0200, - eIMAGE_FILE_MACHINE_AMD64 = 0x8664, - eMaxMachine -} EMachine; - -R_PACKED( - typedef struct { - ut16 section; - ut16 padding1; - st32 offset; - st32 size; - ut32 flags; - st32 module; - st16 padding2; - ut32 data_crc; - ut32 reloc_crc; - }) SSymbolRange; - -R_PACKED( - typedef struct { - ut32 opened; - SSymbolRange range; - ut16 flags; - st16 stream; - ut32 symSize; - ut32 oldLineSize; - ut32 lineSize; - st16 nSrcFiles; - st16 padding1; - ut32 offsets; - ut32 niSource; - ut32 niCompiler; - SCString modName; - SCString objName; - }) SDBIExHeader; - -R_PACKED( - typedef struct { - st16 sn_fpo; - st16 sn_exception; - st16 sn_fixup; - st16 sn_omap_to_src; - st16 sn_omap_from_src; - st16 sn_section_hdr; - st16 sn_token_rid_map; - st16 sn_xdata; - st16 sn_pdata; - st16 sn_new_fpo; - st16 sn_section_hdr_orig; - }) SDbiDbgHeader; - -R_PACKED( - typedef struct { - ut32 magic; - ut32 version; - ut32 age; - st16 gssymStream; - ut16 vers; - st16 pssymStream; - ut16 pdbver; - st16 symrecStream; - ut16 pdbver2; - ut32 module_size; - ut32 seccon_size; - ut32 secmap_size; - ut32 filinf_size; - ut32 tsmap_size; - ut32 mfc_index; - ut32 dbghdr_size; - ut32 ecinfo_size; - ut16 flags; - EMachine machine; // read just 2 bytes - ut32 resvd; - }) SDBIHeader; - -typedef struct { - SDBIHeader dbi_header; - SDbiDbgHeader dbg_header; - RList *dbiexhdrs; - - free_func free_; -} SDbiStream; -// end of dbi stream structures - -// start of FPO stream structures -typedef union { - struct { - ut8 cbRegs : 3; - ut8 fHashSEH : 1; - ut8 fUseBp : 1; - ut8 reserved : 1; - ut8 cbFrame : 2; - ut8 cbProlog : 8; - } bits; - ut16 bit_values; -} UBit_values; - -R_PACKED( - typedef struct { - ut32 ul_off_start; - ut32 cb_proc_size; - ut32 cdw_locals; - ut16 cdw_params; - UBit_values bit_values; - }) SFPO_DATA; - -typedef struct { - RList *fpo_data_list; -} SFPOStream; - -typedef enum { - eSEH = 1, - eCPPEH = 2, - eFnStart = 4, - eFPO_DATA_FLAGS_MAX -} EFPO_DATA_FLAGS; - -R_PACKED( - typedef struct { - ut32 ul_off_start; - ut32 cb_proc_size; - ut32 cdw_locals; - ut32 cdw_params; - ut32 max_stack; - ut32 programm_string_offset; - ut16 cb_prolog; - ut16 cb_save_regs; - EFPO_DATA_FLAGS flags; - }) SFPO_DATA_V2; - -typedef struct { - RList *fpo_data_list; -} SFPONewStream; -// end of FPO stream structures - -// GDATA structrens -typedef struct { - RList *globals_list; -} SGDATAStream; - -R_PACKED ( - typedef struct { - ut16 leaf_type; - ut32 symtype; - ut32 offset; - ut16 segment; - SCString name; - }) SGlobal; -// end GDATA structures - -// PE stream structures -// TODO: Support 64bit addressing! -typedef union { - ut32 physical_address; - ut32 virtual_address; -} UMISC; - -#define PDB_SIZEOF_SECTION_NAME 8 - -R_PACKED( - typedef struct { - char name[PDB_SIZEOF_SECTION_NAME]; - UMISC misc; - ut32 virtual_address; - ut32 size_of_raw_data; - ut32 pointer_to_raw_data; - ut32 pointer_to_relocations; - ut32 pointer_to_line_numbers; - ut16 number_of_relocations; - ut16 number_of_line_numbers; - ut32 charactestics; - }) SIMAGE_SECTION_HEADER; - -typedef struct { - RList *sections_hdrs; -} SPEStream; -// end PE stream structures - -// omap structures -typedef struct { - ut32 from; - ut32 to; -} SOmapEntry; - -typedef struct { - RList *omap_entries; - ut32 *froms; -} SOmapStream; -// end of omap structures - -#endif // PDB_TYPES_H