mirror of
https://github.com/mike1k/pepp
synced 2026-06-08 16:02:04 +00:00
117 lines
3.6 KiB
C++
117 lines
3.6 KiB
C++
#pragma once
|
|
|
|
namespace pepp
|
|
{
|
|
enum PEDirectoryEntry
|
|
{
|
|
DIRECTORY_ENTRY_EXPORT = 0, // Export Directory
|
|
DIRECTORY_ENTRY_IMPORT = 1, // Import Directory
|
|
DIRECTORY_ENTRY_RESOURCE = 2, // Resource Directory
|
|
DIRECTORY_ENTRY_EXCEPTION = 3, // Exception Directory
|
|
DIRECTORY_ENTRY_SECURITY = 4, // Security Directory
|
|
DIRECTORY_ENTRY_BASERELOC = 5, // Base Relocation Table
|
|
DIRECTORY_ENTRY_DEBUG = 6, // Debug Directory
|
|
DIRECTORY_ENTRY_ARCHITECTURE = 7, // Architecture Specific Data
|
|
DIRECTORY_ENTRY_GLOBALPTR = 8, // RVA of GP
|
|
DIRECTORY_ENTRY_TLS = 9, // TLS Directory
|
|
DIRECTORY_ENTRY_LOAD_CONFIG = 10, // Load Configuration Directory
|
|
DIRECTORY_ENTRY_BOUND_IMPORT = 11, // Bound Import Directory in headers
|
|
DIRECTORY_ENTRY_IAT = 12, // Import Address Table
|
|
DIRECTORY_ENTRY_DELAY_IMPORT = 13, // Delay Load Import Descriptors
|
|
DIRECTORY_ENTRY_COM_DESCRIPTOR = 14 // COM Runtime descriptor
|
|
};
|
|
|
|
enum class PEMagic
|
|
{
|
|
HDR_32 = 0x10b,
|
|
HDR_64 = 0x20b,
|
|
HDR_ROM = 0x107
|
|
};
|
|
|
|
template<unsigned int bitsize = 32>
|
|
class OptionalHeader : pepp::msc::NonCopyable
|
|
{
|
|
friend class PEHeader<bitsize>;
|
|
friend class Image<bitsize>;
|
|
|
|
using ImageData_t = detail::Image_t<bitsize>;
|
|
|
|
Image<bitsize>* m_Image;
|
|
ImageData_t::OptionalHeader_t* m_base{ nullptr };
|
|
public:
|
|
OptionalHeader();
|
|
|
|
|
|
//! Getter/setter for OptionalHeader.Magic
|
|
void setMagic(PEMagic magic);
|
|
PEMagic getMagic() const;
|
|
|
|
//! Getter/setter for OptionalHeader.ImageBase
|
|
void setImageBase(detail::Image_t<bitsize>::Address_t address);
|
|
detail::Image_t<bitsize>::Address_t getImageBase() const;
|
|
|
|
//! Getter/setter for OptionalHeader.SizeOfImage
|
|
void setSizeOfImage(std::uint32_t size);
|
|
std::uint32_t getSizeOfImage() const;
|
|
|
|
//! Getter/setter for OptionalHeader.SizeOfCode
|
|
void setSizeOfCode(std::uint32_t dwSize);
|
|
std::uint32_t getSizeOfCode() const;
|
|
|
|
//! Getter/setter for OptionalHeader.SizeOfInitializedData
|
|
void setSizeOfInitializedData(std::uint32_t dwSize);
|
|
std::uint32_t getSizeOfInitializedData() const;
|
|
|
|
//! Getter/setter for OptionalHeader.SizeOfInitializedData
|
|
void setSizeOfHeaders(std::uint32_t dwSize);
|
|
std::uint32_t getSizeOfHeaders() const;
|
|
|
|
//! Getter/setter for OptionalHeader.SizeOfUninitializedData
|
|
void setSizeOfUninitializedData(std::uint32_t dwSize);
|
|
std::uint32_t getSizeOfUninitializedData() const;
|
|
|
|
//! Getter/setter for OptionalHeader.BaseOfCode
|
|
void setBaseOfCode(std::uint32_t dwBase);
|
|
std::uint32_t getBaseOfCode() const;
|
|
|
|
//! Getter/setter for OptionalHeader.AddressOfEntryPoint
|
|
void setAddressOfEntryPoint(std::uint32_t dwBase);
|
|
std::uint32_t getAddressOfEntryPoint() const;
|
|
|
|
//! Getter for OptionalHeader.FileAlignment
|
|
std::uint32_t getFileAlignment() const;
|
|
|
|
//! Getter for OptionalHeader.SectionAlignment
|
|
std::uint32_t getSectionAlignment() const;
|
|
|
|
//! Get data directory
|
|
detail::Image_t<>::DataDirectory_t& getDataDir(int idx) const {
|
|
return m_base->DataDirectory[idx];
|
|
}
|
|
|
|
//! Calculate the number of directories present (not NumberOfRvaAndSizes)
|
|
std::uint32_t getDirectoryCount() const {
|
|
std::uint32_t count{ 0ul };
|
|
for (int i = 0; i < MAX_DIRECTORY_COUNT; i++)
|
|
{
|
|
if (getDataDir(i).Size > 0) {
|
|
++count;
|
|
}
|
|
}
|
|
return count;
|
|
}
|
|
|
|
std::uint8_t* base() const {
|
|
return (std::uint8_t*)m_base;
|
|
}
|
|
|
|
//! Check if image has relocations
|
|
bool hasRelocations() const;
|
|
|
|
private:
|
|
void _setup(Image<bitsize>* image) {
|
|
m_Image = image;
|
|
m_base = &image->getPEHdr().native()->OptionalHeader;
|
|
}
|
|
};
|
|
} |