Mercurial > projects > ddmd
comparison dbg/image/PE.d @ 70:6bdecc3f4569
Get rid of win32 bindings
author | korDen |
---|---|
date | Sat, 28 Aug 2010 10:51:32 +0400 |
parents | 10317f0c89a5 |
children | 7e0d548de9e6 |
comparison
equal
deleted
inserted
replaced
69:c876339731a4 | 70:6bdecc3f4569 |
---|---|
10 License: | 10 License: |
11 Public Domain | 11 Public Domain |
12 */ | 12 */ |
13 module dbg.image.PE; | 13 module dbg.image.PE; |
14 | 14 |
15 version(Windows) { | 15 import core.stdc.string : strncmp; |
16 | |
17 import std.c.string : strncmp; | |
18 import dbg.Debug; | 16 import dbg.Debug; |
19 import dbg.symbol.CodeView; | 17 import dbg.symbol.CodeView; |
20 //import dbg.symbol.COFF; | 18 //import dbg.symbol.COFF; |
21 //import sys.windows.FileSystem; | 19 //import sys.windows.FileSystem; |
22 //import sys.windows.Memory; | 20 //import sys.windows.Memory; |
23 //import sys.windows.Security : GENERIC_READ; | 21 //import sys.windows.Security : GENERIC_READ; |
24 //import sys.windows.Information : CloseHandle; | 22 //import sys.windows.Information : CloseHandle; |
25 //import sys.windows.Image; | 23 //import sys.windows.Image; |
26 | 24 |
27 import win32.windows; | 25 import core.sys.windows.windows; |
28 import win32.winbase; | |
29 | |
30 enum IMAGE_SIZEOF_NT_OPTIONAL64_HEADER = 240; | |
31 | |
32 struct IMAGE_NT_HEADERS64 { | |
33 DWORD Signature; | |
34 IMAGE_FILE_HEADER FileHeader; | |
35 IMAGE_OPTIONAL_HEADER64 OptionalHeader; | |
36 } | |
37 | |
38 auto IMAGE_FIRST_SECTION64( const(IMAGE_NT_HEADERS64*) ntheader ) { | |
39 return cast(PIMAGE_SECTION_HEADER) ((cast(UINT_PTR)ntheader) + IMAGE_NT_HEADERS64.OptionalHeader.offsetof + (cast(PIMAGE_NT_HEADERS64)(ntheader)).FileHeader.SizeOfOptionalHeader); | |
40 } | |
41 | |
42 auto IMAGE_FIRST_SECTION32( const(IMAGE_NT_HEADERS32*) ntheader ) { | |
43 return cast(PIMAGE_SECTION_HEADER)((cast(UINT_PTR)ntheader) + IMAGE_NT_HEADERS32.OptionalHeader.offsetof + (cast(PIMAGE_NT_HEADERS32)ntheader).FileHeader.SizeOfOptionalHeader); | |
44 } | |
45 | 26 |
46 class PEImage : IExecutableImage { | 27 class PEImage : IExecutableImage { |
47 /** | 28 /** |
48 Loads and validate the image file. | 29 Loads and validate the image file. |
49 | 30 |
60 // Create the file mapping | 41 // Create the file mapping |
61 _file = CreateFileA((fileName ~ '\0').ptr, GENERIC_READ, FILE_SHARE_READ, | 42 _file = CreateFileA((fileName ~ '\0').ptr, GENERIC_READ, FILE_SHARE_READ, |
62 null, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, null); | 43 null, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, null); |
63 if(_file == INVALID_HANDLE_VALUE) SystemException(); | 44 if(_file == INVALID_HANDLE_VALUE) SystemException(); |
64 | 45 |
65 GetFileSizeEx(_file, &_fileSize); | 46 _fileSize = GetFileSize(_file, null); |
66 | 47 |
67 _map = CreateFileMapping(_file, null, PAGE_READONLY, 0, 0, null); | 48 _map = CreateFileMappingA(_file, null, PAGE_READONLY, 0, 0, null); |
68 if(!_map) SystemException(); | 49 if(!_map) SystemException(); |
69 | 50 |
70 _view = cast(const(ubyte)*)MapViewOfFile(_map, FILE_MAP_READ, 0, 0, 0); | 51 _view = cast(const(ubyte)*)MapViewOfFile(_map, FILE_MAP_READ, 0, 0, 0); |
71 if(!_view) SystemException(); | 52 if(!_view) SystemException(); |
72 | 53 |
137 | 118 |
138 /** | 119 /** |
139 Get the raw image data | 120 Get the raw image data |
140 */ | 121 */ |
141 const(ubyte)[] data() const { | 122 const(ubyte)[] data() const { |
142 return _view[0 .. cast(size_t)_fileSize.QuadPart]; | 123 return _view[0 .. _fileSize]; |
143 } | 124 } |
144 | 125 |
145 /** | 126 /** |
146 Get the dos, nt or nt64 headers | 127 Get the dos, nt or nt64 headers |
147 */ | 128 */ |
308 | 289 |
309 /** | 290 /** |
310 Verify a file offset before accessing it | 291 Verify a file offset before accessing it |
311 */ | 292 */ |
312 void CheckOffset(long offset) const { | 293 void CheckOffset(long offset) const { |
313 if(offset > _fileSize.QuadPart) throw new PECorruptedException(this); | 294 if (offset > _fileSize) throw new PECorruptedException(this); |
314 } | 295 } |
315 | 296 |
316 string _filename; | 297 string _filename; |
317 HANDLE _file; | 298 HANDLE _file; |
318 HANDLE _map; | 299 HANDLE _map; |
319 LARGE_INTEGER _fileSize; | 300 size_t _fileSize; |
320 bool _is64; | 301 bool _is64; |
321 | 302 |
322 union { | 303 union { |
323 const(ubyte)* _view; | 304 const(ubyte)* _view; |
324 const(IMAGE_DOS_HEADER)* _dos; | 305 const(IMAGE_DOS_HEADER)* _dos; |
356 this(in PEImage img) { | 337 this(in PEImage img) { |
357 super("Corrupted PE file."); | 338 super("Corrupted PE file."); |
358 } | 339 } |
359 } | 340 } |
360 | 341 |
361 } // version(Windows) | 342 align(2): |
343 struct IMAGE_DOS_HEADER { | |
344 WORD e_magic; | |
345 WORD e_cblp; | |
346 WORD e_cp; | |
347 WORD e_crlc; | |
348 WORD e_cparhdr; | |
349 WORD e_minalloc; | |
350 WORD e_maxalloc; | |
351 WORD e_ss; | |
352 WORD e_sp; | |
353 WORD e_csum; | |
354 WORD e_ip; | |
355 WORD e_cs; | |
356 WORD e_lfarlc; | |
357 WORD e_ovno; | |
358 WORD[4] e_res; | |
359 WORD e_oemid; | |
360 WORD e_oeminfo; | |
361 WORD[10] e_res2; | |
362 LONG e_lfanew; | |
363 } | |
364 | |
365 align(4) struct IMAGE_NT_HEADERS32 { | |
366 DWORD Signature; | |
367 IMAGE_FILE_HEADER FileHeader; | |
368 IMAGE_OPTIONAL_HEADER32 OptionalHeader; | |
369 } | |
370 | |
371 align(4) struct IMAGE_NT_HEADERS64 { | |
372 DWORD Signature; | |
373 IMAGE_FILE_HEADER FileHeader; | |
374 IMAGE_OPTIONAL_HEADER64 OptionalHeader; | |
375 } | |
376 | |
377 align(4): | |
378 struct IMAGE_FILE_HEADER { | |
379 WORD Machine; | |
380 WORD NumberOfSections; | |
381 DWORD TimeDateStamp; | |
382 DWORD PointerToSymbolTable; | |
383 DWORD NumberOfSymbols; | |
384 WORD SizeOfOptionalHeader; | |
385 WORD Characteristics; | |
386 } | |
387 | |
388 struct IMAGE_OPTIONAL_HEADER32 { | |
389 WORD Magic; | |
390 BYTE MajorLinkerVersion; | |
391 BYTE MinorLinkerVersion; | |
392 DWORD SizeOfCode; | |
393 DWORD SizeOfInitializedData; | |
394 DWORD SizeOfUninitializedData; | |
395 DWORD AddressOfEntryPoint; | |
396 DWORD BaseOfCode; | |
397 DWORD BaseOfData; | |
398 DWORD ImageBase; | |
399 DWORD SectionAlignment; | |
400 DWORD FileAlignment; | |
401 WORD MajorOperatingSystemVersion; | |
402 WORD MinorOperatingSystemVersion; | |
403 WORD MajorImageVersion; | |
404 WORD MinorImageVersion; | |
405 WORD MajorSubsystemVersion; | |
406 WORD MinorSubsystemVersion; | |
407 DWORD Win32VersionValue; | |
408 DWORD SizeOfImage; | |
409 DWORD SizeOfHeaders; | |
410 DWORD CheckSum; | |
411 WORD Subsystem; | |
412 WORD DllCharacteristics; | |
413 DWORD SizeOfStackReserve; | |
414 DWORD SizeOfStackCommit; | |
415 DWORD SizeOfHeapReserve; | |
416 DWORD SizeOfHeapCommit; | |
417 DWORD LoaderFlags; | |
418 DWORD NumberOfRvaAndSizes; | |
419 IMAGE_DATA_DIRECTORY[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] DataDirectory; | |
420 } | |
421 | |
422 alias ulong ULONGLONG; | |
423 | |
424 struct IMAGE_OPTIONAL_HEADER64 { | |
425 WORD Magic; | |
426 BYTE MajorLinkerVersion; | |
427 BYTE MinorLinkerVersion; | |
428 DWORD SizeOfCode; | |
429 DWORD SizeOfInitializedData; | |
430 DWORD SizeOfUninitializedData; | |
431 DWORD AddressOfEntryPoint; | |
432 DWORD BaseOfCode; | |
433 ULONGLONG ImageBase; | |
434 DWORD SectionAlignment; | |
435 DWORD FileAlignment; | |
436 WORD MajorOperatingSystemVersion; | |
437 WORD MinorOperatingSystemVersion; | |
438 WORD MajorImageVersion; | |
439 WORD MinorImageVersion; | |
440 WORD MajorSubsystemVersion; | |
441 WORD MinorSubsystemVersion; | |
442 DWORD Win32VersionValue; | |
443 DWORD SizeOfImage; | |
444 DWORD SizeOfHeaders; | |
445 DWORD CheckSum; | |
446 WORD Subsystem; | |
447 WORD DllCharacteristics; | |
448 ULONGLONG SizeOfStackReserve; | |
449 ULONGLONG SizeOfStackCommit; | |
450 ULONGLONG SizeOfHeapReserve; | |
451 ULONGLONG SizeOfHeapCommit; | |
452 DWORD LoaderFlags; | |
453 DWORD NumberOfRvaAndSizes; | |
454 IMAGE_DATA_DIRECTORY[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] DataDirectory; | |
455 } | |
456 | |
457 enum { | |
458 IMAGE_DOS_SIGNATURE = 0x5A4D, | |
459 IMAGE_OS2_SIGNATURE = 0x454E, | |
460 IMAGE_OS2_SIGNATURE_LE = 0x454C, | |
461 IMAGE_VXD_SIGNATURE = 0x454C, | |
462 IMAGE_NT_SIGNATURE = 0x4550 | |
463 } | |
464 | |
465 const size_t | |
466 IMAGE_NUMBEROF_DIRECTORY_ENTRIES = 16, | |
467 IMAGE_SIZEOF_ROM_OPTIONAL_HEADER = 56, | |
468 IMAGE_SIZEOF_STD_OPTIONAL_HEADER = 28, | |
469 IMAGE_SIZEOF_NT_OPTIONAL32_HEADER = 224, | |
470 IMAGE_SIZEOF_NT_OPTIONAL64_HEADER = 240, | |
471 IMAGE_SIZEOF_SHORT_NAME = 8, | |
472 IMAGE_SIZEOF_SECTION_HEADER = 40, | |
473 IMAGE_SIZEOF_SYMBOL = 18, | |
474 IMAGE_SIZEOF_AUX_SYMBOL = 18, | |
475 IMAGE_SIZEOF_RELOCATION = 10, | |
476 IMAGE_SIZEOF_BASE_RELOCATION = 8, | |
477 IMAGE_SIZEOF_LINENUMBER = 6, | |
478 IMAGE_SIZEOF_ARCHIVE_MEMBER_HDR = 60, | |
479 SIZEOF_RFPO_DATA = 16; | |
480 | |
481 struct IMAGE_DATA_DIRECTORY { | |
482 DWORD VirtualAddress; | |
483 DWORD Size; | |
484 } | |
485 | |
486 // IMAGE_OPTIONAL_HEADER.Magic | |
487 enum : WORD { | |
488 IMAGE_NT_OPTIONAL_HDR32_MAGIC = 0x010B, | |
489 IMAGE_ROM_OPTIONAL_HDR_MAGIC = 0x0107, | |
490 IMAGE_NT_OPTIONAL_HDR64_MAGIC = 0x020B | |
491 } | |
492 | |
493 struct IMAGE_SECTION_HEADER { | |
494 BYTE[IMAGE_SIZEOF_SHORT_NAME] Name; | |
495 union _Misc { | |
496 DWORD PhysicalAddress; | |
497 DWORD VirtualSize; | |
498 } | |
499 _Misc Misc; | |
500 DWORD VirtualAddress; | |
501 DWORD SizeOfRawData; | |
502 DWORD PointerToRawData; | |
503 DWORD PointerToRelocations; | |
504 DWORD PointerToLinenumbers; | |
505 WORD NumberOfRelocations; | |
506 WORD NumberOfLinenumbers; | |
507 DWORD Characteristics; | |
508 } | |
509 | |
510 // IMAGE_SECTION_HEADER.Characteristics | |
511 const DWORD | |
512 IMAGE_SCN_TYPE_REG = 0x00000000, | |
513 IMAGE_SCN_TYPE_DSECT = 0x00000001, | |
514 IMAGE_SCN_TYPE_NOLOAD = 0x00000002, | |
515 IMAGE_SCN_TYPE_GROUP = 0x00000004, | |
516 IMAGE_SCN_TYPE_NO_PAD = 0x00000008, | |
517 IMAGE_SCN_TYPE_COPY = 0x00000010, | |
518 IMAGE_SCN_CNT_CODE = 0x00000020, | |
519 IMAGE_SCN_CNT_INITIALIZED_DATA = 0x00000040, | |
520 IMAGE_SCN_CNT_UNINITIALIZED_DATA = 0x00000080, | |
521 IMAGE_SCN_LNK_OTHER = 0x00000100, | |
522 IMAGE_SCN_LNK_INFO = 0x00000200, | |
523 IMAGE_SCN_TYPE_OVER = 0x00000400, | |
524 IMAGE_SCN_LNK_REMOVE = 0x00000800, | |
525 IMAGE_SCN_LNK_COMDAT = 0x00001000, | |
526 IMAGE_SCN_MEM_FARDATA = 0x00008000, | |
527 IMAGE_SCN_GPREL = 0x00008000, | |
528 IMAGE_SCN_MEM_PURGEABLE = 0x00020000, | |
529 IMAGE_SCN_MEM_16BIT = 0x00020000, | |
530 IMAGE_SCN_MEM_LOCKED = 0x00040000, | |
531 IMAGE_SCN_MEM_PRELOAD = 0x00080000, | |
532 IMAGE_SCN_ALIGN_1BYTES = 0x00100000, | |
533 IMAGE_SCN_ALIGN_2BYTES = 0x00200000, | |
534 IMAGE_SCN_ALIGN_4BYTES = 0x00300000, | |
535 IMAGE_SCN_ALIGN_8BYTES = 0x00400000, | |
536 IMAGE_SCN_ALIGN_16BYTES = 0x00500000, | |
537 IMAGE_SCN_ALIGN_32BYTES = 0x00600000, | |
538 IMAGE_SCN_ALIGN_64BYTES = 0x00700000, | |
539 IMAGE_SCN_ALIGN_128BYTES = 0x00800000, | |
540 IMAGE_SCN_ALIGN_256BYTES = 0x00900000, | |
541 IMAGE_SCN_ALIGN_512BYTES = 0x00A00000, | |
542 IMAGE_SCN_ALIGN_1024BYTES = 0x00B00000, | |
543 IMAGE_SCN_ALIGN_2048BYTES = 0x00C00000, | |
544 IMAGE_SCN_ALIGN_4096BYTES = 0x00D00000, | |
545 IMAGE_SCN_ALIGN_8192BYTES = 0x00E00000, | |
546 IMAGE_SCN_LNK_NRELOC_OVFL = 0x01000000, | |
547 IMAGE_SCN_MEM_DISCARDABLE = 0x02000000, | |
548 IMAGE_SCN_MEM_NOT_CACHED = 0x04000000, | |
549 IMAGE_SCN_MEM_NOT_PAGED = 0x08000000, | |
550 IMAGE_SCN_MEM_SHARED = 0x10000000, | |
551 IMAGE_SCN_MEM_EXECUTE = 0x20000000, | |
552 IMAGE_SCN_MEM_READ = 0x40000000, | |
553 IMAGE_SCN_MEM_WRITE = 0x80000000; | |
554 | |
555 // ImageDirectoryEntryToDataEx() | |
556 enum : USHORT { | |
557 IMAGE_DIRECTORY_ENTRY_EXPORT = 0, | |
558 IMAGE_DIRECTORY_ENTRY_IMPORT, | |
559 IMAGE_DIRECTORY_ENTRY_RESOURCE, | |
560 IMAGE_DIRECTORY_ENTRY_EXCEPTION, | |
561 IMAGE_DIRECTORY_ENTRY_SECURITY, | |
562 IMAGE_DIRECTORY_ENTRY_BASERELOC, | |
563 IMAGE_DIRECTORY_ENTRY_DEBUG, | |
564 IMAGE_DIRECTORY_ENTRY_COPYRIGHT, // = 7 | |
565 IMAGE_DIRECTORY_ENTRY_ARCHITECTURE = 7, | |
566 IMAGE_DIRECTORY_ENTRY_GLOBALPTR, | |
567 IMAGE_DIRECTORY_ENTRY_TLS, | |
568 IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG, | |
569 IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT, | |
570 IMAGE_DIRECTORY_ENTRY_IAT, | |
571 IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT, | |
572 IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR, // = 14 | |
573 } | |
574 | |
575 IMAGE_SECTION_HEADER* IMAGE_FIRST_SECTION32(const(IMAGE_NT_HEADERS32)* h) { | |
576 return cast(IMAGE_SECTION_HEADER*)((cast(char*)&h.OptionalHeader) + h.FileHeader.SizeOfOptionalHeader); | |
577 } | |
578 | |
579 IMAGE_SECTION_HEADER* IMAGE_FIRST_SECTION64(const(IMAGE_NT_HEADERS64)* h) { | |
580 return cast(IMAGE_SECTION_HEADER*)((cast(char*)&h.OptionalHeader) + h.FileHeader.SizeOfOptionalHeader); | |
581 } | |
582 | |
583 struct IMAGE_DEBUG_DIRECTORY { | |
584 DWORD Characteristics; | |
585 DWORD TimeDateStamp; | |
586 WORD MajorVersion; | |
587 WORD MinorVersion; | |
588 DWORD Type; | |
589 DWORD SizeOfData; | |
590 DWORD AddressOfRawData; | |
591 DWORD PointerToRawData; | |
592 } | |
593 | |
594 enum : DWORD { | |
595 IMAGE_DEBUG_TYPE_UNKNOWN, | |
596 IMAGE_DEBUG_TYPE_COFF, | |
597 IMAGE_DEBUG_TYPE_CODEVIEW, | |
598 IMAGE_DEBUG_TYPE_FPO, | |
599 IMAGE_DEBUG_TYPE_MISC, | |
600 IMAGE_DEBUG_TYPE_EXCEPTION, | |
601 IMAGE_DEBUG_TYPE_FIXUP, | |
602 IMAGE_DEBUG_TYPE_OMAP_TO_SRC, | |
603 IMAGE_DEBUG_TYPE_OMAP_FROM_SRC, | |
604 IMAGE_DEBUG_TYPE_BORLAND // = 9 | |
605 } |