Path: blob/master/platform/windows/export/template_modifier.h
21204 views
/**************************************************************************/1/* template_modifier.h */2/**************************************************************************/3/* This file is part of: */4/* GODOT ENGINE */5/* https://godotengine.org */6/**************************************************************************/7/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */8/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */9/* */10/* Permission is hereby granted, free of charge, to any person obtaining */11/* a copy of this software and associated documentation files (the */12/* "Software"), to deal in the Software without restriction, including */13/* without limitation the rights to use, copy, modify, merge, publish, */14/* distribute, sublicense, and/or sell copies of the Software, and to */15/* permit persons to whom the Software is furnished to do so, subject to */16/* the following conditions: */17/* */18/* The above copyright notice and this permission notice shall be */19/* included in all copies or substantial portions of the Software. */20/* */21/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */22/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */23/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */24/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */25/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */26/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */27/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */28/**************************************************************************/2930#pragma once3132#include "core/io/file_access.h"33#include "editor/export/editor_export_platform_pc.h"3435class TemplateModifier {36const uint32_t PE_PAGE_SIZE = 4096;37const uint32_t BLOCK_SIZE = 512;38const uint32_t COFF_HEADER_SIZE = 24;39const uint32_t POINTER_TO_PE_HEADER_OFFSET = 0x3c;40// all offsets below are calculated from POINTER_TO_PE_HEADER_OFFSET value, at 0 is magic string PE (0x50450000)41const uint32_t MAGIC_NUMBER_OFFSET = 24;42const uint32_t SIZE_OF_INITIALIZED_DATA_OFFSET = 32;43const uint32_t SIZE_OF_IMAGE_OFFSET = 80;4445struct ByteStream {46void save(uint8_t p_value, Vector<uint8_t> &r_bytes) const;47void save(uint16_t p_value, Vector<uint8_t> &r_bytes) const;48void save(uint32_t p_value, Vector<uint8_t> &r_bytes) const;49void save(const String &p_value, Vector<uint8_t> &r_bytes) const;50void save(uint32_t p_value, Vector<uint8_t> &r_bytes, uint32_t p_count) const;51Vector<uint8_t> save() const;52};5354struct ResourceDirectoryTable : ByteStream {55static const uint16_t SIZE = 16;5657uint16_t name_entry_count = 0;58uint16_t id_entry_count = 0;5960Vector<uint8_t> save() const;61};6263struct ResourceDirectoryEntry : ByteStream {64static const uint16_t SIZE = 8;65static const uint32_t ICON = 0x03;66static const uint32_t GROUP_ICON = 0x0e;67static const uint32_t MANIFEST = 0x18;68static const uint32_t VERSION = 0x10;69static const uint32_t ENGLISH = 0x0409;70static const uint32_t HIGH_BIT = 0x80000000;7172uint32_t id = 0;73uint32_t data_offset = 0;74bool name = false;75bool subdirectory = false;7677Vector<uint8_t> save() const;78};7980struct FixedFileInfo : ByteStream {81uint32_t signature = 0xfeef04bd;82uint32_t struct_version = 0x10000;83uint32_t file_version_ms = 0;84uint32_t file_version_ls = 0;85uint32_t product_version_ms = 0;86uint32_t product_version_ls = 0;87uint32_t file_flags_mask = 0;88uint32_t file_flags = 0;89uint32_t file_os = 0x00000004;90uint32_t file_type = 0x00000001;91uint32_t file_subtype = 0;92uint32_t file_date_ms = 0;93uint32_t file_date_ls = 0;9495Vector<uint8_t> save() const;96void set_file_version(const String &p_file_version);97void set_product_version(const String &p_product_version);98};99100struct Structure : ByteStream {101uint16_t length = 0;102uint16_t value_length = 0;103uint16_t type = 0;104String key;105106Vector<uint8_t> save() const;107Vector<uint8_t> &add_length(Vector<uint8_t> &r_bytes) const;108};109110struct StringStructure : Structure {111String value;112113Vector<uint8_t> save() const;114StringStructure();115StringStructure(const String &p_key, const String &p_value);116};117118struct StringTable : Structure {119Vector<StringStructure> strings;120121Vector<uint8_t> save() const;122void put(const String &p_key, const String &p_value);123StringTable();124};125126struct StringFileInfo : Structure {127StringTable string_table;128129Vector<uint8_t> save() const;130StringFileInfo();131};132133struct Var : Structure {134const uint32_t value = 0x04b00409;135136Vector<uint8_t> save() const;137Var();138};139140struct VarFileInfo : Structure {141Var var;142143Vector<uint8_t> save() const;144VarFileInfo();145};146147struct VersionInfo : Structure {148FixedFileInfo value;149StringFileInfo string_file_info;150VarFileInfo var_file_info;151152Vector<uint8_t> save() const;153VersionInfo();154};155156struct ManifestInfo : Structure {157String manifest;158159Vector<uint8_t> save() const;160ManifestInfo() {}161};162163struct IconEntry : ByteStream {164static const uint32_t SIZE = 16;165166uint8_t width = 0;167uint8_t height = 0;168uint8_t colors = 0;169uint8_t reserved = 0;170uint16_t planes = 0;171uint16_t bits_per_pixel = 32;172uint32_t image_size = 0;173uint32_t image_offset = 0;174Vector<uint8_t> data;175176Vector<uint8_t> save() const;177void load(Ref<FileAccess> p_file);178};179180struct GroupIcon : ByteStream {181static constexpr uint8_t SIZES[6] = { 16, 32, 48, 64, 128, 0 };182183uint16_t reserved = 0;184uint16_t type = 1;185uint16_t image_count = 0;186Vector<IconEntry> icon_entries;187Vector<Vector<uint8_t>> images;188189Vector<uint8_t> save() const;190void load(Ref<FileAccess> p_icon_file);191void fill_with_godot_blue();192};193194struct SectionEntry : ByteStream {195static const uint32_t SIZE = 40;196197String name;198uint32_t virtual_size = 0;199uint32_t virtual_address = 0;200uint32_t size_of_raw_data = 0;201uint32_t pointer_to_raw_data = 0;202uint32_t pointer_to_relocations = 0;203uint32_t pointer_to_line_numbers = 0;204uint16_t number_of_relocations = 0;205uint16_t number_of_line_numbers = 0;206uint32_t characteristics = 0;207208Vector<uint8_t> save() const;209void load(Ref<FileAccess> p_file);210};211212struct ResourceDataEntry : ByteStream {213static const uint16_t SIZE = 16;214215uint32_t rva = 0;216uint32_t size = 0;217218Vector<uint8_t> save() const;219};220221uint32_t _snap(uint32_t p_value, uint32_t p_size) const;222uint32_t _get_pe_header_offset(Ref<FileAccess> p_executable) const;223Vector<SectionEntry> _get_section_entries(Ref<FileAccess> p_executable) const;224GroupIcon _create_group_icon(const String &p_icon_path) const;225ManifestInfo _create_manifest_info() const;226VersionInfo _create_version_info(const HashMap<String, String> &p_strings) const;227Vector<uint8_t> _create_resources(uint32_t p_virtual_address, const GroupIcon &p_group_icon, const VersionInfo &p_version_info, const ManifestInfo &p_manifest_info) const;228Error _truncate(const String &p_executable_path, uint32_t p_size) const;229HashMap<String, String> _get_strings(const Ref<EditorExportPreset> &p_preset) const;230Error _modify_template(const Ref<EditorExportPreset> &p_preset, const String &p_template_path, const String &p_icon_path) const;231232public:233static Error modify(const Ref<EditorExportPreset> &p_preset, const String &p_template_path, const String &p_icon_path);234};235236237