summaryrefslogtreecommitdiffstats
path: root/src/lib/kStuff/include/k/kLdrFmts/lx.h
blob: fc1d1e2136e2467588d9293ee8d102496ee89875 (plain)
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
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
/* $Id $ */
/** @file
 * LX structures, types and defines.
 */

/*
 * Copyright (c) 2006-2007 Knut St. Osmundsen <bird-kStuff-spamix@anduin.net>
 *
 * Permission is hereby granted, free of charge, to any person
 * obtaining a copy of this software and associated documentation
 * files (the "Software"), to deal in the Software without
 * restriction, including without limitation the rights to use,
 * copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following
 * conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 */

#ifndef ___k_kLdrFmts_lx_h___
#define ___k_kLdrFmts_lx_h___

#include <k/kDefs.h>
#include <k/kTypes.h>


#ifndef IMAGE_OS2_SIGNATURE_LX
/** LX signature ("LX") */
# define IMAGE_LX_SIGNATURE  K_LE2H_U16('L' | ('X' << 8))
#endif

#pragma pack(1)

/**
 * Linear eXecutable header.
 * This structure is exactly 196 bytes long.
 */
struct e32_exe
{
    KU8                 e32_magic[2];
    KU8                 e32_border;
    KU8                 e32_worder;
    KU32                e32_level;
    KU16                e32_cpu;
    KU16                e32_os;
    KU32                e32_ver;
    KU32                e32_mflags;
    KU32                e32_mpages;
    KU32                e32_startobj;
    KU32                e32_eip;
    KU32                e32_stackobj;
    KU32                e32_esp;
    KU32                e32_pagesize;
    KU32                e32_pageshift;
    /** The size of the fixup section.
     * The fixup section consists of the fixup page table, the fixup record table,
     * the import module table, and the import procedure name table.
     */
    KU32                e32_fixupsize;
    KU32                e32_fixupsum;
    /** The size of the resident loader section.
     * This includes the object table, the object page map table, the resource table, the resident name table,
     * the entry table, the module format directives table, and the page checksum table (?). */
    KU32                e32_ldrsize;
    /** The checksum of the loader section. 0 if not calculated. */
    KU32                e32_ldrsum;
    /** The offset of the object table relative to this structure. */
    KU32                e32_objtab;
    /** Count of objects. */
    KU32                e32_objcnt;
    /** The offset of the object page map table relative to this structure. */
    KU32                e32_objmap;
    /** The offset of the object iterated pages (whatever this is used for) relative to the start of the file. */
    KU32                e32_itermap;
    /** The offset of the resource table relative to this structure. */
    KU32                e32_rsrctab;
    /** The number of entries in the resource table. */
    KU32                e32_rsrccnt;
    /** The offset of the resident name table relative to this structure. */
    KU32                e32_restab;
    /** The offset of the entry (export) table relative to this structure. */
    KU32                e32_enttab;
    /** The offset of the module format directives table relative to this structure. */
    KU32                e32_dirtab;
    /** The number of entries in the module format directives table. */
    KU32                e32_dircnt;
    /** The offset of the fixup page table relative to this structure. */
    KU32                e32_fpagetab;
    /** The offset of the fixup record table relative to this structure. */
    KU32                e32_frectab;
    /** The offset of the import module name table relative to this structure. */
    KU32                e32_impmod;
    /** The number of entries in the import module name table. */
    KU32                e32_impmodcnt;
    /** The offset of the import procedure name table relative to this structure. */
    KU32                e32_impproc;
    /** The offset of the page checksum table relative to this structure. */
    KU32                e32_pagesum;
    /** The offset of the data pages relative to the start of the file. */
    KU32                e32_datapage;
    /** The number of preload pages (ignored). */
    KU32                e32_preload;
    /** The offset of the non-resident name table relative to the start of the file. */
    KU32                e32_nrestab;
    /** The size of the non-resident name table. */
    KU32                e32_cbnrestab;
    KU32                e32_nressum;
    KU32                e32_autodata;
    KU32                e32_debuginfo;
    KU32                e32_debuglen;
    KU32                e32_instpreload;
    KU32                e32_instdemand;
    KU32                e32_heapsize;
    KU32                e32_stacksize;
    KU8                 e32_res3[20];
};

/** e32_magic[0] */
#define E32MAGIC1       'L'
/** e32_magic[1] */
#define E32MAGIC2       'X'
/** MAKEWORD(e32_magic[0], e32_magic[1]) */
#define E32MAGIC        0x584c
/** e32_border - little endian */
#define E32LEBO         0
/** e32_border - big endian */
#define E32BEBO         1
/** e32_worder - little endian */
#define E32LEWO         0
/** e32_worder - big endian */
#define E32BEWO         1
/** e32_level */
#define E32LEVEL        KU32_C(0)
/** e32_cpu - 80286 */
#define E32CPU286       1
/** e32_cpu - 80386 */
#define E32CPU386       2
/** e32_cpu - 80486 */
#define E32CPU486       3
/** e32_pagesize */
#define OBJPAGELEN      KU32_C(0x1000)


