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 }