PDB switch to R_PACKED and utN types (#11830)

Fix typo, use R_PACKED and use r2 types in the PDB parser
This commit is contained in:
Anton Kochkov 2018-10-17 17:18:18 +08:00 committed by GitHub
parent 0e62aee601
commit 71170a4e9c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 282 additions and 252 deletions

View File

@ -438,7 +438,7 @@ static int get_procedure_arglist(void *type, void **ret_type) {
static int get_member_index(void *type, void **ret_type) {
STypeInfo *t = (STypeInfo *) type;
SLF_MEMBER *lf = (SLF_MEMBER *) t->type_info;
int curr_idx = lf->inedex;
int curr_idx = lf->index;
if (curr_idx < base_idx) {
*ret_type = 0;
@ -635,7 +635,7 @@ static void get_sval_val(SVal *val, int *res) {
// STypeInfo *t = (STypeInfo *) type;
// SLF_MEMBER *lf_member = (SLF_MEMBER *)t->type_info;
// *indx_val = lf_member->inedex;
// *indx_val = lf_member->index;
//}
static void get_onemethod_name_len(void *type, int *res_len) {
@ -1526,6 +1526,7 @@ void deinit_scstring(SCString *cstr) {
int parse_sctring(SCString *sctr, unsigned char *leaf_data, unsigned int *read_bytes, unsigned int len) {
unsigned int c = 0;
sctr->name = NULL;
sctr->size = 0;
while (*leaf_data) {
CAN_READ((*read_bytes + c), 1, len);
c++;
@ -1726,7 +1727,7 @@ static int parse_lf_member(SLF_MEMBER *lf_member, unsigned char *leaf_data, unsi
lf_member->offset.name_or_val = 0;
READ2(*read_bytes, len, lf_member->fldattr.fldattr, leaf_data, ut16);
READ4(*read_bytes, len, lf_member->inedex, leaf_data, ut32);
READ4(*read_bytes, len, lf_member->index, leaf_data, ut32);
tmp_read_bytes_before = *read_bytes;
parse_sval(&lf_member->offset, leaf_data, read_bytes, len);

View File

@ -6,7 +6,8 @@
#define READ_PAGE_FAIL 0x01
//TODO: MOVE TO GENERAL MACROSE
// TODO: Move to a general macroses in r_util/r_types
///////////////////////////////////////////////////////////////////////////////
#define GET_PAGE(pn, off, pos, page_size) { \
(pn) = (pos) / (page_size); \
@ -465,18 +466,18 @@ typedef enum {
typedef union {
struct {
unsigned char scoped : 1;
unsigned char reserved : 7; // swapped
unsigned char packed : 1;
unsigned char ctor : 1;
unsigned char ovlops : 1;
unsigned char isnested : 1;
unsigned char cnested : 1;
unsigned char opassign : 1;
unsigned char opcast : 1;
unsigned char fwdref : 1;
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;
unsigned short cv_property;
ut16 cv_property;
} UCV_PROPERTY;
typedef enum {
@ -502,58 +503,62 @@ typedef enum {
//# ordering for BitStructs
typedef union {
struct {
unsigned char access : 2;
unsigned char mprop : 3;
unsigned char pseudo : 1;
unsigned char noinherit : 1;
unsigned char noconstruct : 1;
unsigned char padding : 7;
unsigned char compgenx : 1;
ut8 access : 2;
ut8 mprop : 3;
ut8 pseudo : 1;
ut8 noinherit : 1;
ut8 noconstruct : 1;
ut8 padding : 7;
ut8 compgenx : 1;
} bits;
unsigned short fldattr;
ut16 fldattr;
} UCV_fldattr;
R_PACKED(
typedef struct {
unsigned int return_type;
ut32 return_type;
ECV_CALL call_conv;
unsigned char reserved;
unsigned short parm_count;
unsigned int arg_list;
unsigned char pad;
} SLF_PROCEDURE;
ut8 reserved;
ut16 parm_count;
ut32 arg_list;
ut8 pad;
}) SLF_PROCEDURE;
R_PACKED(
typedef struct {
unsigned int return_type;
unsigned int class_type;
unsigned int this_type;
ut32 return_type;
ut32 class_type;
ut32 this_type;
ECV_CALL call_conv; // 1 byte
unsigned char reserved;
unsigned short parm_count;
unsigned int arglist;
int this_adjust;
unsigned char pad;
} SLF_MFUNCTION;
ut8 reserved;
ut16 parm_count;
ut32 arglist;
st32 this_adjust;
ut8 pad;
}) SLF_MFUNCTION;
R_PACKED(
typedef struct {
unsigned int count;
unsigned int *arg_type;
unsigned char pad;
} SLF_ARGLIST;
ut32 count;
ut32 *arg_type;
ut8 pad;
}) SLF_ARGLIST;
R_PACKED(
typedef struct {
unsigned int modified_type;
ut32 modified_type;
union {
struct {
unsigned char pad2 : 8;
unsigned char const_ : 1;
unsigned char volatile_ : 1;
unsigned char unaligned : 1;
unsigned char pad1 : 5;
ut8 pad2 : 8;
ut8 const_ : 1;
ut8 volatile_ : 1;
ut8 unaligned : 1;
ut8 pad1 : 5;
} bits;
unsigned short modifier;
ut16 modifier;
} umodifier;
unsigned char pad;
} SLF_MODIFIER;
ut8 pad;
}) SLF_MODIFIER;
typedef enum {
ePTR_MODE_PTR = 0x00000000,
@ -582,32 +587,35 @@ typedef enum {
eTypeMax
} EType;
R_PACKED(
typedef union {
struct {
unsigned char pad[2];
unsigned char flat32 : 1;
unsigned char volatile_ : 1;
unsigned char const_ : 1;
unsigned char unaligned : 1;
unsigned char restrict_ : 1;
unsigned char pad1 : 3;
unsigned char type : 5;
unsigned char mode : 3;
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;
unsigned int ptr_attr;
} UPTR_ATTR;
ut32 ptr_attr;
}) UPTR_ATTR;
R_PACKED(
typedef struct {
unsigned int utype;
ut32 utype;
UPTR_ATTR ptr_attr;
unsigned char pad;
} SLF_POINTER;
ut8 pad;
}) SLF_POINTER;
R_PACKED(
typedef struct {
int stream_size;
int num_pages;
char *stream_pages;
} SPage;
st32 stream_size;
st32 num_pages;
ut8 *stream_pages;
}) SPage;
typedef struct {
// FILE *fp;
@ -656,148 +664,166 @@ typedef struct {
f_load load;
} SParsedPDBStream;
R_PACKED(
typedef struct {
char *name;
unsigned int size;
} SCString;
ut32 size;
}) SCString;
R_PACKED(
typedef struct {
SCString name;
} SNoVal;
}) SNoVal;
R_PACKED(
typedef struct {
char value;
SCString name;
} SVal_LF_CHAR;
}) SVal_LF_CHAR;
R_PACKED(
typedef struct {
short value;
st16 value;
SCString name;
} SVal_LF_SHORT;
}) SVal_LF_SHORT;
R_PACKED(
typedef struct {
unsigned short value;
ut16 value;
SCString name;
} SVal_LF_USHORT;
}) SVal_LF_USHORT;
typedef struct {
long value;
st32 value;
SCString name;
} SVal_LF_LONG;
typedef struct {
unsigned long value;
ut32 value;
SCString name;
} SVal_LF_ULONG;
typedef struct {
int64_t value;
st64 value;
SCString name;
} SVal_LF_QUADWORD;
typedef struct {
uint64_t value;
ut64 value;
SCString name;
} SVal_LF_UQUADWORD;
R_PACKED(
typedef struct {
unsigned short value_or_type;
ut16 value_or_type;
void *name_or_val;
} SVal;
}) SVal;
R_PACKED(
typedef struct {
unsigned int element_type;
unsigned int index_type;
ut32 element_type;
ut32 index_type;
SVal size;
unsigned char pad;
} SLF_ARRAY;
ut8 pad;
}) SLF_ARRAY;
R_PACKED(
typedef struct {
unsigned short count;
ut16 count;
UCV_PROPERTY prop;
unsigned int field_list;
unsigned int derived;
unsigned int vshape;
ut32 field_list;
ut32 derived;
ut32 vshape;
SVal size;
unsigned char pad;
} SLF_STRUCTURE, SLF_CLASS;
ut8 pad;
}) SLF_STRUCTURE, SLF_CLASS;
R_PACKED(
typedef struct {
unsigned short count;
ut16 count;
UCV_PROPERTY prop;
unsigned int field_list;
ut32 field_list;
SVal size;
unsigned pad;
} SLF_UNION;
ut32 pad;
}) SLF_UNION;
R_PACKED(
typedef struct {
unsigned int base_type;
unsigned char length;
unsigned char position;
unsigned char pad;
} SLF_BITFIELD;
ut32 base_type;
ut8 length;
ut8 position;
ut8 pad;
}) SLF_BITFIELD;
R_PACKED(
typedef struct {
unsigned short count;
ut16 count;
char *vt_descriptors;
unsigned char pad;
} SLF_VTSHAPE;
ut8 pad;
}) SLF_VTSHAPE;
R_PACKED(
typedef struct {
unsigned short count;
ut16 count;
UCV_PROPERTY prop;
unsigned int utype;
unsigned int field_list;
ut32 utype;
ut32 field_list;
SCString name;
unsigned char pad;
} SLF_ENUM;
ut8 pad;
}) SLF_ENUM;
R_PACKED(
typedef struct {
UCV_fldattr fldattr;
SVal enum_value;
unsigned char pad;
ut8 pad;
free_func free_;
} SLF_ENUMERATE;
}) SLF_ENUMERATE;
R_PACKED(
typedef struct {
unsigned short pad;
unsigned int index;
ut16 pad;
ut32 index;
SCString name;
free_func free_;
} SLF_NESTTYPE;
}) SLF_NESTTYPE;
R_PACKED(
typedef struct {
unsigned short count;
unsigned int mlist;
ut16 count;
ut32 mlist;
SCString name;
unsigned char pad;
ut8 pad;
free_func free_;
} SLF_METHOD;
}) SLF_METHOD;
R_PACKED(
typedef struct {
UCV_fldattr fldattr;
unsigned int inedex;
ut32 index;
SVal offset;
unsigned char pad;
ut8 pad;
// TODO: remove free_
free_func free_;
} SLF_MEMBER;
}) SLF_MEMBER;
R_PACKED(
typedef struct {
unsigned int val;
ut32 val;
SCString str_data;
} SLF_ONEMETHOD_VAL;
}) SLF_ONEMETHOD_VAL;
R_PACKED(
typedef struct {
UCV_fldattr fldattr;
unsigned int index;
ut32 index;
SLF_ONEMETHOD_VAL val;
unsigned char pad;
} SLF_ONEMETHOD;
ut8 pad;
}) SLF_ONEMETHOD;
typedef struct {
// ELeafType leaf_type;
@ -805,26 +831,26 @@ typedef struct {
} SLF_FIELDLIST;
typedef struct {
int off;
int cb;
st32 off;
st32 cb;
} SOffCb;
typedef struct {
short sn;
short padding;
int hash_key;
int buckets;
st16 sn;
st16 padding;
st32 hash_key;
st32 buckets;
SOffCb hash_vals;
SOffCb ti_off;
SOffCb hash_adj;
} STPI;
typedef struct {
unsigned int version;
int hdr_size;
unsigned int ti_min;
unsigned int ti_max;
unsigned int follow_size;
ut32 version;
st32 hdr_size;
ut32 ti_min;
ut32 ti_max;
ut32 follow_size;
STPI tpi;
} STPIHeader;
@ -986,6 +1012,7 @@ typedef enum {
eLF_MAX = 0xFFFFFFFF
} ELeafType;
R_PACKED(
typedef struct {
ELeafType leaf_type;
void *type_info;
@ -1012,15 +1039,16 @@ typedef struct {
get_value is_fwdref;
get_print_type_ get_print_type;
} STypeInfo;
}) STypeInfo;
R_PACKED(
typedef struct {
unsigned short length;
unsigned int tpi_idx;
ut16 length;
ut32 tpi_idx;
STypeInfo type_data;
// free_func free_;
} SType;
}) SType;
typedef struct {
STPIHeader header;
@ -1030,18 +1058,18 @@ typedef struct {
} STpiStream;
typedef struct {
unsigned int data1;
unsigned short data2;
unsigned short data3;
char data4[8];
ut32 data1;
ut16 data2;
ut16 data3;
ut8 data4[8];
} SGUID;
typedef struct {
unsigned int version;
unsigned int time_date_stamp;
unsigned int age;
ut32 version;
ut32 time_date_stamp;
ut32 age;
SGUID guid;
unsigned int cb_names;
ut32 cb_names;
char *names;
free_func free_;
@ -1057,79 +1085,75 @@ typedef enum {
eMaxMachine
} EMachine;
#pragma pack(push, 1)
R_PACKED(
typedef struct {
short section;
short padding1;
int offset;
int size;
unsigned int flags;
int module;
short padding2;
unsigned int data_crc;
unsigned int reloc_crc;
} SSymbolRange;
#pragma pack(pop)
ut16 section;
ut16 padding1;
st32 offset;
st32 size;
ut32 flags;
st32 module;
st16 padding2;
ut32 data_crc;
ut32 reloc_crc;
}) SSymbolRange;
// #pragma pack(push, 1)
R_PACKED(
typedef struct {
unsigned int opened;
ut32 opened;
SSymbolRange range;
unsigned short flags;
short stream;
unsigned int symSize;
unsigned int oldLineSize;
unsigned int lineSize;
short nSrcFiles;
short padding1;
unsigned int offsets;
unsigned int niSource;
unsigned int niCompiler;
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;
// #pragma pack(pop)
}) SDBIExHeader;
#pragma pack(push, 1)
R_PACKED(
typedef struct {
short sn_fpo;
short sn_exception;
short sn_fixup;
short sn_omap_to_src;
short sn_omap_from_src;
short sn_section_hdr;
short sn_token_rid_map;
short sn_xdata;
short sn_pdata;
short sn_new_fpo;
short sn_section_hdr_orig;
} SDbiDbgHeader;
#pragma pack(pop)
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;
#pragma pack(push, 1)
R_PACKED(
typedef struct {
unsigned int magic;
unsigned int version;
unsigned int age;
short gssymStream;
unsigned short vers;
short pssymStream;
unsigned short pdbver;
short symrecStream;
unsigned short pdbver2;
unsigned int module_size;
unsigned int seccon_size;
unsigned int secmap_size;
unsigned int filinf_size;
unsigned int tsmap_size;
unsigned int mfc_index;
unsigned int dbghdr_size;
unsigned int ecinfo_size;
unsigned short flags;
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
unsigned int resvd;
} SDBIHeader;
#pragma pack(pop)
ut32 resvd;
}) SDBIHeader;
typedef struct {
SDBIHeader dbi_header;
@ -1143,23 +1167,24 @@ typedef struct {
// start of FPO stream structures
typedef union {
struct {
unsigned char cbRegs : 3;
unsigned char fHashSEH : 1;
unsigned char fUseBp : 1;
unsigned char reserved : 1;
unsigned char cbFrame : 2;
unsigned char cbProlog : 8;
ut8 cbRegs : 3;
ut8 fHashSEH : 1;
ut8 fUseBp : 1;
ut8 reserved : 1;
ut8 cbFrame : 2;
ut8 cbProlog : 8;
} bits;
unsigned short bit_values;
ut16 bit_values;
} UBit_values;
R_PACKED(
typedef struct {
unsigned int ul_off_start;
unsigned int cb_proc_size;
unsigned int cdw_locals;
unsigned short cdw_params;
ut32 ul_off_start;
ut32 cb_proc_size;
ut32 cdw_locals;
ut16 cdw_params;
UBit_values bit_values;
} SFPO_DATA;
}) SFPO_DATA;
typedef struct {
RList *fpo_data_list;
@ -1172,17 +1197,18 @@ typedef enum {
eFPO_DATA_FLAGS_MAX
} EFPO_DATA_FLAGS;
R_PACKED(
typedef struct {
unsigned int ul_off_start;
unsigned int cb_proc_size;
unsigned int cdw_locals;
unsigned int cdw_params;
unsigned int max_stack;
unsigned int programm_string_offset;
unsigned short cb_prolog;
unsigned short cb_save_regs;
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;
}) SFPO_DATA_V2;
typedef struct {
RList *fpo_data_list;
@ -1194,35 +1220,38 @@ typedef struct {
RList *globals_list;
} SGDATAStream;
R_PACKED (
typedef struct {
unsigned short leaf_type;
unsigned int symtype;
unsigned int offset;
unsigned short segment;
ut16 leaf_type;
ut32 symtype;
ut32 offset;
ut16 segment;
SCString name;
} SGlobal;
}) SGlobal;
// end GDATA structures
// PE stream structures
// TODO: Support 64bit addressing!
typedef union {
unsigned int physical_address;
unsigned int virtual_address;
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;
unsigned int virtual_address;
unsigned int size_of_raw_data;
unsigned int pointer_to_raw_data;
unsigned int pointer_to_relocations;
unsigned int pointer_to_line_numbers;
unsigned short number_of_relocations;
unsigned short number_of_line_numbers;
unsigned int charactestics;
} SIMAGE_SECTION_HEADER;
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;
@ -1231,13 +1260,13 @@ typedef struct {
// omap structures
typedef struct {
unsigned int from;
unsigned int to;
ut32 from;
ut32 to;
} SOmapEntry;
typedef struct {
RList *omap_entries;
unsigned int *froms;
ut32 *froms;
} SOmapStream;
// end of omap structures