Logo Search packages:      
Sourcecode: virtualbox-ose version File versions  Download package

lx.h

Go to the documentation of this file.
/* $Id $ */
/** @file
 * LX structures, types and defines.
 */

#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") */
00015 # define IMAGE_LX_SIGNATURE  K_LE2H_U16('L' | ('X' << 8))
#endif

#pragma pack(1)

/**
 * Linear eXecutable header.
 * This structure is exactly 196 bytes long.
 */
00024 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.
     */
00045     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 (?). */
00050     KU32                e32_ldrsize;
    /** The checksum of the loader section. 0 if not calculated. */
00052     KU32                e32_ldrsum;
    /** The offset of the object table relative to this structure. */
00054     KU32                e32_objtab;
    /** Count of objects. */
00056     KU32                e32_objcnt;
    /** The offset of the object page map table relative to this structure. */
00058     KU32                e32_objmap;
    /** The offset of the object iterated pages (whatever this is used for) relative to the start of the file. */
00060     KU32                e32_itermap;
    /** The offset of the resource table relative to this structure. */
00062     KU32                e32_rsrctab;
    /** The number of entries in the resource table. */
00064     KU32                e32_rsrccnt;
    /** The offset of the resident name table relative to this structure. */
00066     KU32                e32_restab;
    /** The offset of the entry (export) table relative to this structure. */
00068     KU32                e32_enttab;
    /** The offset of the module format directives table relative to this structure. */
00070     KU32                e32_dirtab;
    /** The number of entries in the module format directives table. */
00072     KU32                e32_dircnt;
    /** The offset of the fixup page table relative to this structure. */
00074     KU32                e32_fpagetab;
    /** The offset of the fixup record table relative to this structure. */
00076     KU32                e32_frectab;
    /** The offset of the import module name table relative to this structure. */
00078     KU32                e32_impmod;
    /** The number of entries in the import module name table. */
00080     KU32                e32_impmodcnt;
    /** The offset of the import procedure name table relative to this structure. */
00082     KU32                e32_impproc;
    /** The offset of the page checksum table relative to this structure. */
00084     KU32                e32_pagesum;
    /** The offset of the data pages relative to the start of the file. */
00086     KU32                e32_datapage;
    /** The number of preload pages (ignored). */
00088     KU32                e32_preload;
    /** The offset of the non-resident name table relative to the start of the file. */
00090     KU32                e32_nrestab;
    /** The size of the non-resident name table. */
00092     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] */
00105 #define E32MAGIC1       'L'
/** e32_magic[1] */
00107 #define E32MAGIC2       'X'
/** MAKEWORD(e32_magic[0], e32_magic[1]) */
00109 #define E32MAGIC        0x584c
/** e32_border - little endian */
00111 #define E32LEBO         0
/** e32_border - big endian */
00113 #define E32BEBO         1
/** e32_worder - little endian */
00115 #define E32LEWO         0
/** e32_worder - big endian */
00117 #define E32BEWO         1
/** e32_level */
00119 #define E32LEVEL        KU32_C(0)
/** e32_cpu - 80286 */
00121 #define E32CPU286       1
/** e32_cpu - 80386 */
00123 #define E32CPU386       2
/** e32_cpu - 80486 */
00125 #define E32CPU486       3
/** e32_pagesize */
00127 #define OBJPAGELEN      KU32_C(0x1000)


/** @name e32_mflags
 * @{ */
