00001 /* 00002 * HT Editor 00003 * lestruct.h 00004 * 00005 * Copyright (C) 1999-2002 Stefan Weyergraf (stefan@weyergraf.de) 00006 * 00007 * This program is free software; you can redistribute it and/or modify 00008 * it under the terms of the GNU General Public License version 2 as 00009 * published by the Free Software Foundation. 00010 * 00011 * This program is distributed in the hope that it will be useful, 00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 * GNU General Public License for more details. 00015 * 00016 * You should have received a copy of the GNU General Public License 00017 * along with this program; if not, write to the Free Software 00018 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00019 */ 00020 00021 #ifndef __LESTRUCT_H_ 00022 #define __LESTRUCT_H_ 00023 00024 #include "global.h" 00025 00026 #define LE_CPU_286 0x01 00027 #define LE_CPU_386 0x02 00028 #define LE_CPU_486 0x03 00029 #define LE_CPU_586 0x04 00030 #define LE_CPU_N10 0x20 00031 #define LE_CPU_N11 0x21 00032 #define LE_CPU_R2000 0x40 00033 #define LE_CPU_R6000 0x41 00034 #define LE_CPU_R4000 0x42 00035 00036 #define LE_OS_OS2 0x01 00037 #define LE_OS_WIN 0x02 00038 #define LE_OS_DOS4 0x03 00039 #define LE_OS_WIN386 0x04 00040 00041 #define LE_MAGIC0 'L' 00042 #define LE_MAGIC1 'E' 00043 00044 #define LE_SIZEOF_HEADER 196 00045 00046 struct LE_HEADER { 00047 word magic HTPACKED; // Magic number 00048 byte border HTPACKED; // The byte ordering for the VXD 00049 byte worder HTPACKED; // The word ordering for the VXD 00050 dword level HTPACKED; // The EXE format level for now = 0 00051 word cpu HTPACKED; // The CPU type 00052 word os HTPACKED; // The OS type 00053 dword ver HTPACKED; // Module version 00054 dword mflags HTPACKED; // Module flags 00055 dword pagecnt HTPACKED; // Module # pages 00056 dword startobj HTPACKED; // Object # for instruction pointer 00057 dword eip HTPACKED; // Extended instruction pointer 00058 dword stackobj HTPACKED; // Object # for stack pointer 00059 dword esp HTPACKED; // Extended stack pointer 00060 dword pagesize HTPACKED; // VXD page size 00061 dword lastpagesize HTPACKED; // Last page size in VXD 00062 dword fixupsize HTPACKED; // Fixup section size 00063 dword fixupsum HTPACKED; // Fixup section checksum 00064 dword ldrsize HTPACKED; // Loader section size 00065 dword ldrsum HTPACKED; // Loader section checksum 00066 dword objtab HTPACKED; // Object table offset 00067 dword objcnt HTPACKED; // Number of objects in module 00068 dword pagemap HTPACKED; // Object page map offset 00069 dword itermap HTPACKED; // Object iterated data map offset 00070 dword rsrctab HTPACKED; // Offset of Resource Table 00071 dword rsrccnt HTPACKED; // Number of resource entries 00072 dword restab HTPACKED; // Offset of resident name table 00073 dword enttab HTPACKED; // Offset of Entry Table 00074 dword dirtab HTPACKED; // Offset of Module Directive Table 00075 dword dircnt HTPACKED; // Number of module directives 00076 dword fpagetab HTPACKED; // Offset of Fixup Page Table 00077 dword frectab HTPACKED; // Offset of Fixup Record Table 00078 dword impmod HTPACKED; // Offset of Import Module Name Table 00079 dword impmodcnt HTPACKED; // Number of entries in Import Module Name Table 00080 dword impproc HTPACKED; // Offset of Import Procedure Name Table 00081 dword pagesum HTPACKED; // Offset of Per-Page Checksum Table 00082 dword datapage HTPACKED; // Offset of Enumerated Data Pages 00083 dword preload HTPACKED; // Number of preload pages 00084 dword nrestab HTPACKED; // Offset of Non-resident Names Table 00085 dword cbnrestab HTPACKED; // Size of Non-resident Name Table 00086 dword nressum HTPACKED; // Non-resident Name Table Checksum 00087 dword autodata HTPACKED; // Object # for automatic data object 00088 dword debuginfo HTPACKED; // Offset of the debugging information 00089 dword debuglen HTPACKED; // The length of the debugging info. in bytes 00090 dword instpreload HTPACKED; // Number of instance pages in preload section of VXD file 00091 dword instdemand HTPACKED; // Number of instance pages in demand load section of VXD file 00092 dword heapsize HTPACKED; // Size of heap - for 16-bit apps 00093 byte res3[12] HTPACKED; // Reserved words 00094 dword winresoff HTPACKED; 00095 dword winreslen HTPACKED; 00096 word devid HTPACKED; // Device ID for VxD 00097 word ddkver HTPACKED; // DDK version for VxD 00098 }; 00099 00100 /* 00101 1 1 1 1 1 1 00102 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 00103 ž ž ž ž ž ž ž ž ž ž ž ž ž ž ž ž 00104 ³ ³ ³ ³ ³ ³ ³ ³ 00105 ³ ³ ĄÄÅÄŁ ³ ³ ĄÄÄÄÄÄ2ÄInitialization ( Only for DLL ): 00106 ³ ³ ³ ³ ³ 0: Global 00107 ³ ³ ³ ³ ³ 1: Per-Process 00108 ³ ³ ³ ³ ³ 00109 ³ ³ ³ ³ ĄÄÄÄÄÄÄÄÄÄÄ4Ä1:No internal fixup in exe image 00110 ³ ³ ³ ĄÄÄÄÄÄÄÄÄÄÄÄÄ5Ä1:No external fixup in exe image 00111 ³ ³ ĄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ8,9,10Ä 0 - Unknown 00112 ³ ³ 1 - Incompatible with PM windowing 00113 ³ ³ 2 - Compatible with PM windowing 00114 ³ ³ 3 - Uses PM windowing API 00115 ³ ³ 00116 ³ ĄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ13Ä1: Module not loadable 00117 ĄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ15Ä1: Module is DLL rather then program 00118 */ 00119 #define LE_MODULE_FLAG_INIT_PER_PROCESS (1<<2) 00120 00121 #define LE_MODULE_FLAG_NO_EXT_FIXUP (1<<4) 00122 #define LE_MODULE_FLAG_NO_INT_FIXUP (1<<5) 00123 00124 #define LE_MODULE_FLAG_WINDOWING_MASK (7<<8) 00125 00126 #define LE_MODULE_FLAG_NOT_LOADABLE (1<<13) 00127 #define LE_MODULE_FLAG_LIBRARY (1<<15) 00128 00129 /* 00130 * LE Objects (aka segments, aka sections) 00131 */ 00132 00133 /* 00134 ³ ³ ³ ³ ³ ĄĀŁ ³ ³ ³ ³ ³ ³ ³ ĄÄ0Ä 1: Readable 00135 ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ĄÄÄÄ1Ä 1: Writable 00136 ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ĄÄÄÄÄÄ2Ä 1: Executable 00137 ³ ³ ³ ³ ³ ³ ³ ³ ³ ³ ĄÄÄÄÄÄÄÄ3Ä 1: Resource 00138 ³ ³ ³ ³ ³ ³ ³ ³ ³ ĄÄÄÄÄÄÄÄÄÄÄ4Ä 1: Discardable 00139 ³ ³ ³ ³ ³ ³ ³ ³ ĄÄÄÄÄÄÄÄÄÄÄÄÄ5Ä 1: Shared 00140 ³ ³ ³ ³ ³ ³ ³ ĄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ6Ä 1: Preloaded 00141 ³ ³ ³ ³ ³ ³ ĄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ7Ä 1: Invalid 00142 ³ ³ ³ ³ ³ ĄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ8,9ÄÄ Type: 00 - Normal 00143 ³ ³ ³ ³ ³ 01 - Zero-filled 00144 ³ ³ ³ ³ ³ 10 - Resident 00145 ³ ³ ³ ³ ³ 11 - Resident/contiguous 00146 ³ ³ ³ ³ ĄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ10Ä "RESIDENT/LONG_LOCABLE" 00147 ³ ³ ³ ³ 00148 ³ ³ ³ ĄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ12Ä "16:16_ALIAS" 00149 ³ ³ ĄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ13Ä 1: "BIG" (USE32) 00150 ³ ĄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ14Ä 1: Conforming 00151 ĄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ15Ä "Object_i/o_privilege_level" 00152 */ 00153 00154 #define LE_OBJECT_FLAG_READABLE (1<<0) 00155 #define LE_OBJECT_FLAG_WRITEABLE (1<<1) 00156 #define LE_OBJECT_FLAG_EXECUTABLE (1<<2) 00157 #define LE_OBJECT_FLAG_RESOURCE (1<<3) 00158 #define LE_OBJECT_FLAG_DISCARDABLE (1<<4) 00159 #define LE_OBJECT_FLAG_SHARED (1<<5) 00160 #define LE_OBJECT_FLAG_PRELOADED (1<<6) 00161 #define LE_OBJECT_FLAG_INVALID (1<<7) 00162 00163 #define LE_OBJECT_FLAG_USE32 (1<<13) 00164 00165 #define LE_SIZEOF_OBJECT 24 00166 00167 struct LE_OBJECT { 00168 dword vsize HTPACKED; 00169 dword base_reloc_addr HTPACKED; 00170 dword flags HTPACKED; 00171 dword page_map_index HTPACKED; 00172 dword page_map_count HTPACKED; 00173 byte name[4] HTPACKED; 00174 }; 00175 00176 struct LE_PAGE_MAP_ENTRY { 00177 word high HTPACKED; 00178 byte low HTPACKED; 00179 byte flags HTPACKED; 00180 }; 00181 00182 /* 00183 * ENTRYPOINTS 00184 */ 00185 00186 #define LE_ENTRYPOINT_BUNDLE_VALID (1<<0) 00187 #define LE_ENTRYPOINT_BUNDLE_32BIT (1<<1) 00188 00189 struct LE_ENTRYPOINT_BUNDLE { 00190 byte entry_count HTPACKED; 00191 byte flags HTPACKED; 00192 word obj_index HTPACKED; 00193 }; 00194 00195 #define LE_ENTRYPOINT_EXPORTED (1<<0) 00196 #define LE_ENTRYPOINT_SHARED (1<<1) 00197 00198 struct LE_ENTRYPOINT16 { 00199 byte flags HTPACKED; 00200 word offset HTPACKED; 00201 }; 00202 00203 struct LE_ENTRYPOINT32 { 00204 byte flags HTPACKED; 00205 dword offset HTPACKED; 00206 }; 00207 00208 /* 00209 * FIXUPS 00210 */ 00211 00212 #define LE_FIXUP_ADDR_TYPE_MASK (15<<0) 00213 #define LE_FIXUP_ADDR_TYPE_0_8 0 00214 #define LE_FIXUP_ADDR_TYPE_16_0 2 00215 #define LE_FIXUP_ADDR_TYPE_16_16 3 00216 #define LE_FIXUP_ADDR_TYPE_0_16 5 00217 #define LE_FIXUP_ADDR_TYPE_16_32 6 00218 #define LE_FIXUP_ADDR_TYPE_0_32 7 00219 #define LE_FIXUP_ADDR_TYPE_REL32 8 00220 #define LE_FIXUP_ADDR_16_16 (1<<4) 00221 #define LE_FIXUP_ADDR_MULTIPLE (1<<5) 00222 00223 #define LE_FIXUP_RELOC_TYPE_MASK (3<<0) 00224 #define LE_FIXUP_RELOC_TYPE_INTERNAL 0 00225 #define LE_FIXUP_RELOC_TYPE_IMPORT_ORD 1 00226 #define LE_FIXUP_RELOC_TYPE_IMPORT_NAME 2 00227 #define LE_FIXUP_RELOC_TYPE_OSFIXUP 3 // ? 00228 #define LE_FIXUP_RELOC_ADDITIVE (1<<2) 00229 #define LE_FIXUP_RELOC_TARGET32 (1<<4) 00230 #define LE_FIXUP_RELOC_ADDITIVE32 (1<<5) 00231 #define LE_FIXUP_RELOC_ORDINAL16 (1<<6) 00232 #define LE_FIXUP_RELOC_IORD8 (1<<7) 00233 00234 struct LE_FIXUP { 00235 uint8 address_type HTPACKED; 00236 uint8 reloc_type HTPACKED; 00237 }; 00238 00239 // if address_type == 8, reloc_type = 0 00240 struct LE_FIXUP_INTERNAL16 { 00241 uint8 seg HTPACKED; 00242 uint16 ofs HTPACKED; 00243 }; 00244 00245 struct LE_FIXUP_INTERNAL32 { 00246 uint8 seg HTPACKED; 00247 uint32 ofs HTPACKED; 00248 }; 00249 00250 /* 00251 * VxD specific 00252 */ 00253 00254 struct LE_VXD_DESCRIPTOR { 00255 uint32 next HTPACKED; 00256 uint16 sdk_version HTPACKED; 00257 uint16 device_number HTPACKED; 00258 uint8 version_major HTPACKED; 00259 uint8 version_minor HTPACKED; 00260 uint16 flags HTPACKED; 00261 uint8 name[8] HTPACKED; // not (null-)terminated, fill with spaces 00262 uint32 init_order HTPACKED; 00263 uint32 ctrl_ofs HTPACKED; 00264 uint32 v86_ctrl_ofs HTPACKED; 00265 uint32 pm_ctrl_ofs HTPACKED; 00266 uint32 v86_ctrl_csip HTPACKED; 00267 uint32 pm_ctrl_csip HTPACKED; 00268 uint32 rm_ref_data HTPACKED; // "Reference data from real mode" 00269 uint32 service_table_ofs HTPACKED; 00270 uint32 service_table_size HTPACKED; 00271 uint32 win32_service_table_ofs HTPACKED; 00272 uint32 prev HTPACKED; // normally 'verP' (Prev) 00273 uint32 size HTPACKED; // size of this structure (0x50 = 80) 00274 uint32 reserved0 HTPACKED; // normally '1vsR' (Rsv1) 00275 uint32 reserved1 HTPACKED; // normally '2vsR' (Rsv2) 00276 uint32 reserved2 HTPACKED; // normally '3vsR' (Rsv3) 00277 }; 00278 00279 /* 00280 * internal 00281 */ 00282 00283 struct ht_le_objmap { 00284 LE_OBJECT *header; 00285 UINT *psize; 00286 UINT *vsize; 00287 UINT count; 00288 }; 00289 00290 struct ht_le_pagemap { 00291 UINT *offset; 00292 UINT *psize; 00293 UINT *vsize; 00294 UINT count; 00295 }; 00296 00297 00298 00299 extern byte LE_HEADER_struct[]; 00300 extern byte LE_FIXUP_struct[]; 00301 extern byte LE_ENTRYPOINT16_struct[]; 00302 extern byte LE_ENTRYPOINT32_struct[]; 00303 extern byte LE_VXD_DESCRIPTOR_struct[]; 00304 extern byte LE_FIXUP_INTERNAL_struct[]; 00305 extern byte LE_OBJECT_HEADER_struct[]; 00306 extern byte LE_PAGE_MAP_ENTRY_struct[]; 00307 extern byte LE_FIXUP_INTERNAL16_struct[]; 00308 extern byte LE_FIXUP_INTERNAL32_struct[]; 00309 00310 #endif /* __LESTRUCT_H_ */ 00311