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 | *******************************************************************************/
|
---|
26 | class kPageI;
|
---|
27 | class kExportI;
|
---|
28 | class kExportEntry;
|
---|
29 | class kModuleI;
|
---|
30 | class kExecutableI;
|
---|
31 | class kDbgTypeI;
|
---|
32 | class 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 | */
|
---|
42 | class kPageI
|
---|
43 | {
|
---|
44 | public:
|
---|
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 | */
|
---|
97 | class kExportEntry
|
---|
98 | {
|
---|
99 | public:
|
---|
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 |
|
---|
108 | public:
|
---|
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 | */
|
---|
119 | class kExportI
|
---|
120 | {
|
---|
121 | public:
|
---|
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 | */
|
---|
174 | class kModuleI
|
---|
175 | {
|
---|
176 | public:
|
---|
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 | */
|
---|
187 | class kExecutableI : public kModuleI, public kExportI
|
---|
188 | {
|
---|
189 | public:
|
---|
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 | */
|
---|
206 | class kDbgMemberEntry
|
---|
207 | {
|
---|
208 | public:
|
---|
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 | */
|
---|
221 | class kDbgTypeEntry
|
---|
222 | {
|
---|
223 | public:
|
---|
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 |
|
---|
231 | public:
|
---|
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 | */
|
---|
243 | class kDbgTypeI
|
---|
244 | {
|
---|
245 | public:
|
---|
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 | */
|
---|
269 | class kRelocEntry
|
---|
270 | {
|
---|
271 | public:
|
---|
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 |
|
---|
340 | public:
|
---|
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 | */
|
---|
356 | class kRelocI
|
---|
357 | {
|
---|
358 | public:
|
---|
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
|
---|