1 | /* |
---|---|
2 | * Copyright (c) 2018 Virtuozzo International GmbH |
3 | * |
4 | * This work is licensed under the terms of the GNU GPL, version 2 or later. |
5 | * |
6 | */ |
7 | |
8 | #ifndef PDB_H |
9 | #define PDB_H |
10 | |
11 | |
12 | #ifndef _WIN32 |
13 | typedef struct GUID { |
14 | unsigned int Data1; |
15 | unsigned short Data2; |
16 | unsigned short Data3; |
17 | unsigned char Data4[8]; |
18 | } GUID; |
19 | #endif |
20 | |
21 | struct PDB_FILE { |
22 | uint32_t size; |
23 | uint32_t unknown; |
24 | }; |
25 | |
26 | typedef struct PDB_DS_HEADER { |
27 | char signature[32]; |
28 | uint32_t block_size; |
29 | uint32_t unknown1; |
30 | uint32_t num_pages; |
31 | uint32_t toc_size; |
32 | uint32_t unknown2; |
33 | uint32_t toc_page; |
34 | } PDB_DS_HEADER; |
35 | |
36 | typedef struct PDB_DS_TOC { |
37 | uint32_t num_files; |
38 | uint32_t file_size[1]; |
39 | } PDB_DS_TOC; |
40 | |
41 | typedef struct PDB_DS_ROOT { |
42 | uint32_t Version; |
43 | uint32_t TimeDateStamp; |
44 | uint32_t Age; |
45 | GUID guid; |
46 | uint32_t cbNames; |
47 | char names[1]; |
48 | } PDB_DS_ROOT; |
49 | |
50 | typedef struct PDB_TYPES_OLD { |
51 | uint32_t version; |
52 | uint16_t first_index; |
53 | uint16_t last_index; |
54 | uint32_t type_size; |
55 | uint16_t file; |
56 | uint16_t pad; |
57 | } PDB_TYPES_OLD; |
58 | |
59 | typedef struct PDB_TYPES { |
60 | uint32_t version; |
61 | uint32_t type_offset; |
62 | uint32_t first_index; |
63 | uint32_t last_index; |
64 | uint32_t type_size; |
65 | uint16_t file; |
66 | uint16_t pad; |
67 | uint32_t hash_size; |
68 | uint32_t hash_base; |
69 | uint32_t hash_offset; |
70 | uint32_t hash_len; |
71 | uint32_t search_offset; |
72 | uint32_t search_len; |
73 | uint32_t unknown_offset; |
74 | uint32_t unknown_len; |
75 | } PDB_TYPES; |
76 | |
77 | typedef struct PDB_SYMBOL_RANGE { |
78 | uint16_t segment; |
79 | uint16_t pad1; |
80 | uint32_t offset; |
81 | uint32_t size; |
82 | uint32_t characteristics; |
83 | uint16_t index; |
84 | uint16_t pad2; |
85 | } PDB_SYMBOL_RANGE; |
86 | |
87 | typedef struct PDB_SYMBOL_RANGE_EX { |
88 | uint16_t segment; |
89 | uint16_t pad1; |
90 | uint32_t offset; |
91 | uint32_t size; |
92 | uint32_t characteristics; |
93 | uint16_t index; |
94 | uint16_t pad2; |
95 | uint32_t timestamp; |
96 | uint32_t unknown; |
97 | } PDB_SYMBOL_RANGE_EX; |
98 | |
99 | typedef struct PDB_SYMBOL_FILE { |
100 | uint32_t unknown1; |
101 | PDB_SYMBOL_RANGE range; |
102 | uint16_t flag; |
103 | uint16_t file; |
104 | uint32_t symbol_size; |
105 | uint32_t lineno_size; |
106 | uint32_t unknown2; |
107 | uint32_t nSrcFiles; |
108 | uint32_t attribute; |
109 | char filename[1]; |
110 | } PDB_SYMBOL_FILE; |
111 | |
112 | typedef struct PDB_SYMBOL_FILE_EX { |
113 | uint32_t unknown1; |
114 | PDB_SYMBOL_RANGE_EX range; |
115 | uint16_t flag; |
116 | uint16_t file; |
117 | uint32_t symbol_size; |
118 | uint32_t lineno_size; |
119 | uint32_t unknown2; |
120 | uint32_t nSrcFiles; |
121 | uint32_t attribute; |
122 | uint32_t reserved[2]; |
123 | char filename[1]; |
124 | } PDB_SYMBOL_FILE_EX; |
125 | |
126 | typedef struct PDB_SYMBOL_SOURCE { |
127 | uint16_t nModules; |
128 | uint16_t nSrcFiles; |
129 | uint16_t table[1]; |
130 | } PDB_SYMBOL_SOURCE; |
131 | |
132 | typedef struct PDB_SYMBOL_IMPORT { |
133 | uint32_t unknown1; |
134 | uint32_t unknown2; |
135 | uint32_t TimeDateStamp; |
136 | uint32_t Age; |
137 | char filename[1]; |
138 | } PDB_SYMBOL_IMPORT; |
139 | |
140 | typedef struct PDB_SYMBOLS_OLD { |
141 | uint16_t hash1_file; |
142 | uint16_t hash2_file; |
143 | uint16_t gsym_file; |
144 | uint16_t pad; |
145 | uint32_t module_size; |
146 | uint32_t offset_size; |
147 | uint32_t hash_size; |
148 | uint32_t srcmodule_size; |
149 | } PDB_SYMBOLS_OLD; |
150 | |
151 | typedef struct PDB_SYMBOLS { |
152 | uint32_t signature; |
153 | uint32_t version; |
154 | uint32_t unknown; |
155 | uint32_t hash1_file; |
156 | uint32_t hash2_file; |
157 | uint16_t gsym_file; |
158 | uint16_t unknown1; |
159 | uint32_t module_size; |
160 | uint32_t offset_size; |
161 | uint32_t hash_size; |
162 | uint32_t srcmodule_size; |
163 | uint32_t pdbimport_size; |
164 | uint32_t resvd0; |
165 | uint32_t stream_index_size; |
166 | uint32_t unknown2_size; |
167 | uint16_t resvd3; |
168 | uint16_t machine; |
169 | uint32_t resvd4; |
170 | } PDB_SYMBOLS; |
171 | |
172 | typedef struct { |
173 | uint16_t FPO; |
174 | uint16_t unk0; |
175 | uint16_t unk1; |
176 | uint16_t unk2; |
177 | uint16_t unk3; |
178 | uint16_t segments; |
179 | } PDB_STREAM_INDEXES_OLD; |
180 | |
181 | typedef struct { |
182 | uint16_t FPO; |
183 | uint16_t unk0; |
184 | uint16_t unk1; |
185 | uint16_t unk2; |
186 | uint16_t unk3; |
187 | uint16_t segments; |
188 | uint16_t unk4; |
189 | uint16_t unk5; |
190 | uint16_t unk6; |
191 | uint16_t FPO_EXT; |
192 | uint16_t unk7; |
193 | } PDB_STREAM_INDEXES; |
194 | |
195 | union codeview_symbol { |
196 | struct { |
197 | int16_t len; |
198 | int16_t id; |
199 | } generic; |
200 | |
201 | struct { |
202 | int16_t len; |
203 | int16_t id; |
204 | uint32_t symtype; |
205 | uint32_t offset; |
206 | uint16_t segment; |
207 | char name[1]; |
208 | } public_v3; |
209 | }; |
210 | |
211 | #define S_PUB_V3 0x110E |
212 | |
213 | typedef struct pdb_seg { |
214 | uint32_t dword[8]; |
215 | } __attribute__ ((packed)) pdb_seg; |
216 | |
217 | #define IMAGE_FILE_MACHINE_I386 0x014c |
218 | #define IMAGE_FILE_MACHINE_AMD64 0x8664 |
219 | |
220 | struct pdb_reader { |
221 | GMappedFile *gmf; |
222 | size_t file_size; |
223 | struct { |
224 | PDB_DS_HEADER *header; |
225 | PDB_DS_TOC *toc; |
226 | PDB_DS_ROOT *root; |
227 | } ds; |
228 | uint32_t file_used[1024]; |
229 | PDB_SYMBOLS *symbols; |
230 | PDB_STREAM_INDEXES sidx; |
231 | uint8_t *modimage; |
232 | char *segs; |
233 | size_t segs_size; |
234 | }; |
235 | |
236 | int pdb_init_from_file(const char *name, struct pdb_reader *reader); |
237 | void pdb_exit(struct pdb_reader *reader); |
238 | uint64_t pdb_resolve(uint64_t img_base, struct pdb_reader *r, const char *name); |
239 | uint64_t pdb_find_public_v3_symbol(struct pdb_reader *reader, const char *name); |
240 | |
241 | #endif /* PDB_H */ |
242 |