/** @name e32_mflags
 * @{ */
/** App Type: Fullscreen only. */
#define E32NOPMW         KU32_C(0x00000100)
/** App Type: PM API. */
#define E32PMAPI         KU32_C(0x00000300)
/** App Type: PM VIO compatible. */
#define E32PMW           KU32_C(0x00000200)
/** Application type mask. */
#define E32APPMASK       KU32_C(0x00000300)
/** Executable module. */
#define E32MODEXE        KU32_C(0x00000000)
/** Dynamic link library (DLL / library) module. */
#define E32MODDLL        KU32_C(0x00008000)
/** Protected memory DLL. */
#define E32PROTDLL       KU32_C(0x00010000)
/** Physical Device Driver. */
#define E32MODPDEV       KU32_C(0x00020000)
/** Virtual Device Driver. */
#define E32MODVDEV       KU32_C(0x00028000)
/** Device driver */
#define E32DEVICE        E32MODPDEV
/** Dynamic link library (DLL / library) module. */
#define E32NOTP          E32MODDLL
/** Protected memory DLL. */
#define E32MODPROTDLL    (E32MODDLL | E32PROTDLL)
/** Module Type mask. */
#define E32MODMASK       KU32_C(0x00038000)
/** Not loadable (linker error). */
#define E32NOLOAD        KU32_C(0x00002000)
/** No internal fixups. */
#define E32NOINTFIX      KU32_C(0x00000010)
/** No external fixups (i.e. imports). */
#define E32NOEXTFIX      KU32_C(0x00000020)
/** System DLL, no internal fixups. */
#define E32SYSDLL        KU32_C(0x00000008)
/** Global (set) or per instance (cleared) library initialization. */
#define E32LIBINIT       KU32_C(0x00000004)
/** Global (set) or per instance (cleared) library termination. */
#define E32LIBTERM       KU32_C(0x40000000)
/** Indicates when set in an executable that the process isn't SMP safe. */
#define E32NOTMPSAFE     KU32_C(0x00080000)
/** @} */

/** @name Relocations (aka Fixups).
 * @{ */
typedef union _offset
{
    KU16                offset16;
    KU32                offset32;
} offset;

/** A relocation.
 * @remark this structure isn't very usable since LX relocations comes in too many size variations.
 */
struct r32_rlc
{
    KU8                 nr_stype;
    KU8                 nr_flags;
    KI16                r32_soff;
    KU16                r32_objmod;

    union targetid
    {
        offset          intref;
        union extfixup
        {
            offset      proc;
            KU32        ord;
        } extref;
        struct addfixup
        {
            KU16        entry;
            offset      addval;
        } addfix;
    } r32_target;
    KU16                r32_srccount;
    KU16                r32_chain;
};

/** @name Some attempt at size constanstants.
 * @{
 */
#define RINTSIZE16      8
#define RINTSIZE32      10
#define RORDSIZE        8
#define RNAMSIZE16      8
#define RNAMSIZE32      10
#define RADDSIZE16      10
#define RADDSIZE32      12
/** @} */

/** @name nr_stype (source flags)
 * @{ */
#define NRSBYT          0x00
#define NRSSEG          0x02
#define NRSPTR          0x03
#define NRSOFF          0x05
#define NRPTR48         0x06
#define NROFF32         0x07
#define NRSOFF32        0x08
#define NRSTYP          0x0f
#define NRSRCMASK       0x0f
#define NRALIAS         0x10
#define NRCHAIN         0x20
/** @} */

/** @name nr_flags (target flags)
 * @{ */
#define NRRINT          0x00
#define NRRORD          0x01
#define NRRNAM          0x02
#define NRRENT          0x03
#define NRRTYP          0x03
#define NRADD           0x04
#define NRICHAIN        0x08
#define NR32BITOFF      0x10
#define NR32BITADD      0x20
#define NR16OBJMOD      0x40
#define NR8BITORD       0x80
/** @} */

/** @} */


/** @name The Object Table (aka segment table)
 * @{ */

/** The Object Table Entry. */
struct o32_obj
{
    /** The size of the object. */
    KU32                o32_size;
    /** The base address of the object. */
    KU32                o32_base;
    /** Object flags. */
    KU32                o32_flags;
    /** Page map index. */
    KU32                o32_pagemap;
    /** Page map size. (doesn't need to be o32_size >> page shift). */
    KU32                o32_mapsize;
    /** Reserved */
    KU32                o32_reserved;
};

/** @name o32_flags
 * @{ */
/** Read access. */
#define OBJREAD         KU32_C(0x00000001)
/** Write access. */
#define OBJWRITE        KU32_C(0x00000002)
/** Execute access. */
#define OBJEXEC         KU32_C(0x00000004)
/** Resource object. */
#define OBJRSRC         KU32_C(0x00000008)
/** The object is discarable (i.e. don't swap, just load in pages from the executable).
 * This overlaps a bit with object type. */
