1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
|
/*
* 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:
*/
|