#define __MONO_CIL_COFF_H__
#include <mono/metadata/metadata.h>
+#include <glib.h>
/*
* 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
/*
#define METHOD_HEADER_SECTION_FAT_FORMAT 0x40
#define METHOD_HEADER_SECTION_MORE_SECTS 0x80
-/* A metadata token */
-typedef guint32 mtoken_t;
-
+/* 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;
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;
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 */
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
+#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;
-} 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;
+
+#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];
#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 cli_header;
+ MonoDotNetHeader cli_header;
int cli_section_count;
- section_table_t *cli_section_tables;
+ MonoSectionTable *cli_section_tables;
void **cli_sections;
- cli_header_t cli_cli_header;
-} cli_image_info_t;
+ MonoCLIHeader cli_cli_header;
+} MonoCLIImageInfo;
-guint32 cli_rva_image_map (cli_image_info_t *iinfo, guint32 rva);
-char *cli_rva_map (cli_image_info_t *iinfo, guint32 rva);
+guint32 mono_cli_rva_image_map (MonoImage *image, guint32 rva);
#endif /* __MONO_CIL_COFF_H__ */