source: trunk/src/pe2lx/LX.H@ 10367

Last change on this file since 10367 was 281, checked in by sandervl, 26 years ago

Major changes in PE2LX/KERNEL32 for TLS support. DLL VERSION INCREASED TO 3 AS THIS CHANGE MAKES IT INCOMPATIBLE WITH APPS CONVERTED WITH PREVIOUS VERSION OF PE2LX (OR WIN32K)

File size: 8.4 KB
Line 
1/* $Id: LX.H,v 1.4 1999-07-07 08:11:11 sandervl Exp $ */
2
3/*
4 * PE2LX LX
5 *
6 * Copyright 1998 Sander van Leeuwen (sandervl@xs4all.nl)
7 *
8 *
9 * Project Odin Software License can be found in LICENSE.TXT
10 *
11 */
12#ifndef __LX_H__
13#define __LX_H__
14
15#include <win32type.h>
16#include <exe386.h>
17
18#define LXHEADER_OFFSET 0x80
19#define PAGE_SIZE 4096
20#define PAGE_SHIFT 12
21
22#define SYSTEM_CHARACTER 0
23#define SYSTEM_GUI 1
24
25#define SECTION_CODE 1
26#define SECTION_INITDATA 2
27#define SECTION_UNINITDATA 4
28#define SECTION_READONLYDATA 8
29#define SECTION_IMPORT 16
30#define SECTION_STACK 32
31#define SECTION_RESOURCE_ORG 64
32#define SECTION_RESOURCE 128
33#define SECTION_COMBINEDDATA 256
34#define MAX_SECTION 64 /*PLF Mon 98-02-09 23:47:16*/
35
36#define MAX_IMPORT 8192 //this should do for most bloated apps
37#define MAX_RESOURCE 8192
38
39typedef struct {
40 char *rawdata;
41 int rawsize;
42 int virtualsize;
43 int curoff;
44 int type;
45 int address;
46 int endaddress;
47 int nrpages;
48 int nrinvalidpages;
49 BOOL fProcessed;
50 BOOL fInvalid;
51} Section;
52
53typedef struct {
54 int size;
55 int flags;
56} DataPage;
57
58#pragma pack(1)
59
60//also defined in USER32\NAMEID.H!
61#define RESID_CONVERTEDNAMES 63*1024
62typedef struct {
63 int id;
64 char name[1];
65} NameId;
66
67typedef struct {
68 unsigned char nr_stype; /* Source type - field shared with new_rlc */
69 unsigned char nr_flags; /* Flag byte - field shared with new_rlc */
70 short r32_soff; /* Source offset */
71 unsigned short r32_objmod; /* Target object number or Module ordinal */
72 unsigned short proc; /* Procedure name offset */
73 unsigned short srcpage;
74} namefixup;
75
76typedef struct {
77 unsigned char nr_stype; /* Source type - field shared with new_rlc */
78 unsigned char nr_flags; /* Flag byte - field shared with new_rlc */
79 short r32_soff; /* Source offset */
80 unsigned short r32_objmod; /* Target object number or Module ordinal */
81 unsigned short proc; /* Procedure name offset */
82} realnamefixup;
83
84typedef struct {
85 unsigned char nr_stype; /* Source type - field shared with new_rlc */
86 unsigned char nr_flags; /* Flag byte - field shared with new_rlc */
87 short r32_soff; /* Source offset */
88 unsigned short r32_objmod; /* Target object number or Module ordinal */
89 unsigned short ord; /* Ordinal */
90 unsigned short srcpage;
91} ordfixup;
92
93typedef struct {
94 unsigned char nr_stype; /* Source type - field shared with new_rlc */
95 unsigned char nr_flags; /* Flag byte - field shared with new_rlc */
96 short r32_soff; /* Source offset */
97 unsigned short r32_objmod; /* Target object number or Module ordinal */
98 unsigned short ord; /* Ordinal */
99} realordfixup;
100
101typedef struct {
102 unsigned char nr_stype; /* Source type - field shared with new_rlc */
103 unsigned char nr_flags; /* Flag byte - field shared with new_rlc */
104 short r32_soff; /* Source offset */
105 unsigned short targetobj;
106 unsigned long targetaddr;
107 unsigned short srcobj;
108 unsigned short srcpage;
109} intfixup;
110
111typedef struct {
112 unsigned char nr_stype; /* Source type - field shared with new_rlc */
113 unsigned char nr_flags; /* Flag byte - field shared with new_rlc */
114 short r32_soff; /* Source offset */
115 unsigned short targetobj;
116 unsigned long targetaddr;
117} realintfixup;
118
119typedef struct
120{
121 unsigned char b32_cnt; /* Number of entries in this bundle */
122 unsigned char b32_type; /* Bundle type */
123 unsigned short b32_obj; /* Object number */
124
125 unsigned char e32_flags; /* Entry point flags */
126 unsigned long e32_offset; /* 16-bit/32-bit offset entry */
127} exportbundle;
128
129typedef struct
130{
131 unsigned char b32_cnt; /* Number of entries in this bundle */
132 unsigned char b32_type; /* Bundle type */
133 unsigned short b32_obj; /* Object number */
134
135 unsigned char e32_flags; /* Entry point flags */
136 unsigned short modord; /* Module ordinal number */
137 unsigned long value; /* Proc name offset or ordinal */
138} forwardbundle;
139
140#pragma pack()
141
142class LXHeader {
143public:
144 LXHeader();
145 ~LXHeader();
146
147 void SetEntryAddress(int address); //relative
148
149 void SetEntryPoint(int address) { EntryAddress = address; }; //absolute virtual address
150
151 void SetExeType(BOOL IsEXE);
152 void SetNoFixups();
153 void SetStackSize(int size);
154 void SetResourceSize(int size);
155 void SetNrResources(int cnt);
156 void StoreSection(char *rawdata, int rawsize, int virtualsize, int address, int type);
157 void AlignSections();
158 BOOL StoreImportByName(char *modname, int idxmod, char *name, int offset);
159 BOOL StoreImportByOrd(int idxmod, int ordinal, int offset);
160 void StoreImportModules(char *modules, int nrmod);
161 void SetNoNameImports();
162 BOOL SaveNewExeFile(char *filename);
163 void SetModuleType(int type);
164 void AddOff32Fixup(int address, BOOL fLookatStartupCode = FALSE);
165 void SetNrOff32Fixups(int nr);
166 void AddNameExport(int address, char *name, int ordinal);
167 void AddOrdExport(int address, int ordinal);
168 void SetNrExtFixups(int nr);
169 void AddForwarder(char *name, int ordinal, char *forward);
170
171 int GetAddressPage(int address);
172 void SetModuleName(char *filename);
173 //resource procedures
174 void StoreResource(int id, int type, int size, char *resourcedata);
175 void StoreWin32Resource(int id, int type, int size, char *resourcedata);
176 int ConvertNametoId(char *nameid);
177 void SaveConvertedNames();
178 void StoreResourceId(int id);
179 int GetUniqueId();
180
181 //SvL: 18-7-'98: Set version resource id
182 void SetVersionResourceId(int id) { VersionResourceId = id; };
183
184 void SetTLSAddress(ULONG dwTlsAddress) { tlsAddress = dwTlsAddress; };
185 void SetTLSIndexAddress(ULONG dwTlsIndexAddr) { tlsIndexAddr = dwTlsIndexAddr; };
186 void SetTLSInitSize(ULONG dwTlsSize) { tlsInitSize = dwTlsSize; };
187 void SetTLSTotalSize(ULONG dwTlsSize) { tlsTotalSize = dwTlsSize; };
188 void SetTLSCallBackAddr(ULONG dwTlsCallBackAddr) { tlsCallBackAddr = dwTlsCallBackAddr; };
189
190 void AddExtraFixups();
191
192private:
193 BOOL IsSystemModule(char *mod, int size);
194 int FindName(char *table, int index);
195 char *StripPath(char *path);
196 char *StripExtension(char *fname);
197
198 void StoreAndSortImport(namefixup *newfrec);
199
200 int GetNrPages();
201 int GetNrObjects();
202 void UpCase(char *mixedcase);
203 int GetSection(int type);
204 int GetSectionByAddress(int address);
205 int GetRealSectionByAddress(int address);
206 int GetSectionLEAddress(int address);
207
208 BOOL IsEXE, fConsole;
209 ULONG EntryAddress;
210 Section PESection[MAX_SECTION];
211 Section ResSection;
212 DataPage *datapage;
213
214 char *impmodules, *impnames, *impnameoff;
215 int impmodulesize, impnamesize;
216 int fFlags;
217 int StackSize;
218 int nrsections;
219
220 namefixup *impfixuprec;
221 int nrimpfixups;
222
223 intfixup *intfixuprec;
224 int nrintfixups;
225
226 rsrc32 *os2resource;
227 int nrresources;
228 int curresource;
229 NameId *cvtname, *curcvtname;
230 int nrcvtnames;
231 int *resids;
232 int nrids;
233 int cvtnametableid;
234 int orgrestableid;
235 ULONG *orgrestable;
236 int nrorgres;
237
238 char *exports, *curexport;
239 int nrexports;
240 exportbundle *expbundle, *curexpb;
241
242 char modulename[128];
243
244 struct e32_exe LXHdr;
245
246 static int uniqueId;
247
248 int kernel32Object;
249
250 //SvL: 18-7-'98: Version resource id
251 ULONG VersionResourceId;
252
253 ULONG tlsAddress; //address of TLS data
254 ULONG tlsIndexAddr; //address of DWORD that receives the TLS index
255 ULONG tlsInitSize; //size of initialized TLS memory block
256 ULONG tlsTotalSize; //size of TLS memory block
257 ULONG tlsCallBackAddr; //ptr to TLS callback array
258};
259
260extern LXHeader OS2Exe;
261
262#endif
Note: See TracBrowser for help on using the repository browser.