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

/*
* 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:
*/