1 /*
2  *  Copyright (C) 2005-2018 Team Kodi
3  *  This file is part of Kodi - https://kodi.tv
4  *
5  *  SPDX-License-Identifier: GPL-2.0-or-later
6  *  See LICENSES/README.md for more information.
7  */
8 
9 #pragma once
10 
11 //#pragma message("including coff.h")
12 //
13 //      COFF -- Common Object File Format
14 //          Used commonly by Un*x and is imbedded in Windows PE
15 //          file format.
16 //
17 
18 // These structures must be packed
19 #pragma pack(1)
20 
21 
22 /*
23  *  Some general purpose MACROs
24  */
25 
26 #define VERSION_MAJOR(x)    ((unsigned int)((x)& 0xff))
27 #define VERSION_MINOR(x)    ((unsigned int)(((x)>8) &0xff))
28 
29 #define BIGVERSION_MAJOR(x)    ((unsigned int)((x)& 0xffff))
30 #define BIGVERSION_MINOR(x)    ((unsigned int)(((x)>16) &0xffff))
31 
32 /*
33  *      COFF File Header (Object & Image)
34  *          Spec section 3.3
35  */
36 
37 typedef struct
38 {
39   unsigned short MachineType;            /* magic type               */
40   unsigned short NumberOfSections;       /* number of sections       */
41   unsigned long TimeDateStamp;          /* time & date stamp        */
42   unsigned long PointerToSymbolTable;   /* file pointer to symtab   */
43   unsigned long NumberOfSymbols;        /* number of symtab entries */
44   unsigned short SizeOfOptionHeader;     /* sizeof(optional hdr)     */
45   unsigned short Characteristics;        /* flags                    */
46 }
47 COFF_FileHeader_t;
48 
49 /*
50  *      Machine Types
51  *          Spec section 3.3.1
52  *              (only i386 relevant for us)
53  */
54 
55 #if 1
56 
57 #ifndef IMAGE_FILE_MACHINE_I386
58 #define IMAGE_FILE_MACHINE_I386     0x14c
59 #endif
60 
61 
62 
63 #define IMAGE_FILE_RELOCS_STRIPPED                  0x0001
64 #define IMAGE_FILE_EXECUTABLE_IMAGE                 0x0002
65 #define IMAGE_FILE_LINE_NUMS_STRIPPED               0x0004
66 #define IMAGE_FILE_LOCAL_SYMS_STRIPPED              0x0008
67 #define IMAGE_FILE_AGGRESSIVE_WS_TRIM               0x0010
68 #define IMAGE_FILE_LARGE_ADDRESS_AWARE              0x0020
69 #define IMAGE_FILE_16BIT_MACHINE                    0x0040
70 #define IMAGE_FILE_BYTES_REVERSED_LO                0x0080
71 #define IMAGE_FILE_32BIT_MACHINE                    0x0100
72 #define IMAGE_FILE_DEBUG_STRIPPED                   0x0200
73 #define IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP          0x0400
74 #define IMAGE_FILE_SYSTEM                           0x1000
75 #define IMAGE_FILE_DLL                              0x2000
76 #define IMAGE_FILE_UP_SYSTEM_ONLY                   0x4000
77 #define IMAGE_FILE_BYTES_REVERSED_HI                0x8000
78 
79 #endif
80 
81 
82 
83 #define OPTMAGIC_PE32   0x010b
84 #define OPTMAGIC_PE32P  0x020b
85 
86 #define OPTHDR_SIZE     28
87 #define OPTHDR_SIZEP    24
88 #define WINHDR_SIZE     68
89 #define WINHDR_SIZEP    88
90 
91 /*
92  *      Optional Header Standard Fields (Image Only)
93  *          Spec section 3.4.1
94  */
95 
96 typedef struct
97 {
98   unsigned short Magic;
99   unsigned short LinkVersion;
100   unsigned long CodeSize;
101   unsigned long DataSize;
102   unsigned long BssSize;
103   unsigned long Entry;
104   unsigned long CodeBase;
105   unsigned long DataBase;
106 }
107 OptionHeader_t;
108 
109 typedef struct
110 {
111   unsigned short Magic;
112   unsigned short LinkVersion;
113   unsigned long CodeSize;
114   unsigned long DataSize;
115   unsigned long BssSize;
116   unsigned long Entry;
117   unsigned long CodeBase;
118 }
119 OptionHeaderPlus_t;
120 
121 /*
122  *      Optional Header Windows NT-Specific Fields (Image Only)
123  *          Spec section 3.4.2
124  */
125 
126 typedef struct
127 {
128   unsigned long ImageBase;
129   unsigned long SectionAlignment;
130   unsigned long FileAlignment;
131   unsigned long OSVer;
132   unsigned long ImgVer;
133   unsigned long SubSysVer;
134   unsigned long Reserved;
135   unsigned long SizeOfImage;
136   unsigned long SizeOfHeaders;
137   unsigned long CheckSum;
138   unsigned short Subsystem;
139   unsigned short DLLFlags;
140   unsigned long SizeOfStackReserve;
141   unsigned long SizeOfStackCommit;
142   unsigned long SizeOfHeapReserve;
143   unsigned long SizeOfHeapCommit;
144   unsigned long LoaderFlags;
145   unsigned long NumDirectories;
146 }
147 WindowsHeader_t;
148 
149 typedef struct
150 {
151   unsigned long long ImageBase;
152   unsigned long SectionAlignment;
153   unsigned long FileAlignment;
154   unsigned long OSVer;
155   unsigned long ImgVer;
156   unsigned long SubSysVer;
157   unsigned long Reserved;
158   unsigned long SizeOfImage;
159   unsigned long SizeOfHeaders;
160   unsigned long CheckSum;
161   unsigned short Subsystem;
162   unsigned short DLLFlags;
163   unsigned long long SizeOfStackReserve;
164   unsigned long long SizeOfStackCommit;
165   unsigned long long SizeOfHeapReserve;
166   unsigned long long SizeOfHeapCommit;
167   unsigned long LoaderFlags;
168   unsigned long NumDirectories;
169 }
170 WindowsHeaderPlus_t;
171 
172 /*
173 #define IMAGE_SUBSYSTEM_UNKNOWN                     0
174 #define IMAGE_SUBSYSTEM_NATIVE                      1
175 #define IMAGE_SUBSYSTEM_WINDOWS_GUI                 2
176 #define IMAGE_SUBSYSTEM_WINDOWS_CUI                 3
177 #define IMAGE_SUBSYSTEM_POSIX_CUI                   7
178 #define IMAGE_SUBSYSTEM_WINDOWS_CE_GUI              9
179 #define IMAGE_SUBSYSTEM_EFI_APPLICATION             10
180 #define IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER     11
181 #define IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER          12
182 
183 #define IMAGE_DLLCHARACTERISTICS_NO_BIND            0x0800
184 #define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER         0x2000
185 #define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE  0X8000
186 */
187 
188 /*
189  *      Optional Header Data Directories (Image Only)
190  *          Spec section 3.4.3
191  */
192 
193 typedef struct
194 {
195   unsigned long RVA;
196   unsigned long Size;
197 }
198 Image_Data_Directory_t;
199 
200 enum Directory_Items {
201   EXPORT_TABLE = 0,
202   IMPORT_TABLE,
203   RESOURCE_TABLE,
204   EXCEPTION_TABLE,
205   CERTIFICATE_TABLE,
206   BASE_RELOCATION_TABLE,
207   DEBUG_,
208   ARCHITECTURE,
209   GLOBAL_PTR,
210   TLS_TABLE,
211   LOAD_CONFIG_TABLE,
212   BOUND_IMPORT,
213   IAT,
214   DELAY_IMPORT_DESCRIPTOR,
215   COM_RUNTIME_HEADER,
216   RESERVED
217 };
218 
219 /*
220  *      Section Table (Section Headers)
221  *          Spec section 4.
222  */
223 
224 
225 typedef struct
226 {
227   unsigned char Name[8];
228   unsigned long VirtualSize;
229   unsigned long VirtualAddress;
230   unsigned long SizeOfRawData;
231   unsigned long PtrToRawData;
232   unsigned long PtrToRelocations;
233   unsigned long PtrToLineNums;
234   unsigned short NumRelocations;
235   unsigned short NumLineNumbers;
236   unsigned long Characteristics;
237 }
238 SectionHeader_t;
239 
240 /*
241  *      Section Flags (Characteristics)
242  *          Spec section 4.1
243  */
244 
245 #define IMAGE_SCN_CNT_CODE          0x00000020
246 #define IMAGE_SCN_CNT_DATA          0x00000040
247 #define IMAGE_SCN_CNT_BSS           0x00000080
248 #define IMAGE_SCN_LNK_INFO          0x00000200
249 #define IMAGE_SCN_LNK_REMOVE        0x00000800
250 #define IMAGE_SCN_LNK_COMDAT        0x00001000
251 #define IMAGE_SCN_ALIGN_1BYTES      0x00100000
252 #define IMAGE_SCN_ALIGN_2BYTES      0x00200000
253 #define IMAGE_SCN_ALIGN_4BYTES      0x00300000
254 #define IMAGE_SCN_ALIGN_8BYTES      0x00400000
255 #define IMAGE_SCN_ALIGN_16BYTES     0x00500000
256 #define IMAGE_SCN_ALIGN_32BYTES     0x00600000
257 #define IMAGE_SCN_ALIGN_64BYTES     0x00700000
258 #define IMAGE_SCN_ALIGN_128BYTES    0x00800000
259 #define IMAGE_SCN_ALIGN_256BYTES    0x00900000
260 #define IMAGE_SCN_ALIGN_512BYTES    0x00A00000
261 #define IMAGE_SCN_ALIGN_1024BYTES   0x00B00000
262 #define IMAGE_SCN_ALIGN_2048BYTES   0x00C00000
263 #define IMAGE_SCN_ALIGN_4096BYTES   0x00D00000
264 #define IMAGE_SCN_ALIGN_8192BYTES   0x00E00000
265 #define IMAGE_SCN_ALIGN_MASK        0x00F00000
266 #define IMAGE_SCN_LNK_NRELOC_OVFL   0x01000000
267 #define IMAGE_SCN_MEM_DISCARDABLE   0x02000000
268 #define IMAGE_SCN_MEM_NOT_CACHED    0x04000000
269 #define IMAGE_SCN_MEM_NOT_PAGED     0x08000000
270 #define IMAGE_SCN_MEM_SHARED        0x10000000
271 #define IMAGE_SCN_MEM_EXECUTE       0x20000000
272 #define IMAGE_SCN_MEM_READ          0x40000000
273 #define IMAGE_SCN_MEM_WRITE         0x80000000
274 
275 /*
276  *      COFF Relocations (Object Only)
277  *          Spec section 5.2
278  */
279 
280 typedef struct
281 {
282   unsigned long VirtualAddress;
283   unsigned long SymTableIndex;
284   unsigned short Type;
285 }
286 ObjReloc_t;
287 
288 /*
289  *      COFF Relocation Type Indicators
290  *          Spec section 5.2.1
291  */
292 
293 #define IMAGE_REL_I386_ABSOLUTE     0x0000
294 #define IMAGE_REL_I386_DIR16        0x0001
295 #define IMAGE_REL_I386_REL16        0x0002
296 #define IMAGE_REL_I386_DIR32        0x0006
297 #define IMAGE_REL_I386_DIR32NB      0x0007
298 #define IMAGE_REL_I386_SEG12        0x0009
299 #define IMAGE_REL_I386_SECTION      0x000A
300 #define IMAGE_REL_I386_SECREL       0x000B
301 #define IMAGE_REL_I386_REL32        0x0014
302 
303 /*
304  *      COFF Line Numbers
305  *          Spec section 5.3
306  */
307 
308 typedef struct
309 {
310   union {
311     unsigned long SymbolTableIndex;
312     unsigned long VirtualAddress;
313   } Type;
314   unsigned short LineNum;
315 }
316 LineNumbers_t;
317 
318 /*
319  *      COFF Symbol Table
320  *          Spec section 5.4
321  */
322 
323 typedef struct
324 {
325   union {
326     unsigned char ShortName[8];
327     unsigned long long Offset;
328   } Name;
329   unsigned long Value;
330   unsigned short SectionNumber;
331   unsigned short Type;
332   unsigned char StorageClass;
333   unsigned char NumberOfAuxSymbols;
334 }
335 SymbolTable_t;
336 
337 #if !defined(TARGET_WINDOWS)
338 
339 #define IMAGE_SYM_UNDEFINED     0
340 #define IMAGE_SYM_ABSOLUTE      0xFFFF
341 #define IMAGE_SYM_DEBUG         0xFFFE
342 
343 
344 #define IMAGE_SYM_TYPE_NULL         0
345 #define IMAGE_SYM_TYPE_VOID         1
346 #define IMAGE_SYM_TYPE_CHAR         2
347 #define IMAGE_SYM_TYPE_SHORT        3
348 #define IMAGE_SYM_TYPE_INT          4
349 #define IMAGE_SYM_TYPE_LONG         5
350 #define IMAGE_SYM_TYPE_FLOAT        6
351 #define IMAGE_SYM_TYPE_DOUBLE       7
352 #define IMAGE_SYM_TYPE_STRUCT       8
353 #define IMAGE_SYM_TYPE_UNION        9
354 #define IMAGE_SYM_TYPE_ENUM         10
355 #define IMAGE_SYM_TYPE_MOE          11
356 #define IMAGE_SYM_TYPE_BYTE         12
357 #define IMAGE_SYM_TYPE_WORD         13
358 #define IMAGE_SYM_TYPE_UINT         14
359 #define IMAGE_SYM_TYPE_DWORD        15
360 
361 #define IMAGE_SYM_DWORD_NULL        0
362 #define IMAGE_SYM_DWORD_POINTER     1
363 #define IMAGE_SYM_DWORD_FUNCTION    2
364 #define IMAGE_SYM_DWORD_ARRAY       3
365 
366 
367 #define IMAGE_SYM_CLASS_END_OF_FUNCTION         0xFF
368 #define IMAGE_SYM_CLASS_NULL                    0
369 #define IMAGE_SYM_CLASS_AUTOMATIC               1
370 #define IMAGE_SYM_CLASS_EXTERNAL                2
371 #define IMAGE_SYM_CLASS_STATIC                  3
372 #define IMAGE_SYM_CLASS_REGISTER                4
373 #define IMAGE_SYM_CLASS_EXTERNAL_DEF            5
374 #define IMAGE_SYM_CLASS_LABEL                   6
375 #define IMAGE_SYM_CLASS_UNDEFINED_LABEL         7
376 #define IMAGE_SYM_CLASS_MEMBER_OF_STRUCT        8
377 #define IMAGE_SYM_CLASS_ARGUMENT                9
378 #define IMAGE_SYM_CLASS_STRUCT_TAG              10
379 #define IMAGE_SYM_CLASS_MEMBER_OF_UNION         11
380 #define IMAGE_SYM_CLASS_UNION_TAG               12
381 #define IMAGE_SYM_CLASS_TYPE_DEFINITION         13
382 #define IMAGE_SYM_CLASS_UNDEFINED_STATIC        14
383 #define IMAGE_SYM_CLASS_ENUM_TAG                15
384 #define IMAGE_SYM_CLASS_MEMBER_OF_ENUM          16
385 #define IMAGE_SYM_CLASS_REGISTER_PARAM          17
386 #define IMAGE_SYM_CLASS_BIT_FIELD               18
387 #define IMAGE_SYM_CLASS_BLOCK                   100
388 #define IMAGE_SYM_CLASS_FUNCTION                101
389 #define IMAGE_SYM_CLASS_END_OF_STRUCT           102
390 #define IMAGE_SYM_CLASS_FILE                    103
391 #define IMAGE_SYM_CLASS_SECTION                 104
392 #define IMAGE_SYM_CLASS_WEAK_EXTERNAL           105
393 #endif
394 
395 typedef struct
396 {
397   unsigned long TagIndex;
398   unsigned long TotalSize;
399   unsigned long PtrToLineNumber;
400   unsigned long PtrToNextFunc;
401   unsigned short unused;
402 }
403 AuxFuncDef_t;
404 
405 /*
406  *      Symbol Auxiliary Record: .bf and .ef
407  *          Spec section 5.5.2
408  */
409 
410 typedef struct
411 {
412   unsigned long unused;
413   unsigned short LineNumber;
414   unsigned long unused1;
415   unsigned short unused2;
416   unsigned long PtrToNextFunc;
417   unsigned char unused3;
418 }
419 AuxBfEf_t;
420 
421 /*
422  *      Export Section (Directory)
423  *          Spec section 6.3
424  */
425 
426 /*
427  *      Export Directory Table
428  *          Spec section 6.3.1
429  */
430 
431 typedef struct
432 {
433   unsigned long ExportFlags;
434   unsigned long TimeStamp;
435   unsigned short MajorVersion;
436   unsigned short MinorVersion;
437   unsigned long Name_RVA;
438   unsigned long OrdinalBase;
439   unsigned long NumAddrTable;
440   unsigned long NumNamePtrs;
441   unsigned long ExportAddressTable_RVA;
442   unsigned long NamePointerTable_RVA;
443   unsigned long OrdinalTable_RVA;
444 }
445 ExportDirTable_t;
446 
447 
448 /*
449  *      Import Section (Directory)
450  *          Spec section 6.4
451  */
452 
453 /*
454  *      Import Directory Table
455  *          Spec Section 6.4.1
456  */
457 
458 typedef struct
459 {
460   unsigned long ImportLookupTable_RVA;
461   unsigned long TimeStamp;
462   unsigned long ForwarderChain;
463   unsigned long Name_RVA;
464   unsigned long ImportAddressTable_RVA;
465 }
466 ImportDirTable_t;
467 
468 /*
469  *      .reloc Relocation types
470  *          spec section 6.6
471  */
472 
473 #if 1
474 #define IMAGE_REL_BASED_ABSOLUTE        0
475 #define IMAGE_REL_BASED_HIGH            1
476 #define IMAGE_REL_BASED_LOW             2
477 #define IMAGE_REL_BASED_HIGHLOW         3
478 #define IMAGE_REL_BASED_HIGHADJ         4
479 #define IMAGE_REL_BASED_MIPS_JMPADDR    5
480 #define IMAGE_REL_BASED_SECTION         6
481 #define IMAGE_REL_BASED_REL32           7
482 #define IMAGE_REL_BASED_MIPS_JMPADDR16  9
483 #define IMAGE_REL_BASED_DIR64           10
484 #define IMAGE_REL_BASED_HIGH3ADJ        11
485 #endif
486 
487 
488 
489 
490 #pragma pack()
491 
492