/xbmc/cores/DllLoader/coff.h

http://github.com/xbmc/xbmc · C Header · 491 lines · 323 code · 67 blank · 101 comment · 0 complexity · 9873270c42f40330d5417c77d749e81d MD5 · raw file

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