mirror of
https://github.com/etaHEN/etaHEN.git
synced 2026-01-13 11:38:21 +08:00
392 lines
12 KiB
C
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 |