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
11namespace 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.
18struct 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
32COMPILE_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//
38class ImageDataDirectory {
39 public:
40  ImageDataDirectory() : address_(0), size_(0) {}
41  RVA address_;
42  uint32 size_;
43};
44
45COMPILE_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):
55const size_t kOffsetOfFileAddressOfNewExeHeader = 0x3c;
56
57const uint16 kImageNtOptionalHdr32Magic = 0x10b;
58const uint16 kImageNtOptionalHdr64Magic = 0x20b;
59
60const size_t kSizeOfCoffHeader = 20;
61const size_t kOffsetOfDataDirectoryFromImageOptionalHeader32 = 96;
62const size_t kOffsetOfDataDirectoryFromImageOptionalHeader64 = 112;
63
64}  // namespace
65#endif  // TYPES_WIN_PE_H_
66