#include <stdio.h>
#include <glib.h>
-typedef struct _MonoImage MonoImage;
+G_BEGIN_DECLS
-typedef struct {
- int ref_count;
- char *name;
-
- MonoImage *image;
- /* Load files here */
-} MonoAssembly;
+typedef struct _MonoImage MonoImage;
+typedef struct _MonoAssembly MonoAssembly;
+typedef struct _MonoTableInfo MonoTableInfo;
-typedef struct {
- guint32 offset;
- guint32 size;
-} MonoStreamHeader;
+#define MONO_PUBLIC_KEY_TOKEN_LENGTH 17
typedef struct {
- guint32 rows, row_size;
- char *base;
-
- /*
- * Tables contain up to 9 columns and the possible sizes of the
- * fields in the documentation are 1, 2 and 4 bytes. So we
- * can encode in 2 bits the size.
- *
- * A 32 bit value can encode the resulting size
- *
- * The top eight bits encode the number of columns in the table.
- * we only need 4, but 8 is aligned no shift required.
- */
- guint32 size_bitfield;
-} MonoTableInfo;
-
-struct _MonoImage {
- int ref_count;
- FILE *f;
- char *name;
- const char *assembly_name;
- void *image_info;
-
- char *raw_metadata;
-
- gboolean idx_string_wide, idx_guid_wide, idx_blob_wide;
-
- MonoStreamHeader heap_strings;
- MonoStreamHeader heap_us;
- MonoStreamHeader heap_blob;
- MonoStreamHeader heap_guid;
- MonoStreamHeader heap_tables;
-
- char *tables_base;
-
- MonoTableInfo tables [64];
-
- /*
- * references is initialized only by using the mono_assembly_open
- * function, and not by using the lowlevel mono_image_open.
- *
- * It is NULL terminated.
- */
- MonoAssembly **references;
-
- /*
- * Indexed by method tokens and typedef tokens.
- */
- GHashTable *method_cache;
- GHashTable *class_cache;
- /*
- * Indexes namespaces to hash tables that map class name to typedef token.
- */
- GHashTable *name_cache;
-
- /*
- * Indexed by ((rank << 24) | (typedef & 0xffffff)), which limits us to a
- * maximal rank of 255
- */
- GHashTable *array_cache;
-
- /*
- * user_info is a public field and is not touched by the
- * metadata engine
- */
- void *user_info;
-};
-
-enum MonoImageOpenStatus {
+ const char *name;
+ const char *culture;
+ const char *hash_value;
+ const guint8* public_key;
+ // string of 16 hex chars + 1 NULL
+ guchar public_key_token [MONO_PUBLIC_KEY_TOKEN_LENGTH];
+ guint32 hash_alg;
+ guint32 hash_len;
+ guint32 flags;
+ guint16 major, minor, build, revision;
+} MonoAssemblyName;
+
+typedef enum {
MONO_IMAGE_OK,
MONO_IMAGE_ERROR_ERRNO,
MONO_IMAGE_MISSING_ASSEMBLYREF,
MONO_IMAGE_IMAGE_INVALID
-};
+} MonoImageOpenStatus;
+
+void mono_images_init (void);
+void mono_images_cleanup (void);
MonoImage *mono_image_open (const char *fname,
- enum MonoImageOpenStatus *status);
+ MonoImageOpenStatus *status);
+MonoImage *mono_image_open_full (const char *fname,
+ MonoImageOpenStatus *status, gboolean refonly);
+MonoImage *mono_pe_file_open (const char *fname,
+ MonoImageOpenStatus *status);
+MonoImage *mono_image_open_from_data (char *data, guint32 data_len, gboolean need_copy,
+ MonoImageOpenStatus *status);
+MonoImage *mono_image_open_from_data_full (char *data, guint32 data_len, gboolean need_copy,
+ MonoImageOpenStatus *status, gboolean refonly);
MonoImage *mono_image_loaded (const char *name);
+MonoImage *mono_image_loaded_full (const char *name, gboolean refonly);
+MonoImage *mono_image_loaded_by_guid (const char *guid);
+MonoImage *mono_image_loaded_by_guid_full (const char *guid, gboolean refonly);
+void mono_image_init (MonoImage *image);
void mono_image_close (MonoImage *image);
-const char *mono_image_strerror (enum MonoImageOpenStatus status);
+void mono_image_addref (MonoImage *image);
+const char *mono_image_strerror (MonoImageOpenStatus status);
int mono_image_ensure_section (MonoImage *image,
const char *section);
int mono_image_ensure_section_idx (MonoImage *image,
int section);
-
+
+guint32 mono_image_get_entry_point (MonoImage *image);
+const char *mono_image_get_resource (MonoImage *image, guint32 offset, guint32 *size);
+MonoImage* mono_image_load_file_for_image (MonoImage *image, int fileidx);
+
+MonoImage* mono_image_load_module (MonoImage *image, int idx);
+
+const char* mono_image_get_name (MonoImage *image);
+const char* mono_image_get_filename (MonoImage *image);
+const char * mono_image_get_guid (MonoImage *image);
+MonoAssembly* mono_image_get_assembly (MonoImage *image);
+gboolean mono_image_is_dynamic (MonoImage *image);
+char* mono_image_rva_map (MonoImage *image, guint32 rva);
+
+const MonoTableInfo *mono_image_get_table_info (MonoImage *image, int table_id);
+int mono_image_get_table_rows (MonoImage *image, int table_id);
+int mono_table_info_get_rows (const MonoTableInfo *table);
+
+/* This actually returns a MonoPEResourceDataEntry *, but declaring it
+ * causes an include file loop.
+ */
+gpointer mono_image_lookup_resource (MonoImage *image, guint32 res_id,
+ guint32 lang_id, gunichar2 *name);
+
+const char* mono_image_get_public_key (MonoImage *image, guint32 *size);
+const char* mono_image_get_strong_name (MonoImage *image, guint32 *size);
+guint32 mono_image_strong_name_position (MonoImage *image, guint32 *size);
+void mono_image_add_to_name_cache (MonoImage *image,
+ const char *nspace,
+ const char *name, guint32 idx);
+gboolean mono_image_has_authenticode_entry (MonoImage *image);
+
+G_END_DECLS
+
#endif