2 #ifndef __MONO_CIL_COFF_H__
3 #define __MONO_CIL_COFF_H__
5 #include <mono/metadata/metadata.h>
9 * 25.2.1: Method header type values
11 #define METHOD_HEADER_FORMAT_MASK 3
12 #define METHOD_HEADER_TINY_FORMAT 2
13 #define METHOD_HEADER_FAT_FORMAT 3
16 * 25.2.3.1: Flags for method headers
18 #define METHOD_HEADER_INIT_LOCALS 0x10
19 #define METHOD_HEADER_MORE_SECTS 0x08
22 * For section data (25.3)
24 #define METHOD_HEADER_SECTION_RESERVED 0
25 #define METHOD_HEADER_SECTION_EHTABLE 1
26 #define METHOD_HEADER_SECTION_OPTIL_TABLE 2
27 #define METHOD_HEADER_SECTION_FAT_FORMAT 0x40
28 #define METHOD_HEADER_SECTION_MORE_SECTS 0x80
35 char msdos_header [54];
37 char msdos_header2 [64];
40 /* Possible values for coff_machine */
41 #define COFF_MACHINE_I386 332
42 #define COFF_MACHINE_IA64 512
43 #define COFF_MACHINE_AMD64 34404
44 #define COFF_MACHINE_ARM 452
49 guint16 coff_sections;
52 guint32 coff_symcount;
53 guint16 coff_opt_header_size;
54 guint16 coff_attributes;
57 #define COFF_ATTRIBUTE_EXECUTABLE_IMAGE 0x0002
58 #define COFF_ATTRIBUTE_LIBRARY_IMAGE 0x2000
67 guint32 pe_uninit_data_size;
68 guint32 pe_rva_entry_point;
69 guint32 pe_rva_code_base;
70 guint32 pe_rva_data_base;
80 guint32 pe_uninit_data_size;
81 guint32 pe_rva_entry_point;
82 guint32 pe_rva_code_base;
87 guint32 pe_image_base; /* must be 0x400000 */
88 guint32 pe_section_align; /* must be 8192 */
89 guint32 pe_file_alignment; /* must be 512 or 4096 */
90 guint16 pe_os_major; /* must be 4 */
91 guint16 pe_os_minor; /* must be 0 */
92 guint16 pe_user_major;
93 guint16 pe_user_minor;
94 guint16 pe_subsys_major;
95 guint16 pe_subsys_minor;
96 guint32 pe_reserved_1;
97 guint32 pe_image_size;
98 guint32 pe_header_size;
100 guint16 pe_subsys_required;
101 guint16 pe_dll_flags;
102 guint32 pe_stack_reserve;
103 guint32 pe_stack_commit;
104 guint32 pe_heap_reserve;
105 guint32 pe_heap_commit;
106 guint32 pe_loader_flags;
107 guint32 pe_data_dir_count;
112 guint64 pe_image_base;
113 guint32 pe_section_align; /* must be 8192 */
114 guint32 pe_file_alignment; /* must be 512 or 4096 */
115 guint16 pe_os_major; /* must be 4 */
116 guint16 pe_os_minor; /* must be 0 */
117 guint16 pe_user_major;
118 guint16 pe_user_minor;
119 guint16 pe_subsys_major;
120 guint16 pe_subsys_minor;
121 guint32 pe_reserved_1;
122 guint32 pe_image_size;
123 guint32 pe_header_size;
125 guint16 pe_subsys_required;
126 guint16 pe_dll_flags;
127 guint64 pe_stack_reserve;
128 guint64 pe_stack_commit;
129 guint64 pe_heap_reserve;
130 guint64 pe_heap_commit;
131 guint32 pe_loader_flags;
132 guint32 pe_data_dir_count;
136 guint32 rde_data_offset;
138 guint32 rde_codepage;
139 guint32 rde_reserved;
140 } MonoPEResourceDataEntry;
142 #define MONO_PE_RESOURCE_ID_CURSOR 0x01
143 #define MONO_PE_RESOURCE_ID_BITMAP 0x02
144 #define MONO_PE_RESOURCE_ID_ICON 0x03
145 #define MONO_PE_RESOURCE_ID_MENU 0x04
146 #define MONO_PE_RESOURCE_ID_DIALOG 0x05
147 #define MONO_PE_RESOURCE_ID_STRING 0x06
148 #define MONO_PE_RESOURCE_ID_FONTDIR 0x07
149 #define MONO_PE_RESOURCE_ID_FONT 0x08
150 #define MONO_PE_RESOURCE_ID_ACCEL 0x09
151 #define MONO_PE_RESOURCE_ID_RCDATA 0x0a
152 #define MONO_PE_RESOURCE_ID_MESSAGETABLE 0x0b
153 #define MONO_PE_RESOURCE_ID_GROUP_CURSOR 0x0c
154 #define MONO_PE_RESOURCE_ID_GROUP_ICON 0x0d
155 #define MONO_PE_RESOURCE_ID_VERSION 0x10
156 #define MONO_PE_RESOURCE_ID_DLGINCLUDE 0x11
157 #define MONO_PE_RESOURCE_ID_PLUGPLAY 0x13
158 #define MONO_PE_RESOURCE_ID_VXD 0x14
159 #define MONO_PE_RESOURCE_ID_ANICURSOR 0x15
160 #define MONO_PE_RESOURCE_ID_ANIICON 0x16
161 #define MONO_PE_RESOURCE_ID_HTML 0x17
162 #define MONO_PE_RESOURCE_ID_ASPNET_STRING 0x65
165 /* If the MSB is set, then the other 31 bits store the RVA of
166 * the unicode string containing the name. Otherwise, the
167 * other 31 bits contain the ID of this entry.
171 /* If the MSB is set, then the other 31 bits store the RVA of
172 * another subdirectory. Otherwise, the other 31 bits store
173 * the RVA of the resource data entry leaf node.
176 } MonoPEResourceDirEntry;
178 #define MONO_PE_RES_DIR_ENTRY_NAME_IS_STRING(d) (GUINT32_FROM_LE((d).name) >> 31)
179 #define MONO_PE_RES_DIR_ENTRY_NAME_OFFSET(d) (GUINT32_FROM_LE((d).name) & 0x7fffffff)
180 #define MONO_PE_RES_DIR_ENTRY_SET_NAME(d,i,o) ((d).name = GUINT32_TO_LE(((guint32)((i)?1:0) << 31) | ((o) & 0x7fffffff)))
182 #define MONO_PE_RES_DIR_ENTRY_IS_DIR(d) (GUINT32_FROM_LE((d).dir) >> 31)
183 #define MONO_PE_RES_DIR_ENTRY_DIR_OFFSET(d) (GUINT32_FROM_LE((d).dir) & 0x7fffffff)
184 #define MONO_PE_RES_DIR_ENTRY_SET_DIR(d,i,o) ((d).dir = GUINT32_TO_LE(((guint32)((i)?1:0) << 31) | ((o) & 0x7fffffff)))
188 guint32 res_characteristics;
189 guint32 res_date_stamp;
192 guint16 res_named_entries;
193 guint16 res_id_entries;
194 /* Directory entries follow on here. The array is
195 * res_named_entries + res_id_entries long, containing all
196 * named entries first.
207 MonoPEDirEntry pe_export_table;
208 MonoPEDirEntry pe_import_table;
209 MonoPEDirEntry pe_resource_table;
210 MonoPEDirEntry pe_exception_table;
211 MonoPEDirEntry pe_certificate_table;
212 MonoPEDirEntry pe_reloc_table;
213 MonoPEDirEntry pe_debug;
214 MonoPEDirEntry pe_copyright;
215 MonoPEDirEntry pe_global_ptr;
216 MonoPEDirEntry pe_tls_table;
217 MonoPEDirEntry pe_load_config_table;
218 MonoPEDirEntry pe_bound_import;
219 MonoPEDirEntry pe_iat;
220 MonoPEDirEntry pe_delay_import_desc;
221 MonoPEDirEntry pe_cli_header;
222 MonoPEDirEntry pe_reserved;
231 MonoPEDatadir datadir;
232 } MonoDotNetHeader32;
240 MonoPEDatadir datadir;
249 MonoPEDatadir datadir;
250 } MonoDotNetHeader64;
252 #define VTFIXUP_TYPE_32BIT 0x01
253 #define VTFIXUP_TYPE_64BIT 0x02
254 #define VTFIXUP_TYPE_FROM_UNMANAGED 0x04
255 #define VTFIXUP_TYPE_FROM_UNMANAGED_RETAIN_APPDOMAIN 0x08
256 #define VTFIXUP_TYPE_CALL_MOST_DERIVED 0x10
266 guint32 st_virtual_size;
267 guint32 st_virtual_address;
268 guint32 st_raw_data_size;
269 guint32 st_raw_data_ptr;
270 guint32 st_reloc_ptr;
271 guint32 st_lineno_ptr;
272 guint16 st_reloc_count;
273 guint16 st_line_count;
275 #define SECT_FLAGS_HAS_CODE 0x20
276 #define SECT_FLAGS_HAS_INITIALIZED_DATA 0x40
277 #define SECT_FLAGS_HAS_UNINITIALIZED_DATA 0x80
278 #define SECT_FLAGS_MEM_DISCARDABLE 0x02000000
279 #define SECT_FLAGS_MEM_NOT_CACHED 0x04000000
280 #define SECT_FLAGS_MEM_NOT_PAGED 0x08000000
281 #define SECT_FLAGS_MEM_SHARED 0x10000000
282 #define SECT_FLAGS_MEM_EXECUTE 0x20000000
283 #define SECT_FLAGS_MEM_READ 0x40000000
284 #define SECT_FLAGS_MEM_WRITE 0x80000000
291 guint16 ch_runtime_major;
292 guint16 ch_runtime_minor;
293 MonoPEDirEntry ch_metadata;
295 #define CLI_FLAGS_ILONLY 0x01
296 #define CLI_FLAGS_32BITREQUIRED 0x02
297 #define CLI_FLAGS_STRONGNAMESIGNED 0x8
298 #define CLI_FLAGS_PREFERRED32BIT 0x10
299 #define CLI_FLAGS_TRACKDEBUGDATA 0x00010000
302 guint32 ch_entry_point;
303 MonoPEDirEntry ch_resources;
304 MonoPEDirEntry ch_strong_name;
305 MonoPEDirEntry ch_code_manager_table;
306 MonoPEDirEntry ch_vtable_fixups;
307 MonoPEDirEntry ch_export_address_table_jumps;
309 /* The following are zero in the current docs */
310 MonoPEDirEntry ch_eeinfo_table;
311 MonoPEDirEntry ch_helper_table;
312 MonoPEDirEntry ch_dynamic_info;
313 MonoPEDirEntry ch_delay_load_info;
314 MonoPEDirEntry ch_module_image;
315 MonoPEDirEntry ch_external_fixups;
316 MonoPEDirEntry ch_ridmap;
317 MonoPEDirEntry ch_debug_map;
318 MonoPEDirEntry ch_ip_map;
321 /* This is not an on-disk structure */
323 MonoDotNetHeader cli_header;
324 int cli_section_count;
325 MonoSectionTable *cli_section_tables;
327 MonoCLIHeader cli_cli_header;
330 MONO_API guint32 mono_cli_rva_image_map (MonoImage *image, guint32 rva);
332 #endif /* __MONO_CIL_COFF_H__ */