summaryrefslogtreecommitdiff
path: root/le/le_header.cpp
diff options
context:
space:
mode:
authorDennis Brentjes <d.brentjes@gmail.com>2016-06-19 20:23:07 +0200
committerDennis Brentjes <d.brentjes@gmail.com>2016-06-19 20:23:07 +0200
commitcea325b7451c1fb8dd22462ec2e7b5b88ea9b547 (patch)
treeffa2811b2ca24b3aa7e08bb28b45e7e9adbd154c /le/le_header.cpp
parentc66d1f5c0af70161f4ad4c4175f4280e95b55dfd (diff)
downloadopenwar-cea325b7451c1fb8dd22462ec2e7b5b88ea9b547.tar.gz
openwar-cea325b7451c1fb8dd22462ec2e7b5b88ea9b547.tar.bz2
openwar-cea325b7451c1fb8dd22462ec2e7b5b88ea9b547.zip
Adds an LE executable parser.
Adds the binparse library that holds common components for the MZ and LE parsers.
Diffstat (limited to 'le/le_header.cpp')
-rw-r--r--le/le_header.cpp92
1 files changed, 92 insertions, 0 deletions
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/adapted/struct.hpp>
+
+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 <int... Indices>
+LEHeader parse_file_impl(std::istream& is, indices<Indices...>) {
+
+ return {parse<typename std::decay<typename boost::fusion::result_of::at_c<LEHeader, Indices>::type>::type>(is, boost::fusion::extension::struct_member_name<LEHeader, Indices>::call())...};
+
+}
+
+LEHeader parse_file(std::istream& is) {
+
+ typedef build_indices<boost::fusion::result_of::size<LEHeader>::value>::type indices;
+
+ return parse_file_impl(is, indices{});
+}
+
+std::ostream& output_impl(std::ostream& os, LEHeader const&, indices<>) {
+ return os;
+}
+
+template <int I, int... Indices>
+std::ostream& output_impl(std::ostream& os, const LEHeader& header, indices<I, Indices...>) {
+ os << boost::fusion::extension::struct_member_name<LEHeader, I>::call() << ": " << boost::fusion::at_c<I>(header) << std::endl;
+ return output_impl(os, header, indices<Indices...>{});
+}
+
+std::ostream& operator<<(std::ostream& os, LEHeader const& header)
+{
+ typedef build_indices<boost::fusion::result_of::size<LEHeader>::value>::type indices;
+
+ return output_impl(os, header, indices{});
+}
+
+} \ No newline at end of file