X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fcil-coff.h;h=bfdb47e76beb213320926e32d719513d23f5129e;hb=ddbd6b64c6050e6a5739559ff0321887a5fcbbe7;hp=ee4f001e2b0a21e31070f5dfe00b7a5d1051e43d;hpb=0fae05ddc83ee034344d50a6d4d618cfb10ee491;p=mono.git diff --git a/mono/metadata/cil-coff.h b/mono/metadata/cil-coff.h index ee4f001e2b0..bfdb47e76be 100644 --- a/mono/metadata/cil-coff.h +++ b/mono/metadata/cil-coff.h @@ -1,12 +1,43 @@ + +#ifndef __MONO_CIL_COFF_H__ +#define __MONO_CIL_COFF_H__ + #include -/* A metadata token */ -typedef guint32 mtoken_t; +/* + * 25.2.1: Method header type values + */ +#define METHOD_HEADER_FORMAT_MASK 7 +#define METHOD_HEADER_TINY_FORMAT 2 +#define METHOD_HEADER_TINY_FORMAT1 6 +#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_header [128]; -} msdos_header_t; + char msdos_sig [2]; + guint16 nlast_page; + guint16 npages; + char msdos_header [54]; + guint32 pe_offset; + char msdos_header2 [64]; +} MonoMSDOSHeader; +/* 20 bytes */ typedef struct { guint16 coff_machine; guint16 coff_sections; @@ -15,11 +46,12 @@ typedef struct { guint32 coff_symcount; guint16 coff_opt_header_size; guint16 coff_attributes; -} coff_header_t; +} MonoCOFFHeader; #define COFF_ATTRIBUTE_EXECUTABLE_IMAGE 0x0002 #define COFF_ATTRIBUTE_LIBRARY_IMAGE 0x2000 +/* 28 bytes */ typedef struct { guint16 pe_magic; guchar pe_major; @@ -30,8 +62,21 @@ typedef struct { guint32 pe_rva_entry_point; guint32 pe_rva_code_base; guint32 pe_rva_data_base; -} pe_header_t; +} 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 */ @@ -54,39 +99,152 @@ typedef struct { guint32 pe_heap_commit; guint32 pe_loader_flags; guint32 pe_data_dir_count; -} pe_header_nt_t; +} 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 + +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. + */ +#if G_BYTE_ORDER == G_LITTLE_ENDIAN + guint32 name_offset:31; + guint32 name_is_string:1; +#else + guint32 name_is_string:1; + guint32 name_offset:31; +#endif + + /* 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. + */ +#if G_BYTE_ORDER == G_LITTLE_ENDIAN + guint32 dir_offset:31; + guint32 is_dir:1; +#else + guint32 is_dir:1; + guint32 dir_offset:31; +#endif +} MonoPEResourceDirEntry; + +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; -} pe_dir_entry_t; - -typedef struct { - pe_dir_entry_t pe_export_table; - pe_dir_entry_t pe_import_table; - pe_dir_entry_t pe_resource_table; - pe_dir_entry_t pe_exception_table; - pe_dir_entry_t pe_certificate_table; - pe_dir_entry_t pe_reloc_table; - pe_dir_entry_t pe_debug; - pe_dir_entry_t pe_copyright; - pe_dir_entry_t pe_global_ptr; - pe_dir_entry_t pe_tls_table; - pe_dir_entry_t pe_load_config_table; - pe_dir_entry_t pe_bound_import; - pe_dir_entry_t pe_iat; - pe_dir_entry_t pe_delay_import_desc; - pe_dir_entry_t pe_cli_header; - pe_dir_entry_t pe_reserved; -} pe_datadir_t; +} 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]; - coff_header_t coff; - pe_header_t pe; - pe_header_nt_t nt; - pe_datadir_t datadir; -} dotnet_header_t; + 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; typedef struct { char st_name [8]; @@ -110,47 +268,49 @@ typedef struct { #define SECT_FLAGS_MEM_READ 0x40000000 #define SECT_FLAGS_MEM_WRITE 0x80000000 guint32 st_flags; -} section_table_t; + +} MonoSectionTable; typedef struct { guint32 ch_size; guint16 ch_runtime_major; guint16 ch_runtime_minor; - pe_dir_entry_t ch_metadata; + MonoPEDirEntry ch_metadata; #define CLI_FLAGS_ILONLY 0x01 #define CLI_FLAGS_32BITREQUIRED 0x02 +#define CLI_FLAGS_STRONGNAMESIGNED 0x8 #define CLI_FLAGS_TRACKDEBUGDATA 0x00010000 guint32 ch_flags; - mtoken_t ch_entry_point; - pe_dir_entry_t ch_resources; - pe_dir_entry_t ch_strong_name; - pe_dir_entry_t ch_code_manager_table; - pe_dir_entry_t ch_vtable_fixups; - pe_dir_entry_t ch_export_address_table_jumps; + 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 */ - pe_dir_entry_t ch_eeinfo_table; - pe_dir_entry_t ch_helper_table; - pe_dir_entry_t ch_dynamic_info; - pe_dir_entry_t ch_delay_load_info; - pe_dir_entry_t ch_module_image; - pe_dir_entry_t ch_external_fixups; - pe_dir_entry_t ch_ridmap; - pe_dir_entry_t ch_debug_map; - pe_dir_entry_t ch_ip_map; -} cli_header_t; + 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 { - dotnet_header_t dn_header; - int dn_section_count; - section_table_t *dn_section_tables; - cli_header_t dn_cli_header; - - metadata_t dn_metadata; -} dotnet_image_info_t; - + MonoDotNetHeader cli_header; + int cli_section_count; + MonoSectionTable *cli_section_tables; + void **cli_sections; + MonoCLIHeader cli_cli_header; +} MonoCLIImageInfo; +guint32 mono_cli_rva_image_map (MonoCLIImageInfo *iinfo, guint32 rva); +#endif /* __MONO_CIL_COFF_H__ */