#define OBJDISCARD      KU32_C(0x00000010)
/** The object is shared. */
#define OBJSHARED       KU32_C(0x00000020)
/** The object has preload pages. */
#define OBJPRELOAD      KU32_C(0x00000040)
/** The object has invalid pages. */
#define OBJINVALID      KU32_C(0x00000080)
/** Non-permanent, link386 bug. */
#define LNKNONPERM      KU32_C(0x00000600)
/** Non-permanent, correct 'value'. */
#define OBJNONPERM      KU32_C(0x00000000)
/** Obj Type: The object is permanent and swappable. */
#define OBJPERM         KU32_C(0x00000100)
/** Obj Type: The object is permanent and resident (i.e. not swappable). */
#define OBJRESIDENT     KU32_C(0x00000200)
/** Obj Type: The object is resident and contigious. */
#define OBJCONTIG       KU32_C(0x00000300)
/** Obj Type: The object is permanent and long locable. */
#define OBJDYNAMIC      KU32_C(0x00000400)
/** Object type mask. */
#define OBJTYPEMASK     KU32_C(0x00000700)
/** x86: The object require an 16:16 alias. */
#define OBJALIAS16      KU32_C(0x00001000)
/** x86: Big/Default selector setting, i.e. toggle 32-bit or 16-bit. */
#define OBJBIGDEF       KU32_C(0x00002000)
/** x86: conforming selector setting (weird stuff). */
#define OBJCONFORM      KU32_C(0x00004000)
/** x86: IOPL. */
#define OBJIOPL         KU32_C(0x00008000)
/** @} */

/** A Object Page Map Entry. */
struct o32_map
{
    /** The file offset of the page. */
    KU32                o32_pagedataoffset;
    /** The number of bytes of raw page data. */
    KU16                o32_pagesize;
    /** Per page flags describing how the page is encoded in the file. */
    KU16                o32_pageflags;
};

/** @name o32 o32_pageflags
 * @{
 */
/** Raw page (uncompressed) in the file. */
#define VALID           KU16_C(0x0000)
/** RLE encoded page in file. */
#define ITERDATA        KU16_C(0x0001)
/** Invalid page, nothing in the file. */
#define INVALID         KU16_C(0x0002)
/** Zero page, nothing in file. */
#define ZEROED          KU16_C(0x0003)
/** range of pages (what is this?) */
#define RANGE           KU16_C(0x0004)
/** Compressed page in file. */
#define ITERDATA2       KU16_C(0x0005)
/** @} */


/** Iteration Record format (RLE compressed page). */
struct LX_Iter
{
    /** Number of iterations. */
    KU16                LX_nIter;
    /** The number of bytes that's being iterated. */
    KU16                LX_nBytes;
    /** The bytes. */
    KU8                 LX_Iterdata;
};

/** @} */


/** A Resource Table Entry */
struct rsrc32
{
    /** Resource Type. */
    KU16                type;
    /** Resource ID. */
    KU16                name;
    /** Resource size in bytes. */
    KU32                cb;
    /** The index of the object containing the resource. */
    KU16                obj;
    /** Offset of the resource that within the object. */
    KU32                offset;
};


/** @name The Entry Table (aka Export Table)
 * @{ */

/** Entry bundle.
 * Header descripting up to 255 entries that follows immediatly after this structure. */
struct b32_bundle
{
    /** The number of entries. */
    KU8                 b32_cnt;
    /** The type of bundle. */
    KU8                 b32_type;
    /** The index of the object containing these entry points. */
    KU16                b32_obj;
};

/** @name b32_type
 * @{ */
/** Empty bundle, filling up unused ranges of ordinals. */
#define EMPTY           0x00
/** 16-bit offset entry point. */
#define ENTRY16         0x01
/** 16-bit callgate entry point. */
#define GATE16          0x02
/** 32-bit offset entry point. */
#define ENTRY32         0x03
/** Forwarder entry point. */
#define ENTRYFWD        0x04
/** Typing information present indicator. */
#define TYPEINFO        0x80
/** @} */


/** Entry point. */
struct e32_entry
{
    /** Entry point flags */
    KU8                 e32_flags;      /* Entry point flags */
    union entrykind
    {
        /** ENTRY16 or ENTRY32. */
        offset          e32_offset;
        /** GATE16 */
        struct callgate
        {
            /** Offset into segment. */
            KU16        offset;
            /** The callgate selector */
            KU16        callgate;
        } e32_callgate;
        /** ENTRYFWD */
        struct fwd
        {
            /** Module ordinal number (i.e. into the import module table). */
            KU16        modord;
            /** Procedure name or ordinal number. */
            KU32        value;
        } e32_fwd;
    } e32_variant;
};

/** @name e32_flags
 * @{ */
/** Exported entry (set) or private entry (clear). */
#define E32EXPORT       0x01
/** Uses shared data. */
#define E32SHARED       0x02
/** Parameter word count mask. */
#define E32PARAMS       0xf8
/** ENTRYFWD: Imported by ordinal (set) or by name (clear). */
#define FWD_ORDINAL     0x01
/** @} */

/** @name dunno
 * @{ */
#define FIXENT16        3
#define FIXENT32        5
#define GATEENT16       5
#define FWDENT          7
/** @} */

#pragma pack()

#endif