From cea325b7451c1fb8dd22462ec2e7b5b88ea9b547 Mon Sep 17 00:00:00 2001 From: Dennis Brentjes Date: Sun, 19 Jun 2016 20:23:07 +0200 Subject: Adds an LE executable parser. Adds the binparse library that holds common components for the MZ and LE parsers. --- le/le_header.cpp | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 le/le_header.cpp (limited to 'le/le_header.cpp') diff --git a/le/le_header.cpp b/le/le_header.cpp new file mode 100644 index 0000000..a429add --- /dev/null +++ b/le/le_header.cpp @@ -0,0 +1,92 @@ + +#include "le_header.hpp" + +#include "index_list.hpp" +#include "binparse.hpp" + +#include + +BOOST_FUSION_ADAPT_STRUCT( + le::LEHeader, + (binparse::Magic16, magic) + (binparse::Value8, B_ord) + (binparse::Value8, W_ord) + (binparse::Value32, format_level) + (binparse::Value16, cpu_type) + (binparse::Value16, os_type) + (binparse::Value32, module_version) + (binparse::Value32, module_flags) + (binparse::Value32, module_nr_of_pages) + (binparse::Offset32, EIP_object) + (binparse::Offset32, EIP) + (binparse::Offset32, ESP_object) + (binparse::Offset32, ESP) + (binparse::Value32, page_size) + (binparse::Offset32, page_offset_shift) + (binparse::Value32, fixup_section_size) + (binparse::Value32, fixup_section_checksum) + (binparse::Value32, loader_section_size) + (binparse::Value32, loader_section_checksum) + (binparse::Offset32, object_table_offset) + (binparse::Value32, nr_objects_in_module) + (binparse::Offset32, object_page_table_offset) + (binparse::Offset32, objct_iter_pages_offset) + (binparse::Offset32, resource_table_offset) + (binparse::Value32, nr_resource_table_entries) + (binparse::Offset32, resident_name_table_offset) + (binparse::Offset32, entry_table_offset) + (binparse::Offset32, module_directives_offset) + (binparse::Value32, nr_module_directives) + (binparse::Offset32, fixup_page_table_offset) + (binparse::Offset32, fixup_record_table_offset) + (binparse::Offset32, import_module_table_offset) + (binparse::Value32, import_mod_entries) + (binparse::Offset32, import_proc_table_offset) + (binparse::Offset32, per_page_checksum_offset) + (binparse::Offset32, data_page_offset) + (binparse::Value32, nr_preload_pages) + (binparse::Offset32, non_res_name_table_offset) + (binparse::Value32, non_res_name_table_length) + (binparse::Value32, non_res_name_table_checksum) + (binparse::Value32, auto_ds_object_nr) + (binparse::Offset32, debug_info_offset) + (binparse::Value32, debug_info_length) + (binparse::Value32, nr_instance_preload) + (binparse::Value32, nr_instance_demand) + (binparse::Value32, heapsize) +) + +namespace le { + +template +LEHeader parse_file_impl(std::istream& is, indices) { + + return {parse::type>::type>(is, boost::fusion::extension::struct_member_name::call())...}; + +} + +LEHeader parse_file(std::istream& is) { + + typedef build_indices::value>::type indices; + + return parse_file_impl(is, indices{}); +} + +std::ostream& output_impl(std::ostream& os, LEHeader const&, indices<>) { + return os; +} + +template +std::ostream& output_impl(std::ostream& os, const LEHeader& header, indices) { + os << boost::fusion::extension::struct_member_name::call() << ": " << boost::fusion::at_c(header) << std::endl; + return output_impl(os, header, indices{}); +} + +std::ostream& operator<<(std::ostream& os, LEHeader const& header) +{ + typedef build_indices::value>::type indices; + + return output_impl(os, header, indices{}); +} + +} \ No newline at end of file -- cgit v1.2.3-70-g09d2