Files
2025-12-25 00:28:32 -05:00

392 lines
12 KiB
C

/* Copyright (C) 2025 etaHEN / LightningMods
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 3, or (at your option) any
later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING. If not, see
<http://www.gnu.org/licenses/>. */
#pragma once
#include <stdint.h>
#define IOVEC_ENTRY(x) {x ? (char *)x : 0, x ? strlen(x) + 1 : 0}
#define IOVEC_SIZE(x) (sizeof(x) / sizeof(struct iovec))
typedef int gboolean;
typedef int gint;
typedef unsigned int guint;
typedef short gshort;
typedef unsigned short gushort;
typedef long glong;
typedef unsigned long gulong;
typedef void* gpointer;
typedef const void* gconstpointer;
typedef char gchar;
typedef unsigned char guchar;
typedef int8_t gint8;
typedef uint8_t guint8;
typedef int16_t gint16;
typedef uint16_t guint16;
typedef int32_t gint32;
typedef uint32_t guint32;
typedef int64_t gint64;
typedef uint64_t guint64;
typedef float gfloat;
typedef double gdouble;
typedef uint16_t gunichar2;
typedef enum {
NOT_PAUSED,
PS5_ONLY,
PS4_ONLY,
BOTH_PAUSED,
} KstuffPauseStatus;
typedef enum {
MONO_IMAGE_OK,
MONO_IMAGE_ERROR_ERRNO,
MONO_IMAGE_MISSING_ASSEMBLYREF,
MONO_IMAGE_IMAGE_INVALID
} MonoImageOpenStatus;
typedef guint32 mono_array_size_t;
typedef gint32 mono_array_lower_bound_t;
#define MONO_ZERO_LEN_ARRAY 1
#if defined(_MSC_VER) && defined(PLATFORM_IPHONE_XCOMP)
# define USE_UINT8_BIT_FIELD(type, field) guint8 field
#else
# define USE_UINT8_BIT_FIELD(type, field) type field
#endif
struct MonoDomain;
struct MonoAssembly;
struct MonoImage;
struct MonoMethodSignature;
struct MonoMethodDesc;
struct MonoClassField;
struct MonoProperty;
struct MonoEvent;
struct MonoThreadsSync;
struct MonoThread;
struct MonoRuntimeGenericContext;
struct MonoMarshalType;
struct MonoGenericClass;
struct MonoGenericContainer;
struct MonoClassRuntimeInfo;
struct MonoClassExt;
struct MonoArrayType;
struct MonoGenericParam;
typedef int MonoTypeEnum;
struct MonoCustomMod;
struct MonoClass;
struct MonoType;
struct MonoMethod;
struct MonoVTable;
struct MonoCustomMod {
unsigned int required : 1;
unsigned int token : 31;
};
struct MonoType {
union {
struct MonoClass* klass; /* for VALUETYPE and CLASS */
struct MonoType* type; /* for PTR */
struct MonoArrayType* array; /* for ARRAY */
struct MonoMethodSignature* method;
struct MonoGenericParam* generic_param; /* for VAR and MVAR */
struct MonoGenericClass* generic_class; /* for GENERICINST */
} data;
unsigned int attrs : 16; /* param attributes or field flags */
MonoTypeEnum type : 8;
unsigned int num_mods : 6; /* max 64 modifiers follow at the end */
unsigned int byref : 1;
unsigned int pinned : 1; /* valid when included in a local var signature */
struct MonoCustomMod modifiers[MONO_ZERO_LEN_ARRAY]; /* this may grow */
};
struct MonoClass {
/* element class for arrays and enum basetype for enums */
struct MonoClass* element_class;
/* used for subtype checks */
struct MonoClass* cast_class;
/* for fast subtype checks */
struct MonoClass** supertypes;
guint16 idepth;
/* array dimension */
guint8 rank;
int instance_size; /* object instance size */
USE_UINT8_BIT_FIELD(guint, inited : 1);
/* We use init_pending to detect cyclic calls to mono_class_init */
USE_UINT8_BIT_FIELD(guint, init_pending : 1);
/* A class contains static and non static data. Static data can be
* of the same type as the class itselfs, but it does not influence
* the instance size of the class. To avoid cyclic calls to
* mono_class_init (from mono_class_instance_size ()) we first
* initialise all non static fields. After that we set size_inited
* to 1, because we know the instance size now. After that we
* initialise all static fields.
*/
USE_UINT8_BIT_FIELD(guint, size_inited : 1);
USE_UINT8_BIT_FIELD(guint, valuetype : 1); /* derives from System.ValueType */
USE_UINT8_BIT_FIELD(guint, enumtype : 1); /* derives from System.Enum */
USE_UINT8_BIT_FIELD(guint, blittable : 1); /* class is blittable */
USE_UINT8_BIT_FIELD(guint, unicode : 1); /* class uses unicode char when marshalled */
USE_UINT8_BIT_FIELD(guint, wastypebuilder : 1); /* class was created at runtime from a TypeBuilder */
/* next byte */
guint8 min_align;
/* next byte */
USE_UINT8_BIT_FIELD(guint, packing_size : 4);
USE_UINT8_BIT_FIELD(guint, has_unity_native_intptr : 1); // This class has a IntPtr that points to a native class with an asset reference
/* still 3 bits free */
/* next byte */
USE_UINT8_BIT_FIELD(guint, ghcimpl : 1); /* class has its own GetHashCode impl */
USE_UINT8_BIT_FIELD(guint, has_finalize : 1); /* class has its own Finalize impl */
USE_UINT8_BIT_FIELD(guint, marshalbyref : 1); /* class is a MarshalByRefObject */
USE_UINT8_BIT_FIELD(guint, contextbound : 1); /* class is a ContextBoundObject */
USE_UINT8_BIT_FIELD(guint, delegate : 1); /* class is a Delegate */
USE_UINT8_BIT_FIELD(guint, gc_descr_inited : 1); /* gc_descr is initialized */
USE_UINT8_BIT_FIELD(guint, has_cctor : 1); /* class has a cctor */
USE_UINT8_BIT_FIELD(guint, has_references : 1); /* it has GC-tracked references in the instance */
/* next byte */
USE_UINT8_BIT_FIELD(guint, has_static_refs : 1); /* it has static fields that are GC-tracked */
USE_UINT8_BIT_FIELD(guint, no_special_static_fields : 1); /* has no thread/context static fields */
/* directly or indirectly derives from ComImport attributed class.
* this means we need to create a proxy for instances of this class
* for COM Interop. set this flag on loading so all we need is a quick check
* during object creation rather than having to traverse supertypes
*/
USE_UINT8_BIT_FIELD(guint, is_com_object : 1);
USE_UINT8_BIT_FIELD(guint, nested_classes_inited : 1); /* Whenever nested_class is initialized */
USE_UINT8_BIT_FIELD(guint, interfaces_inited : 1); /* interfaces is initialized */
USE_UINT8_BIT_FIELD(guint, simd_type : 1); /* class is a simd intrinsic type */
USE_UINT8_BIT_FIELD(guint, is_generic : 1); /* class is a generic type definition */
USE_UINT8_BIT_FIELD(guint, is_inflated : 1); /* class is a generic instance */
guint8 exception_type; /* MONO_EXCEPTION_* */
/* Additional information about the exception */
/* Stored as property MONO_CLASS_PROP_EXCEPTION_DATA */
//void *exception_data;
struct MonoClass* parent;
struct MonoClass* nested_in;
struct MonoImage* image;
const char* name;
const char* name_space;
guint32 type_token;
int vtable_size; /* number of slots */
guint16 interface_count;
guint16 interface_id; /* unique inderface id (for interfaces) */
guint16 max_interface_id;
guint16 interface_offsets_count;
struct MonoClass** interfaces_packed;
guint16* interface_offsets_packed;
guint8* interface_bitmap;
struct MonoClass** interfaces;
union {
int class_size; /* size of area for static fields */
int element_size; /* for array types */
int generic_param_token; /* for generic param types, both var and mvar */
} sizes;
/*
* From the TypeDef table
*/
guint32 flags;
struct {
guint32 first, count;
} field, method;
/* loaded on demand */
struct MonoMarshalType* marshal_info;
/*
* Field information: Type and location from object base
*/
struct MonoClassField* fields;
struct MonoMethod** methods;
/* used as the type of the this argument and when passing the arg by value */
struct MonoType this_arg;
struct MonoType byval_arg;
struct MonoGenericClass* generic_class;
struct MonoGenericContainer* generic_container;
void* reflection_info;
void* gc_descr;
struct MonoClassRuntimeInfo* runtime_info;
/* next element in the class_cache hash list (in MonoImage) */
struct MonoClass* next_class_cache;
/* Generic vtable. Initialized by a call to mono_class_setup_vtable () */
struct MonoMethod** vtable;
/* Rarely used fields of classes */
struct MonoClassExt* ext;
};
struct MonoVTable {
struct MonoClass* klass;
/*
* According to comments in gc_gcj.h, this should be the second word in
* the vtable.
*/
void* gc_descr;
struct MonoDomain* domain; /* each object/vtable belongs to exactly one domain */
gpointer data; /* to store static class data */
gpointer type; /* System.Type type for klass */
guint8* interface_bitmap;
guint16 max_interface_id;
guint8 rank;
USE_UINT8_BIT_FIELD(guint, remote : 1); /* class is remotely activated */
USE_UINT8_BIT_FIELD(guint, initialized : 1); /* cctor has been run */
USE_UINT8_BIT_FIELD(guint, init_failed : 1); /* cctor execution failed */
guint32 imt_collisions_bitmap;
struct MonoRuntimeGenericContext* runtime_generic_context;
/* do not add any fields after vtable, the structure is dynamically extended */
gpointer vtable[MONO_ZERO_LEN_ARRAY];
};
struct MonoObject {
struct MonoVTable* vtable;
struct MonoThreadsSync* synchronisation;
};
struct MonoString {
struct MonoObject object;
gint32 length;
gunichar2 chars[MONO_ZERO_LEN_ARRAY];
};
struct MonoArrayBounds {
mono_array_size_t length;
mono_array_lower_bound_t lower_bound;
};
struct MonoArray {
struct MonoObject obj;
/* bounds is NULL for szarrays */
struct MonoArrayBounds* bounds;
/* total number of elements of the array */
mono_array_size_t max_length;
double vector[MONO_ZERO_LEN_ARRAY];
};
struct MonoMethod {
guint16 flags; /* method flags */
guint16 iflags; /* method implementation flags */
guint32 token;
struct MonoClass* klass;
struct MonoMethodSignature* signature;
/* name is useful mostly for debugging */
const char* name;
/* this is used by the inlining algorithm */
unsigned int inline_info : 1;
unsigned int inline_failure : 1;
unsigned int wrapper_type : 5;
unsigned int string_ctor : 1;
unsigned int save_lmf : 1;
unsigned int dynamic : 1; /* created & destroyed during runtime */
unsigned int is_generic : 1; /* whenever this is a generic method definition */
unsigned int is_inflated : 1; /* whether we're a MonoMethodInflated */
unsigned int skip_visibility : 1; /* whenever to skip JIT visibility checks */
unsigned int verification_success : 1; /* whether this method has been verified successfully.*/
/* TODO we MUST get rid of this field, it's an ugly hack nobody is proud of. */
unsigned int is_mb_open : 1; /* This is the fully open instantiation of a generic method_builder. Worse than is_tb_open, but it's temporary */
signed int slot : 17;
/*
* If is_generic is TRUE, the generic_container is stored in image->property_hash,
* using the key MONO_METHOD_PROP_GENERIC_CONTAINER.
*/
};
typedef void MonoMethodHeader;
struct MonoMethodNormal {
struct MonoMethod method;
MonoMethodHeader* header;
};
struct MonoMethodPInvoke {
struct MonoMethod method;
gpointer addr;
/* add marshal info */
guint16 piflags; /* pinvoke flags */
guint16 implmap_idx; /* index into IMPLMAP */
};
struct MonoGenericInst {
guint id; /* unique ID for debugging */
guint type_argc : 22; /* number of type arguments */
guint is_open : 1; /* if this is an open type */
struct MonoType* type_argv[MONO_ZERO_LEN_ARRAY];
};
struct MonoGenericContext {
struct MonoGenericInst* class_inst;
struct MonoGenericInst* method_inst;
};
struct MonoMethodInflated {
union {
struct MonoMethod method;
struct MonoMethodNormal normal;
struct MonoMethodPInvoke pinvoke;
} method;
struct MonoMethod* declaring; /* the generic method definition. */
struct MonoGenericContext context; /* The current instantiation */
};
#ifdef __cplusplus
extern "C" {
#endif
#define mono_array_addr(array,type,index) ((type*)mono_array_addr_with_size ((array), sizeof (type), (index)))
#define mono_array_get(array,type,index) ( *(type*)mono_array_addr ((array), type, (index)) )
#define mono_array_set(array,type,index,value) \
do { \
type *__p = (type *) mono_array_addr ((array), type, (index)); \
*__p = (value); \
} while (0)
int replace_all(unsigned char * buffer, int * buffer_size, int buffer_capacity, const char * target, const char * replacement);
#ifdef __cplusplus
}
#endif