Main Page | Class Hierarchy | Class List | File List | Class Members | File Members

lestruct.h

Go to the documentation of this file.
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 

Generated on Fri May 7 21:15:40 2004 by doxygen 1.3.5