#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
/*
/* 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;
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_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 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];
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;
#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;
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__ */