1 /*
2  *	HT Editor
3  *	xexstruct.h
4  *
5  *	Copyright (C) 2006 Sebastian Biallas (sb@biallas.net)
6  *
7  *	This program is free software; you can redistribute it and/or modify
8  *	it under the terms of the GNU General Public License version 2 as
9  *	published by the Free Software Foundation.
10  *
11  *	This program is distributed in the hope that it will be useful,
12  *	but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *	GNU General Public License for more details.
15  *
16  *	You should have received a copy of the GNU General Public License
17  *	along with this program; if not, write to the Free Software
18  *	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19  */
20 
21 #ifndef __XEXSTRUCT_H_
22 #define __XEXSTRUCT_H_
23 
24 #include "io/types.h"
25 #include "tools.h"
26 
27 typedef unsigned int RVA;
28 
29 #define XEX_MAGIC_LENGTH 4
30 #define XEX_MAGIC0	'X'
31 #define XEX_MAGIC1	'E'
32 #define XEX_MAGIC2	'X'
33 #define XEX_MAGIC3	'2'
34 
35 struct XEX_IMAGE_HEADER {
36 	byte	magic_id[XEX_MAGIC_LENGTH];
37 	uint32	flags;
38 	uint32	size;
39 	uint32	res;
40 	uint32	file_header_offset;
41 	uint32	number_of_sections;
42 } PACKED;
43 
44 #define XEX_HEADER_FIELD_MODULES	0x0002ff
45 #define XEX_HEADER_FIELD_LOADERINFO	0x0003ff
46 #define XEX_HEADER_FIELD_FILENAME	0x0080ff
47 #define XEX_HEADER_FIELD_LOADBASE	0x010001
48 #define XEX_HEADER_FIELD_ENTRY		0x010100
49 #define XEX_HEADER_FIELD_BASE		0x010201
50 #define XEX_HEADER_FIELD_IMPORT		0x0103ff
51 #define XEX_HEADER_FIELD_IDS		0x018002
52 #define XEX_HEADER_FIELD_ORIG_FILENAME	0x0183ff
53 #define XEX_HEADER_FIELD_RESMAP2	0x0200ff
54 #define XEX_HEADER_FIELD_UNK0		0x020104 // 80078884
55 #define XEX_HEADER_FIELD_STACK_SIZE	0x020200 // 800788bc
56 #define XEX_HEADER_FIELD_CACHE_INFO	0x020301
57 #define XEX_HEADER_FIELD_MEDIAINFO	0x040006
58 #define XEX_HEADER_FIELD_LAN_KEY	0x040404
59 #define XEX_HEADER_FIELD_IMPORT_UNK	0xe10402
60 
61 #define XEX_MEDIA_HD		0x00000001
62 #define XEX_MEDIA_DVD_X2	0x00000002
63 #define XEX_MEDIA_DVD_CD	0x00000004
64 #define XEX_MEDIA_DVD_5		0x00000008
65 #define XEX_MEDIA_DVD_9		0x00000010
66 #define XEX_MEDIA_FLASH		0x00000020
67 #define XEX_MEDIA_MEMORY_UNIT	0x00000080
68 #define XEX_MEDIA_MASS_STORAGE	0x00000100
69 #define XEX_MEDIA_SMB		0x00000200
70 #define XEX_MEDIA_RAM		0x00000400
71 #define XEX_MEDIA_INSECURE	0x01000000
72 #define XEX_MEDIA_SAVE_GAME	0x02000000
73 #define XEX_MEDIA_LOCAL		0x04000000
74 #define XEX_MEDIA_LIVE		0x08000000
75 #define XEX_MEDIA_XBOX		0x10000000
76 
77 struct XEX_IMAGE_HEADER_INFO_ENTRY {
78 	union {
79 		struct {
80 			byte	res;
81 			byte	classe;
82 			byte	type;
83 			byte	size;
84 		} b;
85 		uint32 type PACKED;
86 	} PACKED;
87 	uint32	value;
88 } PACKED;
89 
90 enum {
91 	XEX_LOADER_NONE = 0,
92 	XEX_LOADER_RAW = 1,
93 	XEX_LOADER_COMPRESSED = 2,
94 };
95 
96 struct XEX_LOADER_INFO_HEADER {
97 	uint16 crypted;
98 	uint16 type;
99 } PACKED;
100 
101 struct XEX_RAW_LOADER_ENTRY {
102 	uint32 raw;
103 	uint32 pad;
104 } PACKED;
105 
106 struct XEX_FILE_HEADER {
107 	uint32 hdr_size;
108 	uint32 image_size;
109 	uint8  key[256];
110 	uint32 unk1;
111 	uint32 image_flags;
112 	uint32 load_address;
113 	uint8  hash1[20];
114 	uint32 unk2;
115 	uint8  hash2[20];
116 	uint8  unk3[16];
117 	uint8  loader_key[16];
118 	uint32 unk4;
119 	uint8  hash3[20];
120 	uint32 region;
121 	uint32 media_mask;
122 	uint32 pages;
123 } PACKED;
124 
125 extern byte XEX_IMAGE_HEADER_struct[];
126 extern byte XEX_IMAGE_HEADER_INFO_ENTRY_struct[];
127 extern byte XEX_LOADER_INFO_HEADER_struct[];
128 extern byte XEX_RAW_LOADER_ENTRY_struct[];
129 extern byte XEX_FILE_HEADER_struct[];
130 
131 #endif
132