#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) (le::ObjectPageTable, object_page_table) (le::ObjectIterateDataMapTable, object_iterate_data_map_table) (le::ResourceTable, resource_table) (le::ResidentNameTable, resident_name_table) (le::EntryTable, entry_table) (le::FixupPageTable, fixup_page_table) (le::FixupRecordTable, fixup_record_table) (le::Pages, pages) ) 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); auto object_page_table = parse_object_page_table(is, le_offset + le_h.object_page_table_offset, le_h.module_nr_of_pages); auto resident_name_table = parse_resident_name_table(is, le_offset + le_h.resident_name_table_offset); auto entry_table = parse_entry_table(is, le_offset + le_h.entry_table_offset); auto resource_table = parse_resource_table(is, le_offset + le_h.resource_table_offset, le_h.nr_resource_table_entries); auto fixup_page_table = parse_fixup_page_table(is, le_offset + le_h.fixup_page_table_offset, le_h.module_nr_of_pages + binparse::Value32(1)); auto fixup_record_table = parse_fixup_record_table(is, le_offset + le_h.fixup_record_table_offset, fixup_page_table); auto pages = parse_pages(is, le_h.data_page_offset, le_h.module_nr_of_pages, le_h.page_size); return { mz_h, unused, OEM_id, OEM_info, le_offset, dos_exe, le_h, object_table, object_page_table, {}, resource_table, resident_name_table, entry_table, fixup_page_table, fixup_record_table, pages }; } std::ostream&operator<<(std::ostream& os, File const& file) { return binparse::operator<<(os, file); } }