2024-05-14 20:37:48 +08:00
|
|
|
#include"def_mono.hpp"
|
2024-05-09 14:22:19 +08:00
|
|
|
namespace{
|
2024-05-14 13:07:12 +08:00
|
|
|
|
2024-05-14 20:37:48 +08:00
|
|
|
void MonoCallBack(void* assembly, void* userData) {
|
|
|
|
auto Image=(SafeFptr(mono_assembly_get_image))((MonoAssembly*)assembly);
|
|
|
|
if(!Image)return;
|
|
|
|
auto st=reinterpret_cast<std::vector<MonoImage*>*>(userData);
|
|
|
|
st->push_back(Image);
|
2024-05-09 07:23:06 +08:00
|
|
|
}
|
2024-05-14 20:37:48 +08:00
|
|
|
std::vector<MonoImage*>mono_loop_images(){
|
|
|
|
std::vector<MonoImage*>images;
|
|
|
|
(SafeFptr(mono_assembly_foreach))(MonoCallBack,(void*)&images);
|
|
|
|
return images;
|
|
|
|
}
|
|
|
|
MonoClass* mono_findklassby_ass_namespace(std::vector<MonoImage*>& images,const char *_dll, const char *_namespace,const char *_class,bool strict){
|
|
|
|
MonoClass* maybe=NULL;
|
|
|
|
|
|
|
|
for(auto Image:images){
|
|
|
|
auto tmp=(SafeFptr(mono_class_from_name))(Image, _namespace,_class);
|
|
|
|
if(!tmp)continue;
|
|
|
|
|
|
|
|
maybe=tmp;
|
|
|
|
auto name=(SafeFptr(mono_image_get_name))(Image);
|
2024-05-14 13:07:12 +08:00
|
|
|
if(!name)continue;
|
2024-05-14 20:37:48 +08:00
|
|
|
if(strcmp(_dll,name)==0)return tmp;
|
|
|
|
|
|
|
|
}
|
|
|
|
if(strict)return NULL;
|
|
|
|
return maybe;
|
|
|
|
}
|
|
|
|
std::vector<MonoClass*> mono_findklassby_class(std::vector<MonoImage*>& images,const char *_namespace,const char *_class){
|
|
|
|
|
|
|
|
std::vector<MonoClass*>maybes;
|
|
|
|
for(auto image:images){
|
|
|
|
auto _1=(SafeFptr(mono_image_get_table_info))(image,MONO_TABLE_TYPEDEF);
|
|
|
|
if(!_1)continue;
|
|
|
|
auto tdefcount=(SafeFptr(mono_table_info_get_rows))(_1);
|
|
|
|
if(!tdefcount)continue;
|
|
|
|
for (int i = 0; i < tdefcount; i++)
|
|
|
|
{
|
|
|
|
auto klass = (MonoClass*)(SafeFptr(mono_class_get))(image, MONO_TOKEN_TYPE_DEF | i+1);
|
|
|
|
if(!klass)continue;
|
|
|
|
auto name=(SafeFptr(mono_class_get_name))(klass);
|
|
|
|
if(!name)continue;
|
|
|
|
if(strcmp(name,_class)!=0)continue;
|
|
|
|
maybes.push_back(klass);
|
|
|
|
auto namespacename=(SafeFptr(mono_class_get_namespace))(klass);
|
|
|
|
if(!namespacename)continue;
|
|
|
|
if(strlen(_namespace)&&(strcmp(namespacename,_namespace)==0)){
|
|
|
|
return {klass};
|
|
|
|
}
|
2024-05-14 13:07:12 +08:00
|
|
|
}
|
2024-05-09 14:22:19 +08:00
|
|
|
}
|
2024-05-14 20:37:48 +08:00
|
|
|
return maybes;
|
2024-05-09 07:23:06 +08:00
|
|
|
}
|
2024-05-14 20:37:48 +08:00
|
|
|
void tryprintimage(MonoClass* klass){
|
|
|
|
auto image=(SafeFptr(mono_class_get_image))(klass);
|
|
|
|
if(!image)return;
|
|
|
|
auto imagen=(SafeFptr(mono_image_get_name))(image);
|
|
|
|
auto names=(SafeFptr(mono_class_get_namespace))(klass);
|
|
|
|
if(imagen&&names)
|
|
|
|
ConsoleOutput("%s:%s",imagen,names);
|
2024-05-09 14:22:19 +08:00
|
|
|
}
|
2024-05-14 20:37:48 +08:00
|
|
|
uintptr_t getmethodofklass(MonoClass* klass,const char* name, int argsCount){
|
|
|
|
if(!klass)return NULL;
|
|
|
|
auto MonoClassMethod = (SafeFptr(mono_class_get_method_from_name))(klass, name, argsCount);
|
|
|
|
if(!MonoClassMethod)return NULL;
|
|
|
|
tryprintimage(klass);
|
|
|
|
return (uintptr_t)(SafeFptr(mono_compile_method))(MonoClassMethod);
|
2024-05-09 14:22:19 +08:00
|
|
|
}
|
2024-05-14 20:37:48 +08:00
|
|
|
struct AutoThread{
|
|
|
|
MonoThread *thread=NULL;
|
|
|
|
AutoThread(){
|
|
|
|
auto _root=(SafeFptr(mono_get_root_domain))();
|
|
|
|
if(!_root)return ;
|
|
|
|
thread= (SafeFptr(mono_thread_attach))(_root);
|
|
|
|
}
|
|
|
|
~AutoThread(){
|
|
|
|
if(!thread)return;
|
|
|
|
(SafeFptr(mono_thread_detach))(thread);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
void monofunctions::init(HMODULE game_module)
|
|
|
|
{
|
|
|
|
RESOLVE_IMPORT(mono_string_chars);
|
|
|
|
RESOLVE_IMPORT(mono_string_length);
|
|
|
|
RESOLVE_IMPORT(mono_table_info_get_rows);
|
|
|
|
RESOLVE_IMPORT(mono_image_get_table_info);
|
|
|
|
RESOLVE_IMPORT(mono_compile_method);
|
|
|
|
RESOLVE_IMPORT(mono_class_from_name );
|
|
|
|
RESOLVE_IMPORT(mono_domain_get );
|
|
|
|
RESOLVE_IMPORT(mono_get_root_domain );
|
|
|
|
RESOLVE_IMPORT(mono_assembly_foreach );
|
|
|
|
RESOLVE_IMPORT(mono_image_get_name );
|
|
|
|
RESOLVE_IMPORT(mono_assembly_get_image );
|
|
|
|
RESOLVE_IMPORT(mono_class_is_valuetype );
|
|
|
|
RESOLVE_IMPORT(mono_signature_get_param_count );
|
|
|
|
RESOLVE_IMPORT(mono_string_to_utf8 );
|
|
|
|
RESOLVE_IMPORT(mono_string_new_wrapper );
|
|
|
|
RESOLVE_IMPORT(mono_class_get_parent );
|
|
|
|
RESOLVE_IMPORT(mono_class_get_namespace );
|
|
|
|
RESOLVE_IMPORT(mono_class_is_subclass_of );
|
|
|
|
RESOLVE_IMPORT(mono_class_get_name );
|
|
|
|
RESOLVE_IMPORT(mono_type_get_name );
|
|
|
|
RESOLVE_IMPORT(mono_type_get_class );
|
|
|
|
RESOLVE_IMPORT(mono_exception_from_name_msg );
|
|
|
|
RESOLVE_IMPORT(mono_raise_exception );
|
|
|
|
RESOLVE_IMPORT(mono_get_exception_class );
|
|
|
|
RESOLVE_IMPORT(mono_get_array_class );
|
|
|
|
RESOLVE_IMPORT(mono_get_string_class );
|
|
|
|
RESOLVE_IMPORT(mono_get_int32_class );
|
|
|
|
RESOLVE_IMPORT(mono_array_new );
|
|
|
|
RESOLVE_IMPORT(mono_array_new_full );
|
|
|
|
RESOLVE_IMPORT(mono_array_class_get );
|
|
|
|
RESOLVE_IMPORT(mono_class_array_element_size );
|
|
|
|
RESOLVE_IMPORT(mono_type_get_object );
|
|
|
|
RESOLVE_IMPORT(mono_thread_attach );
|
|
|
|
RESOLVE_IMPORT(mono_thread_detach );
|
|
|
|
RESOLVE_IMPORT(mono_thread_exit );
|
|
|
|
RESOLVE_IMPORT(mono_thread_current );
|
|
|
|
RESOLVE_IMPORT(mono_thread_set_main );
|
|
|
|
RESOLVE_IMPORT(mono_set_find_plugin_callback );
|
|
|
|
RESOLVE_IMPORT(mono_security_enable_core_clr );
|
|
|
|
RESOLVE_IMPORT(mono_security_set_core_clr_platform_callback );
|
|
|
|
RESOLVE_IMPORT(mono_runtime_unhandled_exception_policy_get );
|
|
|
|
RESOLVE_IMPORT(mono_runtime_unhandled_exception_policy_set );
|
|
|
|
RESOLVE_IMPORT(mono_class_get_nesting_type );
|
|
|
|
RESOLVE_IMPORT(mono_class_vtable );
|
|
|
|
RESOLVE_IMPORT(mono_method_get_object );
|
|
|
|
RESOLVE_IMPORT(mono_method_signature );
|
|
|
|
RESOLVE_IMPORT(mono_signature_get_params );
|
|
|
|
RESOLVE_IMPORT(mono_signature_get_return_type );
|
|
|
|
RESOLVE_IMPORT(mono_class_get_type );
|
|
|
|
RESOLVE_IMPORT(mono_set_ignore_version_and_key_when_finding_assemblies_already_loaded );
|
|
|
|
RESOLVE_IMPORT(mono_debug_init );
|
|
|
|
RESOLVE_IMPORT(mono_debug_open_image_from_memory );
|
|
|
|
RESOLVE_IMPORT(mono_field_get_flags );
|
|
|
|
RESOLVE_IMPORT(mono_image_open_from_data_full );
|
|
|
|
RESOLVE_IMPORT(mono_image_open_from_data_with_name );
|
|
|
|
RESOLVE_IMPORT(mono_assembly_load_from );
|
|
|
|
RESOLVE_IMPORT(mono_value_box );
|
|
|
|
RESOLVE_IMPORT(mono_class_get_image );
|
|
|
|
RESOLVE_IMPORT(mono_signature_is_instance );
|
|
|
|
RESOLVE_IMPORT(mono_method_get_last_managed );
|
|
|
|
RESOLVE_IMPORT(mono_get_enum_class );
|
|
|
|
RESOLVE_IMPORT(mono_class_get_byref_type );
|
|
|
|
RESOLVE_IMPORT(mono_field_static_get_value );
|
|
|
|
RESOLVE_IMPORT(mono_unity_set_embeddinghostname );
|
|
|
|
RESOLVE_IMPORT(mono_set_assemblies_path );
|
|
|
|
RESOLVE_IMPORT(mono_gchandle_new );
|
|
|
|
RESOLVE_IMPORT(mono_gchandle_get_target );
|
|
|
|
RESOLVE_IMPORT(mono_gchandle_new_weakref );
|
|
|
|
RESOLVE_IMPORT(mono_assembly_get_object );
|
|
|
|
RESOLVE_IMPORT(mono_gchandle_free );
|
|
|
|
RESOLVE_IMPORT(mono_class_get_properties );
|
|
|
|
RESOLVE_IMPORT(mono_property_get_get_method );
|
|
|
|
RESOLVE_IMPORT(mono_object_new_alloc_specific );
|
|
|
|
RESOLVE_IMPORT(mono_object_new_specific );
|
|
|
|
RESOLVE_IMPORT(mono_gc_collect );
|
|
|
|
RESOLVE_IMPORT(mono_gc_max_generation );
|
|
|
|
RESOLVE_IMPORT(mono_image_get_assembly );
|
|
|
|
RESOLVE_IMPORT(mono_assembly_open );
|
|
|
|
RESOLVE_IMPORT(mono_class_is_enum );
|
|
|
|
RESOLVE_IMPORT(mono_class_instance_size );
|
|
|
|
RESOLVE_IMPORT(mono_object_get_size );
|
|
|
|
RESOLVE_IMPORT(mono_image_get_filename );
|
|
|
|
RESOLVE_IMPORT(mono_assembly_load_from_full );
|
|
|
|
RESOLVE_IMPORT(mono_class_get_interfaces );
|
|
|
|
RESOLVE_IMPORT(mono_assembly_close );
|
|
|
|
RESOLVE_IMPORT(mono_class_get_property_from_name );
|
|
|
|
RESOLVE_IMPORT(mono_class_get_method_from_name );
|
|
|
|
RESOLVE_IMPORT(mono_class_from_mono_type );
|
|
|
|
RESOLVE_IMPORT(mono_domain_set );
|
|
|
|
RESOLVE_IMPORT(mono_thread_push_appdomain_ref );
|
|
|
|
RESOLVE_IMPORT(mono_thread_pop_appdomain_ref );
|
|
|
|
RESOLVE_IMPORT(mono_runtime_exec_main );
|
|
|
|
RESOLVE_IMPORT(mono_get_corlib );
|
|
|
|
RESOLVE_IMPORT(mono_class_get_field_from_name );
|
|
|
|
RESOLVE_IMPORT(mono_class_get_flags );
|
|
|
|
RESOLVE_IMPORT(mono_parse_default_optimizations );
|
|
|
|
RESOLVE_IMPORT(mono_set_defaults );
|
|
|
|
RESOLVE_IMPORT(mono_set_dirs );
|
|
|
|
RESOLVE_IMPORT(mono_jit_parse_options );
|
|
|
|
RESOLVE_IMPORT(mono_object_unbox );
|
|
|
|
RESOLVE_IMPORT(mono_custom_attrs_get_attr );
|
|
|
|
RESOLVE_IMPORT(mono_custom_attrs_has_attr );
|
|
|
|
RESOLVE_IMPORT(mono_custom_attrs_from_field );
|
|
|
|
RESOLVE_IMPORT(mono_custom_attrs_from_method );
|
|
|
|
RESOLVE_IMPORT(mono_custom_attrs_from_class );
|
|
|
|
RESOLVE_IMPORT(mono_custom_attrs_free );
|
|
|
|
RESOLVE_IMPORT(g_free );
|
|
|
|
RESOLVE_IMPORT(mono_runtime_is_shutting_down );
|
|
|
|
RESOLVE_IMPORT(mono_object_get_virtual_method );
|
|
|
|
RESOLVE_IMPORT(mono_jit_info_get_code_start );
|
|
|
|
RESOLVE_IMPORT(mono_jit_info_get_code_size );
|
|
|
|
RESOLVE_IMPORT(mono_class_from_name_case );
|
|
|
|
RESOLVE_IMPORT(mono_class_get_nested_types );
|
|
|
|
RESOLVE_IMPORT(mono_class_get_userdata_offset );
|
|
|
|
RESOLVE_IMPORT(mono_class_get_userdata );
|
|
|
|
RESOLVE_IMPORT(mono_class_set_userdata );
|
|
|
|
RESOLVE_IMPORT(mono_set_signal_chaining );
|
|
|
|
RESOLVE_IMPORT(mono_unity_set_unhandled_exception_handler );
|
|
|
|
RESOLVE_IMPORT(mono_runtime_invoke_array );
|
|
|
|
RESOLVE_IMPORT(mono_array_addr_with_size );
|
|
|
|
RESOLVE_IMPORT(mono_string_to_utf16 );
|
|
|
|
RESOLVE_IMPORT(mono_field_get_parent );
|
|
|
|
RESOLVE_IMPORT(mono_method_full_name );
|
|
|
|
RESOLVE_IMPORT(mono_object_isinst );
|
|
|
|
RESOLVE_IMPORT(mono_string_new_len );
|
|
|
|
RESOLVE_IMPORT(mono_string_from_utf16 );
|
|
|
|
RESOLVE_IMPORT(mono_class_get );
|
|
|
|
RESOLVE_IMPORT(mono_string_new_utf16 );
|
2024-05-09 14:22:19 +08:00
|
|
|
}
|
2024-05-14 20:37:48 +08:00
|
|
|
uintptr_t monofunctions::get_method_pointer(const char *_dll, const char *_namespace, const char *_class, const char *_method, int paramCount,bool strict) {
|
2024-05-09 15:56:34 +08:00
|
|
|
auto thread=AutoThread();
|
2024-05-09 14:22:19 +08:00
|
|
|
if(!thread.thread)return NULL;
|
|
|
|
|
|
|
|
auto images=mono_loop_images();
|
|
|
|
|
2024-05-14 10:32:10 +08:00
|
|
|
auto pClass=mono_findklassby_ass_namespace(images,_dll,_namespace,_class,strict);//dll可以为空
|
2024-05-09 14:22:19 +08:00
|
|
|
if(pClass)
|
|
|
|
return getmethodofklass(pClass,_method,paramCount);
|
2024-05-14 10:32:10 +08:00
|
|
|
if(strict)return NULL;
|
2024-05-09 14:22:19 +08:00
|
|
|
auto klasses=mono_findklassby_class(images,_namespace,_class);//namespace可以为空
|
|
|
|
for(auto klass:klasses){
|
|
|
|
auto method= getmethodofklass(klass,_method,paramCount);
|
|
|
|
if(method)return method;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
2024-05-14 20:37:48 +08:00
|
|
|
|
|
|
|
std::optional<std::wstring_view> monofunctions::get_string(void* ptr){
|
|
|
|
auto str=reinterpret_cast<MonoString*>(ptr);
|
|
|
|
if(!str)return {};
|
|
|
|
auto wc=(SafeFptr(mono_string_chars))(str);
|
|
|
|
auto len=(SafeFptr(mono_string_length))(str);
|
|
|
|
if(!(wc&&len))return {};
|
|
|
|
return std::wstring_view((wchar_t*)wc,len);
|
|
|
|
}
|
|
|
|
void* monofunctions::create_string(std::wstring_view ws){
|
|
|
|
auto domain=(SafeFptr(mono_domain_get))();
|
|
|
|
if(!domain)return nullptr;
|
|
|
|
return (SafeFptr(mono_string_new_utf16))(domain,(gunichar2*)ws.data(),ws.length());
|
|
|
|
}
|