1 #ifndef PE_GENERIC_H
2 #define PE_GENERIC_H
3 /*
4 Copyright (c) 2018, David Anderson All rights reserved.
5 
6 Redistribution and use in source and binary forms, with
7 or without modification, are permitted provided that the
8 following conditions are met:
9 
10     Redistributions of source code must retain the above
11     copyright notice, this list of conditions and the following
12     disclaimer.
13 
14     Redistributions in binary form must reproduce the above
15     copyright notice, this list of conditions and the following
16     disclaimer in the documentation and/or other materials
17     provided with the distribution.
18 
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
20 CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
21 INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
24 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
30 OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
31 EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 */
33 #ifdef __cplusplus
34 extern "C" {
35 #endif /* __cplusplus */
36 
37 
38 struct dwarf_pe_generic_file_header
39 {
40     Dwarf_Unsigned Machine;
41     Dwarf_Unsigned NumberOfSections;
42     Dwarf_Unsigned TimeDateStamp;
43     Dwarf_Unsigned PointerToSymbolTable;
44     Dwarf_Unsigned NumberOfSymbols;
45     Dwarf_Unsigned SizeOfOptionalHeader; /* in object file */
46     Dwarf_Unsigned Characteristics;
47 };
48 
49 struct dwarf_pe_generic_data_directory
50 {
51     Dwarf_Unsigned VirtualAddress;
52     Dwarf_Unsigned Size;
53 };
54 
55 #define DWARF_PE_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES 16
56 struct dwarf_pe_generic_optional_header
57 {
58     Dwarf_Unsigned Magic;
59     unsigned char MajorLinkerVersion;
60     unsigned char MinorLinkerVersion;
61     Dwarf_Unsigned SizeOfCode;
62     Dwarf_Unsigned SizeOfInitializedData;
63     Dwarf_Unsigned SizeOfUninitializedData;
64     Dwarf_Unsigned AddressOfEntryPoint;
65     Dwarf_Unsigned BaseOfCode;
66     Dwarf_Unsigned BaseOfData;
67     Dwarf_Unsigned ImageBase;
68     Dwarf_Unsigned SectionAlignment;
69     Dwarf_Unsigned FileAlignment;
70     Dwarf_Unsigned MajorOperatingSystemVersion;
71     Dwarf_Unsigned MinorOperatingSystemVersion;
72     Dwarf_Unsigned MajorImageVersion;
73     Dwarf_Unsigned MinorImageVersion;
74     Dwarf_Unsigned MajorSubsystemVersion;
75     Dwarf_Unsigned MinorSubsystemVersion;
76     Dwarf_Unsigned Win32VersionValue;
77     Dwarf_Unsigned SizeOfImage; /* size in object file */
78     Dwarf_Unsigned SizeOfHeaders; /* size in object file */
79     Dwarf_Unsigned CheckSum;
80     Dwarf_Unsigned Subsystem;
81     Dwarf_Unsigned DllCharacteristics;
82     Dwarf_Unsigned SizeOfStackReserve;
83     Dwarf_Unsigned SizeOfStackCommit;
84     Dwarf_Unsigned SizeOfHeapReserve;
85     Dwarf_Unsigned SizeOfHeapCommit;
86     Dwarf_Unsigned LoaderFlags;
87     Dwarf_Unsigned NumberOfRvaAndSizes;
88     Dwarf_Unsigned SizeOfDataDirEntry; /* size in object file */
89     struct dwarf_pe_generic_data_directory DataDirectory[DWARF_PE_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES];
90 };
91 
92 struct dwarf_pe_generic_image_section_header
93 {
94     char *name; /* Name must be freed */
95     char *dwarfsectname; /* Name must be freed */
96     Dwarf_Unsigned SecHeaderOffset; /* offset in object file */
97         /* union { */
98         /* Dwarf_Unsigned PhysicalAddress; */
99     Dwarf_Unsigned VirtualSize;
100         /* } Misc; */
101     Dwarf_Unsigned VirtualAddress;
102     Dwarf_Unsigned SizeOfRawData; /* size we need */
103     Dwarf_Unsigned PointerToRawData;
104     Dwarf_Unsigned PointerToRelocations;
105     Dwarf_Unsigned PointerToLinenumbers;
106     Dwarf_Unsigned NumberOfRelocations;
107     Dwarf_Unsigned NumberOfLinenumbers;
108     Dwarf_Unsigned Characteristics;
109     Dwarf_Small *  loaded_data; /* must be freed. */
110 };
111 
112 #define DWARF_PE_IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b
113 #define DWARF_PE_IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b
114 #define DWARF_PE_IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107
115 
116 /*  ident[0] == 'P' means this is a PE header.
117     ident[1] will be 1 indicating version 1.
118     Other bytes in ident not defined, should be zero. */
119 typedef struct pe_filedata_s {
120     char             pe_ident[8];
121     const char *     pe_path; /* must free.*/
122     int              pe_fd;
123     int              pe_destruct_close_fd; /*aka: lib owns fd */
124     int              pe_is_64bit;
125     Dwarf_Unsigned   pe_filesize;
126     Dwarf_Small      pe_offsetsize; /* 32 or 64 section data */
127     Dwarf_Small      pe_pointersize;
128     int              pe_ftype;
129     unsigned         pe_endian;
130     /*Dwarf_Small      pe_machine; */
131     void (*pe_copy_word) (void *, const void *, unsigned long);
132     Dwarf_Unsigned   pe_nt_header_offset;
133     Dwarf_Unsigned   pe_optional_header_offset;
134     Dwarf_Unsigned   pe_optional_header_size;
135     Dwarf_Unsigned   pe_symbol_table_offset;
136     Dwarf_Unsigned   pe_string_table_offset;
137     Dwarf_Unsigned   pe_section_table_offset;
138     Dwarf_Unsigned pe_signature;
139 
140     struct dwarf_pe_generic_file_header pe_FileHeader;
141 
142     struct dwarf_pe_generic_optional_header pe_OptionalHeader;
143 
144     Dwarf_Unsigned pe_section_count;
145     struct dwarf_pe_generic_image_section_header *pe_sectionptr;
146 
147     Dwarf_Unsigned pe_string_table_size;
148     char          *pe_string_table;
149 } dwarf_pe_object_access_internals_t;
150 
151 #ifdef __cplusplus
152 }
153 #endif /* __cplusplus */
154 
155 #endif /* PE_GENERIC_H */
156