You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
216 lines
5.5 KiB
216 lines
5.5 KiB
/*
|
|
* w32dll-local.h -- w32dll.c internal header file
|
|
* Written by Andrew Church <achurch@achurch.org>
|
|
*
|
|
* This file is part of transcode, a video stream processing tool.
|
|
* transcode is free software, distributable under the terms of the GNU
|
|
* General Public License (version 2 or later). See the file COPYING
|
|
* for details.
|
|
*/
|
|
|
|
#ifndef W32DLL_LOCAL_H
|
|
#define W32DLL_LOCAL_H
|
|
|
|
/*************************************************************************/
|
|
|
|
/* Win-PE executable file structures. */
|
|
|
|
/************************************/
|
|
|
|
/* DOS executable header */
|
|
|
|
struct dos_header {
|
|
uint16_t signature; /* DOS_EXE_SIGNATURE */
|
|
uint16_t len_bytes; /* 1..512 */
|
|
uint16_t len_sectors;
|
|
uint16_t reloc_count;
|
|
uint16_t len_header;
|
|
uint16_t min_extra_mem;
|
|
uint16_t max_extra_mem;
|
|
uint16_t init_ss;
|
|
uint16_t init_sp;
|
|
uint16_t checksum;
|
|
uint16_t init_cs;
|
|
uint16_t init_ip;
|
|
uint16_t reloc_offset;
|
|
uint16_t overlay_num;
|
|
uint8_t ignore1C[0x20]; /* 0x1C..0x3B */
|
|
uint16_t winheader;
|
|
uint16_t ignore3E;
|
|
};
|
|
|
|
#define DOS_EXE_SIGNATURE 0x5A4D /* 'MZ' */
|
|
|
|
/************************************/
|
|
|
|
/* Win-PE executable headers (base and optional) */
|
|
|
|
enum rva_index {
|
|
RVA_EXPORT = 0,
|
|
RVA_IMPORT,
|
|
RVA_RESOURCE,
|
|
RVA_EXCEPTION,
|
|
RVA_CERTIFICATE,
|
|
RVA_BASE_RELOC,
|
|
RVA_DEBUG,
|
|
RVA_ARCH,
|
|
RVA_GLOBAL_PTR,
|
|
RVA_TLS_TABLE,
|
|
RVA_LOAD_CONFIG,
|
|
RVA_BOUND_IMPORT,
|
|
RVA_IMPORT_ADDR,
|
|
RVA_DELAY_IMPORT,
|
|
RVA_MAX
|
|
};
|
|
|
|
struct pe_header {
|
|
uint32_t signature; /* WIN_PE_SIGNATURE */
|
|
uint16_t arch; /* WIN_PE_ARCH_xxx */
|
|
uint16_t nsections;
|
|
uint32_t timestamp;
|
|
uint32_t sym_table_offset;
|
|
uint32_t nsyms;
|
|
uint16_t opt_header_size;
|
|
uint16_t flags; /* WIN_PE_FLAG_xxx */
|
|
};
|
|
struct pe_ext_header {
|
|
uint16_t magic; /* WIN_PE_OPT_MAGIC_xxx */
|
|
uint8_t linkver_major;
|
|
uint8_t linkver_minor;
|
|
uint32_t code_size;
|
|
uint32_t data_size;
|
|
uint32_t bss_size;
|
|
uint32_t entry_point;
|
|
uint32_t code_base;
|
|
uint32_t data_base;
|
|
uint32_t image_base; /* Code assumes it's loaded at this address */
|
|
uint32_t section_align;
|
|
uint32_t file_align;
|
|
uint16_t osver_major;
|
|
uint16_t osver_minor;
|
|
uint16_t imagever_major;
|
|
uint16_t imagever_minor;
|
|
uint16_t subsysver_major;
|
|
uint16_t subsysver_minor;
|
|
uint32_t win32_ver;
|
|
uint32_t image_size;
|
|
uint32_t header_size;
|
|
uint32_t checksum;
|
|
uint16_t subsystem;
|
|
uint16_t dll_flags; /* Ignored here */
|
|
uint32_t stack_reserve;
|
|
uint32_t stack_commit;
|
|
uint32_t heap_reserve;
|
|
uint32_t heap_commit;
|
|
uint32_t loader_flags;
|
|
uint32_t nrva;
|
|
struct {
|
|
uint32_t address;
|
|
uint32_t size;
|
|
} rva[RVA_MAX];
|
|
};
|
|
|
|
#define WIN_PE_SIGNATURE 0x00004550 /* 'PE\0\0' */
|
|
|
|
#define WIN_PE_ARCH_X86 0x014C /* Ignore the lower 2 bits for this */
|
|
#define WIN_PE_ARCH_IA64 0x0200
|
|
#define WIN_PE_ARCH_X86_64 0x8664
|
|
|
|
#define WIN_PE_FLAG_DLL 0x2000
|
|
|
|
#define WIN_PE_OPT_MAGIC_32 0x010B /* 32-bit code */
|
|
#define WIN_PE_OPT_MAGIC_64 0x020B /* 64-bit code */
|
|
|
|
/************************************/
|
|
|
|
/* Section table */
|
|
|
|
struct pe_section_header {
|
|
char name[8];
|
|
uint32_t virtsize;
|
|
uint32_t virtaddr;
|
|
uint32_t filesize;
|
|
uint32_t fileaddr;
|
|
uint32_t reloc_table;
|
|
uint32_t linenum_table;
|
|
uint16_t nrelocs;
|
|
uint16_t nlinenums;
|
|
uint32_t flags; /* SECTION_FLAG_xxx */
|
|
};
|
|
|
|
#define SECTION_FLAG_CODE 0x00000020
|
|
#define SECTION_FLAG_DATA 0x00000040
|
|
#define SECTION_FLAG_BSS 0x00000080
|
|
#define SECTION_FLAG_EXEC 0x20000000
|
|
#define SECTION_FLAG_READ 0x40000000
|
|
#define SECTION_FLAG_WRITE 0x80000000
|
|
|
|
/************************************/
|
|
|
|
/* Export directory */
|
|
|
|
struct export_directory {
|
|
uint32_t flags;
|
|
uint32_t timestamp;
|
|
uint16_t version_major;
|
|
uint16_t version_minor;
|
|
uint32_t name; /* Address of name in section */
|
|
uint32_t ordinal_base;
|
|
uint32_t nfuncs;
|
|
uint32_t nnames;
|
|
uint32_t func_table;
|
|
uint32_t name_table;
|
|
uint32_t name_ordinal_table;
|
|
};
|
|
|
|
/************************************/
|
|
|
|
/* Import directory */
|
|
|
|
struct import_directory {
|
|
uint32_t import_table;
|
|
uint32_t timestamp;
|
|
uint32_t forward;
|
|
uint32_t module_name;
|
|
uint32_t import_addr_table;
|
|
};
|
|
|
|
struct import_name_entry {
|
|
uint16_t hint;
|
|
char name[1]; /* As long as necessary, null-terminated */
|
|
};
|
|
|
|
/*************************************************************************/
|
|
|
|
/* Constants for the DllMain() function (entry point). */
|
|
#define DLL_PROCESS_DETACH 0
|
|
#define DLL_PROCESS_ATTACH 1
|
|
#define DLL_THREAD_ATTACH 2
|
|
#define DLL_THREAD_DETACH 3
|
|
|
|
/* Handle value for "this module" (FIXME: assumes only one module). */
|
|
#define HANDLE_DEFAULT 1
|
|
|
|
/*************************************************************************/
|
|
|
|
/* Internal function prototypes. */
|
|
|
|
extern void *w32dll_emu_import_by_name(const char *module,
|
|
const struct import_name_entry *name);
|
|
extern void *w32dll_emu_import_by_ordinal(const char *module,
|
|
uint32_t ordinal);
|
|
|
|
/*************************************************************************/
|
|
|
|
#endif /* W32DLL_LOCAL_H */
|
|
|
|
/*
|
|
* Local variables:
|
|
* c-file-style: "stroustrup"
|
|
* c-file-offsets: ((case-label . *) (statement-case-intro . *))
|
|
* indent-tabs-mode: nil
|
|
* End:
|
|
*
|
|
* vim: expandtab shiftwidth=4:
|
|
*/
|