diff options
Diffstat (limited to 'le/le_file.cpp')
| -rw-r--r-- | le/le_file.cpp | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/le/le_file.cpp b/le/le_file.cpp new file mode 100644 index 0000000..3cec50c --- /dev/null +++ b/le/le_file.cpp @@ -0,0 +1,80 @@ +#include "le_file.hpp" + +#include "index_list.hpp" + +#include <boost/fusion/adapted/struct.hpp> + +typedef std::array<uint8_t, 8> A1; +typedef std::array<uint8_t, 22> A2; + +BOOST_FUSION_ADAPT_STRUCT( + le::LEFile, + (mz::MZHeader, mz_header) + (A1, unused_1) + (binparse::Value16, OEM_id) + (A2, OEM_info) + (binparse::Offset32, le_offset) + (std::vector<uint8_t>, dos_exe) + (le::LEHeader, le_header) + (std::vector<uint8_t>, le_exe) +) + +namespace le { + +LEFile parse_file(std::istream& is) { + auto mz_h = mz::parse_header(is); + auto unused = parse<std::array<uint8_t, 8>>(is, "unused_1"); + auto OEM_id = parse<binparse::Value16>(is, "OEM_id"); + auto OEM_info = parse<std::array<uint8_t, 22>>(is, "OEM_info"); + auto le_offset = parse<binparse::Offset32>(is, "le_offset"); + + size_t dos_exe_len = le_offset - 0x40; + std::vector<uint8_t> dos_exe = std::vector<uint8_t>(dos_exe_len, 0); + binparse::dump_bytes(is, dos_exe, "dos_exe"); + + auto le_h = le::parse_header(is); + std::string str(std::istreambuf_iterator<char>(is), {}); + std::vector<uint8_t> le_exe(str.begin(), str.end()); + + return { + mz_h, + unused, + OEM_id, + OEM_info, + le_offset, + dos_exe, + le_h, + le_exe + }; +} + +std::ostream& operator<<(std::ostream& os, std::array<uint8_t, 8> const& array) { + return os; +} + +std::ostream& operator<<(std::ostream& os, std::array<uint8_t, 22> const& array) { + return os; +} + +std::ostream& operator<<(std::ostream& os, std::vector<uint8_t> vec) { + return os; +} + +std::ostream& output_impl(std::ostream& os, LEFile const&, indices<>) { + return os; +} + +template <int I, int... Indices> +std::ostream& output_impl(std::ostream& os, const LEFile& file, indices<I, Indices...>) { + os << boost::fusion::extension::struct_member_name<LEFile, I>::call() << ": " << boost::fusion::at_c<I>(file) << std::endl; + return output_impl(os, file, indices<Indices...>{}); +} + +std::ostream&operator<<(std::ostream& os, LEFile const& file) +{ + typedef build_indices<boost::fusion::result_of::size<LEFile>::value>::type indices; + + return output_impl(os, file, indices{}); +} + +}
\ No newline at end of file |
