summaryrefslogtreecommitdiff
path: root/le/le_header.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'le/le_header.hpp')
-rw-r--r--le/le_header.hpp107
1 files changed, 107 insertions, 0 deletions
diff --git a/le/le_header.hpp b/le/le_header.hpp
new file mode 100644
index 0000000..9501127
--- /dev/null
+++ b/le/le_header.hpp
@@ -0,0 +1,107 @@
+
+#include "types.hpp"
+
+#include <cstdint>
+
+namespace le {
+
+using namespace binparse;
+
+struct NotALEFileException : public std::runtime_error {
+ NotALEFileException();
+};
+
+enum class Bord : uint8_t {
+ little_endian = 0,
+ big_endian = 1,
+};
+
+enum class Word : uint8_t {
+ little_endian = 0,
+ big_endian = 0,
+};
+
+enum class CpuType : uint16_t {
+ _80286 = 1,
+ _80386 = 2,
+ _80486 = 3,
+};
+
+enum class OsType : uint16_t {
+ Unknown = 0,
+ OS_2 = 1,
+ Windows = 2,
+ Dos_4x = 3,
+ Windows_386 = 4,
+};
+
+enum class module_flags {
+ per_process_library_initialization = 0x4,
+ internal_fixups = 0x10,
+ incompat_pm_windowing = 0x100,
+ compat_pm_windowing = 0x200,
+ uses_pm_windowing = 0x300,
+ module_not_loadable = 0x2000,
+ module_type_mask = 0x38000,
+ program_module = 0x0,
+ library_module = 0x8000,
+ protected_memory_library_module = 0x18000,
+ physical_device_driver_module = 0x20000,
+ virtual_device_driver_module = 0x28000,
+ per_process_library_temrination = 0x40000000,
+};
+
+struct LEHeader {
+ Magic16 magic;
+ Value8 B_ord;
+ Value8 W_ord;
+ Value32 format_level;
+ Value16 cpu_type;
+ Value16 os_type;
+ Value32 module_version;
+ Value32 module_flags;
+ Value32 module_nr_of_pages;
+ Offset32 EIP_object;
+ Offset32 EIP;
+ Offset32 ESP_object;
+ Offset32 ESP;
+ Value32 page_size;
+ Offset32 page_offset_shift;
+ Value32 fixup_section_size;
+ Value32 fixup_section_checksum;
+ Value32 loader_section_size;
+ Value32 loader_section_checksum;
+ Offset32 object_table_offset;
+ Value32 nr_objects_in_module;
+ Offset32 object_page_table_offset;
+ Offset32 objct_iter_pages_offset;
+ Offset32 resource_table_offset;
+ Value32 nr_resource_table_entries;
+ Offset32 resident_name_table_offset;
+ Offset32 entry_table_offset;
+ Offset32 module_directives_offset;
+ Value32 nr_module_directives;
+ Offset32 fixup_page_table_offset;
+ Offset32 fixup_record_table_offset;
+ Offset32 import_module_table_offset;
+ Value32 import_mod_entries;
+ Offset32 import_proc_table_offset;
+ Offset32 per_page_checksum_offset;
+ Offset32 data_page_offset;
+ Value32 nr_preload_pages;
+ Offset32 non_res_name_table_offset;
+ Value32 non_res_name_table_length;
+ Value32 non_res_name_table_checksum;
+ Value32 auto_ds_object_nr;
+ Offset32 debug_info_offset;
+ Value32 debug_info_length;
+ Value32 nr_instance_preload;
+ Value32 nr_instance_demand;
+ Value32 heapsize;
+};
+
+LEHeader parse_file(std::istream& is);
+
+std::ostream& operator<<(std::ostream& os, LEHeader const& header);
+
+} \ No newline at end of file