1 // This is a generated file! Please edit source .ksy file and use
2 // kaitai-struct-compiler to rebuild
3
4 #include "kaitai/microsoft_pe.h"
5
6 namespace veles {
7 namespace kaitai {
8 namespace microsoft_pe {
9
microsoft_pe_t(kaitai::kstream * p_io,kaitai::kstruct * p_parent,microsoft_pe_t * p_root)10 microsoft_pe_t::microsoft_pe_t(kaitai::kstream* p_io, kaitai::kstruct* p_parent,
11 microsoft_pe_t* p_root)
12 : kaitai::kstruct(p_io) {
13 m__io->pushName("_parent");
14 m__parent = p_parent;
15 m__io->popName();
16 m__io->pushName("_root");
17 m__root = this;
18 m__io->popName();
19 veles_obj = m__io->startChunk("microsoft_pe");
20 m__io->pushName("mz1");
21 m_mz1 = new mz_placeholder_t(m__io, this, m__root);
22 m__io->popName();
23 m__io->pushName("mz2");
24 m_mz2 = m__io->read_bytes((mz1()->header_size() - 64));
25 m__io->popName();
26 m__io->pushName("m_pe_signature" + 2);
27 m_pe_signature =
28 m__io->ensure_fixed_contents(std::string("\x50\x45\x00\x00", 4));
29 m__io->popName();
30 m__io->pushName("coff_header");
31 m_coff_header = new coff_header_t(m__io, this, m__root);
32 m__io->popName();
33 m__io->pushName("_skip_me_optional_header");
34 m__skip_me_optional_header =
35 m__io->read_bytes(coff_header()->size_of_optional_header());
36 m__io->popName();
37 m__io->pushName("m__skip_me_optional_header" + 3);
38 m__io__skip_me_optional_header = new kaitai::kstream(
39 m__io->blob(), m__io->pos() - m__skip_me_optional_header.size(),
40 veles_obj, m__io->pos(), m__io->error());
41 m__io->popName();
42 m__io->pushName("optional_header");
43 m_optional_header =
44 new optional_header_t(m__io__skip_me_optional_header, this, m__root);
45 m__io->popName();
46 int l_sections = coff_header()->number_of_sections();
47 m_sections = new std::vector<section_t*>();
48 m_sections->reserve(l_sections);
49 for (int i = 0; i < l_sections; i++) {
50 m__io->pushName("sections");
51 m_sections->push_back(new section_t(m__io, this, m__root));
52 m__io->popName();
53 }
54 m__io->endChunk();
55 }
56
~microsoft_pe_t()57 microsoft_pe_t::~microsoft_pe_t() {
58 delete m_mz1;
59 delete m_coff_header;
60 delete m__io__skip_me_optional_header;
61 delete m_optional_header;
62 for (std::vector<section_t*>::iterator it = m_sections->begin();
63 it != m_sections->end(); ++it) {
64 delete *it;
65 }
66 delete m_sections;
67 }
68
optional_header_windows_t(kaitai::kstream * p_io,microsoft_pe_t::optional_header_t * p_parent,microsoft_pe_t * p_root)69 microsoft_pe_t::optional_header_windows_t::optional_header_windows_t(
70 kaitai::kstream* p_io, microsoft_pe_t::optional_header_t* p_parent,
71 microsoft_pe_t* p_root)
72 : kaitai::kstruct(p_io) {
73 m__io->pushName("_parent");
74 m__parent = p_parent;
75 m__io->popName();
76 m__io->pushName("_root");
77 m__root = p_root;
78 m__io->popName();
79 veles_obj = m__io->startChunk("optional_header_windows");
80 n_image_base = true;
81 if (_parent()->std()->format() == 267) {
82 n_image_base = false;
83 m__io->pushName("image_base");
84 m_image_base = m__io->read_u4le();
85 m__io->popName();
86 }
87 n_image_base2 = true;
88 if (_parent()->std()->format() == 523) {
89 n_image_base2 = false;
90 m__io->pushName("image_base2");
91 m_image_base2 = m__io->read_u8le();
92 m__io->popName();
93 }
94 m__io->pushName("section_alignment");
95 m_section_alignment = m__io->read_u4le();
96 m__io->popName();
97 m__io->pushName("file_alignment");
98 m_file_alignment = m__io->read_u4le();
99 m__io->popName();
100 m__io->pushName("major_operating_system_version");
101 m_major_operating_system_version = m__io->read_u2le();
102 m__io->popName();
103 m__io->pushName("minor_operating_system_version");
104 m_minor_operating_system_version = m__io->read_u2le();
105 m__io->popName();
106 m__io->pushName("major_image_version");
107 m_major_image_version = m__io->read_u2le();
108 m__io->popName();
109 m__io->pushName("minor_image_version");
110 m_minor_image_version = m__io->read_u2le();
111 m__io->popName();
112 m__io->pushName("major_subsystem_version");
113 m_major_subsystem_version = m__io->read_u2le();
114 m__io->popName();
115 m__io->pushName("minor_subsystem_version");
116 m_minor_subsystem_version = m__io->read_u2le();
117 m__io->popName();
118 m__io->pushName("win32_version_value");
119 m_win32_version_value = m__io->read_u4le();
120 m__io->popName();
121 m__io->pushName("size_of_image");
122 m_size_of_image = m__io->read_u4le();
123 m__io->popName();
124 m__io->pushName("size_of_headers");
125 m_size_of_headers = m__io->read_u4le();
126 m__io->popName();
127 m__io->pushName("check_sum");
128 m_check_sum = m__io->read_u4le();
129 m__io->popName();
130 m__io->pushName("subsystem");
131 m_subsystem =
132 static_cast<microsoft_pe_t::optional_header_windows_t::subsystem_t>(
133 m__io->read_u2le());
134 m__io->popName();
135 m__io->pushName("dll_characteristics");
136 m_dll_characteristics = m__io->read_u2le();
137 m__io->popName();
138 n_size_of_stack_reserve = true;
139 if (_parent()->std()->format() == 267) {
140 n_size_of_stack_reserve = false;
141 m__io->pushName("size_of_stack_reserve");
142 m_size_of_stack_reserve = m__io->read_u4le();
143 m__io->popName();
144 }
145 n_size_of_stack_reserve2 = true;
146 if (_parent()->std()->format() == 523) {
147 n_size_of_stack_reserve2 = false;
148 m__io->pushName("size_of_stack_reserve2");
149 m_size_of_stack_reserve2 = m__io->read_u8le();
150 m__io->popName();
151 }
152 n_size_of_stack_commit = true;
153 if (_parent()->std()->format() == 267) {
154 n_size_of_stack_commit = false;
155 m__io->pushName("size_of_stack_commit");
156 m_size_of_stack_commit = m__io->read_u4le();
157 m__io->popName();
158 }
159 n_size_of_stack_commit2 = true;
160 if (_parent()->std()->format() == 523) {
161 n_size_of_stack_commit2 = false;
162 m__io->pushName("size_of_stack_commit2");
163 m_size_of_stack_commit2 = m__io->read_u8le();
164 m__io->popName();
165 }
166 n_size_of_heap_reserve = true;
167 if (_parent()->std()->format() == 267) {
168 n_size_of_heap_reserve = false;
169 m__io->pushName("size_of_heap_reserve");
170 m_size_of_heap_reserve = m__io->read_u4le();
171 m__io->popName();
172 }
173 n_size_of_heap_reserve2 = true;
174 if (_parent()->std()->format() == 523) {
175 n_size_of_heap_reserve2 = false;
176 m__io->pushName("size_of_heap_reserve2");
177 m_size_of_heap_reserve2 = m__io->read_u8le();
178 m__io->popName();
179 }
180 n_size_of_heap_commit = true;
181 if (_parent()->std()->format() == 267) {
182 n_size_of_heap_commit = false;
183 m__io->pushName("size_of_heap_commit");
184 m_size_of_heap_commit = m__io->read_u4le();
185 m__io->popName();
186 }
187 n_size_of_heap_commit2 = true;
188 if (_parent()->std()->format() == 523) {
189 n_size_of_heap_commit2 = false;
190 m__io->pushName("size_of_heap_commit2");
191 m_size_of_heap_commit2 = m__io->read_u8le();
192 m__io->popName();
193 }
194 m__io->pushName("loader_flags");
195 m_loader_flags = m__io->read_u4le();
196 m__io->popName();
197 m__io->pushName("number_of_rva_and_sizes");
198 m_number_of_rva_and_sizes = m__io->read_u4le();
199 m__io->popName();
200 m__io->endChunk();
201 }
202
~optional_header_windows_t()203 microsoft_pe_t::optional_header_windows_t::~optional_header_windows_t() {}
204
optional_header_data_dirs_t(kaitai::kstream * p_io,microsoft_pe_t::optional_header_t * p_parent,microsoft_pe_t * p_root)205 microsoft_pe_t::optional_header_data_dirs_t::optional_header_data_dirs_t(
206 kaitai::kstream* p_io, microsoft_pe_t::optional_header_t* p_parent,
207 microsoft_pe_t* p_root)
208 : kaitai::kstruct(p_io) {
209 m__io->pushName("_parent");
210 m__parent = p_parent;
211 m__io->popName();
212 m__io->pushName("_root");
213 m__root = p_root;
214 m__io->popName();
215 veles_obj = m__io->startChunk("optional_header_data_dirs");
216 m__io->pushName("export_table");
217 m_export_table = new data_dir_t(m__io, this, m__root);
218 m__io->popName();
219 m__io->pushName("import_table");
220 m_import_table = new data_dir_t(m__io, this, m__root);
221 m__io->popName();
222 m__io->pushName("resource_table");
223 m_resource_table = new data_dir_t(m__io, this, m__root);
224 m__io->popName();
225 m__io->pushName("exception_table");
226 m_exception_table = new data_dir_t(m__io, this, m__root);
227 m__io->popName();
228 m__io->pushName("certificate_table");
229 m_certificate_table = new data_dir_t(m__io, this, m__root);
230 m__io->popName();
231 m__io->pushName("base_relocation_table");
232 m_base_relocation_table = new data_dir_t(m__io, this, m__root);
233 m__io->popName();
234 m__io->pushName("debug");
235 m_debug = new data_dir_t(m__io, this, m__root);
236 m__io->popName();
237 m__io->pushName("architecture");
238 m_architecture = new data_dir_t(m__io, this, m__root);
239 m__io->popName();
240 m__io->pushName("global_ptr");
241 m_global_ptr = new data_dir_t(m__io, this, m__root);
242 m__io->popName();
243 m__io->pushName("tls_table");
244 m_tls_table = new data_dir_t(m__io, this, m__root);
245 m__io->popName();
246 m__io->pushName("load_config_table");
247 m_load_config_table = new data_dir_t(m__io, this, m__root);
248 m__io->popName();
249 m__io->pushName("bound_import");
250 m_bound_import = new data_dir_t(m__io, this, m__root);
251 m__io->popName();
252 m__io->pushName("iat");
253 m_iat = new data_dir_t(m__io, this, m__root);
254 m__io->popName();
255 m__io->pushName("delay_import_descriptor");
256 m_delay_import_descriptor = new data_dir_t(m__io, this, m__root);
257 m__io->popName();
258 m__io->pushName("clr_runtime_header");
259 m_clr_runtime_header = new data_dir_t(m__io, this, m__root);
260 m__io->popName();
261 m__io->endChunk();
262 }
263
~optional_header_data_dirs_t()264 microsoft_pe_t::optional_header_data_dirs_t::~optional_header_data_dirs_t() {
265 delete m_export_table;
266 delete m_import_table;
267 delete m_resource_table;
268 delete m_exception_table;
269 delete m_certificate_table;
270 delete m_base_relocation_table;
271 delete m_debug;
272 delete m_architecture;
273 delete m_global_ptr;
274 delete m_tls_table;
275 delete m_load_config_table;
276 delete m_bound_import;
277 delete m_iat;
278 delete m_delay_import_descriptor;
279 delete m_clr_runtime_header;
280 }
281
data_dir_t(kaitai::kstream * p_io,microsoft_pe_t::optional_header_data_dirs_t * p_parent,microsoft_pe_t * p_root)282 microsoft_pe_t::data_dir_t::data_dir_t(
283 kaitai::kstream* p_io,
284 microsoft_pe_t::optional_header_data_dirs_t* p_parent,
285 microsoft_pe_t* p_root)
286 : kaitai::kstruct(p_io) {
287 m__io->pushName("_parent");
288 m__parent = p_parent;
289 m__io->popName();
290 m__io->pushName("_root");
291 m__root = p_root;
292 m__io->popName();
293 veles_obj = m__io->startChunk("data_dir");
294 m__io->pushName("virtual_address");
295 m_virtual_address = m__io->read_u4le();
296 m__io->popName();
297 m__io->pushName("size");
298 m_size = m__io->read_u4le();
299 m__io->popName();
300 m__io->endChunk();
301 }
302
~data_dir_t()303 microsoft_pe_t::data_dir_t::~data_dir_t() {}
304
optional_header_t(kaitai::kstream * p_io,microsoft_pe_t * p_parent,microsoft_pe_t * p_root)305 microsoft_pe_t::optional_header_t::optional_header_t(kaitai::kstream* p_io,
306 microsoft_pe_t* p_parent,
307 microsoft_pe_t* p_root)
308 : kaitai::kstruct(p_io) {
309 m__io->pushName("_parent");
310 m__parent = p_parent;
311 m__io->popName();
312 m__io->pushName("_root");
313 m__root = p_root;
314 m__io->popName();
315 veles_obj = m__io->startChunk("optional_header");
316 m__io->pushName("std");
317 m_std = new optional_header_std_t(m__io, this, m__root);
318 m__io->popName();
319 m__io->pushName("windows");
320 m_windows = new optional_header_windows_t(m__io, this, m__root);
321 m__io->popName();
322 m__io->pushName("data_dirs");
323 m_data_dirs = new optional_header_data_dirs_t(m__io, this, m__root);
324 m__io->popName();
325 m__io->endChunk();
326 }
327
~optional_header_t()328 microsoft_pe_t::optional_header_t::~optional_header_t() {
329 delete m_std;
330 delete m_windows;
331 delete m_data_dirs;
332 }
333
section_t(kaitai::kstream * p_io,microsoft_pe_t * p_parent,microsoft_pe_t * p_root)334 microsoft_pe_t::section_t::section_t(kaitai::kstream* p_io,
335 microsoft_pe_t* p_parent,
336 microsoft_pe_t* p_root)
337 : kaitai::kstruct(p_io) {
338 m__io->pushName("_parent");
339 m__parent = p_parent;
340 m__io->popName();
341 m__io->pushName("_root");
342 m__root = p_root;
343 m__io->popName();
344 veles_obj = m__io->startChunk("section");
345 f_body = false;
346 m__io->pushName("name");
347 m_name = m__io->read_str_byte_limit(8, "UTF-8");
348 m__io->popName();
349 m__io->pushName("virtual_size");
350 m_virtual_size = m__io->read_u4le();
351 m__io->popName();
352 m__io->pushName("virtual_address");
353 m_virtual_address = m__io->read_u4le();
354 m__io->popName();
355 m__io->pushName("size_of_raw_data");
356 m_size_of_raw_data = m__io->read_u4le();
357 m__io->popName();
358 m__io->pushName("pointer_to_raw_data");
359 m_pointer_to_raw_data = m__io->read_u4le();
360 m__io->popName();
361 m__io->pushName("pointer_to_relocations");
362 m_pointer_to_relocations = m__io->read_u4le();
363 m__io->popName();
364 m__io->pushName("pointer_to_linenumbers");
365 m_pointer_to_linenumbers = m__io->read_u4le();
366 m__io->popName();
367 m__io->pushName("number_of_relocations");
368 m_number_of_relocations = m__io->read_u2le();
369 m__io->popName();
370 m__io->pushName("number_of_linenumbers");
371 m_number_of_linenumbers = m__io->read_u2le();
372 m__io->popName();
373 m__io->pushName("characteristics");
374 m_characteristics = m__io->read_u4le();
375 m__io->popName();
376 m__io->endChunk();
377 }
378
~section_t()379 microsoft_pe_t::section_t::~section_t() {}
380
body()381 std::vector<uint8_t> microsoft_pe_t::section_t::body() {
382 if (f_body) {
383 return m_body;
384 }
385 m__io->pushName("body");
386 auto saved_io = m__io;
387 auto saved_veles_obj = veles_obj;
388 m__io = new kaitai::kstream(saved_io->blob(), pointer_to_raw_data(),
389 veles_obj, 0, saved_io->error());
390 veles_obj = m__io->startChunk(saved_io->currentName());
391 m__io->pushName("body");
392 m_body = m__io->read_bytes(size_of_raw_data());
393 m__io->popName();
394 m__io->endChunk();
395 delete m__io;
396 veles_obj = saved_veles_obj;
397 m__io = saved_io;
398 f_body = true;
399 m__io->popName();
400 return m_body;
401 }
402
mz_placeholder_t(kaitai::kstream * p_io,microsoft_pe_t * p_parent,microsoft_pe_t * p_root)403 microsoft_pe_t::mz_placeholder_t::mz_placeholder_t(kaitai::kstream* p_io,
404 microsoft_pe_t* p_parent,
405 microsoft_pe_t* p_root)
406 : kaitai::kstruct(p_io) {
407 m__io->pushName("_parent");
408 m__parent = p_parent;
409 m__io->popName();
410 m__io->pushName("_root");
411 m__root = p_root;
412 m__io->popName();
413 veles_obj = m__io->startChunk("mz_placeholder");
414 m__io->pushName("m_magic" + 2);
415 m_magic = m__io->ensure_fixed_contents(std::string("\x4D\x5A", 2));
416 m__io->popName();
417 m__io->pushName("data1");
418 m_data1 = m__io->read_bytes(58);
419 m__io->popName();
420 m__io->pushName("header_size");
421 m_header_size = m__io->read_u4le();
422 m__io->popName();
423 m__io->endChunk();
424 }
425
~mz_placeholder_t()426 microsoft_pe_t::mz_placeholder_t::~mz_placeholder_t() {}
427
optional_header_std_t(kaitai::kstream * p_io,microsoft_pe_t::optional_header_t * p_parent,microsoft_pe_t * p_root)428 microsoft_pe_t::optional_header_std_t::optional_header_std_t(
429 kaitai::kstream* p_io, microsoft_pe_t::optional_header_t* p_parent,
430 microsoft_pe_t* p_root)
431 : kaitai::kstruct(p_io) {
432 m__io->pushName("_parent");
433 m__parent = p_parent;
434 m__io->popName();
435 m__io->pushName("_root");
436 m__root = p_root;
437 m__io->popName();
438 veles_obj = m__io->startChunk("optional_header_std");
439 m__io->pushName("format");
440 m_format = m__io->read_u2le();
441 m__io->popName();
442 m__io->pushName("major_linker_version");
443 m_major_linker_version = m__io->read_u1();
444 m__io->popName();
445 m__io->pushName("minor_linker_version");
446 m_minor_linker_version = m__io->read_u1();
447 m__io->popName();
448 m__io->pushName("size_of_code");
449 m_size_of_code = m__io->read_u4le();
450 m__io->popName();
451 m__io->pushName("size_of_initialized_data");
452 m_size_of_initialized_data = m__io->read_u4le();
453 m__io->popName();
454 m__io->pushName("size_of_uninitialized_data");
455 m_size_of_uninitialized_data = m__io->read_u4le();
456 m__io->popName();
457 m__io->pushName("address_of_entry_point");
458 m_address_of_entry_point = m__io->read_u4le();
459 m__io->popName();
460 m__io->pushName("base_of_code");
461 m_base_of_code = m__io->read_u4le();
462 m__io->popName();
463 n_base_of_data = true;
464 if (format() == 267) {
465 n_base_of_data = false;
466 m__io->pushName("base_of_data");
467 m_base_of_data = m__io->read_u4le();
468 m__io->popName();
469 }
470 m__io->endChunk();
471 }
472
~optional_header_std_t()473 microsoft_pe_t::optional_header_std_t::~optional_header_std_t() {}
474
coff_header_t(kaitai::kstream * p_io,microsoft_pe_t * p_parent,microsoft_pe_t * p_root)475 microsoft_pe_t::coff_header_t::coff_header_t(kaitai::kstream* p_io,
476 microsoft_pe_t* p_parent,
477 microsoft_pe_t* p_root)
478 : kaitai::kstruct(p_io) {
479 m__io->pushName("_parent");
480 m__parent = p_parent;
481 m__io->popName();
482 m__io->pushName("_root");
483 m__root = p_root;
484 m__io->popName();
485 veles_obj = m__io->startChunk("coff_header");
486 m__io->pushName("machine");
487 m_machine = static_cast<microsoft_pe_t::coff_header_t::machine_type_t>(
488 m__io->read_u2le());
489 m__io->popName();
490 m__io->pushName("number_of_sections");
491 m_number_of_sections = m__io->read_u2le();
492 m__io->popName();
493 m__io->pushName("time_date_stamp");
494 m_time_date_stamp = m__io->read_u4le();
495 m__io->popName();
496 m__io->pushName("pointer_to_symbol_table");
497 m_pointer_to_symbol_table = m__io->read_u4le();
498 m__io->popName();
499 m__io->pushName("number_of_symbols");
500 m_number_of_symbols = m__io->read_u4le();
501 m__io->popName();
502 m__io->pushName("size_of_optional_header");
503 m_size_of_optional_header = m__io->read_u2le();
504 m__io->popName();
505 m__io->pushName("characteristics");
506 m_characteristics = m__io->read_u2le();
507 m__io->popName();
508 m__io->endChunk();
509 }
510
~coff_header_t()511 microsoft_pe_t::coff_header_t::~coff_header_t() {}
512
513 } // namespace microsoft_pe
514 } // namespace kaitai
515 } // namespace veles
516