/** * \file */ #ifndef __MONO_CIL_COFF_H__ #define __MONO_CIL_COFF_H__ #include #include /* * 25.2.1: Method header type values */ #define METHOD_HEADER_FORMAT_MASK 3 #define METHOD_HEADER_TINY_FORMAT 2 #define METHOD_HEADER_FAT_FORMAT 3 /* * 25.2.3.1: Flags for method headers */ #define METHOD_HEADER_INIT_LOCALS 0x10 #define METHOD_HEADER_MORE_SECTS 0x08 /* * For section data (25.3) */ #define METHOD_HEADER_SECTION_RESERVED 0 #define METHOD_HEADER_SECTION_EHTABLE 1 #define METHOD_HEADER_SECTION_OPTIL_TABLE 2 #define METHOD_HEADER_SECTION_FAT_FORMAT 0x40 #define METHOD_HEADER_SECTION_MORE_SECTS 0x80 /* 128 bytes */ typedef struct { char msdos_sig [2]; guint16 nlast_page; guint16 npages; char msdos_header [54]; guint32 pe_offset; char msdos_header2 [64]; } MonoMSDOSHeader; /* Possible values for coff_machine */ #define COFF_MACHINE_I386 332 #define COFF_MACHINE_IA64 512 #define COFF_MACHINE_AMD64 34404 #define COFF_MACHINE_ARM 452 /* 20 bytes */ typedef struct { guint16 coff_machine; guint16 coff_sections; guint32 coff_time; guint32 coff_symptr; guint32 coff_symcount; guint16 coff_opt_header_size; guint16 coff_attributes; } MonoCOFFHeader; #define COFF_ATTRIBUTE_EXECUTABLE_IMAGE 0x0002 #define COFF_ATTRIBUTE_LIBRARY_IMAGE 0x2000 /* 28 bytes */ typedef struct { guint16 pe_magic; guchar pe_major; guchar pe_minor; guint32 pe_code_size; guint32 pe_data_size; guint32 pe_uninit_data_size; guint32 pe_rva_entry_point; guint32 pe_rva_code_base; guint32 pe_rva_data_base; } MonoPEHeader; /* 24 bytes */ typedef struct { guint16 pe_magic; guchar pe_major; guchar pe_minor; guint32 pe_code_size; guint32 pe_data_size; guint32 pe_uninit_data_size; guint32 pe_rva_entry_point; guint32 pe_rva_code_base; } MonoPEHeader64; /* 68 bytes */ typedef struct { guint32 pe_image_base; /* must be 0x400000 */ guint32 pe_section_align; /* must be 8192 */ guint32 pe_file_alignment; /* must be 512 or 4096 */ guint16 pe_os_major; /* must be 4 */ guint16 pe_os_minor; /* must be 0 */ guint16 pe_user_major; guint16 pe_user_minor; guint16 pe_subsys_major; guint16 pe_subsys_minor; guint32 pe_reserved_1; guint32 pe_image_size; guint32 pe_header_size; guint32 pe_checksum; guint16 pe_subsys_required; guint16 pe_dll_flags; guint32 pe_stack_reserve; guint32 pe_stack_commit; guint32 pe_heap_reserve; guint32 pe_heap_commit; guint32 pe_loader_flags; guint32 pe_data_dir_count; } MonoPEHeaderNT; /* 88 bytes */ typedef struct { guint64 pe_image_base; guint32 pe_section_align; /* must be 8192 */ guint32 pe_file_alignment; /* must be 512 or 4096 */ guint16 pe_os_major; /* must be 4 */ guint16 pe_os_minor; /* must be 0 */ guint16 pe_user_major; guint16 pe_user_minor; guint16 pe_subsys_major; guint16 pe_subsys_minor; guint32 pe_reserved_1; guint32 pe_image_size; guint32 pe_header_size; guint32 pe_checksum; guint16 pe_subsys_required; guint16 pe_dll_flags; guint64 pe_stack_reserve; guint64 pe_stack_commit; guint64 pe_heap_reserve; guint64 pe_heap_commit; guint32 pe_loader_flags; guint32 pe_data_dir_count; } MonoPEHeaderNT64; typedef struct { guint32 rde_data_offset; guint32 rde_size; guint32 rde_codepage; guint32 rde_reserved; } MonoPEResourceDataEntry; #define MONO_PE_RESOURCE_ID_CURSOR 0x01 #define MONO_PE_RESOURCE_ID_BITMAP 0x02 #define MONO_PE_RESOURCE_ID_ICON 0x03 #define MONO_PE_RESOURCE_ID_MENU 0x04 #define MONO_PE_RESOURCE_ID_DIALOG 0x05 #define MONO_PE_RESOURCE_ID_STRING 0x06 #define MONO_PE_RESOURCE_ID_FONTDIR 0x07 #define MONO_PE_RESOURCE_ID_FONT 0x08 #define MONO_PE_RESOURCE_ID_ACCEL 0x09 #define MONO_PE_RESOURCE_ID_RCDATA 0x0a #define MONO_PE_RESOURCE_ID_MESSAGETABLE 0x0b #define MONO_PE_RESOURCE_ID_GROUP_CURSOR 0x0c #define MONO_PE_RESOURCE_ID_GROUP_ICON 0x0d #define MONO_PE_RESOURCE_ID_VERSION 0x10 #define MONO_PE_RESOURCE_ID_DLGINCLUDE 0x11 #define MONO_PE_RESOURCE_ID_PLUGPLAY 0x13 #define MONO_PE_RESOURCE_ID_VXD 0x14 #define MONO_PE_RESOURCE_ID_ANICURSOR 0x15 #define MONO_PE_RESOURCE_ID_ANIICON 0x16 #define MONO_PE_RESOURCE_ID_HTML 0x17 #define MONO_PE_RESOURCE_ID_ASPNET_STRING 0x65 typedef struct { /* If the MSB is set, then the other 31 bits store the RVA of * the unicode string containing the name. Otherwise, the * other 31 bits contain the ID of this entry. */ guint32 name; /* If the MSB is set, then the other 31 bits store the RVA of * another subdirectory. Otherwise, the other 31 bits store * the RVA of the resource data entry leaf node. */ guint32 dir; } MonoPEResourceDirEntry; #define MONO_PE_RES_DIR_ENTRY_NAME_IS_STRING(d) (GUINT32_FROM_LE((d).name) >> 31) #define MONO_PE_RES_DIR_ENTRY_NAME_OFFSET(d) (GUINT32_FROM_LE((d).name) & 0x7fffffff) #define MONO_PE_RES_DIR_ENTRY_SET_NAME(d,i,o) ((d).name = GUINT32_TO_LE(((guint32)((i)?1:0) << 31) | ((o) & 0x7fffffff))) #define MONO_PE_RES_DIR_ENTRY_IS_DIR(d) (GUINT32_FROM_LE((d).dir) >> 31) #define MONO_PE_RES_DIR_ENTRY_DIR_OFFSET(d) (GUINT32_FROM_LE((d).dir) & 0x7fffffff) #define MONO_PE_RES_DIR_ENTRY_SET_DIR(d,i,o) ((d).dir = GUINT32_TO_LE(((guint32)((i)?1:0) << 31) | ((o) & 0x7fffffff))) typedef struct { guint32 res_characteristics; guint32 res_date_stamp; guint16 res_major; guint16 res_minor; guint16 res_named_entries; guint16 res_id_entries; /* Directory entries follow on here. The array is * res_named_entries + res_id_entries long, containing all * named entries first. */ } MonoPEResourceDir; typedef struct { guint32 rva; guint32 size; } MonoPEDirEntry; /* 128 bytes */ typedef struct { MonoPEDirEntry pe_export_table; MonoPEDirEntry pe_import_table; MonoPEDirEntry pe_resource_table; MonoPEDirEntry pe_exception_table; MonoPEDirEntry pe_certificate_table; MonoPEDirEntry pe_reloc_table; MonoPEDirEntry pe_debug; MonoPEDirEntry pe_copyright; MonoPEDirEntry pe_global_ptr; MonoPEDirEntry pe_tls_table; MonoPEDirEntry pe_load_config_table; MonoPEDirEntry pe_bound_import; MonoPEDirEntry pe_iat; MonoPEDirEntry pe_delay_import_desc; MonoPEDirEntry pe_cli_header; MonoPEDirEntry pe_reserved; } MonoPEDatadir; /* 248 bytes */ typedef struct { char pesig [4]; MonoCOFFHeader coff; MonoPEHeader pe; MonoPEHeaderNT nt; MonoPEDatadir datadir; } MonoDotNetHeader32; /* 248 bytes */ typedef struct { char pesig [4]; MonoCOFFHeader coff; MonoPEHeader pe; MonoPEHeaderNT nt; MonoPEDatadir datadir; } MonoDotNetHeader; /* XX248 bytes */ typedef struct { char pesig [4]; MonoCOFFHeader coff; MonoPEHeader64 pe; MonoPEHeaderNT64 nt; MonoPEDatadir datadir; } MonoDotNetHeader64; #define VTFIXUP_TYPE_32BIT 0x01 #define VTFIXUP_TYPE_64BIT 0x02 #define VTFIXUP_TYPE_FROM_UNMANAGED 0x04 #define VTFIXUP_TYPE_FROM_UNMANAGED_RETAIN_APPDOMAIN 0x08 #define VTFIXUP_TYPE_CALL_MOST_DERIVED 0x10 typedef struct { guint32 rva; guint16 count; guint16 type; } MonoVTableFixup; typedef struct { char st_name [8]; guint32 st_virtual_size; guint32 st_virtual_address; guint32 st_raw_data_size; guint32 st_raw_data_ptr; guint32 st_reloc_ptr; guint32 st_lineno_ptr; guint16 st_reloc_count; guint16 st_line_count; #define SECT_FLAGS_HAS_CODE 0x20 #define SECT_FLAGS_HAS_INITIALIZED_DATA 0x40 #define SECT_FLAGS_HAS_UNINITIALIZED_DATA 0x80 #define SECT_FLAGS_MEM_DISCARDABLE 0x02000000 #define SECT_FLAGS_MEM_NOT_CACHED 0x04000000 #define SECT_FLAGS_MEM_NOT_PAGED 0x08000000 #define SECT_FLAGS_MEM_SHARED 0x10000000 #define SECT_FLAGS_MEM_EXECUTE 0x20000000 #define SECT_FLAGS_MEM_READ 0x40000000 #define SECT_FLAGS_MEM_WRITE 0x80000000 guint32 st_flags; } MonoSectionTable; typedef struct { guint32 ch_size; guint16 ch_runtime_major; guint16 ch_runtime_minor; MonoPEDirEntry ch_metadata; #define CLI_FLAGS_ILONLY 0x01 #define CLI_FLAGS_32BITREQUIRED 0x02 #define CLI_FLAGS_STRONGNAMESIGNED 0x8 #define CLI_FLAGS_TRACKDEBUGDATA 0x00010000 #define CLI_FLAGS_PREFERRED32BIT 0x00020000 guint32 ch_flags; guint32 ch_entry_point; MonoPEDirEntry ch_resources; MonoPEDirEntry ch_strong_name; MonoPEDirEntry ch_code_manager_table; MonoPEDirEntry ch_vtable_fixups; MonoPEDirEntry ch_export_address_table_jumps; /* The following are zero in the current docs */ MonoPEDirEntry ch_eeinfo_table; MonoPEDirEntry ch_helper_table; MonoPEDirEntry ch_dynamic_info; MonoPEDirEntry ch_delay_load_info; MonoPEDirEntry ch_module_image; MonoPEDirEntry ch_external_fixups; MonoPEDirEntry ch_ridmap; MonoPEDirEntry ch_debug_map; MonoPEDirEntry ch_ip_map; } MonoCLIHeader; /* This is not an on-disk structure */ typedef struct { MonoDotNetHeader cli_header; int cli_section_count; MonoSectionTable *cli_section_tables; void **cli_sections; MonoCLIHeader cli_cli_header; } MonoCLIImageInfo; MONO_API guint32 mono_cli_rva_image_map (MonoImage *image, guint32 rva); #endif /* __MONO_CIL_COFF_H__ */