1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef TYPES_WIN_PE_H_ 6 #define TYPES_WIN_PE_H_ 7 8 #include "base/basictypes.h" 9 10 11 namespace courgette { 12 13 // PE file section header. This struct has the same layout as the 14 // IMAGE_SECTION_HEADER structure from WINNT.H 15 // http://msdn.microsoft.com/en-us/library/ms680341(VS.85).aspx 16 // 17 #pragma pack(push, 1) // Supported by MSVC and GCC. Ensures no gaps in packing. 18 struct Section { 19 char name[8]; 20 uint32 virtual_size; 21 uint32 virtual_address; 22 uint32 size_of_raw_data; 23 uint32 file_offset_of_raw_data; 24 uint32 pointer_to_relocations; // Always zero in an image. 25 uint32 pointer_to_line_numbers; // Always zero in an image. 26 uint16 number_of_relocations; // Always zero in an image. 27 uint16 number_of_line_numbers; // Always zero in an image. 28 uint32 characteristics; 29 }; 30 #pragma pack(pop) 31 32 COMPILE_ASSERT(sizeof(Section) == 40, section_is_40_bytes); 33 34 // ImageDataDirectory has same layout as IMAGE_DATA_DIRECTORY structure from 35 // WINNT.H 36 // http://msdn.microsoft.com/en-us/library/ms680305(VS.85).aspx 37 // 38 class ImageDataDirectory { 39 public: 40 ImageDataDirectory() : address_(0), size_(0) {} 41 RVA address_; 42 uint32 size_; 43 }; 44 45 COMPILE_ASSERT(sizeof(ImageDataDirectory) == 8, 46 image_data_directory_is_8_bytes); 47 48 49 //////////////////////////////////////////////////////////////////////////////// 50 51 // Constants and offsets gleaned from WINNT.H and various articles on the 52 // format of Windows PE executables. 53 54 // This is FIELD_OFFSET(IMAGE_DOS_HEADER, e_lfanew): 55 const size_t kOffsetOfFileAddressOfNewExeHeader = 0x3c; 56 57 const uint16 kImageNtOptionalHdr32Magic = 0x10b; 58 const uint16 kImageNtOptionalHdr64Magic = 0x20b; 59 60 const size_t kSizeOfCoffHeader = 20; 61 const size_t kOffsetOfDataDirectoryFromImageOptionalHeader32 = 96; 62 const size_t kOffsetOfDataDirectoryFromImageOptionalHeader64 = 112; 63 64 } // namespace 65 #endif // TYPES_WIN_PE_H_ 66