#include "le_file.hpp" #include "parse.hpp" #include "output.hpp" #include typedef std::array A1; typedef std::array A2; BOOST_FUSION_ADAPT_STRUCT( le::File, (mz::Header, mz_header) (A1, unused_1) (binparse::Value16, OEM_id) (A2, OEM_info) (binparse::Offset32, le_offset) (std::vector, dos_exe) (le::Header, le_header) (le::ObjectTable, object_table) ) namespace le { File parse_file(std::istream& is) { using binparse::parse; auto mz_h = mz::parse_header(is); auto unused = parse>(is, "unused_1"); auto OEM_id = parse(is, "OEM_id"); auto OEM_info = parse>(is, "OEM_info"); auto le_offset = parse(is, "le_offset"); size_t dos_exe_len = le_offset - 0x40; std::vector dos_exe = std::vector(dos_exe_len, 0); binparse::dump_bytes(is, dos_exe, "dos_exe"); auto le_h = le::parse_header(is); auto object_table = parse_object_table(is, le_offset + le_h.object_table_offset, le_h.nr_objects_in_module); return { mz_h, unused, OEM_id, OEM_info, le_offset, dos_exe, le_h, object_table, }; } std::ostream&operator<<(std::ostream& os, File const& file) { return binparse::operator<<(os, file); } }