Path: blob/master/platform/windows/export/template_modifier.h
10278 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 VERSION = 0x10;68static const uint32_t ENGLISH = 0x0409;69static const uint32_t HIGH_BIT = 0x80000000;7071uint32_t id = 0;72uint32_t data_offset = 0;73bool name = false;74bool subdirectory = false;7576Vector<uint8_t> save() const;77};7879struct FixedFileInfo : ByteStream {80uint32_t signature = 0xfeef04bd;81uint32_t struct_version = 0x10000;82uint32_t file_version_ms = 0;83uint32_t file_version_ls = 0;84uint32_t product_version_ms = 0;85uint32_t product_version_ls = 0;86uint32_t file_flags_mask = 0;87uint32_t file_flags = 0;88uint32_t file_os = 0x00000004;89uint32_t file_type = 0x00000001;90uint32_t file_subtype = 0;91uint32_t file_date_ms = 0;92uint32_t file_date_ls = 0;9394Vector<uint8_t> save() const;95void set_file_version(const String &p_file_version);96void set_product_version(const String &p_product_version);97};9899struct Structure : ByteStream {100uint16_t length = 0;101uint16_t value_length = 0;102uint16_t type = 0;103String key;104105Vector<uint8_t> save() const;106Vector<uint8_t> &add_length(Vector<uint8_t> &r_bytes) const;107};108109struct StringStructure : Structure {110String value;111112Vector<uint8_t> save() const;113StringStructure();114StringStructure(const String &p_key, const String &p_value);115};116117struct StringTable : Structure {118Vector<StringStructure> strings;119120Vector<uint8_t> save() const;121void put(const String &p_key, const String &p_value);122StringTable();123};124125struct StringFileInfo : Structure {126StringTable string_table;127128Vector<uint8_t> save() const;129StringFileInfo();130};131132struct Var : Structure {133const uint32_t value = 0x04b00409;134135Vector<uint8_t> save() const;136Var();137};138139struct VarFileInfo : Structure {140Var var;141142Vector<uint8_t> save() const;143VarFileInfo();144};145146struct VersionInfo : Structure {147FixedFileInfo value;148StringFileInfo string_file_info;149VarFileInfo var_file_info;150151Vector<uint8_t> save() const;152VersionInfo();153};154155struct IconEntry : ByteStream {156static const uint32_t SIZE = 16;157158uint8_t width = 0;159uint8_t height = 0;160uint8_t colors = 0;161uint8_t reserved = 0;162uint16_t planes = 0;163uint16_t bits_per_pixel = 32;164uint32_t image_size = 0;165uint32_t image_offset = 0;166Vector<uint8_t> data;167168Vector<uint8_t> save() const;169void load(Ref<FileAccess> p_file);170};171172struct GroupIcon : ByteStream {173static constexpr uint8_t SIZES[6] = { 16, 32, 48, 64, 128, 0 };174175uint16_t reserved = 0;176uint16_t type = 1;177uint16_t image_count = 0;178Vector<IconEntry> icon_entries;179Vector<Vector<uint8_t>> images;180181Vector<uint8_t> save() const;182void load(Ref<FileAccess> p_icon_file);183void fill_with_godot_blue();184};185186struct SectionEntry : ByteStream {187static const uint32_t SIZE = 40;188189String name;190uint32_t virtual_size = 0;191uint32_t virtual_address = 0;192uint32_t size_of_raw_data = 0;193uint32_t pointer_to_raw_data = 0;194uint32_t pointer_to_relocations = 0;195uint32_t pointer_to_line_numbers = 0;196uint16_t number_of_relocations = 0;197uint16_t number_of_line_numbers = 0;198uint32_t characteristics = 0;199200Vector<uint8_t> save() const;201void load(Ref<FileAccess> p_file);202};203204struct ResourceDataEntry : ByteStream {205static const uint16_t SIZE = 16;206207uint32_t rva = 0;208uint32_t size = 0;209210Vector<uint8_t> save() const;211};212213uint32_t _snap(uint32_t p_value, uint32_t p_size) const;214uint32_t _get_pe_header_offset(Ref<FileAccess> p_executable) const;215Vector<SectionEntry> _get_section_entries(Ref<FileAccess> p_executable) const;216GroupIcon _create_group_icon(const String &p_icon_path) const;217VersionInfo _create_version_info(const HashMap<String, String> &p_strings) const;218Vector<uint8_t> _create_resources(uint32_t p_virtual_address, const GroupIcon &p_group_icon, const VersionInfo &p_version_info) const;219Error _truncate(const String &p_executable_path, uint32_t p_size) const;220HashMap<String, String> _get_strings(const Ref<EditorExportPreset> &p_preset) const;221Error _modify_template(const Ref<EditorExportPreset> &p_preset, const String &p_template_path, const String &p_icon_path) const;222223public:224static Error modify(const Ref<EditorExportPreset> &p_preset, const String &p_template_path, const String &p_icon_path);225};226227228