1 /**
2  * @namespace   biew_plugins_auto
3  * @file        plugins/bin/lx_le.h
4  * @brief       This file contains LX and LE executable file definitions.
5  * @version     -
6  * @remark      this source file is part of Binary vIEW project (BIEW).
7  *              The Binary vIEW (BIEW) is copyright (C) 1995 Nickols_K.
8  *              All rights reserved. This software is redistributable under the
9  *              licence given in the file "Licence.en" ("Licence.ru" in russian
10  *              translation) distributed in the BIEW archive.
11  * @note        Requires POSIX compatible development system
12  *
13  * @author      Nickols_K
14  * @since       1995
15  * @note        Development, fixes and improvements
16 **/
17 #ifndef __LX_LE_INC
18 #define __LX_LE_INC
19 
20 #ifndef __BIEWUTIL__H
21 #include "biewutil.h"
22 #endif
23 
24 #ifndef __BBIO_H
25 #include "bbio.h"
26 #endif
27 
28 #ifdef __HAVE_PRAGMA_PACK__
29 #pragma pack(1)
30 #endif
31 
32 /** Linear eXecutable header */
33 typedef struct tagLXHEADER
34 {
35   tUInt8    lxSignature[2];  /**< 'LX' */
36   tUInt8    lxByteOrdering;
37   tUInt8    lxWordOrdering;
38   tUInt32   lxFormatLevel;
39   tUInt16   lxCPUType;
40   tUInt16   lxOSType;
41   tUInt32   lxModuleVersion;
42   tUInt32   lxModuleFlags;
43   tUInt32   lxPageCount;
44   tUInt32   lxEIPObjectNumbers;
45   tUInt32   lxEIP;
46   tUInt32   lxESPObjectNumbers;
47   tUInt32   lxESP;
48   tUInt32   lxPageSize;
49   /* ------ specific LX part --------- */
50   tUInt32   lxPageOffsetShift;
51   tUInt32   lxFixupSectionSize;
52   tUInt32   lxFixupSectionChecksum;      /**< different LE/LX part */
53   tUInt32   lxLoaderSectionSize;
54   tUInt32   lxLoaderSectionChecksum;
55   tUInt32   lxObjectTableOffset;
56   tUInt32   lxObjectCount;
57   tUInt32   lxObjectPageTableOffset;
58   tUInt32   lxObjectIterPageOffset;
59   tUInt32   lxResourceTableOffset;
60   tUInt32   lxNumberResourceTableEntries;
61   tUInt32   lxResidentNameTableOffset;
62   tUInt32   lxEntryTableOffset;
63   tUInt32   lxModuleDirectivesOffset;
64   tUInt32   lxNumberModuleDirectives;
65   tUInt32   lxFixupPageTableOffset;
66   tUInt32   lxFixupRecordTableOffset;
67   tUInt32   lxImportModuleTableOffset;
68   tUInt32   lxImportModuleTableEntries;
69   tUInt32   lxImportProcedureTableOffset;
70   tUInt32   lxPerPageChecksumOffset;
71   tUInt32   lxDataPagesOffset;
72   tUInt32   lxNumberPreloadPages;
73   tUInt32   lxNonResidentNameTableOffset;
74   tUInt32   lxNonResidentNameTableLength;
75   tUInt32   lxNonResidentNameTableChecksum;
76   tUInt32   lxAutoDSObjectNumber;     /**< not present in LE */
77   tUInt32   lxDebugInfoOffset;
78   tUInt32   lxDebugInfoLength;
79   tUInt32   lxNumberInstancePreload;  /**< not present in LE */
80   tUInt32   lxNumberInstanceDemand;   /**< not present in LE */
81   tUInt32   lxHeapSize;               /**< not present in LE */
82   tUInt32   lxStackSize;              /**< not present in LE */
83 }LXHEADER;
84 
85 /** Linear EXE header */
86 typedef struct tagLEHEADER
87 {
88   /* --------- common LE/LX part ------------- */
89   tUInt8    leSignature[2];  /**< 'LE' */
90   tUInt8    leByteOrdering;
91   tUInt8    leWordOrdering;
92   tUInt32   leFormatLevel;
93   tUInt16   leCPUType;
94   tUInt16   leOSType;
95   tUInt32   leModuleVersion;
96   tUInt32   leModuleFlags;
97   tUInt32   lePageCount;
98   tUInt32   leEIPObjectNumbers;
99   tUInt32   leEIP;
100   tUInt32   leESPObjectNumbers;
101   tUInt32   leESP;
102   tUInt32   lePageSize;
103   /* ---------- specific LE part ----------------- */
104   tUInt32   lePageOffsetShift; /**< possible not used */
105   tUInt32   leFixupSize;
106   tUInt32   lePageChecksum;            /**< different LE/LX part */
107   tUInt32   leLoaderSectionSize;
108   tUInt32   leLoaderSectionChecksum;
109   tUInt32   leObjectTableOffset;
110   tUInt32   leObjectCount;
111   tUInt32   leObjectPageMapTableOffset;
112   tUInt32   leObjectIterDataMapOffset;
113   tUInt32   leResourceTableOffset;
114   tUInt32   leResourceCount;
115   tUInt32   leResidentNameTableOffset;
116   tUInt32   leEntryTableOffset;
117   tUInt32   leModuleDirectivesOffset;
118   tUInt32   leModuleDirectivesCount;
119   tUInt32   leFixupPageTableOffset;
120   tUInt32   leFixupRecordTableOffset;
121   tUInt32   leImportModuleTableOffset;
122   tUInt32   leImportModuleEntryCount;
123   tUInt32   leImportProcedureNamesTableOffset;
124   tUInt32   lePerPageChecksumTableOffset;
125   tUInt32   leDataPagesOffset;
126   tUInt32   lePreloadPageCount;
127   tUInt32   leNonResidentNameTableOffset;
128   tUInt32   leNonResidentNameTableLength;
129   tUInt32   leNonResidentNameTableChecksum;
130   tUInt32   leDebugInfoOffset;
131   tUInt32   leDebugInfoLength;
132 }LEHEADER;
133 
134 typedef struct tag_VxD_Desc_Block
135 {
136    tUInt32       DDB_Next                ; /**< VMM RESERVED FIELD */
137    tUInt16       DDB_SDK_Version         ; /**< VMM RESERVED FIELD */
138    tUInt16       DDB_Req_Device_Number   ; /**< Required device number */
139    tUInt8        DDB_Dev_Major_Version   ; /**< Major device number */
140    tUInt8        DDB_Dev_Minor_Version   ; /**< Minor device number */
141    tUInt16       DDB_Flags               ; /**< Flags for init calls complete */
142    tInt8         DDB_Name[8]             ; /**< Device name */
143    tUInt32       DDB_Init_Order          ; /**< Initialization Order */
144    tUInt32       DDB_Control_Proc        ; /**< Offset of control procedure */
145    tUInt32       DDB_V86_API_Proc        ; /**< Offset of API procedure (or 0) */
146    tUInt32       DDB_PM_API_Proc         ; /**< Offset of API procedure (or 0) */
147    tUInt32       DDB_V86_API_CSIP        ; /**< CS:IP of API entry point */
148    tUInt32       DDB_PM_API_CSIP         ; /**< CS:IP of API entry point */
149    tUInt32       DDB_Reference_Data      ; /**< Reference data from real mode */
150    tUInt32       DDB_Service_Table_Ptr   ; /**< Pointer to service table */
151    tUInt32       DDB_Service_Table_Size  ; /**< Number of services */
152 }VxD_Desc_Block;
153 
154 
155 extern union LX_LE
156 {
157   LEHEADER le;
158   LXHEADER lx;
159 }lxe;
160 
161 /** Flat .EXE object table entry */
162 typedef struct o32_obj
163 {
164     tUInt32       o32_size;       /**< Object virtual size */
165     tUInt32       o32_base;       /**< Object base virtual address */
166     tUInt32       o32_flags;      /**< Attribute flags */
167     tUInt32       o32_pagemap;    /**< Object page map index */
168     tUInt32       o32_mapsize;    /**< Number of entries in object page map */
169     tUInt32       o32_reserved;   /**< Reserved */
170 }LX_OBJECT;
171 
172 #define PAGE_VALID       0x0000    /**< Valid Physical Page in .EXE */
173 #define PAGE_ITERDATA    0x0001    /**< Iterated Data Page */
174 #define PAGE_INVALID     0x0002    /**< Invalid Page */
175 #define PAGE_ZEROED      0x0003    /**< Zero Filled Page */
176 #define PAGE_RANGE       0x0004    /**< Range of pages */
177 #define PAGE_ITERDATA2   0x0005    /**< Iterated Data Page Type II */
178 
179 /* Object Page Table entry */
180 typedef struct o32_map
181 {
182     tUInt32  o32_pagedataoffset;     /**< file offset of page */
183     tUInt16  o32_pagesize;           /**< # bytes of page data */
184     tUInt16  o32_pageflags;          /**< Per-Page attributes */
185 }LX_MAP_TABLE;
186 
187 typedef struct LX_Iter
188 {
189     tUInt16 LX_nIter;            /**< number of iterations */
190     tUInt16 LX_nBytes;           /**< number of bytes */
191     tUInt8  LX_Iterdata;         /**< iterated data byte(s) */
192 }LX_ITER;
193 
194 typedef struct b32_bundle
195 {
196     tUInt8       b32_cnt;        /**< Number of entries in this bundle */
197     tUInt8       b32_type;       /**< Bundle type */
198     tUInt16      b32_obj;        /**< Object number */
199 }LX_BUNGLE;                       /* Follows entry types */
200 
201 /** 16-bit or 32-bit offset */
202 typedef union _offset
203 {
204     tUInt16 offset16;
205     tUInt32 offset32;
206 }offset;
207 
208 typedef struct e32_entry
209 {
210     tUInt8       e32_flags;      /**< Entry point flags */
211     union entrykind
212     {
213         offset          e32_offset;     /**< 16-bit/32-bit offset entry */
214         struct callgate
215         {
216             tUInt16 offset;      /**< Offset in segment */
217             tUInt16 callgate;    /**< Callgate selector */
218         }e32_callgate;   /**< 286 (16-bit) call gate */
219         struct fwd
220         {
221             tUInt16  modord;     /**< Module ordinal number */
222             tUInt32  value;      /**< Proc name offset or ordinal */
223         }e32_fwd;        /**< Forwarder */
224     }e32_variant;    /**< Entry variant */
225 }e32_ENTRY;
226 
227 /*
228  *  In 32-bit .EXE file run-time relocations are written as varying size
229  *  records, so we need many size definitions.
230  */
231 
232 #define RINTSIZE16      8
233 #define RINTSIZE32      10
234 #define RORDSIZE        8
235 #define RNAMSIZE16      8
236 #define RNAMSIZE32      10
237 #define RADDSIZE16      10
238 #define RADDSIZE32      12
239 
240 /*
241  *  BUNDLE TYPES
242  */
243 
244 #define EMPTY        0x00               /* Empty bundle */
245 #define ENTRY16      0x01               /* 16-bit offset entry point */
246 #define GATE16       0x02               /* 286 call gate (16-bit IOPL) */
247 #define ENTRY32      0x03               /* 32-bit offset entry point */
248 #define ENTRYFWD     0x04               /* Forwarder entry point */
249 #define TYPEINFO     0x80               /* Typing information present flag */
250 
251 typedef struct lxEntry
252 {
253   tInt8 b32_type;
254   tInt8 b32_obj;
255   e32_ENTRY entry;
256 }LX_ENTRY;
257 
258 typedef struct tagLE_PAGE
259 {
260   tUInt16 flags;
261   tUInt16 number;
262 }LE_PAGE;
263 
264 typedef struct tagLXResource
265 {
266    tUInt16 typeID;
267    tUInt16 nameID;
268    tUInt32 resourceSize;
269    tUInt16 object;
270    tUInt32 offset;
271 }LXResource;
272 
273 
274 extern void          __FASTCALL__ ShowFwdModOrdLX(const LX_ENTRY *_lxe);
275 extern __filesize_t  __FASTCALL__ ShowNewHeaderLX( void );
276 extern __filesize_t  __FASTCALL__ ShowObjectsLX( void );
277 extern unsigned      __FASTCALL__ LXRNamesNumItems(BGLOBAL);
278 extern tBool         __FASTCALL__ LXRNamesReadItems(BGLOBAL,memArray *,unsigned);
279 extern __filesize_t  __FASTCALL__ ShowModRefLX( void );
280 extern unsigned      __FASTCALL__ LXNRNamesNumItems(BGLOBAL);
281 extern tBool         __FASTCALL__ LXNRNamesReadItems(BGLOBAL,memArray *,unsigned);
282 extern __filesize_t  __FASTCALL__ ShowImpProcLXLE( void );
283 extern __filesize_t  __FASTCALL__ ShowEntriesLX( void );
284 extern const char *  __FASTCALL__ lxeGetMapAttr(unsigned long attr);
285 extern __filesize_t  __FASTCALL__ CalcEntryPointLE(unsigned long objnum,__filesize_t _offset);
286 extern __filesize_t  __FASTCALL__ CalcPageEntryLE(unsigned long idx);
287 extern __filesize_t  __FASTCALL__ CalcEntryLE(const LX_ENTRY *);
288 
289 #define FILE_LX 1
290 #define FILE_LE 2
291 extern int LXType;
292 
293 #ifdef __HAVE_PRAGMA_PACK__
294 #pragma pack()
295 #endif
296 
297 #endif
298