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
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
/*
* Winedump - A Wine DLL tool
*
* Copyright 2000 Jon Griffiths
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*
* References:
* DLL symbol extraction based on file format from alib (anthonyw.cjb.net).
*
* Option processing shamelessly cadged from winebuild.
*
* All the cool functionality (prototyping, call tracing, forwarding)
* relies on Patrik Stridvall's 'function_grep.pl' script to work.
*
* http://www.kegel.com/mangle.html
* Gives information on the name mangling scheme used by MS compilers,
* used as the starting point for the code here. Contains a few
* mistakes and some incorrect assumptions, but the lists of types
* are pure gold.
*/
#ifndef __WINE_WINEDUMP_H
#define __WINE_WINEDUMP_H
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include <assert.h>
#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
/* Argument type constants */
#define MAX_FUNCTION_ARGS 32
#define ARG_VOID 0x0
#define ARG_STRING 0x1
#define ARG_WIDE_STRING 0x2
#define ARG_POINTER 0x3
#define ARG_LONG 0x4
#define ARG_DOUBLE 0x5
#define ARG_STRUCT 0x6 /* By value */
#define ARG_FLOAT 0x7
#define ARG_VARARGS 0x8
/* Compound type flags */
#define CT_BY_REFERENCE 0x1
#define CT_VOLATILE 0x2
#define CT_CONST 0x4
#define CT_EXTENDED 0x8
/* symbol flags */
#define SYM_CDECL 0x1
#define SYM_STDCALL 0x2
#define SYM_THISCALL 0x4
#define SYM_DATA 0x8 /* Data, not a function */
typedef enum {NONE, DMGL, SPEC, DUMP} Mode;
/* Structure holding a parsed symbol */
typedef struct __parsed_symbol
{
char *symbol;
int ordinal;
char *return_text;
char return_type;
char *function_name;
int varargs;
unsigned int argc;
unsigned int flags;
char arg_type [MAX_FUNCTION_ARGS];
char arg_flag [MAX_FUNCTION_ARGS];
char *arg_text [MAX_FUNCTION_ARGS];
char *arg_name [MAX_FUNCTION_ARGS];
} parsed_symbol;
/* FIXME: Replace with some hash such as GHashTable */
typedef struct __search_symbol
{
struct __search_symbol *next;
BOOL found;
char symbolname[1]; /* static string, be ANSI C compliant by [1] */
} search_symbol;
/* All globals */
typedef struct __globals
{
Mode mode; /* SPEC, DEMANGLE or DUMP */
/* Options: generic */
BOOL do_quiet; /* -q */
BOOL do_verbose; /* -v */
/* Option arguments: generic */
const char *input_name; /* */
const char *input_module; /* input module name generated after input_name according mode */
/* Options: spec mode */
BOOL do_code; /* -c, -t, -f */
BOOL do_trace; /* -t, -f */
BOOL do_cdecl; /* -C */
BOOL do_documentation; /* -D */
/* Options: dump mode */
BOOL do_demangle; /* -d */
BOOL do_dumpheader; /* -f */
BOOL do_dump_rawdata; /* -x */
BOOL do_debug; /* -G == 1, -g == 2 */
BOOL do_symbol_table; /* -t */
/* Option arguments: spec mode */
int start_ordinal; /* -s */
int end_ordinal; /* -e */
search_symbol *search_symbol; /* -S */
char *directory; /* -I */
const char *forward_dll; /* -f */
const char *dll_name; /* -o */
const char *uc_dll_name; /* -o */
/* Option arguments: dump mode */
const char *dumpsect; /* -j */
} _globals;
extern _globals globals;
/* Names to use for output DLL */
#define OUTPUT_DLL_NAME \
(globals.dll_name ? globals.dll_name : (globals.input_module ? globals.input_module : globals.input_name))
#define OUTPUT_UC_DLL_NAME globals.uc_dll_name
/* Verbosity levels */
#define QUIET (globals.do_quiet)
#define NORMAL (!QUIET)
#define VERBOSE (globals.do_verbose)
/* Default calling convention */
#define CALLING_CONVENTION (globals.do_cdecl ? SYM_CDECL : SYM_STDCALL)
/* Image functions */
void dump_file(const char* name);
/* DLL functions */
BOOL dll_open (const char *dll_name);
BOOL dll_next_symbol (parsed_symbol * sym);
/* Symbol functions */
void symbol_init(parsed_symbol* symbol, const char* name);
BOOL symbol_demangle (parsed_symbol *symbol);
BOOL symbol_search (parsed_symbol *symbol);
void symbol_clear(parsed_symbol *sym);
BOOL symbol_is_valid_c(const parsed_symbol *sym);
const char *symbol_get_call_convention(const parsed_symbol *sym);
const char *symbol_get_spec_type (const parsed_symbol *sym, size_t arg);
void symbol_clean_string (char *string);
int symbol_get_type (const char *string);
/* Output functions */
void output_spec_preamble (void);
void output_spec_symbol (const parsed_symbol *sym);
void output_header_preamble (void);
void output_header_symbol (const parsed_symbol *sym);
void output_c_preamble (void);
void output_c_symbol (const parsed_symbol *sym);
void output_prototype (FILE *file, const parsed_symbol *sym);
void output_makefile (void);
/* Misc functions */
char *str_create (size_t num_str, ...);
char *str_create_num (size_t num_str, int num, ...);
char *str_substring(const char *start, const char *end);
char *str_replace (char *str, const char *oldstr, const char *newstr);
const char *str_match (const char *str, const char *match, BOOL *found);
const char *str_find_set (const char *str, const char *findset);
char *str_toupper (char *str);
const char *get_machine_str(int mach);
/* file dumping functions */
enum FileSig {SIG_UNKNOWN, SIG_DOS, SIG_PE, SIG_DBG, SIG_PDB, SIG_NE, SIG_LE, SIG_MDMP, SIG_COFFLIB, SIG_LNK,
SIG_EMF, SIG_FNT, SIG_TLB};
const void* PRD(unsigned long prd, unsigned long len);
unsigned long Offset(const void* ptr);
typedef void (*file_dumper)(void);
BOOL dump_analysis(const char*, file_dumper, enum FileSig);
void dump_data( const unsigned char *ptr, unsigned int size, const char *prefix );
const char* get_time_str( unsigned long );
unsigned int strlenW( const unsigned short *str );
void dump_unicode_str( const unsigned short *str, int len );
const char* get_guid_str(const GUID* guid);
const char* get_symbol_str(const char* symname);
void print_fake_dll(void);
void dump_file_header(const IMAGE_FILE_HEADER *);
void dump_optional_header(const IMAGE_OPTIONAL_HEADER32 *, UINT);
void dump_section(const IMAGE_SECTION_HEADER *, const char* strtable);
enum FileSig get_kind_exec(void);
void dos_dump( void );
void pe_dump( void );
void ne_dump( void );
void le_dump( void );
enum FileSig get_kind_mdmp(void);
void mdmp_dump( void );
enum FileSig get_kind_lib(void);
void lib_dump( void );
enum FileSig get_kind_dbg(void);
void dbg_dump( void );
enum FileSig get_kind_lnk(void);
void lnk_dump( void );
enum FileSig get_kind_emf(void);
void emf_dump( void );
enum FileSig get_kind_pdb(void);
void pdb_dump(void);
enum FileSig get_kind_fnt(void);
void fnt_dump( void );
enum FileSig get_kind_tlb(void);
void tlb_dump(void);
BOOL codeview_dump_symbols(const void* root, unsigned long size);
BOOL codeview_dump_types_from_offsets(const void* table, const DWORD* offsets, unsigned num_types);
BOOL codeview_dump_types_from_block(const void* table, unsigned long len);
void codeview_dump_linetab(const char* linetab, BOOL pascal_str, const char* pfx);
void codeview_dump_linetab2(const char* linetab, DWORD size, const char* strimage, DWORD strsize, const char* pfx);
void dump_stabs(const void* pv_stabs, unsigned szstabs, const char* stabstr, unsigned szstr);
void dump_codeview(unsigned long ptr, unsigned long len);
void dump_coff(unsigned long coffbase, unsigned long len,
const IMAGE_SECTION_HEADER *sectHead);
void dump_coff_symbol_table(const IMAGE_SYMBOL *coff_symbols, unsigned num_sym,
const IMAGE_SECTION_HEADER *sectHead);
void dump_frame_pointer_omission(unsigned long base, unsigned long len);
FILE *open_file (const char *name, const char *ext, const char *mode);
#ifdef __GNUC__
void do_usage (const char *arg) __attribute__ ((noreturn));
void fatal (const char *message) __attribute__ ((noreturn));
#else
void do_usage (const char *arg);
void fatal (const char *message);
#endif
#endif /* __WINE_WINEDUMP_H */