171 lines
4.1 KiB
C
171 lines
4.1 KiB
C
#ifndef EFI_WRAPPER_H
|
|
#define EFI_WRAPPER_H
|
|
|
|
#define MSDOS_SIGNATURE 0x5a4d
|
|
#define PE_SIGNATURE 0x4550
|
|
#define PE32_FORMAT 0x10b
|
|
#define PE32P_FORMAT 0x20b /* PE32+ */
|
|
|
|
#define IMAGE_FILE_MACHINE_I386 0x14c
|
|
#define IMAGE_FILE_MACHINE_X86_64 0x8664
|
|
#define IMAGE_FILE_EXECUTABLE_IMAGE 0x0002
|
|
#define IMAGE_FILE_LINE_NUMBERS_STRIPPED 0x0004
|
|
#define IMAGE_FILE_32BIT_MACHINE 0x0100
|
|
#define IMAGE_FILE_DEBUG_STRIPPED 0x0200
|
|
|
|
#define IMAGE_SUBSYSTEM_EFI_APPLICATION 0x0a
|
|
|
|
#define IMAGE_SCN_CNT_CODE 0x00000020
|
|
#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040
|
|
#define IMAGE_SCN_ALIGN_1BYTES 0x00100000
|
|
#define IMAGE_SCN_ALIGN_16BYTES 0x00500000
|
|
#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000
|
|
#define IMAGE_SCN_MEM_EXECUTE 0x20000000
|
|
#define IMAGE_SCN_MEM_READ 0x40000000
|
|
|
|
#define __packed __attribute__((packed))
|
|
#define OFFSETOF(t,m) ((size_t)&((t *)0)->m)
|
|
|
|
struct header {
|
|
__uint16_t msdos_signature;
|
|
__uint8_t _pad1[0x16];
|
|
__uint16_t relocs_ptr;
|
|
__uint8_t __pad2[0x3c - 0x1a];
|
|
__uint32_t pe_hdr;
|
|
__uint16_t pe_signature;
|
|
__uint16_t _pad2;
|
|
} __packed;
|
|
|
|
/* FIXME: when setting up coff_hdr, set up optional_hdr_sz
|
|
* based on PE32 or PE32+ format
|
|
*/
|
|
/*
|
|
* COFF header
|
|
*/
|
|
struct coff_hdr {
|
|
__uint16_t arch;
|
|
__uint16_t nr_sections;
|
|
__uint32_t timedatestamp;
|
|
__uint32_t symtab;
|
|
__uint32_t nr_syms;
|
|
__uint16_t optional_hdr_sz;
|
|
__uint16_t characteristics;
|
|
} __packed;
|
|
|
|
struct optional_hdr {
|
|
__uint16_t format;
|
|
__uint8_t major_linker_version;
|
|
__uint8_t minor_linker_version;
|
|
__uint32_t code_sz;
|
|
__uint32_t initialized_data_sz;
|
|
__uint32_t uninitialized_data_sz;
|
|
__uint32_t entry_point;
|
|
__uint32_t base_code;
|
|
__uint32_t data;
|
|
} __packed;
|
|
|
|
/* For PE32+, the optional_header does NOT have
|
|
* data after base_code
|
|
*/
|
|
struct optional_hdr_pe32p {
|
|
__uint16_t format;
|
|
__uint8_t major_linker_version;
|
|
__uint8_t minor_linker_version;
|
|
__uint32_t code_sz;
|
|
__uint32_t initialized_data_sz;
|
|
__uint32_t uninitialized_data_sz;
|
|
__uint32_t entry_point;
|
|
__uint32_t base_code;
|
|
} __packed;
|
|
/*
|
|
* Extra header fields
|
|
*/
|
|
struct extra_hdr {
|
|
__uint32_t image_base;
|
|
__uint32_t section_align;
|
|
__uint32_t file_align;
|
|
__uint16_t major_os_version;
|
|
__uint16_t minor_os_version;
|
|
__uint16_t major_image_version;
|
|
__uint16_t minor_image_version;
|
|
__uint16_t major_subsystem_version;
|
|
__uint16_t minor_subsystem_version;
|
|
__uint32_t win32_version;
|
|
__uint32_t image_sz;
|
|
__uint32_t headers_sz;
|
|
__uint32_t checksum;
|
|
__uint16_t subsystem;
|
|
__uint16_t dll_characteristics;
|
|
__uint32_t stack_reserve_sz;
|
|
__uint32_t stack_commit_sz;
|
|
__uint32_t heap_reserve_sz;
|
|
__uint32_t heap_commit_sz;
|
|
__uint32_t loader_flags;
|
|
__uint32_t rva_and_sizes_nr;
|
|
struct {
|
|
__uint64_t export_table;
|
|
__uint64_t import_table;
|
|
__uint64_t resource_table;
|
|
__uint64_t exception_table;
|
|
__uint64_t certification_table;
|
|
__uint64_t base_relocation_table;
|
|
} data_directory;
|
|
} __packed;
|
|
|
|
/* Extra header for PE32+ format
|
|
* FIXME: There are additional fields in Microsoft PE COFF v8
|
|
*/
|
|
|
|
struct extra_hdr_pe32p {
|
|
__uint64_t image_base;
|
|
__uint32_t section_align;
|
|
__uint32_t file_align;
|
|
__uint16_t major_os_version;
|
|
__uint16_t minor_os_version;
|
|
__uint16_t major_image_version;
|
|
__uint16_t minor_image_version;
|
|
__uint16_t major_subsystem_version;
|
|
__uint16_t minor_subsystem_version;
|
|
__uint32_t win32_version;
|
|
__uint32_t image_sz;
|
|
__uint32_t headers_sz;
|
|
__uint32_t checksum;
|
|
__uint16_t subsystem;
|
|
__uint16_t dll_characteristics;
|
|
__uint64_t stack_reserve_sz;
|
|
__uint64_t stack_commit_sz;
|
|
__uint64_t heap_reserve_sz;
|
|
__uint64_t heap_commit_sz;
|
|
__uint32_t loader_flags;
|
|
__uint32_t rva_and_sizes_nr;
|
|
struct {
|
|
__uint64_t export_table;
|
|
__uint64_t import_table;
|
|
__uint64_t resource_table;
|
|
__uint64_t exception_table;
|
|
__uint64_t certification_table;
|
|
__uint64_t base_relocation_table;
|
|
} data_directory;
|
|
} __packed;
|
|
|
|
struct section {
|
|
__uint8_t name[8];
|
|
__uint32_t virtual_sz;
|
|
__uint32_t virtual_address;
|
|
__uint32_t raw_data_sz;
|
|
__uint32_t raw_data;
|
|
__uint32_t relocs;
|
|
__uint32_t line_numbers;
|
|
__uint16_t relocs_nr;
|
|
__uint16_t line_numbers_nr;
|
|
__uint32_t characteristics;
|
|
} __packed;
|
|
|
|
struct coff_reloc {
|
|
__uint32_t virtual_address;
|
|
__uint32_t symtab_index;
|
|
__uint16_t type;
|
|
};
|
|
|
|
#endif /* EFI_WRAPPER_H */
|