Index: /trunk/include/iprt/formats/lx.h
===================================================================
--- /trunk/include/iprt/formats/lx.h	(revision 74637)
+++ /trunk/include/iprt/formats/lx.h	(revision 74637)
@@ -0,0 +1,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
+
