retdec
pdb_file.h
Go to the documentation of this file.
1 
7 #ifndef RETDEC_PDBPARSER_PDB_FILE_H
8 #define RETDEC_PDBPARSER_PDB_FILE_H
9 
14 
15 namespace retdec {
16 namespace pdbparser {
17 
18 // =================================================================
19 // STATES
20 // =================================================================
21 
23 {
29 };
30 
31 // =================================================================
32 // PDB_VERSIONS
33 // =================================================================
34 
35 #define PDB_VERSION_200 0x200 // binary version number
36 #define PDB_SIGNATURE_200_SIZE 0x2C // signature size (bytes)
37 #define PDB_SIGNATURE_200 "Microsoft C/C++ program database 2.00\r\n\032JG\0"
38 
39 #define PDB_VERSION_700 0x700 // binary version number
40 #define PDB_SIGNATURE_700_SIZE 0x20 // signature size (bytes)
41 #define PDB_SIGNATURE_700 "Microsoft C/C++ MSF 7.00\r\n\032DS\0\0"
42 
43 // some arbitrary, hopefully big enough, signature size
44 #define PDB_VERSION_INDEPENDENT_SIGNATURE_SIZE 0x100
45 
46 // =================================================================
47 // STREAM IDS
48 // =================================================================
49 
50 #define PDB_STREAM_ROOT 0 // PDB root directory
51 #define PDB_STREAM_PDB 1 // PDB stream info
52 #define PDB_STREAM_TPI 2 // type info
53 #define PDB_STREAM_DBI 3 // debug info
54 
55 // =================================================================
56 // PDB 2.00 STRUCTURES
57 // =================================================================
58 
59 typedef struct _PDB_STREAM_200
60 {
61  PDB_DWORD dStreamBytes; // stream size (-1 = unused)
62  PDB_PVOID pReserved; // implementation dependent
64 
65 // -----------------------------------------------------------------
66 
67 typedef struct _PDB_HEADER_200
68 {
70  PDB_DWORD dPageBytes; // 0x0400, 0x0800, 0x1000
71  PDB_WORD wStartPage; // 0x0009, 0x0005, 0x0002
72  PDB_WORD wFilePages; // file size / dPageBytes
73  PDB_STREAM_200 RootStream; // stream directory
74  PDB_WORD awRootPages[]; // pages containing PDB_ROOT_200
76 
77 // -----------------------------------------------------------------
78 
79 typedef struct _PDB_ROOT_200
80 {
81  PDB_WORD wStreams; // number of streams
82  PDB_WORD wReserved; // not used
83  PDB_STREAM_200 aStreams[]; // stream size list
85 
86 // =================================================================
87 // PDB 7.00 STRUCTURES
88 // =================================================================
89 
90 typedef struct _PDB_HEADER_700
91 {
94  PDB_DWORD dFlagPage; // 0x0002
95  PDB_DWORD dNumPages; // number of pages in file
96  PDB_DWORD dRootSize; // stream directory size
98  PDB_DWORD dRootIndexesPage; // root page index
100 
101 // -----------------------------------------------------------------
102 
103 typedef struct _PDB_ROOT_700
104 {
105  PDB_DWORD dNumStreams; // number of streams
106  PDB_DWORD adStreamSizes[]; // stream size list
108 
109 // =================================================================
110 // VERSION-INDEPENDENT PDB STRUCTURES
111 // =================================================================
112 
113 typedef union _PDB_HEADER
114 {
116  PDB_HEADER_200 V200; // version 2.00 header
117  PDB_HEADER_700 V700; // version 7.00 header
119 
120 // -----------------------------------------------------------------
121 
122 typedef union _PDB_ROOT
123 {
124  PDB_ROOT_200 V200; // version 2.00 root directory
125  PDB_ROOT_700 V700; // version 7.00 root directory
127 
128 // =================================================================
129 // CLASS PDBFile
130 // =================================================================
131 
132 class PDBFile
133 {
134  public:
135  PDBFile(void) :
136  pdb_loaded(false), pdb_initialized(false), pdb_filename(nullptr), pdb_version(0), page_size(0), pdb_file_size(
137  0), pdb_file_data(
138  nullptr), num_streams(0), pdb_fpo_num(0), pdb_newfpo_num(0), pdb_sec_num(0), pdb_header(nullptr), pdb_root_dir(
139  nullptr), pdb_info_v700(nullptr), dbi_header_v700(nullptr), pdb_types(nullptr), pdb_symbols(nullptr)
140  {
141  }
142  ;
143  ~PDBFile(void);
144 
145  // Action methods
146  PDBFileState load_pdb_file(const char *filename);
147  void initialize(uint64_t image_base = 0);
148  bool save_streams_to_files(void);
149 
150  // Getting methods
151  unsigned int get_version(void)
152  {
153  return pdb_version;
154  }
155  PDBStream * get_stream(unsigned int num)
156  {
157  if (num < num_streams)
158  return &streams[num];
159  else
160  return nullptr;
161  }
162  const char * get_module_name(unsigned int num)
163  {
164  if (num < modules.size())
165  return modules[num].name;
166  else
167  return nullptr;
168  }
170  {
171  return pdb_types;
172  }
174  {
175  return pdb_symbols;
176  }
178  {
179  if (pdb_symbols != nullptr)
180  return &pdb_symbols->get_functions();
181  else
182  return nullptr;
183  }
185  {
186  if (pdb_symbols != nullptr)
188  else
189  return nullptr;
190  }
191 
192  // Printing methods
193  void print_pdb_file_info(void);
194  void print_modules(void);
195  void dump_FPO(void);
196  void dump_PE_sections(void);
197 
198  private:
199  // Internal functions
200  bool stream_is_linear(PDB_DWORD *pages, int num_pages);
201  char * extract_stream(PDB_DWORD *pages, int num_pages);
204  void parse_modules(void);
205  void parse_sections(uint64_t image_base);
206 
207  // Variables
210  const char * pdb_filename;
211  unsigned int pdb_version;
212  unsigned int page_size;
213  unsigned int pdb_file_size;
215  unsigned int num_streams;
219 
220  // Data structure pointers
225 
226  // Child objects
229 
230  // Data containers
234 
235 };
236 
237 } // namespace pdbparser
238 } // namespace retdec
239 
240 #endif
Definition: pdb_file.h:133
PDBStream * get_stream(unsigned int num)
Definition: pdb_file.h:155
PDB_HEADER * pdb_header
Definition: pdb_file.h:221
PDBGlobalVarAddressMap * get_global_variables(void)
Definition: pdb_file.h:184
PDBSectionsVec sections
Definition: pdb_file.h:233
void print_modules(void)
Definition: pdb_file.cpp:201
void parse_sections(uint64_t image_base)
Definition: pdb_file.cpp:494
PDBFileState load_pdb_file(const char *filename)
Definition: pdb_file.cpp:29
bool pdb_loaded
Definition: pdb_file.h:208
PDBSymbols * pdb_symbols
Definition: pdb_file.h:228
PDBFileState load_pdb_v200(void)
Definition: pdb_file.cpp:361
int pdb_fpo_num
Definition: pdb_file.h:216
PDBTypes * pdb_types
Definition: pdb_file.h:227
PDBSymbols * get_symbols_container(void)
Definition: pdb_file.h:173
PDBModulesVec modules
Definition: pdb_file.h:232
void dump_PE_sections(void)
Definition: pdb_file.cpp:271
int pdb_sec_num
Definition: pdb_file.h:218
PDBFunctionAddressMap * get_functions(void)
Definition: pdb_file.h:177
PDBTypes * get_types_container(void)
Definition: pdb_file.h:169
unsigned int get_version(void)
Definition: pdb_file.h:151
const char * get_module_name(unsigned int num)
Definition: pdb_file.h:162
unsigned int pdb_version
Definition: pdb_file.h:211
PDBStreamsVec streams
Definition: pdb_file.h:231
bool stream_is_linear(PDB_DWORD *pages, int num_pages)
Definition: pdb_file.cpp:330
const char * pdb_filename
Definition: pdb_file.h:210
PDB_ROOT * pdb_root_dir
Definition: pdb_file.h:222
PDBFileState load_pdb_v700(void)
Definition: pdb_file.cpp:372
unsigned int page_size
Definition: pdb_file.h:212
PDBInfo70 * pdb_info_v700
Definition: pdb_file.h:223
PDBFile(void)
Definition: pdb_file.h:135
int pdb_newfpo_num
Definition: pdb_file.h:217
bool save_streams_to_files(void)
Definition: pdb_file.cpp:144
void initialize(uint64_t image_base=0)
Definition: pdb_file.cpp:91
char * pdb_file_data
Definition: pdb_file.h:214
NewDBIHdr * dbi_header_v700
Definition: pdb_file.h:224
void dump_FPO(void)
Definition: pdb_file.cpp:229
~PDBFile(void)
Definition: pdb_file.cpp:306
char * extract_stream(PDB_DWORD *pages, int num_pages)
Definition: pdb_file.cpp:345
bool pdb_initialized
Definition: pdb_file.h:209
unsigned int num_streams
Definition: pdb_file.h:215
void print_pdb_file_info(void)
Definition: pdb_file.cpp:167
void parse_modules(void)
Definition: pdb_file.cpp:437
unsigned int pdb_file_size
Definition: pdb_file.h:213
Definition: pdb_symbols.h:122
PDBGlobalVarAddressMap & get_global_variables(void)
Definition: pdb_symbols.h:146
PDBFunctionAddressMap & get_functions(void)
Definition: pdb_symbols.h:141
Definition: pdb_types.h:584
PDB info.
struct retdec::pdbparser::_PDB_STREAM_200 PDB_STREAM_200
std::vector< PDBModule > PDBModulesVec
Definition: pdb_utils.h:114
std::vector< PDBStream > PDBStreamsVec
Definition: pdb_utils.h:103
unsigned char PDB_BYTE
Definition: pdb_utils.h:33
struct retdec::pdbparser::_PDB_HEADER_700 PDB_HEADER_700
struct retdec::pdbparser::_PDB_ROOT_700 PDB_ROOT_700
void * PDB_PVOID
Definition: pdb_utils.h:43
unsigned short PDB_WORD
Definition: pdb_utils.h:35
unsigned int PDB_DWORD
Definition: pdb_utils.h:21
struct retdec::pdbparser::_PDB_HEADER_200 PDB_HEADER_200
union retdec::pdbparser::_PDB_ROOT PDB_ROOT
std::vector< PDBPESection > PDBSectionsVec
Definition: pdb_utils.h:125
union retdec::pdbparser::_PDB_HEADER PDB_HEADER
PDBFileState
Definition: pdb_file.h:23
@ PDB_STATE_ALREADY_LOADED
Definition: pdb_file.h:25
@ PDB_STATE_OK
Definition: pdb_file.h:24
@ PDB_STATE_UNSUPPORTED_VERSION
Definition: pdb_file.h:28
@ PDB_STATE_INVALID_FILE
Definition: pdb_file.h:27
@ PDB_STATE_ERR_FILE_OPEN
Definition: pdb_file.h:26
std::map< uint64_t, PDBFunction * > PDBFunctionAddressMap
Definition: pdb_symbols.h:96
std::map< uint64_t, PDBGlobalVariable > PDBGlobalVarAddressMap
Definition: pdb_symbols.h:115
struct retdec::pdbparser::_PDB_ROOT_200 PDB_ROOT_200
Definition: archive_wrapper.h:19
#define PDB_SIGNATURE_200_SIZE
Definition: pdb_file.h:36
#define PDB_VERSION_INDEPENDENT_SIGNATURE_SIZE
Definition: pdb_file.h:44
#define PDB_SIGNATURE_700_SIZE
Definition: pdb_file.h:40
Definition: pdb_info.h:1631
Definition: pdb_info.h:1002
Definition: pdb_utils.h:95
Definition: pdb_file.h:68
PDB_WORD wFilePages
Definition: pdb_file.h:72
PDB_DWORD dPageBytes
Definition: pdb_file.h:70
PDB_WORD wStartPage
Definition: pdb_file.h:71
PDB_BYTE abSignature[PDB_SIGNATURE_200_SIZE]
Definition: pdb_file.h:69
PDB_STREAM_200 RootStream
Definition: pdb_file.h:73
PDB_WORD awRootPages[]
Definition: pdb_file.h:74
Definition: pdb_file.h:91
PDB_DWORD dReserved
Definition: pdb_file.h:97
PDB_DWORD dRootIndexesPage
Definition: pdb_file.h:98
PDB_BYTE abSignature[PDB_SIGNATURE_700_SIZE]
Definition: pdb_file.h:92
PDB_DWORD dFlagPage
Definition: pdb_file.h:94
PDB_DWORD dNumPages
Definition: pdb_file.h:95
PDB_DWORD dBytesPerPage
Definition: pdb_file.h:93
PDB_DWORD dRootSize
Definition: pdb_file.h:96
Definition: pdb_file.h:80
PDB_WORD wReserved
Definition: pdb_file.h:82
PDB_WORD wStreams
Definition: pdb_file.h:81
PDB_STREAM_200 aStreams[]
Definition: pdb_file.h:83
Definition: pdb_file.h:104
PDB_DWORD adStreamSizes[]
Definition: pdb_file.h:106
PDB_DWORD dNumStreams
Definition: pdb_file.h:105
Definition: pdb_file.h:60
PDB_PVOID pReserved
Definition: pdb_file.h:62
PDB_DWORD dStreamBytes
Definition: pdb_file.h:61
Definition: pdb_file.h:114
PDB_BYTE abSignature[PDB_VERSION_INDEPENDENT_SIGNATURE_SIZE]
Definition: pdb_file.h:115
PDB_HEADER_700 V700
Definition: pdb_file.h:117
PDB_HEADER_200 V200
Definition: pdb_file.h:116
Definition: pdb_file.h:123
PDB_ROOT_700 V700
Definition: pdb_file.h:125
PDB_ROOT_200 V200
Definition: pdb_file.h:124