summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDennis Brentjes <d.brentjes@gmail.com>2016-09-11 22:56:42 +0200
committerDennis Brentjes <d.brentjes@gmail.com>2016-09-11 22:56:42 +0200
commitc6465bd8c6aca006bc7e980d5db08518659bae3c (patch)
treed25a4b697640fd5cb38f000e8b2369525b7ef92b
parent0828d0bf368d7e0bdc835062aad62bc336047350 (diff)
downloadopenwar-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.txt1
-rw-r--r--le/le_file.cpp7
-rw-r--r--le/le_file.hpp2
-rw-r--r--le/le_file_parser.cpp3
-rw-r--r--le/le_pages.cpp33
-rw-r--r--le/le_pages.hpp19
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