/** App Type: Fullscreen only. */
00133 #define E32NOPMW         KU32_C(0x00000100)
/** App Type: PM API. */
00135 #define E32PMAPI         KU32_C(0x00000300)
/** App Type: PM VIO compatible. */
00137 #define E32PMW           KU32_C(0x00000200)
/** Application type mask. */
00139 #define E32APPMASK       KU32_C(0x00000300)
/** Executable module. */
00141 #define E32MODEXE        KU32_C(0x00000000)
/** Dynamic link library (DLL / library) module. */
00143 #define E32MODDLL        KU32_C(0x00008000)
/** Protected memory DLL. */
00145 #define E32PROTDLL       KU32_C(0x00010000)
/** Physical Device Driver. */
00147 #define E32MODPDEV       KU32_C(0x00020000)
/** Virtual Device Driver. */
00149 #define E32MODVDEV       KU32_C(0x00028000)
/** Device driver */
00151 #define E32DEVICE        E32MODPDEV
/** Dynamic link library (DLL / library) module. */
00153 #define E32NOTP          E32MODDLL
/** Protected memory DLL. */
00155 #define E32MODPROTDLL    (E32MODDLL | E32PROTDLL)
/** Module Type mask. */
00157 #define E32MODMASK       KU32_C(0x00038000)
/** Not loadable (linker error). */
00159 #define E32NOLOAD        KU32_C(0x00002000)
/** No internal fixups. */
00161 #define E32NOINTFIX      KU32_C(0x00000010)
/** No external fixups (i.e. imports). */
00163 #define E32NOEXTFIX      KU32_C(0x00000020)
/** System DLL, no internal fixups. */
00165 #define E32SYSDLL        KU32_C(0x00000008)
/** Global (set) or per instance (cleared) library initialization. */
00167 #define E32LIBINIT       KU32_C(0x00000004)
/** Global (set) or per instance (cleared) library termination. */
00169 #define E32LIBTERM       KU32_C(0x40000000)
/** Indicates when set in an executable that the process isn't SMP safe. */
00171 #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.
 */
00185 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. */
00259 struct o32_obj
{
    /** The size of the object. */
00262     KU32                o32_size;
    /** The base address of the object. */
00264     KU32                o32_base;
    /** Object flags. */
00266     KU32                o32_flags;
    /** Page map index. */
00268     KU32                o32_pagemap;
    /** Page map size. (doesn't need to be o32_size >> page shift). */
00270     KU32                o32_mapsize;
    /** Reserved */
00272     KU32                o32_reserved;
};

/** @name o32_flags
 * @{ */
/** Read access. */
00278 #define OBJREAD         KU32_C(0x00000001)
/** Write access. */
00280 #define OBJWRITE        KU32_C(0x00000002)
/** Execute access. */
00282 #define OBJEXEC         KU32_C(0x00000004)
/** Resource object. */
00284 #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. */
00287 #define OBJDISCARD      KU32_C(0x00000010)
/** The object is shared. */
00289 #define OBJSHARED       KU32_C(0x00000020)
/** The object has preload pages. */
00291 #define OBJPRELOAD      KU32_C(0x00000040)
/** The object has invalid pages. */
00293 #define OBJINVALID      KU32_C(0x00000080)
/** Non-permanent, link386 bug. */
00295 #define LNKNONPERM      KU32_C(0x00000600)
/** Non-permanent, correct 'value'. */
00297 #define OBJNONPERM      KU32_C(0x00000000)
/** Obj Type: The object is permanent and swappable. */
00299 #define OBJPERM         KU32_C(0x00000100)
/** Obj Type: The object is permanent and resident (i.e. not swappable). */
00301 #define OBJRESIDENT     KU32_C(0x00000200)
/** Obj Type: The object is resident and contigious. */
00303 #define OBJCONTIG       KU32_C(0x00000300)
/** Obj Type: The object is permanent and long locable. */
00305 #define OBJDYNAMIC      KU32_C(0x00000400)
/** Object type mask. */
00307 #define OBJTYPEMASK     KU32_C(0x00000700)
/** x86: The object require an 16:16 alias. */
00309 #define OBJALIAS16      KU32_C(0x00001000)
/** x86: Big/Default selector setting, i.e. toggle 32-bit or 16-bit. */
00311 #define OBJBIGDEF       KU32_C(0x00002000)
/** x86: conforming selector setting (weird stuff). */
00313 #define OBJCONFORM      KU32_C(0x00004000)
/** x86: IOPL. */
00315 #define OBJIOPL         KU32_C(0x00008000)
/** @} */

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

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


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

/** @} */


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


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

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

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


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

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

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

#pragma pack()

#endif


Generated by  Doxygen 1.6.0   Back to index