diff options
author | Maurus Cuelenaere <mcuelenaere@gmail.com> | 2008-07-11 15:50:46 +0000 |
---|---|---|
committer | Maurus Cuelenaere <mcuelenaere@gmail.com> | 2008-07-11 15:50:46 +0000 |
commit | 14c7f45cdae826f88dc539c8c38dd95caf305731 (patch) | |
tree | 832da054b7cfb2dc6fd63339af736625f31d21aa /utils/zenutils/libraries/pelib-0.9/pelib/PeLibAux.h | |
parent | 7c84ede3781c27db73403bd6302f320c76a58c8c (diff) | |
download | rockbox-14c7f45cdae826f88dc539c8c38dd95caf305731.tar.gz rockbox-14c7f45cdae826f88dc539c8c38dd95caf305731.zip |
Add zook's ZenUtils to SVN
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@18010 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'utils/zenutils/libraries/pelib-0.9/pelib/PeLibAux.h')
-rwxr-xr-x | utils/zenutils/libraries/pelib-0.9/pelib/PeLibAux.h | 884 |
1 files changed, 884 insertions, 0 deletions
diff --git a/utils/zenutils/libraries/pelib-0.9/pelib/PeLibAux.h b/utils/zenutils/libraries/pelib-0.9/pelib/PeLibAux.h new file mode 100755 index 0000000000..4aed866a7d --- /dev/null +++ b/utils/zenutils/libraries/pelib-0.9/pelib/PeLibAux.h | |||
@@ -0,0 +1,884 @@ | |||
1 | /* | ||
2 | * PeLibAux.cpp - Part of the PeLib library. | ||
3 | * | ||
4 | * Copyright (c) 2004 - 2005 Sebastian Porst (webmaster@the-interweb.com) | ||
5 | * All rights reserved. | ||
6 | * | ||
7 | * This software is licensed under the zlib/libpng License. | ||
8 | * For more details see http://www.opensource.org/licenses/zlib-license.php | ||
9 | * or the license information file (license.htm) in the root directory | ||
10 | * of PeLib. | ||
11 | */ | ||
12 | |||
13 | #ifndef PELIBAUX_H | ||
14 | #define PELIBAUX_H | ||
15 | |||
16 | //#include "PeLibInc.h" | ||
17 | //#include "PeHeader.h" | ||
18 | #include "buffer/OutputBuffer.h" | ||
19 | #include "buffer/InputBuffer.h" | ||
20 | //#include "buffer/ResTree.h" | ||
21 | #include <numeric> | ||
22 | #include <limits> | ||
23 | |||
24 | namespace PeLib | ||
25 | { | ||
26 | enum errorCodes | ||
27 | { | ||
28 | NO_ERROR = 0, | ||
29 | ERROR_OPENING_FILE = -1, | ||
30 | ERROR_INVALID_FILE = -2, | ||
31 | ERROR_TOO_MANY_SECTIONS = -3, | ||
32 | ERROR_NOT_ENOUGH_SPACE = -4, | ||
33 | ERROR_NO_FILE_ALIGNMENT = -5, | ||
34 | ERROR_NO_SECTION_ALIGNMENT = -6, | ||
35 | ERROR_ENTRY_NOT_FOUND = -7, | ||
36 | ERROR_DUPLICATE_ENTRY = -8, | ||
37 | ERROR_DIRECTORY_DOES_NOT_EXIST = -9 | ||
38 | }; | ||
39 | |||
40 | class PeFile; | ||
41 | bool isEqualNc(const std::string& s1, const std::string& s2); | ||
42 | |||
43 | // It's necessary to make sure that a byte has 8 bits and that the platform has a 8 bit type, | ||
44 | // a 16bit type and a bit type. That's because binary PE files are pretty picky about their | ||
45 | // structure. | ||
46 | |||
47 | #if CHAR_BIT == 8 | ||
48 | #if UCHAR_MAX == 255 | ||
49 | typedef unsigned char byte; | ||
50 | // typedef std::bitset<8> byte; | ||
51 | #else | ||
52 | #error You need to change some typedefs (Code: 8). Please read the PeLib documentation. | ||
53 | #endif | ||
54 | |||
55 | #if USHRT_MAX == 65535U | ||
56 | typedef unsigned short word; | ||
57 | // typedef std::bitset<16> word; | ||
58 | #else | ||
59 | #error You need to change some typedefs (Code: 16). Please read the PeLib documentation. | ||
60 | #endif | ||
61 | |||
62 | #if UINT_MAX == 4294967295UL | ||
63 | typedef unsigned int dword; | ||
64 | // typedef std::bitset<32> dword; | ||
65 | #else | ||
66 | #error You need to change some typedefs (Code: 32). Please read the PeLib documentation. | ||
67 | #endif | ||
68 | |||
69 | typedef unsigned long long qword; | ||
70 | |||
71 | // #if ULLONG_MAX == 18446744073709551615 | ||
72 | // typedef unsigned long long qword; | ||
73 | // #else | ||
74 | // #error You need to change some typedefs (Code: 32). Please read the PeLib documentation. | ||
75 | // #endif | ||
76 | #else | ||
77 | #error You need to change some typedefs. Please read the PeLib documentation. | ||
78 | #endif | ||
79 | |||
80 | |||
81 | /* enum bits {BITS_BYTE = 8, BITS_WORD = 16, BITS_DWORD = 32}; | ||
82 | |||
83 | template<bits value> | ||
84 | class DataType | ||
85 | { | ||
86 | private: | ||
87 | std::bitset<value> bsValue; | ||
88 | unsigned long ulValue; | ||
89 | |||
90 | public: | ||
91 | void operator=(unsigned long ulValue) | ||
92 | { | ||
93 | bsValue = ulValue; | ||
94 | } | ||
95 | |||
96 | operator unsigned long() const | ||
97 | { | ||
98 | return bsValue.to_ulong(); | ||
99 | } | ||
100 | |||
101 | const int operator&() | ||
102 | { | ||
103 | ulValue = bsValue; | ||
104 | return ulValue; | ||
105 | } | ||
106 | |||
107 | }; | ||
108 | |||
109 | typedef DataType<BITS_BYTE> byte; | ||
110 | typedef DataType<BITS_WORD> word; | ||
111 | typedef DataType<BITS_DWORD> dword; | ||
112 | */ | ||
113 | |||
114 | enum {PEFILE32 = 32, | ||
115 | PEFILE64 = 64, | ||
116 | PEFILE_UNKNOWN = 0}; | ||
117 | |||
118 | enum {BoundImportDirectoryId = 1, | ||
119 | ComHeaderDirectoryId, | ||
120 | ExportDirectoryId, | ||
121 | IatDirectoryId, | ||
122 | ImportDirectoryId, | ||
123 | MzHeaderId, | ||
124 | PeHeaderId, | ||
125 | RelocationsId, | ||
126 | PeFileId, | ||
127 | ResourceDirectoryId, | ||
128 | DebugDirectoryId, | ||
129 | TlsDirectoryId | ||
130 | }; | ||
131 | |||
132 | const word PELIB_IMAGE_DOS_SIGNATURE = 0x5A4D; | ||
133 | |||
134 | const dword PELIB_IMAGE_NT_SIGNATURE = 0x00004550; | ||
135 | |||
136 | template<int bits> | ||
137 | struct PELIB_IMAGE_ORDINAL_FLAGS; | ||
138 | |||
139 | template<> | ||
140 | struct PELIB_IMAGE_ORDINAL_FLAGS<32> | ||
141 | { | ||
142 | static const dword IMAGE_ORDINAL_FLAG = 0x80000000; | ||
143 | }; | ||
144 | |||
145 | template<> | ||
146 | struct PELIB_IMAGE_ORDINAL_FLAGS<64> | ||
147 | { | ||
148 | static const qword IMAGE_ORDINAL_FLAG; | ||
149 | }; | ||
150 | |||
151 | const unsigned long PELIB_IMAGE_NUMBEROF_DIRECTORY_ENTRIES = 16; | ||
152 | |||
153 | const unsigned long PELIB_IMAGE_RESOURCE_NAME_IS_STRING = 0x80000000; | ||
154 | |||
155 | const unsigned long PELIB_IMAGE_RESOURCE_DATA_IS_DIRECTORY = 0x80000000; | ||
156 | |||
157 | enum | ||
158 | { | ||
159 | PELIB_IMAGE_DIRECTORY_ENTRY_EXPORT, // OK | ||
160 | PELIB_IMAGE_DIRECTORY_ENTRY_IMPORT, // OK | ||
161 | PELIB_IMAGE_DIRECTORY_ENTRY_RESOURCE, // OK | ||
162 | PELIB_IMAGE_DIRECTORY_ENTRY_EXCEPTION, | ||
163 | PELIB_IMAGE_DIRECTORY_ENTRY_SECURITY, | ||
164 | PELIB_IMAGE_DIRECTORY_ENTRY_BASERELOC, // OK | ||
165 | PELIB_IMAGE_DIRECTORY_ENTRY_DEBUG, | ||
166 | PELIB_IMAGE_DIRECTORY_ENTRY_ARCHITECTURE, | ||
167 | PELIB_IMAGE_DIRECTORY_ENTRY_GLOBALPTR, | ||
168 | PELIB_IMAGE_DIRECTORY_ENTRY_TLS, | ||
169 | PELIB_IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG, | ||
170 | PELIB_IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT, // OK | ||
171 | PELIB_IMAGE_DIRECTORY_ENTRY_IAT, // OK | ||
172 | PELIB_IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT, | ||
173 | PELIB_IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR | ||
174 | }; | ||
175 | |||
176 | enum | ||
177 | { | ||
178 | PELIB_IMAGE_SCN_TYPE_NO_PAD = 0x00000008, | ||
179 | PELIB_IMAGE_SCN_CNT_CODE = 0x00000020, | ||
180 | PELIB_IMAGE_SCN_CNT_INITIALIZED_DATA = 0x00000040, | ||
181 | PELIB_IMAGE_SCN_CNT_UNINITIALIZED_DATA = 0x00000080, | ||
182 | PELIB_IMAGE_SCN_LNK_OTHER = 0x00000100, | ||
183 | PELIB_IMAGE_SCN_LNK_INFO = 0x00000200, | ||
184 | PELIB_IMAGE_SCN_LNK_REMOVE = 0x00000800, | ||
185 | PELIB_IMAGE_SCN_LNK_COMDAT = 0x00001000, | ||
186 | PELIB_IMAGE_SCN_NO_DEFER_SPEC_EXC = 0x00004000, | ||
187 | PELIB_IMAGE_SCN_GPREL = 0x00008000, | ||
188 | PELIB_IMAGE_SCN_MEM_FARDATA = 0x00008000, | ||
189 | PELIB_IMAGE_SCN_MEM_PURGEABLE = 0x00020000, | ||
190 | PELIB_IMAGE_SCN_MEM_16BIT = 0x00020000, | ||
191 | PELIB_IMAGE_SCN_MEM_LOCKED = 0x00040000, | ||
192 | PELIB_IMAGE_SCN_MEM_PRELOAD = 0x00080000, | ||
193 | PELIB_IMAGE_SCN_ALIGN_1BYTES = 0x00100000, | ||
194 | PELIB_IMAGE_SCN_ALIGN_2BYTES = 0x00200000, | ||
195 | PELIB_IMAGE_SCN_ALIGN_4BYTES = 0x00300000, | ||
196 | PELIB_IMAGE_SCN_ALIGN_8BYTES = 0x00400000, | ||
197 | PELIB_IMAGE_SCN_ALIGN_16BYTES = 0x00500000, | ||
198 | PELIB_IMAGE_SCN_ALIGN_BYTES = 0x00600000, | ||
199 | PELIB_IMAGE_SCN_ALIGN_64BYTES = 0x00700000, | ||
200 | PELIB_IMAGE_SCN_ALIGN_128BYTES = 0x00800000, | ||
201 | PELIB_IMAGE_SCN_ALIGN_256BYTES = 0x00900000, | ||
202 | PELIB_IMAGE_SCN_ALIGN_512BYTES = 0x00A00000, | ||
203 | PELIB_IMAGE_SCN_ALIGN_1024BYTES = 0x00B00000, | ||
204 | PELIB_IMAGE_SCN_ALIGN_2048BYTES = 0x00C00000, | ||
205 | PELIB_IMAGE_SCN_ALIGN_4096BYTES = 0x00D00000, | ||
206 | PELIB_IMAGE_SCN_ALIGN_8192BYTES = 0x00E00000, | ||
207 | PELIB_IMAGE_SCN_LNK_NRELOC_OVFL = 0x01000000, | ||
208 | PELIB_IMAGE_SCN_MEM_DISCARDABLE = 0x02000000, | ||
209 | PELIB_IMAGE_SCN_MEM_NOT_CACHED = 0x04000000, | ||
210 | PELIB_IMAGE_SCN_MEM_NOT_PAGED = 0x08000000, | ||
211 | PELIB_IMAGE_SCN_MEM_SHARED = 0x10000000, | ||
212 | PELIB_IMAGE_SCN_MEM_EXECUTE = 0x20000000, | ||
213 | PELIB_IMAGE_SCN_MEM_READ = 0x40000000, | ||
214 | PELIB_IMAGE_SCN_MEM_WRITE = 0x80000000 | ||
215 | }; | ||
216 | |||
217 | enum | ||
218 | { | ||
219 | PELIB_IMAGE_FILE_MACHINE_UNKNOWN = 0, | ||
220 | PELIB_IMAGE_FILE_MACHINE_I386 = 0x014c, | ||
221 | PELIB_IMAGE_FILE_MACHINE_R3000 = 0x0162, | ||
222 | PELIB_IMAGE_FILE_MACHINE_R4000 = 0x0166, | ||
223 | PELIB_IMAGE_FILE_MACHINE_R10000 = 0x0168, | ||
224 | PELIB_IMAGE_FILE_MACHINE_WCEMIPSV2 = 0x0169, | ||
225 | PELIB_IMAGE_FILE_MACHINE_ALPHA = 0x0184, | ||
226 | PELIB_IMAGE_FILE_MACHINE_POWERPC = 0x01F0, | ||
227 | PELIB_IMAGE_FILE_MACHINE_SH3 = 0x01a2, | ||
228 | PELIB_IMAGE_FILE_MACHINE_SH3E = 0x01a4, | ||
229 | PELIB_IMAGE_FILE_MACHINE_SH4 = 0x01a6, | ||
230 | PELIB_IMAGE_FILE_MACHINE_ARM = 0x01c0, | ||
231 | PELIB_IMAGE_FILE_MACHINE_THUMB = 0x01c2, | ||
232 | PELIB_IMAGE_FILE_MACHINE_IA64 = 0x0200, | ||
233 | PELIB_IMAGE_FILE_MACHINE_MIPS16 = 0x0266, | ||
234 | PELIB_IMAGE_FILE_MACHINE_MIPSFPU = 0x0366, | ||
235 | PELIB_IMAGE_FILE_MACHINE_MIPSFPU16 = 0x0466, | ||
236 | PELIB_IMAGE_FILE_MACHINE_ALPHA64 = 0x0284, | ||
237 | PELIB_IMAGE_FILE_MACHINE_AXP64 = PELIB_IMAGE_FILE_MACHINE_ALPHA64 | ||
238 | }; | ||
239 | |||
240 | enum | ||
241 | { | ||
242 | PELIB_IMAGE_FILE_RELOCS_STRIPPED = 0x0001, | ||
243 | PELIB_IMAGE_FILE_EXECUTABLE_IMAGE = 0x0002, | ||
244 | PELIB_IMAGE_FILE_LINE_NUMS_STRIPPED = 0x0004, | ||
245 | PELIB_IMAGE_FILE_LOCAL_SYMS_STRIPPED = 0x0008, | ||
246 | PELIB_IMAGE_FILE_AGGRESIVE_WS_TRIM = 0x0010, | ||
247 | PELIB_IMAGE_FILE_LARGE_ADDRESS_AWARE = 0x0020, | ||
248 | PELIB_IMAGE_FILE_BYTES_REVERSED_LO = 0x0080, | ||
249 | PELIB_IMAGE_FILE_32BIT_MACHINE = 0x0100, | ||
250 | PELIB_IMAGE_FILE_DEBUG_STRIPPED = 0x0200, | ||
251 | PELIB_IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP = 0x0400, | ||
252 | PELIB_IMAGE_FILE_NET_RUN_FROM_SWAP = 0x0800, | ||
253 | PELIB_IMAGE_FILE_SYSTEM = 0x1000, | ||
254 | PELIB_IMAGE_FILE_DLL = 0x2000, | ||
255 | PELIB_IMAGE_FILE_UP_SYSTEM_ONLY = 0x4000, | ||
256 | PELIB_IMAGE_FILE_BYTES_REVERSED_HI = 0x8000 | ||
257 | }; | ||
258 | |||
259 | enum | ||
260 | { | ||
261 | PELIB_IMAGE_NT_OPTIONAL_HDR32_MAGIC = 0x10b, | ||
262 | PELIB_IMAGE_NT_OPTIONAL_HDR64_MAGIC = 0x20b, | ||
263 | PELIB_IMAGE_ROM_OPTIONAL_HDR_MAGIC = 0x107 | ||
264 | }; | ||
265 | |||
266 | enum | ||
267 | { | ||
268 | PELIB_IMAGE_SUBSYSTEM_UNKNOWN = 0, | ||
269 | PELIB_IMAGE_SUBSYSTEM_NATIVE = 1, | ||
270 | PELIB_IMAGE_SUBSYSTEM_WINDOWS_GUI = 2, | ||
271 | PELIB_IMAGE_SUBSYSTEM_WINDOWS_CUI = 3, | ||
272 | PELIB_IMAGE_SUBSYSTEM_OS2_CUI = 5, | ||
273 | PELIB_IMAGE_SUBSYSTEM_POSIX_CUI = 7, | ||
274 | PELIB_IMAGE_SUBSYSTEM_NATIVE_WINDOWS = 8, | ||
275 | PELIB_IMAGE_SUBSYSTEM_WINDOWS_CE_GUI = 9 | ||
276 | }; | ||
277 | |||
278 | enum | ||
279 | { | ||
280 | PELIB_RT_CURSOR = 1, // 1 | ||
281 | PELIB_RT_BITMAP, // 2 | ||
282 | PELIB_RT_ICON, // 3 | ||
283 | PELIB_RT_MENU, // 4 | ||
284 | PELIB_RT_DIALOG, // 5 | ||
285 | PELIB_RT_STRING, // 6 | ||
286 | PELIB_RT_FONTDIR, // 7 | ||
287 | PELIB_RT_FONT, // 8 | ||
288 | PELIB_RT_ACCELERATOR, // 9 | ||
289 | PELIB_RT_RCDATA, // 10 | ||
290 | PELIB_RT_MESSAGETABLE, // 11 | ||
291 | PELIB_RT_GROUP_CURSOR, // 12 | ||
292 | PELIB_RT_GROUP_ICON = 14, // 14 | ||
293 | PELIB_RT_VERSION = 16, | ||
294 | PELIB_RT_DLGINCLUDE, | ||
295 | PELIB_RT_PLUGPLAY = 19, | ||
296 | PELIB_RT_VXD, | ||
297 | PELIB_RT_ANICURSOR, | ||
298 | PELIB_RT_ANIICON, | ||
299 | PELIB_RT_HTML, | ||
300 | PELIB_RT_MANIFEST | ||
301 | }; | ||
302 | |||
303 | template<typename T> | ||
304 | unsigned int accumulate(unsigned int size, const T& v) | ||
305 | { | ||
306 | return size + v.size(); | ||
307 | } | ||
308 | |||
309 | |||
310 | struct PELIB_IMAGE_DOS_HEADER | ||
311 | { | ||
312 | word e_magic; | ||
313 | word e_cblp; | ||
314 | word e_cp; | ||
315 | word e_crlc; | ||
316 | word e_cparhdr; | ||
317 | word e_minalloc; | ||
318 | word e_maxalloc; | ||
319 | word e_ss; | ||
320 | word e_sp; | ||
321 | word e_csum; | ||
322 | word e_ip; | ||
323 | word e_cs; | ||
324 | word e_lfarlc; | ||
325 | word e_ovno; | ||
326 | word e_res[4]; | ||
327 | word e_oemid; | ||
328 | word e_oeminfo; | ||
329 | word e_res2[10]; | ||
330 | dword e_lfanew; | ||
331 | |||
332 | PELIB_IMAGE_DOS_HEADER(); | ||
333 | |||
334 | static inline unsigned int size() {return 64;} | ||
335 | }; | ||
336 | |||
337 | struct PELIB_IMAGE_FILE_HEADER | ||
338 | { | ||
339 | word Machine; | ||
340 | word NumberOfSections; | ||
341 | dword TimeDateStamp; | ||
342 | dword PointerToSymbolTable; | ||
343 | dword NumberOfSymbols; | ||
344 | word SizeOfOptionalHeader; | ||
345 | word Characteristics; | ||
346 | |||
347 | PELIB_IMAGE_FILE_HEADER() | ||
348 | { | ||
349 | Machine = 0; | ||
350 | NumberOfSections = 0; | ||
351 | TimeDateStamp = 0; | ||
352 | PointerToSymbolTable = 0; | ||
353 | NumberOfSymbols = 0; | ||
354 | SizeOfOptionalHeader = 0; | ||
355 | Characteristics = 0; | ||
356 | } | ||
357 | |||
358 | static inline unsigned int size() {return 20;} | ||
359 | }; | ||
360 | |||
361 | struct PELIB_IMAGE_DATA_DIRECTORY | ||
362 | { | ||
363 | dword VirtualAddress; | ||
364 | dword Size; | ||
365 | |||
366 | PELIB_IMAGE_DATA_DIRECTORY() | ||
367 | { | ||
368 | VirtualAddress = 0; | ||
369 | Size = 0; | ||
370 | } | ||
371 | |||
372 | static inline unsigned int size() {return 8;} | ||
373 | }; | ||
374 | |||
375 | template<int> | ||
376 | struct FieldSizes; | ||
377 | |||
378 | template<> | ||
379 | struct FieldSizes<32> | ||
380 | { | ||
381 | typedef dword VAR4_8; | ||
382 | }; | ||
383 | |||
384 | template<> | ||
385 | struct FieldSizes<64> | ||
386 | { | ||
387 | typedef qword VAR4_8; | ||
388 | }; | ||
389 | |||
390 | template<int x> | ||
391 | struct PELIB_IMAGE_OPTIONAL_HEADER_BASE | ||
392 | { | ||
393 | typedef typename FieldSizes<x>::VAR4_8 VAR4_8; | ||
394 | |||
395 | word Magic; | ||
396 | byte MajorLinkerVersion; | ||
397 | byte MinorLinkerVersion; | ||
398 | dword SizeOfCode; | ||
399 | dword SizeOfInitializedData; | ||
400 | dword SizeOfUninitializedData; | ||
401 | dword AddressOfEntryPoint; | ||
402 | dword BaseOfCode; | ||
403 | dword BaseOfData; | ||
404 | VAR4_8 ImageBase; | ||
405 | dword SectionAlignment; | ||
406 | dword FileAlignment; | ||
407 | word MajorOperatingSystemVersion; | ||
408 | word MinorOperatingSystemVersion; | ||
409 | word MajorImageVersion; | ||
410 | word MinorImageVersion; | ||
411 | word MajorSubsystemVersion; | ||
412 | word MinorSubsystemVersion; | ||
413 | dword Win32VersionValue; | ||
414 | dword SizeOfImage; | ||
415 | dword SizeOfHeaders; | ||
416 | dword CheckSum; | ||
417 | word Subsystem; | ||
418 | word DllCharacteristics; | ||
419 | VAR4_8 SizeOfStackReserve; | ||
420 | VAR4_8 SizeOfStackCommit; | ||
421 | VAR4_8 SizeOfHeapReserve; | ||
422 | VAR4_8 SizeOfHeapCommit; | ||
423 | dword LoaderFlags; | ||
424 | dword NumberOfRvaAndSizes; | ||
425 | // PELIB_IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES]; | ||
426 | |||
427 | PELIB_IMAGE_OPTIONAL_HEADER_BASE(); | ||
428 | }; | ||
429 | |||
430 | template<int x> | ||
431 | PELIB_IMAGE_OPTIONAL_HEADER_BASE<x>::PELIB_IMAGE_OPTIONAL_HEADER_BASE() | ||
432 | { | ||
433 | Magic = 0; | ||
434 | MajorLinkerVersion = 0; | ||
435 | MinorLinkerVersion = 0; | ||
436 | SizeOfCode = 0; | ||
437 | SizeOfInitializedData = 0; | ||
438 | SizeOfUninitializedData = 0; | ||
439 | AddressOfEntryPoint = 0; | ||
440 | BaseOfCode = 0; | ||
441 | // BaseOfData = 0; | ||
442 | ImageBase = 0; | ||
443 | SectionAlignment = 0; | ||
444 | FileAlignment = 0; | ||
445 | MajorOperatingSystemVersion = 0; | ||
446 | MinorOperatingSystemVersion = 0; | ||
447 | MajorImageVersion = 0; | ||
448 | MinorImageVersion = 0; | ||
449 | MajorSubsystemVersion = 0; | ||
450 | MinorSubsystemVersion = 0; | ||
451 | Win32VersionValue = 0; | ||
452 | SizeOfImage = 0; | ||
453 | SizeOfHeaders = 0; | ||
454 | CheckSum = 0; | ||
455 | Subsystem = 0; | ||
456 | DllCharacteristics = 0; | ||
457 | SizeOfStackReserve = 0; | ||
458 | SizeOfStackCommit = 0; | ||
459 | SizeOfHeapReserve = 0; | ||
460 | SizeOfHeapCommit = 0; | ||
461 | LoaderFlags = 0; | ||
462 | NumberOfRvaAndSizes = 0; | ||
463 | } | ||
464 | |||
465 | template<int> | ||
466 | struct PELIB_IMAGE_OPTIONAL_HEADER; | ||
467 | |||
468 | template<> | ||
469 | struct PELIB_IMAGE_OPTIONAL_HEADER<32> : public PELIB_IMAGE_OPTIONAL_HEADER_BASE<32> | ||
470 | { | ||
471 | dword BaseOfData; | ||
472 | |||
473 | static inline unsigned int size() {return 224 - 0x10 * 8;} | ||
474 | }; | ||
475 | |||
476 | template<> | ||
477 | struct PELIB_IMAGE_OPTIONAL_HEADER<64> : public PELIB_IMAGE_OPTIONAL_HEADER_BASE<64> | ||
478 | { | ||
479 | static inline unsigned int size() {return 240 - 0x10 * 8;} | ||
480 | }; | ||
481 | |||
482 | template<int x> | ||
483 | struct PELIB_IMAGE_NT_HEADERS | ||
484 | { | ||
485 | dword Signature; | ||
486 | PELIB_IMAGE_FILE_HEADER FileHeader; | ||
487 | PELIB_IMAGE_OPTIONAL_HEADER<x> OptionalHeader; | ||
488 | std::vector<PELIB_IMAGE_DATA_DIRECTORY> dataDirectories; | ||
489 | |||
490 | unsigned int size() const | ||
491 | { | ||
492 | return sizeof(dword) | ||
493 | + PELIB_IMAGE_FILE_HEADER::size() | ||
494 | + PELIB_IMAGE_OPTIONAL_HEADER<x>::size() | ||
495 | + static_cast<unsigned int>(dataDirectories.size()) * PELIB_IMAGE_DATA_DIRECTORY::size(); | ||
496 | } | ||
497 | |||
498 | PELIB_IMAGE_NT_HEADERS() | ||
499 | { | ||
500 | Signature = 0; | ||
501 | } | ||
502 | }; | ||
503 | |||
504 | const unsigned int PELIB_IMAGE_SIZEOF_SHORT_NAME = 8; | ||
505 | |||
506 | struct PELIB_IMAGE_SECTION_HEADER | ||
507 | { | ||
508 | byte Name[PELIB_IMAGE_SIZEOF_SHORT_NAME]; | ||
509 | dword VirtualSize; | ||
510 | dword VirtualAddress; | ||
511 | dword SizeOfRawData; | ||
512 | dword PointerToRawData; | ||
513 | dword PointerToRelocations; | ||
514 | dword PointerToLinenumbers; | ||
515 | word NumberOfRelocations; | ||
516 | word NumberOfLinenumbers; | ||
517 | dword Characteristics; | ||
518 | |||
519 | PELIB_IMAGE_SECTION_HEADER() | ||
520 | { | ||
521 | VirtualSize = 0; | ||
522 | VirtualAddress = 0; | ||
523 | SizeOfRawData = 0; | ||
524 | PointerToRawData = 0; | ||
525 | PointerToRelocations = 0; | ||
526 | PointerToLinenumbers = 0; | ||
527 | NumberOfRelocations = 0; | ||
528 | NumberOfLinenumbers = 0; | ||
529 | Characteristics = 0; | ||
530 | } | ||
531 | |||
532 | static inline unsigned int size() {return 40;} | ||
533 | bool biggerFileOffset(const PELIB_IMAGE_SECTION_HEADER& ish) const; | ||
534 | bool biggerVirtualAddress(const PELIB_IMAGE_SECTION_HEADER& ish) const; | ||
535 | }; | ||
536 | |||
537 | template<int bits> | ||
538 | struct PELIB_IMAGE_THUNK_DATA | ||
539 | { | ||
540 | typename FieldSizes<bits>::VAR4_8 Ordinal; | ||
541 | |||
542 | PELIB_IMAGE_THUNK_DATA() | ||
543 | { | ||
544 | Ordinal = 0; | ||
545 | } | ||
546 | |||
547 | static inline unsigned int size() {return 4;} | ||
548 | }; | ||
549 | |||
550 | struct PELIB_IMAGE_IMPORT_DESCRIPTOR | ||
551 | { | ||
552 | dword OriginalFirstThunk; | ||
553 | dword TimeDateStamp; | ||
554 | dword ForwarderChain; | ||
555 | dword Name; | ||
556 | dword FirstThunk; | ||
557 | |||
558 | PELIB_IMAGE_IMPORT_DESCRIPTOR() | ||
559 | { | ||
560 | OriginalFirstThunk = 0; | ||
561 | TimeDateStamp = 0; | ||
562 | ForwarderChain = 0; | ||
563 | Name = 0; | ||
564 | FirstThunk = 0; | ||
565 | } | ||
566 | |||
567 | static inline unsigned int size() {return 20;} | ||
568 | }; | ||
569 | |||
570 | struct PELIB_IMAGE_EXPORT_DIRECTORY | ||
571 | { | ||
572 | dword Characteristics; | ||
573 | dword TimeDateStamp; | ||
574 | word MajorVersion; | ||
575 | word MinorVersion; | ||
576 | dword Name; | ||
577 | dword Base; | ||
578 | dword NumberOfFunctions; | ||
579 | dword NumberOfNames; | ||
580 | dword AddressOfFunctions; | ||
581 | dword AddressOfNames; | ||
582 | dword AddressOfNameOrdinals; | ||
583 | |||
584 | PELIB_IMAGE_EXPORT_DIRECTORY() | ||
585 | { | ||
586 | Characteristics = 0; | ||
587 | TimeDateStamp = 0; | ||
588 | MajorVersion = 0; | ||
589 | MinorVersion = 0; | ||
590 | Name = 0; | ||
591 | Base = 0; | ||
592 | NumberOfFunctions = 0; | ||
593 | NumberOfNames = 0; | ||
594 | AddressOfFunctions = 0; | ||
595 | NumberOfNames = 0; | ||
596 | AddressOfNameOrdinals = 0; | ||
597 | } | ||
598 | |||
599 | static inline unsigned int size() {return 40;} | ||
600 | }; | ||
601 | |||
602 | struct PELIB_IMAGE_BOUND_IMPORT_DESCRIPTOR | ||
603 | { | ||
604 | dword TimeDateStamp; | ||
605 | word OffsetModuleName; | ||
606 | word NumberOfModuleForwarderRefs; | ||
607 | |||
608 | PELIB_IMAGE_BOUND_IMPORT_DESCRIPTOR() | ||
609 | { | ||
610 | TimeDateStamp = 0; | ||
611 | OffsetModuleName = 0; | ||
612 | NumberOfModuleForwarderRefs = 0; | ||
613 | } | ||
614 | |||
615 | static unsigned int size() | ||
616 | { | ||
617 | return 8; | ||
618 | } | ||
619 | }; | ||
620 | |||
621 | // Stores all necessary information about a BoundImport field. | ||
622 | struct PELIB_IMAGE_BOUND_DIRECTORY | ||
623 | { | ||
624 | PELIB_IMAGE_BOUND_IMPORT_DESCRIPTOR ibdDescriptor; ///< Information about the imported file. | ||
625 | std::string strModuleName; ///< Name of the imported file. | ||
626 | std::vector<PELIB_IMAGE_BOUND_DIRECTORY> moduleForwarders; | ||
627 | |||
628 | // Will be used in std::find_if | ||
629 | // Passing by-reference not possible (see C++ Standard Core Language Defect Reports, Revision 29, Issue 106) | ||
630 | /// Compares the passed filename to the struct's filename. | ||
631 | bool equal(const std::string strModuleName) const; | ||
632 | |||
633 | unsigned int size() const; | ||
634 | }; | ||
635 | |||
636 | struct PELIB_EXP_FUNC_INFORMATION | ||
637 | { | ||
638 | dword addroffunc; | ||
639 | dword addrofname; | ||
640 | word ordinal; | ||
641 | std::string funcname; | ||
642 | |||
643 | PELIB_EXP_FUNC_INFORMATION(); | ||
644 | |||
645 | bool equal(const std::string strFunctionName) const; | ||
646 | inline unsigned int size() const | ||
647 | { | ||
648 | unsigned int uiSize = 4; | ||
649 | if (addroffunc) uiSize += 2;// + 4; | ||
650 | if (!funcname.empty()) uiSize += 4 + (unsigned int)funcname.size() + 1; | ||
651 | return uiSize; | ||
652 | } | ||
653 | }; | ||
654 | |||
655 | struct PELIB_IMAGE_RESOURCE_DIRECTORY | ||
656 | { | ||
657 | dword Characteristics; | ||
658 | dword TimeDateStamp; | ||
659 | word MajorVersion; | ||
660 | word MinorVersion; | ||
661 | word NumberOfNamedEntries; | ||
662 | word NumberOfIdEntries; | ||
663 | |||
664 | PELIB_IMAGE_RESOURCE_DIRECTORY(); | ||
665 | |||
666 | static inline unsigned int size() {return 16;} | ||
667 | }; | ||
668 | |||
669 | struct PELIB_IMAGE_RESOURCE_DIRECTORY_ENTRY | ||
670 | { | ||
671 | dword Name; | ||
672 | dword OffsetToData; | ||
673 | PELIB_IMAGE_RESOURCE_DIRECTORY_ENTRY(); | ||
674 | static inline unsigned int size() {return 8;} | ||
675 | }; | ||
676 | |||
677 | const unsigned int PELIB_IMAGE_SIZEOF_BASE_RELOCATION = 8; | ||
678 | |||
679 | struct PELIB_IMG_RES_DIR_ENTRY | ||
680 | { | ||
681 | PELIB_IMAGE_RESOURCE_DIRECTORY_ENTRY irde; | ||
682 | std::string wstrName; | ||
683 | |||
684 | bool operator<(const PELIB_IMG_RES_DIR_ENTRY& first) const; | ||
685 | |||
686 | }; | ||
687 | |||
688 | struct PELIB_IMAGE_BASE_RELOCATION | ||
689 | { | ||
690 | dword VirtualAddress; | ||
691 | dword SizeOfBlock; | ||
692 | |||
693 | PELIB_IMAGE_BASE_RELOCATION(); | ||
694 | static inline unsigned int size() {return 8;} | ||
695 | }; | ||
696 | |||
697 | struct PELIB_IMAGE_COR20_HEADER | ||
698 | { | ||
699 | dword cb; | ||
700 | word MajorRuntimeVersion; | ||
701 | word MinorRuntimeVersion; | ||
702 | PELIB_IMAGE_DATA_DIRECTORY MetaData; | ||
703 | dword Flags; | ||
704 | dword EntryPointToken; | ||
705 | PELIB_IMAGE_DATA_DIRECTORY Resources; | ||
706 | PELIB_IMAGE_DATA_DIRECTORY StrongNameSignature; | ||
707 | PELIB_IMAGE_DATA_DIRECTORY CodeManagerTable; | ||
708 | PELIB_IMAGE_DATA_DIRECTORY VTableFixups; | ||
709 | PELIB_IMAGE_DATA_DIRECTORY ExportAddressTableJumps; | ||
710 | PELIB_IMAGE_DATA_DIRECTORY ManagedNativeHeader; | ||
711 | |||
712 | PELIB_IMAGE_COR20_HEADER(); | ||
713 | static inline unsigned int size() {return 72;} | ||
714 | }; | ||
715 | |||
716 | // Used to store a file's export table. | ||
717 | struct PELIB_IMAGE_EXP_DIRECTORY | ||
718 | { | ||
719 | /// The IMAGE_EXPORTED_DIRECTORY of a file's export table. | ||
720 | PELIB_IMAGE_EXPORT_DIRECTORY ied; | ||
721 | /// The original filename of current file. | ||
722 | std::string name; | ||
723 | std::vector<PELIB_EXP_FUNC_INFORMATION> functions; | ||
724 | inline unsigned int size() const | ||
725 | { | ||
726 | return PELIB_IMAGE_EXPORT_DIRECTORY::size() + name.size() + 1 + | ||
727 | std::accumulate(functions.begin(), functions.end(), 0, accumulate<PELIB_EXP_FUNC_INFORMATION>); | ||
728 | } | ||
729 | }; | ||
730 | |||
731 | // Used for parsing a file's import table. It combines the function name, the hint | ||
732 | // and the IMAGE_THUNK_DATA of an imported function. | ||
733 | template<int bits> | ||
734 | struct PELIB_THUNK_DATA | ||
735 | { | ||
736 | /// The IMAGE_THUNK_DATA struct of an imported function. | ||
737 | PELIB_IMAGE_THUNK_DATA<bits> itd; | ||
738 | /// The hint of an imported function. | ||
739 | word hint; | ||
740 | /// The function name of an imported function. | ||
741 | std::string fname; | ||
742 | |||
743 | bool equalHint(word wHint) const | ||
744 | { | ||
745 | return hint == wHint; | ||
746 | // return itd.Ordinal == (wHint | IMAGE_ORDINAL_FLAGS<bits>::IMAGE_ORDINAL_FLAG); | ||
747 | } | ||
748 | |||
749 | bool equalFunctionName(std::string strFunctionName) const | ||
750 | { | ||
751 | return isEqualNc(fname, strFunctionName); | ||
752 | } | ||
753 | |||
754 | unsigned int size() const {return PELIB_IMAGE_THUNK_DATA<bits>::size() + fname.size() + 1 + sizeof(hint);} | ||
755 | }; | ||
756 | |||
757 | // Used to store a file's import table. Every struct of this sort | ||
758 | // can store import information of one DLL. | ||
759 | template<int bits> | ||
760 | struct PELIB_IMAGE_IMPORT_DIRECTORY | ||
761 | { | ||
762 | /// The IMAGE_IMPORT_DESCRIPTOR of an imported DLL. | ||
763 | PELIB_IMAGE_IMPORT_DESCRIPTOR impdesc; | ||
764 | /// The name of an imported DLL. | ||
765 | std::string name; | ||
766 | /// All original first thunk values of an imported DLL. | ||
767 | std::vector<PELIB_THUNK_DATA<bits> > originalfirstthunk; | ||
768 | /// All first thunk value of an imported DLL. | ||
769 | std::vector<PELIB_THUNK_DATA<bits> > firstthunk; | ||
770 | |||
771 | // bool operator==(std::string strFilename) const; | ||
772 | inline unsigned int size() const | ||
773 | { | ||
774 | return PELIB_IMAGE_IMPORT_DESCRIPTOR::size() + name.size() + 1 + // descriptor + dllname | ||
775 | std::accumulate(originalfirstthunk.begin(), originalfirstthunk.end(), 0, accumulate<PELIB_THUNK_DATA<bits> >) + // thunks (PeLib uses only one thunk) | ||
776 | PELIB_IMAGE_THUNK_DATA<bits>::size(); // zero-termination | ||
777 | } | ||
778 | |||
779 | bool operator==(std::string strFilename) const | ||
780 | { | ||
781 | return isEqualNc(this->name, strFilename); | ||
782 | } | ||
783 | }; | ||
784 | |||
785 | struct PELIB_IMAGE_RESOURCE_DATA_ENTRY | ||
786 | { | ||
787 | dword OffsetToData; | ||
788 | dword Size; | ||
789 | dword CodePage; | ||
790 | dword Reserved; | ||
791 | |||
792 | static inline unsigned int size() {return 16;} | ||
793 | }; | ||
794 | |||
795 | struct PELIB_IMAGE_RESOURCE_DATA | ||
796 | { | ||
797 | PELIB_IMAGE_RESOURCE_DATA_ENTRY irdEntry; | ||
798 | std::vector<byte> vData; | ||
799 | }; | ||
800 | |||
801 | struct IMG_BASE_RELOC | ||
802 | { | ||
803 | PELIB_IMAGE_BASE_RELOCATION ibrRelocation; | ||
804 | std::vector<word> vRelocData; | ||
805 | }; | ||
806 | |||
807 | struct PELIB_IMAGE_DEBUG_DIRECTORY | ||
808 | { | ||
809 | dword Characteristics; | ||
810 | dword TimeDateStamp; | ||
811 | word MajorVersion; | ||
812 | word MinorVersion; | ||
813 | dword Type; | ||
814 | dword SizeOfData; | ||
815 | dword AddressOfRawData; | ||
816 | dword PointerToRawData; | ||
817 | |||
818 | static unsigned int size() {return 28;} | ||
819 | }; | ||
820 | |||
821 | struct PELIB_IMG_DEBUG_DIRECTORY | ||
822 | { | ||
823 | PELIB_IMAGE_DEBUG_DIRECTORY idd; | ||
824 | std::vector<byte> data; | ||
825 | }; | ||
826 | |||
827 | template<int bits> | ||
828 | struct PELIB_IMAGE_TLS_DIRECTORY_BASE | ||
829 | { | ||
830 | typename FieldSizes<bits>::VAR4_8 StartAddressOfRawData; | ||
831 | typename FieldSizes<bits>::VAR4_8 EndAddressOfRawData; | ||
832 | typename FieldSizes<bits>::VAR4_8 AddressOfIndex; | ||
833 | typename FieldSizes<bits>::VAR4_8 AddressOfCallBacks; | ||
834 | dword SizeOfZeroFill; | ||
835 | dword Characteristics; | ||
836 | }; | ||
837 | |||
838 | template<int bits> | ||
839 | struct PELIB_IMAGE_TLS_DIRECTORY;// : public PELIB_IMAGE_TLS_DIRECTORY_BASE<bits> | ||
840 | |||
841 | template<> | ||
842 | struct PELIB_IMAGE_TLS_DIRECTORY<32> : public PELIB_IMAGE_TLS_DIRECTORY_BASE<32> | ||
843 | { | ||
844 | // enum {size = 24}; | ||
845 | static unsigned int size(){return 24;} | ||
846 | }; | ||
847 | |||
848 | template<> | ||
849 | struct PELIB_IMAGE_TLS_DIRECTORY<64> : public PELIB_IMAGE_TLS_DIRECTORY_BASE<64> | ||
850 | { | ||
851 | // enum {size = 40}; | ||
852 | static unsigned int size(){return 40;} | ||
853 | }; | ||
854 | |||
855 | unsigned int fileSize(const std::string& filename); | ||
856 | unsigned int fileSize(std::ifstream& file); | ||
857 | unsigned int fileSize(std::ofstream& file); | ||
858 | unsigned int fileSize(std::fstream& file); | ||
859 | unsigned int alignOffset(unsigned int uiOffset, unsigned int uiAlignment); | ||
860 | |||
861 | /// Determines if a file is a 32bit or 64bit PE file. | ||
862 | unsigned int getFileType(const std::string strFilename); | ||
863 | |||
864 | /// Opens a PE file. | ||
865 | PeFile* openPeFile(const std::string& strFilename); | ||
866 | |||
867 | /* enum MzHeader_Field {e_magic, e_cblp, e_cp, e_crlc, e_cparhdr, e_minalloc, e_maxalloc, | ||
868 | e_ss, e_sp, e_csum, e_ip, e_cs, e_lfarlc, e_ovno, e_res, e_oemid, | ||
869 | e_oeminfo, e_res2, e_lfanew}; | ||
870 | enum PeHeader_Field {NtSignature, Machine, NumberOfSections, TimeDateStamp, PointerToSymbolTable, | ||
871 | NumberOfSymbols, SizeOfOptionalHeader, Characteristics, Magic, | ||
872 | MajorLinkerVersion, MinorLinkerVersion, SizeOfCode, SizeOfInitializedData, | ||
873 | SizeOfUninitializedData, AddressOfEntryPoint, BaseOfCode, BaseOfData, ImageBase, | ||
874 | SectionAlignment, FileAlignment, MajorOperatingSystemVersion, MinorOperatingSystemVersion, | ||
875 | MajorImageVersion, MinorImageVersion, MajorSubsystemVersion, MinorSubsystemVersion, | ||
876 | Win32VersionValue, SizeOfImage, SizeOfHeaders, CheckSum, Subsystem, DllCharacteristics, | ||
877 | SizeOfStackReserve, SizeOfStackCommit, SizeOfHeapReserve, SizeOfHeapCommit, | ||
878 | LoaderFlags, NumberOfRvaAndSizes, DataDirectoryRva, DataDirectorySize}; | ||
879 | enum Section_Field {SectionName, VirtualSize, VirtualAddress, SizeOfRawData, PointerToRawData, PointerToRelocations, | ||
880 | PointerToLinenumbers, NumberOfRelocations, NumberOfLinenumbers, SectionCharacteristics}; | ||
881 | */ | ||
882 | } | ||
883 | |||
884 | #endif | ||