1 /** 2 * \file 3 */ 4 5 #ifndef __MONO_CIL_COFF_H__ 6 #define __MONO_CIL_COFF_H__ 7 8 #include <mono/metadata/metadata.h> 9 #include <glib.h> 10 11 /* 12 * 25.2.1: Method header type values 13 */ 14 #define METHOD_HEADER_FORMAT_MASK 3 15 #define METHOD_HEADER_TINY_FORMAT 2 16 #define METHOD_HEADER_FAT_FORMAT 3 17 18 /* 19 * 25.2.3.1: Flags for method headers 20 */ 21 #define METHOD_HEADER_INIT_LOCALS 0x10 22 #define METHOD_HEADER_MORE_SECTS 0x08 23 24 /* 25 * For section data (25.3) 26 */ 27 #define METHOD_HEADER_SECTION_RESERVED 0 28 #define METHOD_HEADER_SECTION_EHTABLE 1 29 #define METHOD_HEADER_SECTION_OPTIL_TABLE 2 30 #define METHOD_HEADER_SECTION_FAT_FORMAT 0x40 31 #define METHOD_HEADER_SECTION_MORE_SECTS 0x80 32 33 /* 128 bytes */ 34 typedef struct { 35 char msdos_sig [2]; 36 guint16 nlast_page; 37 guint16 npages; 38 char msdos_header [54]; 39 guint32 pe_offset; 40 char msdos_header2 [64]; 41 } MonoMSDOSHeader; 42 43 /* Possible values for coff_machine */ 44 #define COFF_MACHINE_I386 332 45 #define COFF_MACHINE_IA64 512 46 #define COFF_MACHINE_AMD64 34404 47 #define COFF_MACHINE_ARM 452 48 49 /* 20 bytes */ 50 typedef struct { 51 guint16 coff_machine; 52 guint16 coff_sections; 53 guint32 coff_time; 54 guint32 coff_symptr; 55 guint32 coff_symcount; 56 guint16 coff_opt_header_size; 57 guint16 coff_attributes; 58 } MonoCOFFHeader; 59 60 #define COFF_ATTRIBUTE_EXECUTABLE_IMAGE 0x0002 61 #define COFF_ATTRIBUTE_LIBRARY_IMAGE 0x2000 62 63 /* 28 bytes */ 64 typedef struct { 65 guint16 pe_magic; 66 guchar pe_major; 67 guchar pe_minor; 68 guint32 pe_code_size; 69 guint32 pe_data_size; 70 guint32 pe_uninit_data_size; 71 guint32 pe_rva_entry_point; 72 guint32 pe_rva_code_base; 73 guint32 pe_rva_data_base; 74 } MonoPEHeader; 75 76 /* 24 bytes */ 77 typedef struct { 78 guint16 pe_magic; 79 guchar pe_major; 80 guchar pe_minor; 81 guint32 pe_code_size; 82 guint32 pe_data_size; 83 guint32 pe_uninit_data_size; 84 guint32 pe_rva_entry_point; 85 guint32 pe_rva_code_base; 86 } MonoPEHeader64; 87 88 /* 68 bytes */ 89 typedef struct { 90 guint32 pe_image_base; /* must be 0x400000 */ 91 guint32 pe_section_align; /* must be 8192 */ 92 guint32 pe_file_alignment; /* must be 512 or 4096 */ 93 guint16 pe_os_major; /* must be 4 */ 94 guint16 pe_os_minor; /* must be 0 */ 95 guint16 pe_user_major; 96 guint16 pe_user_minor; 97 guint16 pe_subsys_major; 98 guint16 pe_subsys_minor; 99 guint32 pe_reserved_1; 100 guint32 pe_image_size; 101 guint32 pe_header_size; 102 guint32 pe_checksum; 103 guint16 pe_subsys_required; 104 guint16 pe_dll_flags; 105 guint32 pe_stack_reserve; 106 guint32 pe_stack_commit; 107 guint32 pe_heap_reserve; 108 guint32 pe_heap_commit; 109 guint32 pe_loader_flags; 110 guint32 pe_data_dir_count; 111 } MonoPEHeaderNT; 112 113 /* 88 bytes */ 114 typedef struct { 115 guint64 pe_image_base; 116 guint32 pe_section_align; /* must be 8192 */ 117 guint32 pe_file_alignment; /* must be 512 or 4096 */ 118 guint16 pe_os_major; /* must be 4 */ 119 guint16 pe_os_minor; /* must be 0 */ 120 guint16 pe_user_major; 121 guint16 pe_user_minor; 122 guint16 pe_subsys_major; 123 guint16 pe_subsys_minor; 124 guint32 pe_reserved_1; 125 guint32 pe_image_size; 126 guint32 pe_header_size; 127 guint32 pe_checksum; 128 guint16 pe_subsys_required; 129 guint16 pe_dll_flags; 130 guint64 pe_stack_reserve; 131 guint64 pe_stack_commit; 132 guint64 pe_heap_reserve; 133 guint64 pe_heap_commit; 134 guint32 pe_loader_flags; 135 guint32 pe_data_dir_count; 136 } MonoPEHeaderNT64; 137 138 typedef struct { 139 guint32 rde_data_offset; 140 guint32 rde_size; 141 guint32 rde_codepage; 142 guint32 rde_reserved; 143 } MonoPEResourceDataEntry; 144 145 #define MONO_PE_RESOURCE_ID_CURSOR 0x01 146 #define MONO_PE_RESOURCE_ID_BITMAP 0x02 147 #define MONO_PE_RESOURCE_ID_ICON 0x03 148 #define MONO_PE_RESOURCE_ID_MENU 0x04 149 #define MONO_PE_RESOURCE_ID_DIALOG 0x05 150 #define MONO_PE_RESOURCE_ID_STRING 0x06 151 #define MONO_PE_RESOURCE_ID_FONTDIR 0x07 152 #define MONO_PE_RESOURCE_ID_FONT 0x08 153 #define MONO_PE_RESOURCE_ID_ACCEL 0x09 154 #define MONO_PE_RESOURCE_ID_RCDATA 0x0a 155 #define MONO_PE_RESOURCE_ID_MESSAGETABLE 0x0b 156 #define MONO_PE_RESOURCE_ID_GROUP_CURSOR 0x0c 157 #define MONO_PE_RESOURCE_ID_GROUP_ICON 0x0d 158 #define MONO_PE_RESOURCE_ID_VERSION 0x10 159 #define MONO_PE_RESOURCE_ID_DLGINCLUDE 0x11 160 #define MONO_PE_RESOURCE_ID_PLUGPLAY 0x13 161 #define MONO_PE_RESOURCE_ID_VXD 0x14 162 #define MONO_PE_RESOURCE_ID_ANICURSOR 0x15 163 #define MONO_PE_RESOURCE_ID_ANIICON 0x16 164 #define MONO_PE_RESOURCE_ID_HTML 0x17 165 #define MONO_PE_RESOURCE_ID_ASPNET_STRING 0x65 166 167 typedef struct { 168 /* If the MSB is set, then the other 31 bits store the RVA of 169 * the unicode string containing the name. Otherwise, the 170 * other 31 bits contain the ID of this entry. 171 */ 172 guint32 name; 173 174 /* If the MSB is set, then the other 31 bits store the RVA of 175 * another subdirectory. Otherwise, the other 31 bits store 176 * the RVA of the resource data entry leaf node. 177 */ 178 guint32 dir; 179 } MonoPEResourceDirEntry; 180 181 #define MONO_PE_RES_DIR_ENTRY_NAME_IS_STRING(d) (GUINT32_FROM_LE((d).name) >> 31) 182 #define MONO_PE_RES_DIR_ENTRY_NAME_OFFSET(d) (GUINT32_FROM_LE((d).name) & 0x7fffffff) 183 #define MONO_PE_RES_DIR_ENTRY_SET_NAME(d,i,o) ((d).name = GUINT32_TO_LE(((guint32)((i)?1:0) << 31) | ((o) & 0x7fffffff))) 184 185 #define MONO_PE_RES_DIR_ENTRY_IS_DIR(d) (GUINT32_FROM_LE((d).dir) >> 31) 186 #define MONO_PE_RES_DIR_ENTRY_DIR_OFFSET(d) (GUINT32_FROM_LE((d).dir) & 0x7fffffff) 187 #define MONO_PE_RES_DIR_ENTRY_SET_DIR(d,i,o) ((d).dir = GUINT32_TO_LE(((guint32)((i)?1:0) << 31) | ((o) & 0x7fffffff))) 188 189 typedef struct 190 { 191 guint32 res_characteristics; 192 guint32 res_date_stamp; 193 guint16 res_major; 194 guint16 res_minor; 195 guint16 res_named_entries; 196 guint16 res_id_entries; 197 /* Directory entries follow on here. The array is 198 * res_named_entries + res_id_entries long, containing all 199 * named entries first. 200 */ 201 } MonoPEResourceDir; 202 203 typedef struct { 204 guint32 rva; 205 guint32 size; 206 } MonoPEDirEntry; 207 208 /* 128 bytes */ 209 typedef struct { 210 MonoPEDirEntry pe_export_table; 211 MonoPEDirEntry pe_import_table; 212 MonoPEDirEntry pe_resource_table; 213 MonoPEDirEntry pe_exception_table; 214 MonoPEDirEntry pe_certificate_table; 215 MonoPEDirEntry pe_reloc_table; 216 MonoPEDirEntry pe_debug; 217 MonoPEDirEntry pe_copyright; 218 MonoPEDirEntry pe_global_ptr; 219 MonoPEDirEntry pe_tls_table; 220 MonoPEDirEntry pe_load_config_table; 221 MonoPEDirEntry pe_bound_import; 222 MonoPEDirEntry pe_iat; 223 MonoPEDirEntry pe_delay_import_desc; 224 MonoPEDirEntry pe_cli_header; 225 MonoPEDirEntry pe_reserved; 226 } MonoPEDatadir; 227 228 /* 248 bytes */ 229 typedef struct { 230 char pesig [4]; 231 MonoCOFFHeader coff; 232 MonoPEHeader pe; 233 MonoPEHeaderNT nt; 234 MonoPEDatadir datadir; 235 } MonoDotNetHeader32; 236 237 /* 248 bytes */ 238 typedef struct { 239 char pesig [4]; 240 MonoCOFFHeader coff; 241 MonoPEHeader pe; 242 MonoPEHeaderNT nt; 243 MonoPEDatadir datadir; 244 } MonoDotNetHeader; 245 246 /* XX248 bytes */ 247 typedef struct { 248 char pesig [4]; 249 MonoCOFFHeader coff; 250 MonoPEHeader64 pe; 251 MonoPEHeaderNT64 nt; 252 MonoPEDatadir datadir; 253 } MonoDotNetHeader64; 254 255 #define VTFIXUP_TYPE_32BIT 0x01 256 #define VTFIXUP_TYPE_64BIT 0x02 257 #define VTFIXUP_TYPE_FROM_UNMANAGED 0x04 258 #define VTFIXUP_TYPE_FROM_UNMANAGED_RETAIN_APPDOMAIN 0x08 259 #define VTFIXUP_TYPE_CALL_MOST_DERIVED 0x10 260 261 typedef struct { 262 guint32 rva; 263 guint16 count; 264 guint16 type; 265 } MonoVTableFixup; 266 267 typedef struct { 268 char st_name [8]; 269 guint32 st_virtual_size; 270 guint32 st_virtual_address; 271 guint32 st_raw_data_size; 272 guint32 st_raw_data_ptr; 273 guint32 st_reloc_ptr; 274 guint32 st_lineno_ptr; 275 guint16 st_reloc_count; 276 guint16 st_line_count; 277 278 #define SECT_FLAGS_HAS_CODE 0x20 279 #define SECT_FLAGS_HAS_INITIALIZED_DATA 0x40 280 #define SECT_FLAGS_HAS_UNINITIALIZED_DATA 0x80 281 #define SECT_FLAGS_MEM_DISCARDABLE 0x02000000 282 #define SECT_FLAGS_MEM_NOT_CACHED 0x04000000 283 #define SECT_FLAGS_MEM_NOT_PAGED 0x08000000 284 #define SECT_FLAGS_MEM_SHARED 0x10000000 285 #define SECT_FLAGS_MEM_EXECUTE 0x20000000 286 #define SECT_FLAGS_MEM_READ 0x40000000 287 #define SECT_FLAGS_MEM_WRITE 0x80000000 288 guint32 st_flags; 289 290 } MonoSectionTable; 291 292 typedef struct { 293 guint32 ch_size; 294 guint16 ch_runtime_major; 295 guint16 ch_runtime_minor; 296 MonoPEDirEntry ch_metadata; 297 298 #define CLI_FLAGS_ILONLY 0x01 299 #define CLI_FLAGS_32BITREQUIRED 0x02 300 #define CLI_FLAGS_STRONGNAMESIGNED 0x8 301 #define CLI_FLAGS_TRACKDEBUGDATA 0x00010000 302 #define CLI_FLAGS_PREFERRED32BIT 0x00020000 303 guint32 ch_flags; 304 305 guint32 ch_entry_point; 306 MonoPEDirEntry ch_resources; 307 MonoPEDirEntry ch_strong_name; 308 MonoPEDirEntry ch_code_manager_table; 309 MonoPEDirEntry ch_vtable_fixups; 310 MonoPEDirEntry ch_export_address_table_jumps; 311 312 /* The following are zero in the current docs */ 313 MonoPEDirEntry ch_eeinfo_table; 314 MonoPEDirEntry ch_helper_table; 315 MonoPEDirEntry ch_dynamic_info; 316 MonoPEDirEntry ch_delay_load_info; 317 MonoPEDirEntry ch_module_image; 318 MonoPEDirEntry ch_external_fixups; 319 MonoPEDirEntry ch_ridmap; 320 MonoPEDirEntry ch_debug_map; 321 MonoPEDirEntry ch_ip_map; 322 } MonoCLIHeader; 323 324 /* This is not an on-disk structure */ 325 typedef struct { 326 MonoDotNetHeader cli_header; 327 int cli_section_count; 328 MonoSectionTable *cli_section_tables; 329 void **cli_sections; 330 MonoCLIHeader cli_cli_header; 331 } MonoCLIImageInfo; 332 333 MONO_API guint32 mono_cli_rva_image_map (MonoImage *image, guint32 rva); 334 335 #endif /* __MONO_CIL_COFF_H__ */ 336