Cxbx-Reloaded/Include/Core/Exe.h

297 lines
15 KiB
C
Raw Normal View History

2003-01-26 06:18:56 +00:00
// ******************************************************************
// *
// * .,-::::: .,:: .::::::::. .,:: .:
// * ,;;;'````' `;;;, .,;; ;;;'';;' `;;;, .,;;
// * [[[ '[[,,[[' [[[__[[\. '[[,,[['
// * $$$ Y$$$P $$""""Y$$ Y$$$P
// * `88bo,__,o, oP"``"Yo, _88o,,od8P oP"``"Yo,
// * "YUMMMMMP",m" "Mm,""YUMMMP" ,m" "Mm,
// *
// * Cxbx->Core->Exe.h
// *
// * This file is part of the Cxbx project.
// *
// * Cxbx and Cxbe are free software; you can redistribute them
// * and/or modify them under the terms of the GNU General Public
// * License as published by the Free Software Foundation; either
// * version 2 of the license, or (at your option) any later version.
// *
// * This program is distributed in the hope that it will be useful,
// * but WITHOUT ANY WARRANTY; without even the implied warranty of
// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// * GNU General Public License for more details.
// *
// * You should have recieved a copy of the GNU General Public License
// * along with this program; see the file COPYING.
// * If not, write to the Free Software Foundation, Inc.,
// * 59 Temple Place - Suite 330, Bostom, MA 02111-1307, USA.
// *
// * (c) 2002-2003 Aaron Robinson <caustik@caustik.com>
// *
// * All rights reserved
// *
// ******************************************************************
#ifndef EXE_H
#define EXE_H
// ******************************************************************
// * class : Exe
// ******************************************************************
class Exe : public Error
{
public:
// ******************************************************************
// * Construct via Exe file
// ******************************************************************
Exe(const char *x_szFilename);
// ******************************************************************
// * Deconstructor
// ******************************************************************
~Exe();
// ******************************************************************
// * Export to EXE file
// ******************************************************************
void Export(const char *x_szExeFilename);
// ******************************************************************
// * DOSHeader
// ******************************************************************
#include "AlignPrefix1.h"
struct DOSHeader
{
uint16 m_magic; // DOS .EXE magic number
uint16 m_cblp; // byte on last page
uint16 m_cp; // number of pages
uint16 m_crlc; // number of relocations
uint16 m_cparhdr; // size of header (in paragraphs)
uint16 m_minalloc; // minimum extra paragraphs needed
uint16 m_maxalloc; // maximum extra paragraphs needed
uint16 m_ss; // initial SS value (relative)
uint16 m_sp; // initial SP value
uint16 m_csum; // checksum
uint16 m_ip; // initial IP value
uint16 m_cs; // initial CS value (relative)
uint16 m_lfarlc; // file address of relocation table
uint16 m_ovno; // overlay number
uint16 m_res[4]; // reserved words
uint16 m_oemid; // OEM identifier
uint16 m_oeminfo; // OEM information
uint16 m_res2[10]; // reserved words
uint32 m_lfanew; // file address of new .EXE header
}
#include "AlignPosfix1.h"
m_DOSHeader;
// ******************************************************************
// * Header (PE)
// ******************************************************************
#include "AlignPrefix1.h"
struct Header
{
uint32 m_magic; // magic number [should be "PE\0\0"]
uint16 m_machine; // machine type
uint16 m_sections; // number of sections
uint32 m_timedate; // timedate stamp
uint32 m_symbol_table_addr; // symbol table address
uint32 m_symbols; // number of symbols
uint16 m_sizeof_optional_header; // size of optional header
uint16 m_characteristics; // characteristics
}
#include "AlignPosfix1.h"
m_Header;
// ******************************************************************
// * OptionalHeader (PE)
// ******************************************************************
#include "AlignPrefix1.h"
struct OptionalHeader
{
uint16 m_magic; // magic number [should be 0x010B]
uint08 m_linker_version_major; // linker version [major]
uint08 m_linker_version_minor; // linker version [minor]
uint32 m_sizeof_code; // size of code
uint32 m_sizeof_initialized_data; // size of initialized data
uint32 m_sizeof_uninitialized_data; // size of uninitialized data
uint32 m_entry; // address of entry point
uint32 m_code_base; // address of code base
uint32 m_data_base; // address of data base
uint32 m_image_base; // address of image base
uint32 m_section_alignment; // section alignment
uint32 m_file_alignment; // file alignment
uint16 m_os_version_major; // operating system version [major]
uint16 m_os_version_minor; // operating system version [minor]
uint16 m_image_version_major; // image version [major]
uint16 m_image_version_minor; // image version [minor]
uint16 m_subsystem_version_major; // subsystem version [major]
uint16 m_subsystem_version_minor; // subsystem version [minor]
uint32 m_win32_version; // win32 version
uint32 m_sizeof_image; // size of image
uint32 m_sizeof_headers; // size of headers
uint32 m_checksum; // checksum
uint16 m_subsystem; // subsystem
uint16 m_dll_characteristics; // dll characteristics
uint32 m_sizeof_stack_reserve; // size of stack reserve
uint32 m_sizeof_stack_commit; // size of stack commit
uint32 m_sizeof_heap_reserve; // size of heap reserve
uint32 m_sizeof_heap_commit; // size of heap commit
uint32 m_loader_flags; // loader flags
uint32 m_data_directories; // data directories
struct image_data_directory // image data directory
{
uint32 m_virtual_addr; // virtual address
uint32 m_size; // size
}
m_image_data_directory[0x10];
}
#include "AlignPosfix1.h"
m_OptionalHeader;
// ******************************************************************
// * PE Section Header
// ******************************************************************
#include "AlignPrefix1.h"
struct SectionHeader
{
char m_name[8]; // name of section
uint32 m_virtual_size; // virtual size of segment
uint32 m_virtual_addr; // virtual address of segment
uint32 m_sizeof_raw; // size of raw data
uint32 m_raw_addr; // address of raw data
uint32 m_relocations_addr; // address of relocations
uint32 m_linenumbers_addr; // address of line numbers
uint16 m_relocations; // number of relocations
uint16 m_linenumbers; // number of linenumbers
uint32 m_characteristics; // characteristics for this segment
}
#include "AlignPosfix1.h"
*m_SectionHeader;
// ******************************************************************
// * array of section data
// ******************************************************************
uint08 **m_bzSection;
protected:
// ******************************************************************
// * Protected Default Constructor
// ******************************************************************
Exe() {};
// ******************************************************************
// * constructor initialization
// ******************************************************************
void ConstructorInit();
// ******************************************************************
// * return a modifiable pointer inside this structure that
// * corresponds to a virtual address
// ******************************************************************
uint08 *GetAddr(uint32 x_dwVirtualAddress);
};
// ******************************************************************
// * PE File/Segment alignments: these must always both equal 0x0020
// ******************************************************************
static uint32 PE_FILE_ALIGN (0x0020);
static uint32 PE_SEGM_ALIGN (0x0020);
// ******************************************************************
// * Section Characeristics
// ******************************************************************
#define IMAGE_SCN_CNT_CODE 0x00000020 // Section contains code.
#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040 // Section contains initialized data.
#define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080 // Section contains uninitialized data.
#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000 // Section can be discarded.
#define IMAGE_SCN_MEM_NOT_CACHED 0x04000000 // Section is not cachable.
#define IMAGE_SCN_MEM_NOT_PAGED 0x08000000 // Section is not pageable.
#define IMAGE_SCN_MEM_SHARED 0x10000000 // Section is shareable.
#define IMAGE_SCN_MEM_EXECUTE 0x20000000 // Section is executable.
#define IMAGE_SCN_MEM_READ 0x40000000 // Section is readable.
#define IMAGE_SCN_MEM_WRITE 0x80000000 // Section is writeable.
// ******************************************************************
// * Based relocation types
// ******************************************************************
#define IMAGE_REL_BASED_ABSOLUTE 0
#define IMAGE_REL_BASED_HIGH 1
#define IMAGE_REL_BASED_LOW 2
#define IMAGE_REL_BASED_HIGHLOW 3
#define IMAGE_REL_BASED_HIGHADJ 4
#define IMAGE_REL_BASED_MIPS_JMPADDR 5
#define IMAGE_REL_BASED_MIPS_JMPADDR16 9
#define IMAGE_REL_BASED_IA64_IMM64 9
#define IMAGE_REL_BASED_DIR64 10
// ******************************************************************
// * Machine type(s)
// ******************************************************************
#define IMAGE_FILE_MACHINE_I386 0x014c // Intel 386.
// ******************************************************************
// * Subsystems
// ******************************************************************
#define IMAGE_SUBSYSTEM_UNKNOWN 0
#define IMAGE_SUBSYSTEM_NATIVE 1
#define IMAGE_SUBSYSTEM_WINDOWS_GUI 2
#define IMAGE_SUBSYSTEM_WINDOWS_CUI 3
#define IMAGE_SUBSYSTEM_OS2_CUI 5
#define IMAGE_SUBSYSTEM_POSIX_CUI 7
#define IMAGE_SUBSYSTEM_NATIVE_WINDOWS 8
#define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI 9
2003-01-31 22:15:41 +00:00
// ******************************************************************
// * Directory Entries
// ******************************************************************
#define IMAGE_DIRECTORY_ENTRY_EXPORT 0 // Export Directory
#define IMAGE_DIRECTORY_ENTRY_IMPORT 1 // Import Directory
#define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 // Resource Directory
#define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 // Exception Directory
#define IMAGE_DIRECTORY_ENTRY_SECURITY 4 // Security Directory
#define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 // Base Relocation Table
#define IMAGE_DIRECTORY_ENTRY_DEBUG 6 // Debug Directory
// IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7 // (X86 usage)
#define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE 7 // Architecture Specific Data
#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 // RVA of GP
#define IMAGE_DIRECTORY_ENTRY_TLS 9 // TLS Directory
#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 // Load Configuration Directory
#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11 // Bound Import Directory in headers
#define IMAGE_DIRECTORY_ENTRY_IAT 12 // Import Address Table
#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 13 // Delay Load Import Descriptors
#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14 // COM Runtime descriptor
2003-01-26 06:18:56 +00:00
// ******************************************************************
// * DOS stub
// ******************************************************************
static uint08 bzDOSStub[] =
{
0x4D, 0x5A, 0x90, 0x00, 0x03, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xB8, 0x00, 0x00, 0x00,
0x0E, 0x1F, 0xBA, 0x0E, 0x00, 0xB4, 0x09, 0xCD,
0x21, 0xB8, 0x01, 0x4C, 0xCD, 0x21, 0x54, 0x68,
0x69, 0x73, 0x20, 0x70, 0x72, 0x6F, 0x67, 0x72,
0x61, 0x6D, 0x20, 0x63, 0x61, 0x6E, 0x6E, 0x6F,
0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x75, 0x6E,
0x20, 0x69, 0x6E, 0x20, 0x44, 0x4F, 0x53, 0x20,
0x6D, 0x6F, 0x64, 0x65, 0x2E, 0x0D, 0x0D, 0x0A,
0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x85, 0xE3, 0xB8, 0xDB, 0xC1, 0x82, 0xD6, 0x88,
0xC1, 0x82, 0xD6, 0x88, 0xC1, 0x82, 0xD6, 0x88,
0xC1, 0x82, 0xD7, 0x88, 0xC3, 0x82, 0xD6, 0x88,
0x3E, 0xA2, 0xD2, 0x88, 0xC2, 0x82, 0xD6, 0x88,
0x95, 0xA1, 0xE7, 0x88, 0xC0, 0x82, 0xD6, 0x88,
0x52, 0x69, 0x63, 0x68, 0xC1, 0x82, 0xD6, 0x88,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
2003-02-07 18:11:43 +00:00
2003-01-26 06:18:56 +00:00
#endif