Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wine-mirror
GitHub Repository: wine-mirror/wine
Path: blob/master/tools/winedump/le.c
4389 views
1
/*
2
* Dumping of LE binaries
3
*
4
* Copyright 2004 Robert Reif
5
*
6
* This library is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU Lesser General Public
8
* License as published by the Free Software Foundation; either
9
* version 2.1 of the License, or (at your option) any later version.
10
*
11
* This library is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* Lesser General Public License for more details.
15
*
16
* You should have received a copy of the GNU Lesser General Public
17
* License along with this library; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19
*/
20
21
#include "config.h"
22
23
#include <fcntl.h>
24
#include <stdarg.h>
25
#include <stdio.h>
26
27
#include "windef.h"
28
#include "winbase.h"
29
#include "winedump.h"
30
31
struct o32_obj
32
{
33
unsigned int o32_size;
34
unsigned int o32_base;
35
unsigned int o32_flags;
36
unsigned int o32_pagemap;
37
unsigned int o32_mapsize;
38
char o32_name[4];
39
};
40
41
struct o32_map
42
{
43
unsigned short o32_pagedataoffset;
44
unsigned char o32_pagesize;
45
unsigned char o32_pageflags;
46
};
47
48
struct b32_bundle
49
{
50
unsigned char b32_cnt;
51
unsigned char b32_type;
52
};
53
54
struct vxd_descriptor
55
{
56
unsigned int next;
57
unsigned short sdk_version;
58
unsigned short device_number;
59
unsigned char version_major;
60
unsigned char version_minor;
61
unsigned short flags;
62
char name[8];
63
unsigned int init_order;
64
unsigned int ctrl_ofs;
65
unsigned int v86_ctrl_ofs;
66
unsigned int pm_ctrl_ofs;
67
unsigned int v86_ctrl_csip;
68
unsigned int pm_ctrl_csip;
69
unsigned int rm_ref_data;
70
unsigned int service_table_ofs;
71
unsigned int service_table_size;
72
unsigned int win32_service_table_ofs;
73
unsigned int prev;
74
unsigned int size;
75
unsigned int reserved0;
76
unsigned int reserved1;
77
unsigned int reserved2;
78
};
79
80
static inline WORD get_word( const BYTE *ptr )
81
{
82
return ptr[0] | (ptr[1] << 8);
83
}
84
85
static void dump_le_header( const IMAGE_VXD_HEADER *le )
86
{
87
printf( "File header:\n" );
88
printf( " Magic: %04x (%c%c)\n",
89
le->e32_magic, LOBYTE(le->e32_magic), HIBYTE(le->e32_magic));
90
printf( " Byte order: %s\n",
91
le->e32_border == 0 ? "little-indian" : "big-endian");
92
printf( " Word order: %s\n",
93
le->e32_worder == 0 ? "little-indian" : "big-endian");
94
printf( " Executable format level: %d\n", (UINT)le->e32_level);
95
printf( " CPU type: %s\n",
96
le->e32_cpu == 0x01 ? "Intel 80286" :
97
le->e32_cpu == 0x02 ? "Intel 80386" :
98
le->e32_cpu == 0x03 ? "Intel 80486" :
99
le->e32_cpu == 0x04 ? "Intel 80586" :
100
le->e32_cpu == 0x20 ? "Intel i860 (N10)" :
101
le->e32_cpu == 0x21 ? "Intel i860 (N11)" :
102
le->e32_cpu == 0x40 ? "MIPS Mark I" :
103
le->e32_cpu == 0x41 ? "MIPS Mark II" :
104
le->e32_cpu == 0x42 ? "MIPS Mark III" :
105
"Unknown");
106
printf( " Target operating system: %s\n",
107
le->e32_os == 0x01 ? "OS/2" :
108
le->e32_os == 0x02 ? "Windows" :
109
le->e32_os == 0x03 ? "DOS 4.x" :
110
le->e32_os == 0x04 ? "Windows 386" :
111
"Unknown");
112
printf( " Module version: %d\n", (UINT)le->e32_ver);
113
printf( " Module type flags: %08x\n", (UINT)le->e32_mflags);
114
if (le->e32_mflags & 0x8000)
115
{
116
if (le->e32_mflags & 0x0004)
117
printf( " Global initialization\n");
118
else
119
printf( " Per-Process initialization\n");
120
if (le->e32_mflags & 0x0010)
121
printf( " No internal fixup\n");
122
if (le->e32_mflags & 0x0020)
123
printf( " No external fixup\n");
124
if ((le->e32_mflags & 0x0700) == 0x0100)
125
printf( " Incompatible with PM windowing\n");
126
else if ((le->e32_mflags & 0x0700) == 0x0200)
127
printf( " Compatible with PM windowing\n");
128
else if ((le->e32_mflags & 0x0700) == 0x0300)
129
printf( " Uses PM windowing API\n");
130
if (le->e32_mflags & 0x2000)
131
printf( " Module not loadable\n");
132
if (le->e32_mflags & 0x8000)
133
printf( " Module is DLL\n");
134
}
135
printf( " Number of memory pages: %d\n", (UINT)le->e32_mpages);
136
printf( " Initial object CS number: %08x\n", (UINT)le->e32_startobj);
137
printf( " Initial EIP: %08x\n", (UINT)le->e32_eip);
138
printf( " Initial object SS number: %08x\n", (UINT)le->e32_stackobj);
139
printf( " Initial ESP: %08x\n", (UINT)le->e32_esp);
140
printf( " Memory page size: %d\n", (UINT)le->e32_pagesize);
141
printf( " Bytes on last page: %d\n", (UINT)le->e32_lastpagesize);
142
printf( " Fix-up section size: %d\n", (UINT)le->e32_fixupsize);
143
printf( " Fix-up section checksum: %08x\n", (UINT)le->e32_fixupsum);
144
printf( " Loader section size: %d\n", (UINT)le->e32_ldrsize);
145
printf( " Loader section checksum: %08x\n", (UINT)le->e32_ldrsum);
146
printf( " Offset of object table: %08x\n", (UINT)le->e32_objtab);
147
printf( " Object table entries: %d\n", (UINT)le->e32_objcnt);
148
printf( " Object page map offset: %08x\n", (UINT)le->e32_objmap);
149
printf( " Object iterate data map offset: %08x\n", (UINT)le->e32_itermap);
150
printf( " Resource table offset: %08x\n", (UINT)le->e32_rsrctab);
151
printf( " Resource table entries: %d\n", (UINT)le->e32_rsrccnt);
152
printf( " Resident names table offset: %08x\n", (UINT)le->e32_restab);
153
printf( " Entry table offset: %08x\n", (UINT)le->e32_enttab);
154
printf( " Module directives table offset: %08x\n", (UINT)le->e32_dirtab);
155
printf( " Module directives entries: %d\n", (UINT)le->e32_dircnt);
156
printf( " Fix-up page table offset: %08x\n", (UINT)le->e32_fpagetab);
157
printf( " Fix-up record table offset: %08x\n", (UINT)le->e32_frectab);
158
printf( " Imported modules name table offset: %08x\n", (UINT)le->e32_impmod);
159
printf( " Imported modules count: %d\n", (UINT)le->e32_impmodcnt);
160
printf( " Imported procedure name table offset: %08x\n", (UINT)le->e32_impproc);
161
printf( " Per-page checksum table offset: %08x\n", (UINT)le->e32_pagesum);
162
printf( " Data pages offset from top of table: %08x\n", (UINT)le->e32_datapage);
163
printf( " Preload page count: %08x\n", (UINT)le->e32_preload);
164
printf( " Non-resident names table offset: %08x\n", (UINT)le->e32_nrestab);
165
printf( " Non-resident names table length: %d\n", (UINT)le->e32_cbnrestab);
166
printf( " Non-resident names table checksum: %08x\n", (UINT)le->e32_nressum);
167
printf( " Automatic data object: %08x\n", (UINT)le->e32_autodata);
168
printf( " Debug information offset: %08x\n", (UINT)le->e32_debuginfo);
169
printf( " Debug information length: %d\n", (UINT)le->e32_debuglen);
170
printf( " Preload instance pages number: %d\n", (UINT)le->e32_instpreload);
171
printf( " Demand instance pages number: %d\n", (UINT)le->e32_instdemand);
172
printf( " Extra heap allocation: %d\n", (UINT)le->e32_heapsize);
173
printf( " VxD resource table offset: %08x\n", (UINT)le->e32_winresoff);
174
printf( " Size of VxD resource table: %d\n", (UINT)le->e32_winreslen);
175
printf( " VxD identifier: %x\n", (UINT)le->e32_devid);
176
printf( " VxD DDK version: %x\n", (UINT)le->e32_ddkver);
177
}
178
179
static void dump_le_objects( const IMAGE_VXD_HEADER *le )
180
{
181
const struct o32_obj *pobj;
182
unsigned int i;
183
184
printf("\nObject table:\n");
185
pobj = (const struct o32_obj *)((const unsigned char *)le + le->e32_objtab);
186
for (i = 0; i < le->e32_objcnt; i++)
187
{
188
unsigned int j;
189
const struct o32_map *pmap=0;
190
191
printf(" Obj. Rel.Base Codesize Flags Tableidx Tablesize Name\n");
192
printf(" %04X %08x %08x %08x %08x %08x ", i + 1,
193
pobj->o32_base, pobj->o32_size, pobj->o32_flags,
194
pobj->o32_pagemap, pobj->o32_mapsize);
195
for (j = 0; j < 4; j++)
196
{
197
if (isprint(pobj->o32_name[j]))
198
printf("%c", pobj->o32_name[j]);
199
else
200
printf(".");
201
}
202
printf("\n");
203
204
if(pobj->o32_flags & 0x0001)
205
printf("\tReadable\n");
206
if(pobj->o32_flags & 0x0002)
207
printf("\tWritable\n");
208
if(pobj->o32_flags & 0x0004)
209
printf("\tExecutable\n");
210
if(pobj->o32_flags & 0x0008)
211
printf("\tResource\n");
212
if(pobj->o32_flags & 0x0010)
213
printf("\tDiscardable\n");
214
if(pobj->o32_flags & 0x0020)
215
printf("\tShared\n");
216
if(pobj->o32_flags & 0x0040)
217
printf("\tPreloaded\n");
218
if(pobj->o32_flags & 0x0080)
219
printf("\tInvalid\n");
220
if(pobj->o32_flags & 0x2000)
221
printf("\tUse 32\n");
222
223
printf(" Page tables:\n");
224
printf(" Tableidx Offset Flags\n");
225
pmap = (const struct o32_map *)((const unsigned char *)le + le->e32_objmap);
226
pmap = &(pmap[pobj->o32_pagemap - 1]);
227
for (j = 0; j < pobj->o32_mapsize; j++)
228
{
229
printf(" %08x %06x %02x\n",
230
pobj->o32_pagemap + j,
231
(pmap->o32_pagedataoffset << 8) + pmap->o32_pagesize,
232
(int)pmap->o32_pageflags);
233
pmap++;
234
}
235
pobj++;
236
}
237
}
238
239
static void dump_le_names( const IMAGE_VXD_HEADER *le )
240
{
241
const unsigned char *pstr = (const unsigned char *)le + le->e32_restab;
242
243
printf( "\nResident name table:\n" );
244
while (*pstr)
245
{
246
printf( " %4d: %*.*s\n", get_word(pstr + *pstr + 1), *pstr, *pstr,
247
pstr + 1 );
248
pstr += *pstr + 1 + sizeof(WORD);
249
}
250
if (le->e32_cbnrestab)
251
{
252
printf( "\nNon-resident name table:\n" );
253
pstr = PRD(le->e32_nrestab, 0);
254
while (*pstr)
255
{
256
printf( " %4d: %*.*s\n", get_word(pstr + *pstr + 1), *pstr, *pstr,
257
pstr + 1 );
258
pstr += *pstr + 1 + sizeof(WORD);
259
}
260
}
261
}
262
263
static void dump_le_resources( const IMAGE_VXD_HEADER *le )
264
{
265
printf( "\nResources:\n" );
266
printf( " Not Implemented\n" );
267
}
268
269
static void dump_le_modules( const IMAGE_VXD_HEADER *le )
270
{
271
printf( "\nImported modulename table:\n" );
272
printf( " Not Implemented\n" );
273
}
274
275
static void dump_le_entries( const IMAGE_VXD_HEADER *le )
276
{
277
printf( "\nEntry table:\n" );
278
printf( " Not Implemented\n" );
279
}
280
281
static void dump_le_fixups( const IMAGE_VXD_HEADER *le )
282
{
283
printf( "\nFixup table:\n" );
284
printf( " Not Implemented\n" );
285
}
286
287
static void dump_le_VxD( const IMAGE_VXD_HEADER *le )
288
{
289
printf( "\nVxD descriptor:\n" );
290
printf( " Not Implemented\n" );
291
}
292
293
void le_dump( void )
294
{
295
const IMAGE_DOS_HEADER *dos;
296
const IMAGE_VXD_HEADER *le;
297
298
dos = PRD(0, sizeof(*dos));
299
if (!dos) return;
300
le = PRD(dos->e_lfanew, sizeof(*le));
301
302
dump_le_header( le );
303
dump_le_objects( le );
304
dump_le_resources( le );
305
dump_le_names( le );
306
dump_le_entries( le );
307
dump_le_modules( le );
308
dump_le_fixups( le );
309
dump_le_VxD( le );
310
}
311
312