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