xref: /illumos-gate/usr/src/lib/libdwarf/common/dwarf_pe_descr.h (revision 4d9fdb46b215739778ebc12079842c9905586999)
1*4d9fdb46SRobert Mustacchi #ifndef DWARF_PE_DESCR_H
2*4d9fdb46SRobert Mustacchi #define DWARF_PE_DESCR_H
3*4d9fdb46SRobert Mustacchi /*
4*4d9fdb46SRobert Mustacchi Copyright (c) 2018, David Anderson All rights reserved.
5*4d9fdb46SRobert Mustacchi 
6*4d9fdb46SRobert Mustacchi Redistribution and use in source and binary forms, with
7*4d9fdb46SRobert Mustacchi or without modification, are permitted provided that the
8*4d9fdb46SRobert Mustacchi following conditions are met:
9*4d9fdb46SRobert Mustacchi 
10*4d9fdb46SRobert Mustacchi     Redistributions of source code must retain the above
11*4d9fdb46SRobert Mustacchi     copyright notice, this list of conditions and the following
12*4d9fdb46SRobert Mustacchi     disclaimer.
13*4d9fdb46SRobert Mustacchi 
14*4d9fdb46SRobert Mustacchi     Redistributions in binary form must reproduce the above
15*4d9fdb46SRobert Mustacchi     copyright notice, this list of conditions and the following
16*4d9fdb46SRobert Mustacchi     disclaimer in the documentation and/or other materials
17*4d9fdb46SRobert Mustacchi     provided with the distribution.
18*4d9fdb46SRobert Mustacchi 
19*4d9fdb46SRobert Mustacchi THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
20*4d9fdb46SRobert Mustacchi CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
21*4d9fdb46SRobert Mustacchi INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22*4d9fdb46SRobert Mustacchi OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23*4d9fdb46SRobert Mustacchi ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
24*4d9fdb46SRobert Mustacchi CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25*4d9fdb46SRobert Mustacchi SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26*4d9fdb46SRobert Mustacchi NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27*4d9fdb46SRobert Mustacchi LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28*4d9fdb46SRobert Mustacchi HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29*4d9fdb46SRobert Mustacchi CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
30*4d9fdb46SRobert Mustacchi OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
31*4d9fdb46SRobert Mustacchi EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32*4d9fdb46SRobert Mustacchi */
33*4d9fdb46SRobert Mustacchi 
34*4d9fdb46SRobert Mustacchi #ifdef __cplusplus
35*4d9fdb46SRobert Mustacchi extern "C" {
36*4d9fdb46SRobert Mustacchi #endif /* __cplusplus */
37*4d9fdb46SRobert Mustacchi 
38*4d9fdb46SRobert Mustacchi #define IMAGE_DOS_SIGNATURE_dw    0x5a4d /* le on disk 'M' 'Z' */
39*4d9fdb46SRobert Mustacchi #define IMAGE_DOS_REVSIGNATURE_dw 0x4d5a /* be on disk */
40*4d9fdb46SRobert Mustacchi #define IMAGE_NT_SIGNATURE_dw     0x00004550
41*4d9fdb46SRobert Mustacchi 
42*4d9fdb46SRobert Mustacchi #ifndef TYP
43*4d9fdb46SRobert Mustacchi #define TYP(n,l) char n[l]
44*4d9fdb46SRobert Mustacchi #endif /* TYPE */
45*4d9fdb46SRobert Mustacchi 
46*4d9fdb46SRobert Mustacchi 
47*4d9fdb46SRobert Mustacchi /*  Data types
48*4d9fdb46SRobert Mustacchi     see https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx */
49*4d9fdb46SRobert Mustacchi 
50*4d9fdb46SRobert Mustacchi /*#define FIELD_OFFSET(type,field) ((LONG)(LONG_PTR)&(((type *)0)->field))*/
51*4d9fdb46SRobert Mustacchi 
52*4d9fdb46SRobert Mustacchi #define IMAGE_SIZEOF_SYMBOL 18
53*4d9fdb46SRobert Mustacchi 
54*4d9fdb46SRobert Mustacchi struct dos_header_dw {
55*4d9fdb46SRobert Mustacchi     TYP(dh_mz,2);
56*4d9fdb46SRobert Mustacchi     TYP(dh_dos_data,58);
57*4d9fdb46SRobert Mustacchi     TYP(dh_image_offset,4);
58*4d9fdb46SRobert Mustacchi };
59*4d9fdb46SRobert Mustacchi 
60*4d9fdb46SRobert Mustacchi /*  IMAGE_FILE_HEADER_dw
61*4d9fdb46SRobert Mustacchi     see https://msdn.microsoft.com/fr-fr/library/windows/desktop/ms680313(v=vs.85).aspx */
62*4d9fdb46SRobert Mustacchi 
63*4d9fdb46SRobert Mustacchi typedef struct
64*4d9fdb46SRobert Mustacchi {
65*4d9fdb46SRobert Mustacchi     TYP(Machine,2);
66*4d9fdb46SRobert Mustacchi     TYP(NumberOfSections,2);
67*4d9fdb46SRobert Mustacchi     TYP(TimeDateStamp,4);
68*4d9fdb46SRobert Mustacchi     TYP(PointerToSymbolTable,4);
69*4d9fdb46SRobert Mustacchi     TYP(NumberOfSymbols,4);
70*4d9fdb46SRobert Mustacchi     TYP(SizeOfOptionalHeader,2);
71*4d9fdb46SRobert Mustacchi     TYP(Characteristics,2);
72*4d9fdb46SRobert Mustacchi } IMAGE_FILE_HEADER_dw;
73*4d9fdb46SRobert Mustacchi 
74*4d9fdb46SRobert Mustacchi /*  IMAGE_DATA_DIRECTORY_dw
75*4d9fdb46SRobert Mustacchi     see https://msdn.microsoft.com/fr-fr/library/windows/desktop/ms680305(v=vs.85).aspx */
76*4d9fdb46SRobert Mustacchi 
77*4d9fdb46SRobert Mustacchi typedef struct
78*4d9fdb46SRobert Mustacchi {
79*4d9fdb46SRobert Mustacchi     TYP(VirtualAddress,4);
80*4d9fdb46SRobert Mustacchi     TYP(Size,4);
81*4d9fdb46SRobert Mustacchi } IMAGE_DATA_DIRECTORY_dw;
82*4d9fdb46SRobert Mustacchi 
83*4d9fdb46SRobert Mustacchi /*  IMAGE_OPTIONAL_HEADER
84*4d9fdb46SRobert Mustacchi     see https://msdn.microsoft.com/en-us/library/windows/desktop/ms680339(v=vs.85).aspx */
85*4d9fdb46SRobert Mustacchi 
86*4d9fdb46SRobert Mustacchi #define IMAGE_NUMBEROF_DIRECTORY_ENTRIES 16
87*4d9fdb46SRobert Mustacchi 
88*4d9fdb46SRobert Mustacchi typedef struct
89*4d9fdb46SRobert Mustacchi {
90*4d9fdb46SRobert Mustacchi     TYP(Magic,2);
91*4d9fdb46SRobert Mustacchi     unsigned char MajorLinkerVersion;
92*4d9fdb46SRobert Mustacchi     unsigned char MinorLinkerVersion;
93*4d9fdb46SRobert Mustacchi     TYP(SizeOfCode,4);
94*4d9fdb46SRobert Mustacchi     TYP(SizeOfInitializedData,4);
95*4d9fdb46SRobert Mustacchi     TYP(SizeOfUninitializedData,4);
96*4d9fdb46SRobert Mustacchi     TYP(AddressOfEntryPoint,4);
97*4d9fdb46SRobert Mustacchi     TYP(BaseOfCode,4);
98*4d9fdb46SRobert Mustacchi     TYP(BaseOfData,4);
99*4d9fdb46SRobert Mustacchi     TYP(ImageBase,4);
100*4d9fdb46SRobert Mustacchi     TYP(SectionAlignment,4);
101*4d9fdb46SRobert Mustacchi     TYP(FileAlignment,4);
102*4d9fdb46SRobert Mustacchi     TYP(MajorOperatingSystemVersion,2);
103*4d9fdb46SRobert Mustacchi     TYP(MinorOperatingSystemVersion,2);
104*4d9fdb46SRobert Mustacchi     TYP(MajorImageVersion,2);
105*4d9fdb46SRobert Mustacchi     TYP(MinorImageVersion,2);
106*4d9fdb46SRobert Mustacchi     TYP(MajorSubsystemVersion,2);
107*4d9fdb46SRobert Mustacchi     TYP(MinorSubsystemVersion,2);
108*4d9fdb46SRobert Mustacchi     TYP(Win32VersionValue,4);
109*4d9fdb46SRobert Mustacchi     TYP(SizeOfImage,4);
110*4d9fdb46SRobert Mustacchi     TYP(SizeOfHeaders,4);
111*4d9fdb46SRobert Mustacchi     TYP(CheckSum,4);
112*4d9fdb46SRobert Mustacchi     TYP(Subsystem,2);
113*4d9fdb46SRobert Mustacchi     TYP(DllCharacteristics,2);
114*4d9fdb46SRobert Mustacchi     TYP(SizeOfStackReserve,4);
115*4d9fdb46SRobert Mustacchi     TYP(SizeOfStackCommit,4);
116*4d9fdb46SRobert Mustacchi     TYP(SizeOfHeapReserve,4);
117*4d9fdb46SRobert Mustacchi     TYP(SizeOfHeapCommit,4);
118*4d9fdb46SRobert Mustacchi     TYP(LoaderFlags,4);
119*4d9fdb46SRobert Mustacchi     TYP(NumberOfRvaAndSizes,4);
120*4d9fdb46SRobert Mustacchi     IMAGE_DATA_DIRECTORY_dw DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
121*4d9fdb46SRobert Mustacchi } IMAGE_OPTIONAL_HEADER32_dw;
122*4d9fdb46SRobert Mustacchi 
123*4d9fdb46SRobert Mustacchi typedef struct
124*4d9fdb46SRobert Mustacchi {
125*4d9fdb46SRobert Mustacchi     TYP(Magic,2);
126*4d9fdb46SRobert Mustacchi     unsigned char MajorLinkerVersion;
127*4d9fdb46SRobert Mustacchi     unsigned char MinorLinkerVersion;
128*4d9fdb46SRobert Mustacchi     TYP(SizeOfCode,4);
129*4d9fdb46SRobert Mustacchi     TYP(SizeOfInitializedData,4);
130*4d9fdb46SRobert Mustacchi     TYP(SizeOfUninitializedData,4);
131*4d9fdb46SRobert Mustacchi     TYP(AddressOfEntryPoint,4);
132*4d9fdb46SRobert Mustacchi     TYP(BaseOfCode,4);
133*4d9fdb46SRobert Mustacchi     TYP(ImageBase,8);
134*4d9fdb46SRobert Mustacchi     TYP(SectionAlignment,4);
135*4d9fdb46SRobert Mustacchi     TYP(FileAlignment,4);
136*4d9fdb46SRobert Mustacchi     TYP(MajorOperatingSystemVersion,2);
137*4d9fdb46SRobert Mustacchi     TYP(MinorOperatingSystemVersion,2);
138*4d9fdb46SRobert Mustacchi     TYP(MajorImageVersion,2);
139*4d9fdb46SRobert Mustacchi     TYP(MinorImageVersion,2);
140*4d9fdb46SRobert Mustacchi     TYP(MajorSubsystemVersion,2);
141*4d9fdb46SRobert Mustacchi     TYP(MinorSubsystemVersion,2);
142*4d9fdb46SRobert Mustacchi     TYP(Win32VersionValue,4);
143*4d9fdb46SRobert Mustacchi     TYP(SizeOfImage,4);
144*4d9fdb46SRobert Mustacchi     TYP(SizeOfHeaders,4);
145*4d9fdb46SRobert Mustacchi     TYP(CheckSum,4);
146*4d9fdb46SRobert Mustacchi     TYP(Subsystem,2);
147*4d9fdb46SRobert Mustacchi     TYP(DllCharacteristics,2);
148*4d9fdb46SRobert Mustacchi     TYP(SizeOfStackReserve,8);
149*4d9fdb46SRobert Mustacchi     TYP(SizeOfStackCommit,8);
150*4d9fdb46SRobert Mustacchi     TYP(SizeOfHeapReserve,8);
151*4d9fdb46SRobert Mustacchi     TYP(SizeOfHeapCommit,8);
152*4d9fdb46SRobert Mustacchi     TYP(LoaderFlags,4);
153*4d9fdb46SRobert Mustacchi     TYP(NumberOfRvaAndSizes,4);
154*4d9fdb46SRobert Mustacchi     IMAGE_DATA_DIRECTORY_dw DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
155*4d9fdb46SRobert Mustacchi } IMAGE_OPTIONAL_HEADER64_dw;
156*4d9fdb46SRobert Mustacchi 
157*4d9fdb46SRobert Mustacchi /*  IMAGE_NT_HEADERS
158*4d9fdb46SRobert Mustacchi     see https://msdn.microsoft.com/fr-fr/library/windows/desktop/ms680336(v=vs.85).aspx */
159*4d9fdb46SRobert Mustacchi 
160*4d9fdb46SRobert Mustacchi #define IMAGE_NT_OPTIONAL_HDR32_MAGIC 0x10b
161*4d9fdb46SRobert Mustacchi #define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b
162*4d9fdb46SRobert Mustacchi #define IMAGE_ROM_OPTIONAL_HDR_MAGIC 0x107
163*4d9fdb46SRobert Mustacchi 
164*4d9fdb46SRobert Mustacchi typedef struct
165*4d9fdb46SRobert Mustacchi {
166*4d9fdb46SRobert Mustacchi     TYP(Signature,4);
167*4d9fdb46SRobert Mustacchi     IMAGE_FILE_HEADER_dw FileHeader;
168*4d9fdb46SRobert Mustacchi     IMAGE_OPTIONAL_HEADER64_dw OptionalHeader;
169*4d9fdb46SRobert Mustacchi } IMAGE_NT_HEADERS64_dw, *PIMAGE_NT_HEADERS64_dw;
170*4d9fdb46SRobert Mustacchi 
171*4d9fdb46SRobert Mustacchi typedef struct
172*4d9fdb46SRobert Mustacchi {
173*4d9fdb46SRobert Mustacchi     TYP(Signature,4);
174*4d9fdb46SRobert Mustacchi     IMAGE_FILE_HEADER_dw FileHeader;
175*4d9fdb46SRobert Mustacchi     IMAGE_OPTIONAL_HEADER32_dw OptionalHeader;
176*4d9fdb46SRobert Mustacchi } IMAGE_NT_HEADERS32_dw, *PIMAGE_NT_HEADERS32_dw;
177*4d9fdb46SRobert Mustacchi 
178*4d9fdb46SRobert Mustacchi 
179*4d9fdb46SRobert Mustacchi /*  IMAGE_SECTION_HEADER_dw
180*4d9fdb46SRobert Mustacchi     see:
181*4d9fdb46SRobert Mustacchi     https://msdn.microsoft.com/en-us/library/windows/desktop/ms680341(v=vs.85).aspx
182*4d9fdb46SRobert Mustacchi     and, for details on VirtualSize and SizeOfRawData:
183*4d9fdb46SRobert Mustacchi     https://docs.microsoft.com/en-us/windows/desktop/api/winnt/ns-winnt-_image_section_header */
184*4d9fdb46SRobert Mustacchi 
185*4d9fdb46SRobert Mustacchi #define IMAGE_SIZEOF_SHORT_NAME 8
186*4d9fdb46SRobert Mustacchi 
187*4d9fdb46SRobert Mustacchi typedef struct
188*4d9fdb46SRobert Mustacchi {
189*4d9fdb46SRobert Mustacchi     char Name[IMAGE_SIZEOF_SHORT_NAME];
190*4d9fdb46SRobert Mustacchi     union {
191*4d9fdb46SRobert Mustacchi         TYP(PhysicalAddress,4);
192*4d9fdb46SRobert Mustacchi         TYP(VirtualSize,4);
193*4d9fdb46SRobert Mustacchi     } Misc;
194*4d9fdb46SRobert Mustacchi     TYP(VirtualAddress,4);
195*4d9fdb46SRobert Mustacchi     TYP(SizeOfRawData,4);
196*4d9fdb46SRobert Mustacchi     TYP(PointerToRawData,4);
197*4d9fdb46SRobert Mustacchi     TYP(PointerToRelocations,4);
198*4d9fdb46SRobert Mustacchi     TYP(PointerToLinenumbers,4);
199*4d9fdb46SRobert Mustacchi     TYP(NumberOfRelocations,2);
200*4d9fdb46SRobert Mustacchi     TYP(NumberOfLinenumbers,2);
201*4d9fdb46SRobert Mustacchi     TYP(Characteristics,4);
202*4d9fdb46SRobert Mustacchi } IMAGE_SECTION_HEADER_dw, *PIMAGE_SECTION_HEADER_dw;
203*4d9fdb46SRobert Mustacchi 
204*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_SCALE_INDEX            0x00000001
205*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_TYPE_NO_PAD            0x00000008
206*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_CNT_CODE               0x00000020
207*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_CNT_INITIALIZED_DATA   0x00000040
208*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_CNT_UNINITIALIZED_DATA 0x00000080
209*4d9fdb46SRobert Mustacchi 
210*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_LNK_OTHER              0x00000100
211*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_LNK_INFO               0x00000200
212*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_LNK_REMOVE             0x00000800
213*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_LNK_COMDAT             0x00001000
214*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_NO_DEFER_SPEC_EXC      0x00004000
215*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_MEM_FARDATA            0x00008000
216*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_MEM_PURGEABLE          0x00020000
217*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_MEM_LOCKED             0x00040000
218*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_MEM_PRELOAD            0x00080000
219*4d9fdb46SRobert Mustacchi 
220*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_ALIGN_1BYTES           0x00100000
221*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_ALIGN_2BYTES           0x00200000
222*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_ALIGN_4BYTES           0x00300000
223*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_ALIGN_8BYTES           0x00400000
224*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_ALIGN_16BYTES          0x00500000
225*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_ALIGN_32BYTES          0x00600000
226*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_ALIGN_64BYTES          0x00700000
227*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_ALIGN_128BYTES         0x00800000
228*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_ALIGN_256BYTES         0x00900000
229*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_ALIGN_512BYTES         0x00A00000
230*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_ALIGN_1024BYTES        0x00B00000
231*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_ALIGN_2048BYTES        0x00C00000
232*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_ALIGN_4096BYTES        0x00D00000
233*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_ALIGN_8192BYTES        0x00E00000
234*4d9fdb46SRobert Mustacchi 
235*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_ALIGN_MASK             0x00F00000
236*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_LNK_NRELOC_OVFL        0x01000000
237*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_MEM_DISCARDABLE        0x02000000
238*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_MEM_NOT_CACHED         0x04000000
239*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_MEM_NOT_PAGED          0x08000000
240*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_MEM_SHARED             0x10000000
241*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_MEM_EXECUTE            0x20000000
242*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_MEM_READ               0x40000000
243*4d9fdb46SRobert Mustacchi #define IMAGE_SCN_MEM_WRITE              0x80000000
244*4d9fdb46SRobert Mustacchi 
245*4d9fdb46SRobert Mustacchi #ifdef __cplusplus
246*4d9fdb46SRobert Mustacchi }
247*4d9fdb46SRobert Mustacchi #endif /* __cplusplus */
248*4d9fdb46SRobert Mustacchi 
249*4d9fdb46SRobert Mustacchi 
250*4d9fdb46SRobert Mustacchi #endif /* DWARF_PE_DESCR_H */
251