virtualx-engine/drivers/pe_bliss/pe_section.cpp
masoud bh 24f3f43457 Add icon to exe file in windows export
add version_info and icon sections in "export to windows platform".
add version_info and icon to godot exe file (editor & template exe).
fix an problem in image class.
change all default icons to android export icon (a little more rounded).
create an python script for convert file to cpp byte array for use in
'splash.h'.
2015-11-09 02:23:58 +03:30

281 lines
6.3 KiB
C++

#include <string.h>
#include "utils.h"
#include "pe_section.h"
namespace pe_bliss
{
using namespace pe_win;
//Section structure default constructor
section::section()
:old_size_(static_cast<size_t>(-1))
{
memset(&header_, 0, sizeof(image_section_header));
}
//Sets the name of section (8 characters maximum)
void section::set_name(const std::string& name)
{
memset(header_.Name, 0, sizeof(header_.Name));
memcpy(header_.Name, name.c_str(), std::min<size_t>(name.length(), sizeof(header_.Name)));
}
//Returns section name
const std::string section::get_name() const
{
char buf[9] = {0};
memcpy(buf, header_.Name, 8);
return std::string(buf);
}
//Set flag (attribute) of section
section& section::set_flag(uint32_t flag, bool setflag)
{
if(setflag)
header_.Characteristics |= flag;
else
header_.Characteristics &= ~flag;
return *this;
}
//Sets "readable" attribute of section
section& section::readable(bool readable)
{
return set_flag(image_scn_mem_read, readable);
}
//Sets "writeable" attribute of section
section& section::writeable(bool writeable)
{
return set_flag(image_scn_mem_write, writeable);
}
//Sets "executable" attribute of section
section& section::executable(bool executable)
{
return set_flag(image_scn_mem_execute, executable);
}
//Sets "shared" attribute of section
section& section::shared(bool shared)
{
return set_flag(image_scn_mem_shared, shared);
}
//Sets "discardable" attribute of section
section& section::discardable(bool discardable)
{
return set_flag(image_scn_mem_discardable, discardable);
}
//Returns true if section is readable
bool section::readable() const
{
return (header_.Characteristics & image_scn_mem_read) != 0;
}
//Returns true if section is writeable
bool section::writeable() const
{
return (header_.Characteristics & image_scn_mem_write) != 0;
}
//Returns true if section is executable
bool section::executable() const
{
return (header_.Characteristics & image_scn_mem_execute) != 0;
}
bool section::shared() const
{
return (header_.Characteristics & image_scn_mem_shared) != 0;
}
bool section::discardable() const
{
return (header_.Characteristics & image_scn_mem_discardable) != 0;
}
//Returns true if section has no RAW data
bool section::empty() const
{
if(old_size_ != static_cast<size_t>(-1)) //If virtual memory is mapped, check raw data length (old_size_)
return old_size_ == 0;
else
return raw_data_.empty();
}
//Returns raw section data from file image
std::string& section::get_raw_data()
{
unmap_virtual();
return raw_data_;
}
//Sets raw section data from file image
void section::set_raw_data(const std::string& data)
{
old_size_ = static_cast<size_t>(-1);
raw_data_ = data;
}
//Returns raw section data from file image
const std::string& section::get_raw_data() const
{
unmap_virtual();
return raw_data_;
}
//Returns mapped virtual section data
const std::string& section::get_virtual_data(uint32_t section_alignment) const
{
map_virtual(section_alignment);
return raw_data_;
}
//Returns mapped virtual section data
std::string& section::get_virtual_data(uint32_t section_alignment)
{
map_virtual(section_alignment);
return raw_data_;
}
//Maps virtual section data
void section::map_virtual(uint32_t section_alignment) const
{
uint32_t aligned_virtual_size = get_aligned_virtual_size(section_alignment);
if(old_size_ == static_cast<size_t>(-1) && aligned_virtual_size && aligned_virtual_size > raw_data_.length())
{
old_size_ = raw_data_.length();
raw_data_.resize(aligned_virtual_size, 0);
}
}
//Unmaps virtual section data
void section::unmap_virtual() const
{
if(old_size_ != static_cast<size_t>(-1))
{
raw_data_.resize(old_size_, 0);
old_size_ = static_cast<size_t>(-1);
}
}
//Returns section virtual size
uint32_t section::get_virtual_size() const
{
return header_.Misc.VirtualSize;
}
//Returns section virtual address
uint32_t section::get_virtual_address() const
{
return header_.VirtualAddress;
}
//Returns size of section raw data
uint32_t section::get_size_of_raw_data() const
{
return header_.SizeOfRawData;
}
//Returns pointer to raw section data in PE file
uint32_t section::get_pointer_to_raw_data() const
{
return header_.PointerToRawData;
}
//Returns section characteristics
uint32_t section::get_characteristics() const
{
return header_.Characteristics;
}
//Returns raw image section header
const pe_win::image_section_header& section::get_raw_header() const
{
return header_;
}
//Returns raw image section header
pe_win::image_section_header& section::get_raw_header()
{
return header_;
}
//Calculates aligned virtual section size
uint32_t section::get_aligned_virtual_size(uint32_t section_alignment) const
{
if(get_size_of_raw_data())
{
if(!get_virtual_size())
{
//If section virtual size is zero
//Set aligned virtual size of section as aligned raw size
return pe_utils::align_up(get_size_of_raw_data(), section_alignment);
}
}
return pe_utils::align_up(get_virtual_size(), section_alignment);
}
//Calculates aligned raw section size
uint32_t section::get_aligned_raw_size(uint32_t file_alignment) const
{
if(get_size_of_raw_data())
return pe_utils::align_up(get_size_of_raw_data(), file_alignment);
else
return 0;
}
//Sets size of raw section data
void section::set_size_of_raw_data(uint32_t size_of_raw_data)
{
header_.SizeOfRawData = size_of_raw_data;
}
//Sets pointer to section raw data
void section::set_pointer_to_raw_data(uint32_t pointer_to_raw_data)
{
header_.PointerToRawData = pointer_to_raw_data;
}
//Sets section characteristics
void section::set_characteristics(uint32_t characteristics)
{
header_.Characteristics = characteristics;
}
//Sets section virtual size
void section::set_virtual_size(uint32_t virtual_size)
{
header_.Misc.VirtualSize = virtual_size;
}
//Sets section virtual address
void section::set_virtual_address(uint32_t virtual_address)
{
header_.VirtualAddress = virtual_address;
}
//Section by file offset finder helper (4gb max)
section_by_raw_offset::section_by_raw_offset(uint32_t offset)
:offset_(offset)
{}
bool section_by_raw_offset::operator()(const section& s) const
{
return (s.get_pointer_to_raw_data() <= offset_)
&& (s.get_pointer_to_raw_data() + s.get_size_of_raw_data() > offset_);
}
section_ptr_finder::section_ptr_finder(const section& s)
:s_(s)
{}
bool section_ptr_finder::operator()(const section& s) const
{
return &s == &s_;
}
}