diff options
| author | Dennis Brentjes <d.brentjes@gmail.com> | 2016-09-11 22:56:42 +0200 |
|---|---|---|
| committer | Dennis Brentjes <d.brentjes@gmail.com> | 2016-09-11 22:56:42 +0200 |
| commit | c6465bd8c6aca006bc7e980d5db08518659bae3c (patch) | |
| tree | d25a4b697640fd5cb38f000e8b2369525b7ef92b | |
| parent | 0828d0bf368d7e0bdc835062aad62bc336047350 (diff) | |
| download | openwar-c6465bd8c6aca006bc7e980d5db08518659bae3c.tar.gz openwar-c6465bd8c6aca006bc7e980d5db08518659bae3c.tar.bz2 openwar-c6465bd8c6aca006bc7e980d5db08518659bae3c.zip | |
Adds a Pages struct to the le::File which contains all pages.
| -rw-r--r-- | le/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | le/le_file.cpp | 7 | ||||
| -rw-r--r-- | le/le_file.hpp | 2 | ||||
| -rw-r--r-- | le/le_file_parser.cpp | 3 | ||||
| -rw-r--r-- | le/le_pages.cpp | 33 | ||||
| -rw-r--r-- | le/le_pages.hpp | 19 |
6 files changed, 62 insertions, 3 deletions
diff --git a/le/CMakeLists.txt b/le/CMakeLists.txt index 6bea735..d01ae7f 100644 --- a/le/CMakeLists.txt +++ b/le/CMakeLists.txt @@ -10,6 +10,7 @@ add_library(le STATIC le_entry_table.hpp le_entry_table.cpp le_fixup_page_table.hpp le_fixup_page_table.cpp le_fixup_record_table.hpp le_fixup_record_table.cpp + le_pages.hpp le_pages.cpp ) target_include_directories(le diff --git a/le/le_file.cpp b/le/le_file.cpp index 55478c8..2e0a9d5 100644 --- a/le/le_file.cpp +++ b/le/le_file.cpp @@ -25,6 +25,7 @@ BOOST_FUSION_ADAPT_STRUCT( (le::EntryTable, entry_table) (le::FixupPageTable, fixup_page_table) (le::FixupRecordTable, fixup_record_table) + (le::Pages, pages) ) namespace le { @@ -50,13 +51,14 @@ File parse_file(std::istream& is) { 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, + le_offset, dos_exe, le_h, object_table, @@ -66,7 +68,8 @@ File parse_file(std::istream& is) { resident_name_table, entry_table, fixup_page_table, - fixup_record_table + fixup_record_table, + pages }; } diff --git a/le/le_file.hpp b/le/le_file.hpp index 09fc42d..0807ea4 100644 --- a/le/le_file.hpp +++ b/le/le_file.hpp @@ -12,6 +12,7 @@ #include "le_entry_table.hpp" #include "le_fixup_page_table.hpp" #include "le_fixup_record_table.hpp" +#include "le_pages.hpp" #include <cstdint> #include <cstddef> @@ -41,6 +42,7 @@ struct File EntryTable entry_table; FixupPageTable fixup_page_table; FixupRecordTable fixup_record_table; + Pages pages; }; File parse_file(std::istream& is); diff --git a/le/le_file_parser.cpp b/le/le_file_parser.cpp index fe34857..42b485b 100644 --- a/le/le_file_parser.cpp +++ b/le/le_file_parser.cpp @@ -50,7 +50,8 @@ int main(int argc, char* argv[]) { return -1; } - std::ifstream file(file_path.string()); + std::ifstream file(file_path.string(), std::ios::binary); + file.unsetf(std::ios::skipws); auto x = le::parse_file(file); binparse::otreestream treestream (std::cout); treestream << x << std::endl; diff --git a/le/le_pages.cpp b/le/le_pages.cpp new file mode 100644 index 0000000..ed8de86 --- /dev/null +++ b/le/le_pages.cpp @@ -0,0 +1,33 @@ +#include "le_pages.hpp" + +#include "output.hpp" + +#include <algorithm> + +namespace le { + +Pages parse_pages(std::istream& is, binparse::Offset32 offset, binparse::Value32 nr_pages, binparse::Value32 page_size) +{ + Pages pages; + + is.seekg(0, std::ios::beg); + is.ignore(offset); + + for(unsigned int i = 0; i < nr_pages; ++i) { + std::vector<uint8_t> page; + page.reserve(page_size); + + std::copy_n(std::istream_iterator<char>(is), page_size, std::back_inserter(page)); + + pages.map.emplace(i+1, page); + } + + return pages; +} + +std::ostream&operator<<(std::ostream& os, const Pages& table) +{ + return binparse::operator<<(os, table.map); +} + +}
\ No newline at end of file diff --git a/le/le_pages.hpp b/le/le_pages.hpp new file mode 100644 index 0000000..6698f64 --- /dev/null +++ b/le/le_pages.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include "types.hpp" + +#include <vector> +#include <map> + +namespace le { + +struct Pages +{ + std::map<binparse::Value32, std::vector<uint8_t>> map; +}; + +Pages parse_pages(std::istream& is, binparse::Offset32 offset, binparse::Value32 nr_pages, binparse::Value32 page_size); + +std::ostream& operator<<(std::ostream& os, Pages const& table); + +}
\ No newline at end of file |
