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