X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fcil-coff.h;h=8581a042f2c310bafe764a2992b0897816939f08;hb=c1086268ba833338bd33ea268f453ebcc063c7bd;hp=1393c801306c8daf26e4319a1dc65ec5f386c64f;hpb=cfd0ebeef7cc4f49e09058b2f03b9746c284bbd1;p=mono.git diff --git a/mono/metadata/cil-coff.h b/mono/metadata/cil-coff.h index 1393c801306..8581a042f2c 100644 --- a/mono/metadata/cil-coff.h +++ b/mono/metadata/cil-coff.h @@ -3,13 +3,13 @@ #define __MONO_CIL_COFF_H__ #include +#include /* * 25.2.1: Method header type values */ -#define METHOD_HEADER_FORMAT_MASK 7 +#define METHOD_HEADER_FORMAT_MASK 3 #define METHOD_HEADER_TINY_FORMAT 2 -#define METHOD_HEADER_TINY_FORMAT1 6 #define METHOD_HEADER_FAT_FORMAT 3 /* @@ -29,11 +29,20 @@ /* 128 bytes */ typedef struct { - char msdos_header [60]; + 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; @@ -61,6 +70,18 @@ typedef struct { 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 */ @@ -86,6 +107,96 @@ typedef struct { 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; @@ -111,6 +222,15 @@ typedef struct { 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]; @@ -120,6 +240,27 @@ typedef struct { 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; @@ -153,7 +294,9 @@ typedef struct { #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; @@ -184,7 +327,6 @@ typedef struct { MonoCLIHeader cli_cli_header; } MonoCLIImageInfo; -guint32 mono_cli_rva_image_map (MonoCLIImageInfo *iinfo, guint32 rva); -char *mono_cli_rva_map (MonoCLIImageInfo *iinfo, guint32 rva); +MONO_API guint32 mono_cli_rva_image_map (MonoImage *image, guint32 rva); #endif /* __MONO_CIL_COFF_H__ */