source: trunk/tools/common/kFileInterfaces.h

Last change on this file was 8003, checked in by bird, 24 years ago

New kFile* classes; now in sync with os2tools.

File size: 14.1 KB
Line 
1/* $Id: kFileInterfaces.h,v 1.1 2002-02-24 02:47:26 bird Exp $
2 *
3 * This headerfile contains interfaces for the common tools classes.
4 *
5 * Copyright (c) 2000 knut st. osmundsen (knut.stange.osmundsen@mynd.no)
6 *
7 * Project Odin Software License can be found in LICENSE.TXT
8 *
9 */
10
11
12#ifndef _kInterfaces_h_
13#define _kInterfaces_h_
14
15
16/*******************************************************************************
17* Defined Constants And Macros *
18*******************************************************************************/
19#define MAXEXPORTNAME 256
20#define MAXDBGNAME 256
21
22
23/*******************************************************************************
24* Structures and Typedefs *
25*******************************************************************************/
26class kPageI;
27class kExportI;
28class kExportEntry;
29class kModuleI;
30class kExecutableI;
31class kDbgTypeI;
32class kRelocI;
33
34
35
36/**
37 * Interface class (ie. virtual) which defines the interface for
38 * executables (resources and object too perhaps) files used to
39 * get and put pages.
40 * @author knut st. osmundsen (knut.stange.osmundsen@mynd.no)
41 */
42class kPageI
43{
44public:
45 /** @cat Get and put page methods. */
46
47 /**
48 * Get a code, data or resource page from the file.
49 * @returns 0 on success. kError number on error.
50 * @param pachPage Pointer to a buffer of the size of a page which
51 * will receive the page data on the specified address.
52 * @param ulAddress Page address. This must be page aligned.
53 */
54 virtual int pageGet(char *pachPage, unsigned long ulAddress) const = 0;
55
56 /**
57 * Get a code, data or resource page from the file.
58 * @returns 0 on success. kError number on error.
59 * @param pachPage Pointer to a buffer of the size of a page which
60 * will receive the page data on the specified address.
61 * @param iSegment Segment number. (0-based)
62 * @param offObject Offset into the object. This must be page aligned.
63 * @remark Object = Section.
64 */
65 virtual int pageGet(char *pachPage, int iSegment, int offObject) const = 0;
66
67 /**
68 * Updates or adds a code, data, or resource page to the file.
69 * @returns 0 on success. kError number on error.
70 * @param pachPage Pointer to a buffer of the size of a page which
71 * holds the page data.
72 * @param ulAddress Page address. This must be page aligned.
73 */
74 virtual int pagePut(const char *pachPage, unsigned long ulAddress) = 0;
75
76 /**
77 * Updates or adds a code, data, or resource page to the file.
78 * @returns 0 on success. kError number on error.
79 * @param pachPage Pointer to a buffer of the size of a page which
80 * holds the page data.
81 * @param iSegment Segment number. (0-based)
82 * @param offObject Offset into the object. This must be page aligned.
83 */
84 virtual int pagePut(const char *pachPage, int iSegment, int offObject) = 0;
85
86 /**
87 * Get pagesize for the file.
88 * @returns Pagesize in bytes.
89 */
90 virtual int pageGetPageSize() const = 0;
91};
92
93
94/**
95 * ExportEntry used by the findFirstExport/findNextExport functions
96 */
97class kExportEntry
98{
99public:
100 unsigned long ulOrdinal; /* Ordinal of export. 0 if invalid. */
101 char achName[MAXEXPORTNAME]; /* Public or exported name. */
102 char achIntName[MAXEXPORTNAME]; /* Optional. not used by PEFile */
103
104 unsigned long ulOffset; /* Offset. -1 if invalid. */
105 unsigned long iObject; /* Object number. -1 if invalid. */
106 unsigned long ulAddress; /* Address of symbol. -1 if invalid. */
107
108public:
109 /** @cat Internal use - don't mess! */
110 void * pv; /* Internal pointer. */
111};
112
113/**
114 * Interface class (ie. virtual) which defines the interface for executables
115 * (objects and libraries to perhaps) files used to enumerate exports and
116 * public exported names.
117 * @author knut st. osmundsen (knut.stange.osmundsen@mynd.no)
118 */
119class kExportI
120{
121public:
122 /** @cat Export enumeration methods. */
123
124 /**
125 * Find the first export/public name.
126 * @returns Success indicator.
127 * @param pExport Communication area.
128 */
129 virtual KBOOL exportFindFirst(kExportEntry * pExport) = 0;
130
131 /**
132 * Find the next export/public name.
133 * @returns Success indicator.
134 * FALSE when no more exports (exportFindClose has been processed then).
135 * @param pExport Communication area which has been successfully
136 * processed by findFirstExport.
137 */
138 virtual KBOOL exportFindNext(kExportEntry * pExport) = 0;
139
140 /**
141 * Frees resources associated with the communicatin area.
142 * It's not necessary to call this when exportFindNext has return FALSE.
143 * @param pExport Communication area which has been successfully
144 * processed by findFirstExport.
145 */
146 virtual void exportFindClose(kExportEntry * pExport) = 0;
147
148
149 /** @cat Export Search methods */
150
151 /**
152 * Lookup information on a spesific export given by ordinal number.
153 * @returns Success indicator.
154 * @param pExport Communication area containing export information
155 * on successful return.
156 */
157 virtual KBOOL exportLookup(unsigned long ulOrdinal, kExportEntry *pExport) = 0;
158
159 /**
160 * Lookup information on a spesific export given by name.
161 * @returns Success indicator.
162 * @param pExport Communication area containing export information
163 * on successful return.
164 */
165 virtual KBOOL exportLookup(const char * pszName, kExportEntry *pExport) = 0;
166};
167
168
169/**
170 * Interface class (ie. virtual) which defines the interface for executables
171 * (objects and libraries to perhaps) files used to enumerate exports and
172 * @author knut st. osmundsen (knut.stange.osmundsen@mynd.no)
173 */
174class kModuleI
175{
176public:
177 /** @cat Module information methods. */
178 virtual KBOOL moduleGetName(char *pszBuffer, int cbBuffer = 260) = 0;
179};
180
181
182/**
183 * Interface class (ie. virtual) which defines the interface for
184 * executables files.
185 * @author knut st. osmundsen (knut.stange.osmundsen@mynd.no)
186 */
187class kExecutableI : public kModuleI, public kExportI
188{
189public:
190 /** @cat Executable information methods. */
191 #if 0
192 virtual BOOL execIsDLL(void) = 0;
193 virtual BOOL execIsProgram(void) = 0;
194 virtual BOOL execIsDriver(void) = 0;
195 #endif
196};
197
198
199/**
200 * Communication class/struct used by kDbgTypeI and others.
201 * This is structure or union member class.
202 * (This might turn out very similar to a normal variable class,
203 * and will if so be changed to that when time comes.)
204 * @author knut st. osmundsen (knut.stange.osmundsen@mynd.no)
205 */
206class kDbgMemberEntry
207{
208public:
209 char szName[MAXDBGNAME]; /* Member name. */
210 char cb; /* Count of bytes it covers. */
211 char szTypeName[MAXDBGNAME]; /* Type name. */
212 int flFlags; /* Type flags. One of the kDbgTypeI::enm*. optional: defaults to kDbgTypeI::enmAny */
213};
214
215
216/**
217 * Communication class/struct used by kDbgTypeI.
218 * This is the type.
219 * @author knut st. osmundsen (knut.stange.osmundsen@mynd.no)
220 */
221class kDbgTypeEntry
222{
223public:
224 char szName[MAXDBGNAME]; /* Name of the type. */
225 char cb; /* Count of bytes it covers. */
226 int flFlags; /* Type flags. One of the kDbgTypeI::enm*. */
227
228 int cMembers; /* Number of members. This is 0 if not a union or a struct. */
229 kDbgMemberEntry * paMembers; /* Pointer array of member entries if union or struct. */
230
231public:
232 /** @cat Internal use only - don't mess! */
233 int flSearchFlags; /* Type flags which this search was started with. One of the kDbgTypeI::enm*. */
234};
235
236
237
238/**
239 * Interface class (ie. virtual) which defines the interface for
240 * debug typeinfo on debug module level.
241 * @author knut st. osmundsen (knut.stange.osmundsen@mynd.no)
242 */
243class kDbgTypeI
244{
245public:
246 /** @cat Debug Type information methods. */
247 virtual kDbgTypeEntry * dbgtypeFindFirst(int flFlags) = 0;
248 virtual kDbgTypeEntry * dbgtypeFindNext(kDbgTypeEntry *kDbgTypeEntry) = 0;
249 virtual void dbgtypeFindClose(kDbgTypeEntry *kDbgTypeEntry) = 0;
250
251 virtual kDbgTypeEntry * dbgtypeLookup(const char *pszName, int flFlags) = 0;
252 enum
253 { enmAny, /* Any/unknown type. */
254 enmStruct, /* Structure: struct _somestruct {..}; */
255 enmUnion, /* Union: union _someunion {..}; */
256 enmEnum, /* Enumeration: enum _someenum {..}; */
257 enmTypedef, /* Type definition: typedef <type expr> sometype; */
258 enmMask = 0x0000000ff, /* Type mask. */
259 enmFlagMask = 0xffffff00, /* Flag mask. */
260 enmflPointer = 0x00000100 /* This is pointer to something. (flag) */
261 };
262};
263
264
265/**
266 * One reallocation (reloc for short).
267 * @author knut st. osmundsen (kosmunds@csc.com)
268 */
269class kRelocEntry
270{
271public:
272 /** @cat constants and flags */
273 enum
274 {
275 /* flags */
276 enmFlagMask = 0x0000FFFF,
277 enmLittleEndian = 0x0001, /* Little endian */
278 enmBigEndian = 0x0002, /* Big endian */
279 enmAdditive = 0x0004, /* There is a addition (like extra offset) to the fixup. */
280
281 /* relocation type part 1 */
282 enmType1Mask= 0x000F0000,
283 enmName = 0x00010000, /* Name import (no dll/module) */
284 enmNameDLL = 0x00020000, /* Name import (from a given dll/module) */
285 enmOrdDLL = 0x00030000, /* Ordinal import (from a given dll/module) */
286 enmDelta = 0x00040000, /* Delta fixup - add the relocation delta */
287 enmInternal = 0x00050000, /* Write the pointer as enmSizeMask describes. */
288
289 /* relocation type part 2 */
290 enmType2Mask= 0x00F00000,
291 enmOffset = 0x00100000, /* Offset fixup. */
292 enmRelStart = 0x00200000, /* The fixup is relative to the fixup location. */
293 enmRelEnd = 0x00300000, /* The fixup is relative to the fixup location + size. */
294
295 /* size */
296 enmSizeMask = 0xFF000000, /* Size mask */
297 enm8 = 0x01000000, /* 8 bit fixup */
298 enm16 = 0x02000000, /* 16 bit fixup */
299 enm32 = 0x03000000, /* 32 bit fixup */
300 enm64 = 0x04000000, /* 64 bit fixup */
301 enm16_00 = 0x05000000, /* 16:00 fixup (selector only) */
302 enm16_16 = 0x06000000, /* 16:16 fixup (selector:offset) */
303 enm16_32 = 0x07000000, /* 16:32 fixup (selector:offset) */
304 enm16_48 = 0x08000000, /* 16:48 fixup (selector:offset) */
305 enm16hb = 0x09000000, /* 16 bit fixup - high byte */
306 enm32hw = 0x0a000000, /* 32 bit fixup - high word */
307 enm64hdw = 0x0b000000, /* 64 bit fixup - high dword */
308
309 /* defaults */
310 enmFirstSelector= 0xfffffffe, /* Selector used if the offset is a Relative Virtual Address. */
311 enmRVASelector = 0xffffffff, /* Selector used if the offset is a Relative Virtual Address. */
312 enmVASelector = 0xfffffffe /* Selector used if the offset is a FLAT address. */
313 };
314
315 /** @cat public data (speed/size) */
316 unsigned long offSegment; /* The address of the fixup. (page offset, segment offset, RVA or FLAT address) */
317 unsigned long ulSegment; /* Segment number the offSegment is relative to. Special selectors may be used. (0-based) */
318 unsigned long fFlags; /* Combination of the above flags. Don't mess with this member. */
319 unsigned long ulAdd; /* Value to add if additiv relocation. */
320
321 union _RelocInfo
322 {
323 struct InternalInfo {
324 unsigned long offSegment; /* Offset into ulSegment of the 'target'. */
325 unsigned long ulSegment; /* Segemnt number of the 'traget'. Special selectors may be used. (0-based) */
326 } Internal;
327
328 struct NameImportInfo {
329 char * pszName; /* Pointer to string or NULL. Don't mess with this pointer! */
330 char * pszModule; /* Pointer to module name or NULL. Don't mess with this pointer! */
331 unsigned long ulOrdinal; /* Ordinal value if applicable. */
332 } Name;
333 } Info;
334
335 /** @cat helper functions */
336 KBOOL isName() const { return (fFlags & enmType1Mask) <= enmOrdDLL; };
337 KBOOL isInternal() const { return (fFlags & enmType1Mask) > enmOrdDLL; };
338
339
340public:
341 /** @cat Internal use only - don't mess! */
342 void * pv1; /* some pointer - used by relocFind*() implementations. */
343 void * pv2; /* some pointer - used by relocXRef*(). */
344};
345
346
347
348/**
349 * Relocation interface.
350 * @author knut st. osmundsen (kosmunds@csc.com)
351 * @remark This interface will not return any address by using the special selectors
352 * since there is no pulic way of converting them - yet.
353 * relocFindFirst will accept special selectors as input.
354 * relocXRefFindFirst will not.
355 */
356class kRelocI
357{
358public:
359 /** @cat Relocation enumeration menthods */
360 virtual KBOOL relocFindFirst(unsigned long ulSegment, unsigned long offSegment, kRelocEntry *preloc) = 0;
361 virtual KBOOL relocFindFirst(unsigned long ulAddress, kRelocEntry *preloc) = 0;
362 virtual KBOOL relocFindNext(kRelocEntry *preloc) = 0;
363 virtual void relocFindClose(kRelocEntry *preloc) = 0;
364
365 /** @cat Common worker methods. */
366 KBOOL relocXRefFindFirst(unsigned long ulSegment, unsigned long offSegment, kRelocEntry *preloc);
367 KBOOL relocXRefFindNext(kRelocEntry *preloc);
368 void relocXRefFindClose(kRelocEntry *preloc);
369
370};
371
372
373
374#endif
Note: See TracBrowser for help on using the repository browser.