22 #include "../config.h"
24 #include "RMonoAPI_Def.h"
26 #include "mono/metadata/blob.h"
27 #include "mono/metadata/row-indexes.h"
28 #include "mono/metadata/tabledefs.h"
33 #define REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(apiname) \
35 apid->apply([&](auto& e) { \
36 checkAPIFunctionSupported(e.api.apiname); \
66 static bool versionPrinted =
false;
68 if (!versionPrinted) {
69 RMonoLogInfo(
"RemoteMono version %u.%u.%u", REMOTEMONO_VERSION_MAJOR, REMOTEMONO_VERSION_MINOR, REMOTEMONO_VERSION_PATCH);
70 versionPrinted =
true;
73 RemoteExec& rem = process.remote();
75 rem.CreateRPCEnvironment(Worker_CreateNew,
true);
77 worker = rem.getWorker();
81 apid->apply([&](
auto& e) {
82 e.api.injectAPI(
this, process, worker);
87 rootDomain = getRootDomain();
89 monoThread = threadAttach(rootDomain);
99 rmono_gchandle monoThreadGchandle = *monoThread;
102 size_t numRegisteredHandles = registeredHandles.size();
104 if (numRegisteredHandles > 1) {
105 RMonoLogDebug(
"%llu RemoteMonoHandles still reachable when detaching. Will force-delete them now.",
106 (
long long unsigned) (numRegisteredHandles-1));
110 backend->forceDelete();
112 registeredHandles.clear();
114 threadDetach(monoThread);
120 gchandleFree(monoThreadGchandle);
123 apid->apply([&](
auto& e) {
139 return apid->apply([&](
auto& e) {
140 return e.api.isAPIFunctionSupported(name);
145 void RMonoAPI::selectABI()
148 GetNativeSystemInfo(&sysinfo);
152 if (sysinfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) {
155 x64 = !process.core().isWow64();
158 apid->foreach([&](
auto& e) {
159 typedef decltype(e.abi) ABI;
160 if (x64 && sizeof(typename ABI::irmono_voidp) == 8) {
162 }
else if (!x64 &&
sizeof(
typename ABI::irmono_voidp) == 4) {
169 apid->apply([&](
auto& e) {
170 RMonoLogDebug(
"Using Mono ABI: %s",
typeid(e.abi).name());
175 template <
typename ABI>
176 blackbone::MemBlock RMonoAPI::prepareIterator()
178 blackbone::MemBlock rIter = std::move(process.memory().Allocate(
sizeof(
typename ABI::irmono_voidp), PAGE_READWRITE).result());
179 typename ABI::irmono_voidp nullPtr = 0;
180 rIter.Write(0,
sizeof(
typename ABI::irmono_voidp), &nullPtr);
181 return std::move(rIter);
185 void RMonoAPI::checkAttached()
188 throw RMonoException(
"RMonoAPI is not attached.");
193 template <
typename FuncT>
194 void RMonoAPI::checkAPIFunctionSupported(
const FuncT& f)
197 throw RMonoUnsupportedAPIException(f.getName());
219 void RMonoAPI::free(rmono_voidp p)
223 apid->apply([&](
auto& e) {
225 e.api.free(e.abi.p2i_rmono_voidp(p));
226 }
else if (e.api.g_free) {
227 e.api.g_free(e.abi.p2i_rmono_voidp(p));
229 throw RMonoUnsupportedAPIException(
"mono_free");
236 RMonoDomainPtr RMonoAPI::jitInit(
const std::string_view& filename)
239 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(jit_init);
241 return apid->apply([&](
auto& e) {
242 return e.abi.i2p_RMonoDomainPtr(e.api.jit_init(filename));
247 void RMonoAPI::jitCleanup(RMonoDomainPtr domain)
250 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(jit_cleanup);
252 apid->apply([&](
auto& e) {
253 e.api.jit_cleanup(e.abi.p2i_RMonoDomainPtr(domain));
259 RMonoDomainPtr RMonoAPI::getRootDomain()
262 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(get_root_domain);
264 return apid->apply([&](
auto& e) {
265 return e.abi.i2p_RMonoDomainPtr(e.api.get_root_domain());
270 bool RMonoAPI::domainSet(RMonoDomainPtr domain,
bool force)
273 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(domain_set);
275 return (
bool) apid->apply([&](
auto& e) {
276 return e.abi.i2p_rmono_bool(e.api.domain_set(e.abi.p2i_RMonoDomainPtr(domain), e.abi.p2i_rmono_bool(force ? 1 : 0)));
281 RMonoDomainPtr RMonoAPI::domainGet()
284 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(domain_get);
286 return apid->apply([&](
auto& e) {
287 return e.abi.i2p_RMonoDomainPtr(e.api.domain_get());
292 std::vector<RMonoDomainPtr> RMonoAPI::domainList()
295 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(domain_foreach);
297 std::vector<RMonoDomainPtr> out;
299 apid->apply([&](
auto& e) {
300 typedef decltype(e.abi) ABI;
301 std::vector<typename ABI::IRMonoDomainPtrRaw> iout;
302 e.api.getIPCVector().vectorClear(e.api.getIPCVectorInstance());
303 e.api.domain_foreach(e.abi.p2i_rmono_funcp((rmono_funcp) e.api.rmono_foreach_ipcvec_adapter.getAddress()),
304 e.abi.p2i_rmono_voidp(e.api.getIPCVectorInstance()));
305 e.api.getIPCVector().read(e.api.getIPCVectorInstance(), iout);
306 for (auto p : iout) {
307 out.push_back(e.abi.hi2p_RMonoDomainPtr(p,
this,
false));
315 RMonoDomainPtr RMonoAPI::domainCreateAppdomain(
const std::string_view& friendlyName,
const std::string_view& configFile)
318 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(domain_create_appdomain);
321 return apid->apply([&](
auto& e) {
322 return e.abi.i2p_RMonoDomainPtr(e.api.domain_create_appdomain(friendlyName, configFile));
327 RMonoAssemblyPtr RMonoAPI::domainAssemblyOpen(RMonoDomainPtr domain,
const std::string_view& name)
330 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(domain_assembly_open);
332 return apid->apply([&](
auto& e) {
333 return e.abi.i2p_RMonoAssemblyPtr(e.api.domain_assembly_open(e.abi.p2i_RMonoDomainPtr(domain), name));
338 void RMonoAPI::domainUnload(RMonoDomainPtr domain)
341 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(domain_unload);
343 apid->apply([&](
auto& e) {
344 e.api.domain_unload(e.abi.p2i_RMonoDomainPtr(domain));
349 std::string RMonoAPI::domainGetFriendlyName(RMonoDomainPtr domain)
352 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(domain_get_friendly_name);
354 return apid->apply([&](
auto& e) {
355 return e.api.domain_get_friendly_name(e.abi.p2i_RMonoDomainPtr(domain));
361 RMonoThreadPtr RMonoAPI::threadAttach(RMonoDomainPtr domain)
364 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(thread_attach);
366 return apid->apply([&](
auto& e) {
367 return e.abi.i2p_RMonoThreadPtr(e.api.thread_attach(e.abi.p2i_RMonoDomainPtr(domain)));
372 void RMonoAPI::threadDetach(RMonoThreadPtr thread)
375 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(thread_detach);
377 apid->apply([&](
auto& e) {
378 e.api.thread_detach(e.abi.p2i_RMonoThreadPtr(thread));
384 void RMonoAPI::assemblyClose(RMonoAssemblyPtr assembly)
387 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(assembly_close);
389 apid->apply([&](
auto& e) {
390 e.api.assembly_close(e.abi.p2i_RMonoAssemblyPtr(assembly));
395 std::vector<RMonoAssemblyPtr> RMonoAPI::assemblyList()
398 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(assembly_foreach);
400 std::vector<RMonoAssemblyPtr> out;
402 apid->apply([&](
auto& e) {
403 typedef decltype(e.abi) ABI;
404 std::vector<typename ABI::IRMonoAssemblyPtrRaw> iout;
405 e.api.getIPCVector().vectorClear(e.api.getIPCVectorInstance());
406 e.api.assembly_foreach(e.abi.p2i_rmono_funcp((rmono_funcp) e.api.rmono_foreach_ipcvec_adapter.getAddress()),
407 e.abi.p2i_rmono_voidp(e.api.getIPCVectorInstance()));
408 e.api.getIPCVector().read(e.api.getIPCVectorInstance(), iout);
409 for (auto p : iout) {
410 out.push_back(e.abi.hi2p_RMonoDomainPtr(p,
this,
false));
418 RMonoImagePtr RMonoAPI::assemblyGetImage(RMonoAssemblyPtr assembly)
421 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(assembly_get_image);
423 return apid->apply([&](
auto& e) {
424 return e.abi.i2p_RMonoImagePtr(e.api.assembly_get_image(e.abi.p2i_RMonoAssemblyPtr(assembly)));
429 RMonoAssemblyNamePtr RMonoAPI::assemblyGetName(RMonoAssemblyPtr assembly)
432 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(assembly_get_name);
434 return apid->apply([&](
auto& e) {
435 return e.abi.i2p_RMonoAssemblyNamePtr(e.api.assembly_get_name(e.abi.p2i_RMonoAssemblyPtr(assembly)));
440 RMonoAssemblyNamePtr RMonoAPI::assemblyNameNew(
const std::string_view& name)
445 return apid->apply([&](
auto& e) {
446 if (e.api.assembly_name_new) {
447 return e.abi.i2p_RMonoAssemblyNamePtr(e.api.assembly_name_new(name));
448 }
else if (e.api.assembly_name_parse) {
449 blackbone::MemBlock block = std::move(process.memory().Allocate(256, PAGE_READWRITE, 0, false).result());
450 RMonoAssemblyNamePtr aname((RMonoAssemblyNamePtrRaw) block.ptr(), this, true);
451 if (!assemblyNameParse(name, aname)) {
453 return RMonoAssemblyNamePtr();
457 throw RMonoUnsupportedAPIException(
"assembly_name_new");
463 bool RMonoAPI::assemblyNameParse(
const std::string_view& name, RMonoAssemblyNamePtr aname)
466 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(assembly_name_parse);
468 return apid->apply([&](
auto& e) {
469 return e.abi.i2p_rmono_bool(e.api.assembly_name_parse(name, e.abi.p2i_RMonoAssemblyNamePtr(aname))) != 0;
474 void RMonoAPI::assemblyNameFree(RMonoAssemblyNamePtrRaw name)
477 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(assembly_name_free);
479 apid->apply([&](
auto& e) {
480 e.api.assembly_name_free(e.abi.p2i_RMonoAssemblyNamePtrRaw(name));
485 std::string RMonoAPI::assemblyNameGetName(RMonoAssemblyNamePtr assembly)
488 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(assembly_name_get_name);
490 return apid->apply([&](
auto& e) {
491 return e.api.assembly_name_get_name(e.abi.p2i_RMonoAssemblyNamePtr(assembly));
496 std::string RMonoAPI::assemblyNameGetCulture(RMonoAssemblyNamePtr assembly)
499 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(assembly_name_get_culture);
501 return apid->apply([&](
auto& e) {
502 return e.api.assembly_name_get_culture(e.abi.p2i_RMonoAssemblyNamePtr(assembly));
507 uint16_t RMonoAPI::assemblyNameGetVersion(RMonoAssemblyNamePtr assembly, uint16_t* minor, uint16_t* build, uint16_t* revision)
510 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(assembly_name_get_version);
512 return apid->apply([&](
auto& e) {
513 return e.api.assembly_name_get_version(e.abi.p2i_RMonoAssemblyNamePtr(assembly), minor, build, revision);
518 std::string RMonoAPI::stringifyAssemblyName(RMonoAssemblyNamePtr assembly)
521 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(stringify_assembly_name);
523 return apid->apply([&](
auto& e) {
524 return e.api.stringify_assembly_name(e.abi.p2i_RMonoAssemblyNamePtr(assembly));
529 std::string RMonoAPI::assemblyNameStringify(RMonoAssemblyNamePtr assembly)
531 return stringifyAssemblyName(assembly);
535 RMonoAssemblyPtr RMonoAPI::assemblyLoaded(RMonoAssemblyNamePtr name)
538 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(assembly_loaded);
540 return apid->apply([&](
auto& e) {
541 return e.abi.i2p_RMonoAssemblyPtr(e.api.assembly_loaded(e.abi.p2i_RMonoAssemblyNamePtr(name)));
546 RMonoAssemblyPtr RMonoAPI::assemblyLoaded(
const std::string_view& name)
548 return assemblyLoaded(assemblyNameNew(name));
553 std::string RMonoAPI::imageGetName(RMonoImagePtr image)
556 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(image_get_name);
558 return apid->apply([&](
auto& e) {
559 return e.api.image_get_name(e.abi.p2i_RMonoImagePtr(image));
564 std::string RMonoAPI::imageGetFilename(RMonoImagePtr image)
567 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(image_get_filename);
569 return apid->apply([&](
auto& e) {
570 return e.api.image_get_filename(e.abi.p2i_RMonoImagePtr(image));
575 RMonoTableInfoPtr RMonoAPI::imageGetTableInfo(RMonoImagePtr image, rmono_int tableID)
578 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(image_get_table_info);
580 return apid->apply([&](
auto& e) {
581 return e.abi.i2p_RMonoTableInfoPtr(e.api.image_get_table_info(e.abi.p2i_RMonoImagePtr(image), e.abi.p2i_rmono_int(tableID)));
586 rmono_int RMonoAPI::tableInfoGetRows(RMonoTableInfoPtr table)
589 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(table_info_get_rows);
591 return apid->apply([&](
auto& e) {
592 return e.abi.i2p_rmono_int(e.api.table_info_get_rows(e.abi.p2i_RMonoTableInfoPtr(table)));
597 rmono_voidp RMonoAPI::imageRVAMap(RMonoImagePtr image, uint32_t addr)
600 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(image_rva_map);
602 return apid->apply([&](
auto& e) {
603 return e.abi.i2p_rmono_voidp(e.api.image_rva_map(e.abi.p2i_RMonoImagePtr(image), addr));
609 uint32_t RMonoAPI::metadataDecodeRowCol(RMonoTableInfoPtr table, rmono_int idx, rmono_uint col)
612 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(metadata_decode_row_col);
614 return apid->apply([&](
auto& e) {
615 return e.api.metadata_decode_row_col(e.abi.p2i_RMonoTableInfoPtr(table), e.abi.p2i_rmono_int(idx), e.abi.p2i_rmono_uint(col));
620 rmono_voidp RMonoAPI::metadataGuidHeap(RMonoImagePtr image, uint32_t idx, uint8_t* outGuid)
623 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(metadata_guid_heap);
625 rmono_voidp p = apid->apply([&](
auto& e) {
626 return e.abi.i2p_rmono_voidp(e.api.metadata_guid_heap(e.abi.p2i_RMonoImagePtr(image), idx));
630 process.memory().Read((blackbone::ptr_t) p, 16, outGuid);
637 std::string RMonoAPI::metadataStringHeap(RMonoImagePtr image, uint32_t idx)
640 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(metadata_string_heap);
642 return apid->apply([&](
auto& e) {
643 return e.api.metadata_string_heap(e.abi.p2i_RMonoImagePtr(image), idx);
648 rmono_voidp RMonoAPI::metadataStringHeapRaw(RMonoImagePtr image, uint32_t idx)
651 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(metadata_string_heap);
653 return apid->apply([&](
auto& e) {
654 return e.abi.i2p_rmono_voidp(e.api.metadata_string_heap.invokeRaw(e.abi.p2i_RMonoImagePtrRaw(*image), idx));
659 rmono_voidp RMonoAPI::metadataBlobHeap(RMonoImagePtr image, uint32_t idx)
662 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(metadata_blob_heap);
664 return apid->apply([&](
auto& e) {
665 return e.abi.i2p_rmono_voidp(e.api.metadata_blob_heap(e.abi.p2i_RMonoImagePtr(image), idx));
670 std::string RMonoAPI::metadataUserString(RMonoImagePtr image, uint32_t idx)
673 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(metadata_user_string);
675 return apid->apply([&](
auto& e) {
676 return e.api.metadata_user_string(e.abi.p2i_RMonoImagePtr(image), idx);
681 rmono_voidp RMonoAPI::metadataUserStringRaw(RMonoImagePtr image, uint32_t idx)
684 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(metadata_user_string);
686 return apid->apply([&](
auto& e) {
687 return e.abi.i2p_rmono_voidp(e.api.metadata_user_string.invokeRaw(e.abi.p2i_RMonoImagePtrRaw(*image), idx));
692 uint32_t RMonoAPI::metadataDecodeBlobSize(rmono_voidp blobPtr, rmono_voidp* outBlobPtr)
695 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(metadata_decode_blob_size);
697 return apid->apply([&](
auto& e) {
698 typedef typename decltype(e.abi)::irmono_voidp irmono_voidp;
701 uint32_t size = e.api.metadata_decode_blob_size(e.abi.p2i_rmono_voidp(blobPtr), &ip);
703 *outBlobPtr = e.abi.i2p_rmono_voidp(ip);
710 RMonoClassPtr RMonoAPI::getObjectClass()
713 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(get_object_class);
715 return apid->apply([&](
auto& e) {
716 return e.abi.i2p_RMonoClassPtr(e.api.get_object_class());
721 RMonoClassPtr RMonoAPI::getInt16Class()
724 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(get_int16_class);
726 return apid->apply([&](
auto& e) {
727 return e.abi.i2p_RMonoClassPtr(e.api.get_int16_class());
732 RMonoClassPtr RMonoAPI::getInt32Class()
735 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(get_int32_class);
737 return apid->apply([&](
auto& e) {
738 return e.abi.i2p_RMonoClassPtr(e.api.get_int32_class());
743 RMonoClassPtr RMonoAPI::getInt64Class()
746 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(get_int64_class);
748 return apid->apply([&](
auto& e) {
749 return e.abi.i2p_RMonoClassPtr(e.api.get_int64_class());
754 RMonoClassPtr RMonoAPI::getDoubleClass()
757 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(get_double_class);
759 return apid->apply([&](
auto& e) {
760 return e.abi.i2p_RMonoClassPtr(e.api.get_double_class());
765 RMonoClassPtr RMonoAPI::getSingleClass()
768 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(get_single_class);
770 return apid->apply([&](
auto& e) {
771 return e.abi.i2p_RMonoClassPtr(e.api.get_single_class());
776 RMonoClassPtr RMonoAPI::getStringClass()
779 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(get_string_class);
781 return apid->apply([&](
auto& e) {
782 return e.abi.i2p_RMonoClassPtr(e.api.get_string_class());
787 RMonoClassPtr RMonoAPI::getThreadClass()
790 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(get_thread_class);
792 return apid->apply([&](
auto& e) {
793 return e.abi.i2p_RMonoClassPtr(e.api.get_thread_class());
798 RMonoClassPtr RMonoAPI::getUInt16Class()
801 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(get_uint16_class);
803 return apid->apply([&](
auto& e) {
804 return e.abi.i2p_RMonoClassPtr(e.api.get_uint16_class());
809 RMonoClassPtr RMonoAPI::getUInt32Class()
812 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(get_uint32_class);
814 return apid->apply([&](
auto& e) {
815 return e.abi.i2p_RMonoClassPtr(e.api.get_uint32_class());
820 RMonoClassPtr RMonoAPI::getUInt64Class()
823 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(get_uint64_class);
825 return apid->apply([&](
auto& e) {
826 return e.abi.i2p_RMonoClassPtr(e.api.get_uint64_class());
831 RMonoClassPtr RMonoAPI::getVoidClass()
834 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(get_void_class);
836 return apid->apply([&](
auto& e) {
837 return e.abi.i2p_RMonoClassPtr(e.api.get_void_class());
842 RMonoClassPtr RMonoAPI::getArrayClass()
845 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(get_array_class);
847 return apid->apply([&](
auto& e) {
848 return e.abi.i2p_RMonoClassPtr(e.api.get_array_class());
853 RMonoClassPtr RMonoAPI::getBooleanClass()
856 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(get_boolean_class);
858 return apid->apply([&](
auto& e) {
859 return e.abi.i2p_RMonoClassPtr(e.api.get_boolean_class());
864 RMonoClassPtr RMonoAPI::getByteClass()
867 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(get_byte_class);
869 return apid->apply([&](
auto& e) {
870 return e.abi.i2p_RMonoClassPtr(e.api.get_byte_class());
875 RMonoClassPtr RMonoAPI::getSByteClass()
878 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(get_sbyte_class);
880 return apid->apply([&](
auto& e) {
881 return e.abi.i2p_RMonoClassPtr(e.api.get_sbyte_class());
886 RMonoClassPtr RMonoAPI::getCharClass()
889 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(get_char_class);
891 return apid->apply([&](
auto& e) {
892 return e.abi.i2p_RMonoClassPtr(e.api.get_char_class());
897 RMonoClassPtr RMonoAPI::getExceptionClass()
900 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(get_exception_class);
902 return apid->apply([&](
auto& e) {
903 return e.abi.i2p_RMonoClassPtr(e.api.get_exception_class());
909 RMonoVTablePtr RMonoAPI::classVTable(RMonoDomainPtr domain, RMonoClassPtr cls)
912 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(class_vtable);
914 return apid->apply([&](
auto& e) {
915 return e.abi.i2p_RMonoVTablePtr(e.api.class_vtable(e.abi.p2i_RMonoDomainPtr(domain), e.abi.p2i_RMonoClassPtr(cls)));
920 RMonoVTablePtr RMonoAPI::classVTable(RMonoClassPtr cls)
922 return classVTable(domainGet(), cls);
926 void RMonoAPI::runtimeClassInit(RMonoVTablePtr vtable)
929 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(runtime_class_init);
931 apid->apply([&](
auto& e) {
932 e.api.runtime_class_init(e.abi.p2i_RMonoVTablePtr(vtable));
937 RMonoClassPtr RMonoAPI::classGetParent(RMonoClassPtr cls)
940 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(class_get_parent);
942 return apid->apply([&](
auto& e) {
943 return e.abi.i2p_RMonoClassPtr(e.api.class_get_parent(e.abi.p2i_RMonoClassPtr(cls)));
948 RMonoTypePtr RMonoAPI::classGetType(RMonoClassPtr cls)
951 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(class_get_type);
953 return apid->apply([&](
auto& e) {
954 return e.abi.i2p_RMonoTypePtr(e.api.class_get_type(e.abi.p2i_RMonoClassPtr(cls)));
959 RMonoClassPtr RMonoAPI::classFromName(RMonoImagePtr image,
const std::string_view& nameSpace,
const std::string_view& name)
962 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(class_from_name);
964 return apid->apply([&](
auto& e) {
965 return e.abi.i2p_RMonoClassPtr(e.api.class_from_name(e.abi.p2i_RMonoImagePtr(image), nameSpace, name));
970 RMonoClassPtr RMonoAPI::classFromMonoType(RMonoTypePtr type)
973 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(class_from_mono_type);
975 return apid->apply([&](
auto& e) {
976 return e.abi.i2p_RMonoClassPtr(e.api.class_from_mono_type(e.abi.p2i_RMonoTypePtr(type)));
981 std::string RMonoAPI::classGetName(RMonoClassPtr cls)
984 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(class_get_name);
986 return apid->apply([&](
auto& e) {
987 return e.api.class_get_name(e.abi.p2i_RMonoClassPtr(cls));
992 std::string RMonoAPI::classGetNamespace(RMonoClassPtr cls)
995 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(class_get_namespace);
997 return apid->apply([&](
auto& e) {
998 return e.api.class_get_namespace(e.abi.p2i_RMonoClassPtr(cls));
1003 std::vector<RMonoClassFieldPtr> RMonoAPI::classGetFields(RMonoClassPtr cls)
1006 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(class_get_fields);
1008 std::vector<RMonoClassFieldPtr> out;
1010 apid->apply([&](
auto& e) {
1011 typedef decltype(e.abi) ABI;
1013 blackbone::MemBlock rIter = prepareIterator<ABI>();
1014 typename ABI::irmono_voidpp iptr = (typename ABI::irmono_voidpp) rIter.ptr();
1016 typename ABI::IRMonoClassFieldPtr field;
1017 typename ABI::IRMonoClassPtr icls = e.abi.p2i_RMonoClassPtr(cls);
1020 field = e.api.class_get_fields(icls, iptr);
1022 out.push_back(e.abi.i2p_RMonoClassFieldPtr(field));
1031 std::vector<RMonoMethodPtr> RMonoAPI::classGetMethods(RMonoClassPtr cls)
1034 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(class_get_methods);
1036 std::vector<RMonoMethodPtr> out;
1038 apid->apply([&](
auto& e) {
1039 typedef decltype(e.abi) ABI;
1041 blackbone::MemBlock rIter = prepareIterator<ABI>();
1042 typename ABI::irmono_voidpp iptr = (typename ABI::irmono_voidpp) rIter.ptr();
1044 typename ABI::IRMonoMethodPtr method;
1045 typename ABI::IRMonoClassPtr icls = e.abi.p2i_RMonoClassPtr(cls);
1048 method = e.api.class_get_methods(icls, iptr);
1050 out.push_back(e.abi.i2p_RMonoMethodPtr(method));
1059 std::vector<RMonoPropertyPtr> RMonoAPI::classGetProperties(RMonoClassPtr cls)
1062 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(class_get_properties);
1064 std::vector<RMonoPropertyPtr> out;
1066 apid->apply([&](
auto& e) {
1067 typedef decltype(e.abi) ABI;
1069 blackbone::MemBlock rIter = prepareIterator<ABI>();
1070 typename ABI::irmono_voidpp iptr = (typename ABI::irmono_voidpp) rIter.ptr();
1072 typename ABI::IRMonoPropertyPtr prop;
1073 typename ABI::IRMonoClassPtr icls = e.abi.p2i_RMonoClassPtr(cls);
1076 prop = e.api.class_get_properties(icls, iptr);
1078 out.push_back(e.abi.i2p_RMonoPropertyPtr(prop));
1087 RMonoClassFieldPtr RMonoAPI::classGetFieldFromName(RMonoClassPtr cls,
const std::string_view& name)
1090 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(class_get_field_from_name);
1092 return apid->apply([&](
auto& e) {
1093 return e.abi.i2p_RMonoClassFieldPtr(e.api.class_get_field_from_name(e.abi.p2i_RMonoClassPtr(cls), name));
1098 RMonoMethodPtr RMonoAPI::classGetMethodFromName(RMonoClassPtr cls,
const std::string_view& name, int32_t paramCount)
1101 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(class_get_method_from_name);
1103 return apid->apply([&](
auto& e) {
1104 return e.abi.i2p_RMonoMethodPtr(e.api.class_get_method_from_name(e.abi.p2i_RMonoClassPtr(cls), name, paramCount));
1109 RMonoPropertyPtr RMonoAPI::classGetPropertyFromName(RMonoClassPtr cls,
const std::string_view& name)
1112 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(class_get_property_from_name);
1114 return apid->apply([&](
auto& e) {
1115 return e.abi.i2p_RMonoPropertyPtr(e.api.class_get_property_from_name(e.abi.p2i_RMonoClassPtr(cls), name));
1120 RMonoClassPtr RMonoAPI::classGetElementClass(RMonoClassPtr cls)
1123 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(class_get_element_class);
1125 return apid->apply([&](
auto& e) {
1126 return e.abi.i2p_RMonoClassPtr(e.api.class_get_element_class(e.abi.p2i_RMonoClassPtr(cls)));
1131 uint32_t RMonoAPI::classGetFlags(RMonoClassPtr cls)
1134 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(class_get_flags);
1136 return apid->apply([&](
auto& e) {
1137 return e.api.class_get_flags(e.abi.p2i_RMonoClassPtr(cls));
1142 rmono_int RMonoAPI::classGetRank(RMonoClassPtr cls)
1145 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(class_get_rank);
1147 return apid->apply([&](
auto& e) {
1148 return e.abi.i2p_rmono_int(e.api.class_get_rank(e.abi.p2i_RMonoClassPtr(cls)));
1153 bool RMonoAPI::classIsValueType(RMonoClassPtr cls)
1156 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(class_is_valuetype);
1158 return apid->apply([&](
auto& e) {
1159 return e.abi.i2p_rmono_bool(e.api.class_is_valuetype(e.abi.p2i_RMonoClassPtr(cls))) != 0;
1164 uint32_t RMonoAPI::classDataSize(RMonoClassPtr cls)
1167 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(class_data_size);
1169 return apid->apply([&](
auto& e) {
1170 return e.api.class_data_size(e.abi.p2i_RMonoClassPtr(cls));
1175 uint32_t RMonoAPI::classInstanceSize(RMonoClassPtr cls)
1178 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(class_instance_size);
1180 return apid->apply([&](
auto& e) {
1181 return e.api.class_instance_size(e.abi.p2i_RMonoClassPtr(cls));
1186 int32_t RMonoAPI::classValueSize(RMonoClassPtr cls, uint32_t* align)
1189 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(class_value_size);
1191 return apid->apply([&](
auto& e) {
1192 return e.api.class_value_size(e.abi.p2i_RMonoClassPtr(cls), align);
1198 RMonoReflectionTypePtr RMonoAPI::typeGetObject(RMonoDomainPtr domain, RMonoTypePtr type)
1201 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(type_get_object);
1203 return apid->apply([&](
auto& e) {
1204 return e.abi.i2p_RMonoReflectionTypePtr(e.api.type_get_object(e.abi.p2i_RMonoDomainPtr(domain), e.abi.p2i_RMonoTypePtr(type)));
1209 RMonoReflectionTypePtr RMonoAPI::typeGetObject(RMonoTypePtr type)
1211 return typeGetObject(domainGet(), type);
1215 std::string RMonoAPI::typeGetName(RMonoTypePtr type)
1218 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(type_get_name);
1220 return apid->apply([&](
auto& e) {
1221 return e.api.type_get_name(e.abi.p2i_RMonoTypePtr(type));
1226 RMonoClassPtr RMonoAPI::typeGetClass(RMonoTypePtr type)
1229 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(type_get_class);
1231 return apid->apply([&](
auto& e) {
1232 return e.abi.i2p_RMonoClassPtr(e.api.type_get_class(e.abi.p2i_RMonoTypePtr(type)));
1237 rmono_int RMonoAPI::typeGetType(RMonoTypePtr type)
1240 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(type_get_type);
1242 return apid->apply([&](
auto& e) {
1243 return e.abi.i2p_rmono_int(e.api.type_get_type(e.abi.p2i_RMonoTypePtr(type)));
1248 bool RMonoAPI::typeIsByRef(RMonoTypePtr type)
1251 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(type_is_byref);
1253 return apid->apply([&](
auto& e) {
1254 return e.abi.i2p_rmono_bool(e.api.type_is_byref(e.abi.p2i_RMonoTypePtr(type))) != 0;
1259 bool RMonoAPI::typeIsPointer(RMonoTypePtr type)
1262 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(type_is_pointer);
1264 return apid->apply([&](
auto& e) {
1265 return e.abi.i2p_rmono_bool(e.api.type_is_pointer(e.abi.p2i_RMonoTypePtr(type))) != 0;
1270 bool RMonoAPI::typeIsReference(RMonoTypePtr type)
1273 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(type_is_reference);
1275 return apid->apply([&](
auto& e) {
1276 return e.abi.i2p_rmono_bool(e.api.type_is_reference(e.abi.p2i_RMonoTypePtr(type))) != 0;
1281 bool RMonoAPI::typeIsStruct(RMonoTypePtr type)
1284 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(type_is_struct);
1286 return apid->apply([&](
auto& e) {
1287 return e.abi.i2p_rmono_bool(e.api.type_is_struct(e.abi.p2i_RMonoTypePtr(type))) != 0;
1292 bool RMonoAPI::typeIsVoid(RMonoTypePtr type)
1295 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(type_is_void);
1297 return apid->apply([&](
auto& e) {
1298 return e.abi.i2p_rmono_bool(e.api.type_is_void(e.abi.p2i_RMonoTypePtr(type))) != 0;
1303 rmono_int RMonoAPI::typeSize(RMonoTypePtr type, rmono_int* align)
1306 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(type_size);
1308 return apid->apply([&](
auto& e) {
1309 typedef typename decltype(e.abi)::irmono_int irmono_int;
1311 rmono_int size = e.abi.i2p_rmono_int(e.api.type_size(e.abi.p2i_RMonoTypePtr(type), &ialign));
1313 *align = e.abi.i2p_rmono_int(ialign);
1320 rmono_int RMonoAPI::typeStackSize(RMonoTypePtr type, rmono_int* align)
1323 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(type_stack_size);
1325 return apid->apply([&](
auto& e) {
1326 typedef typename decltype(e.abi)::irmono_int irmono_int;
1328 rmono_int size = e.abi.i2p_rmono_int(e.api.type_stack_size(e.abi.p2i_RMonoTypePtr(type), &ialign));
1330 *align = e.abi.i2p_rmono_int(ialign);
1338 RMonoClassPtr RMonoAPI::fieldGetParent(RMonoClassFieldPtr field)
1341 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(field_get_parent);
1343 return apid->apply([&](
auto& e) {
1344 return e.abi.i2p_RMonoClassPtr(e.api.field_get_parent(e.abi.p2i_RMonoClassFieldPtr(field)));
1349 RMonoTypePtr RMonoAPI::fieldGetType(RMonoClassFieldPtr field)
1352 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(field_get_type);
1354 return apid->apply([&](
auto& e) {
1355 return e.abi.i2p_RMonoTypePtr(e.api.field_get_type(e.abi.p2i_RMonoClassFieldPtr(field)));
1360 std::string RMonoAPI::fieldGetName(RMonoClassFieldPtr field)
1363 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(field_get_name);
1365 return apid->apply([&](
auto& e) {
1366 return e.api.field_get_name(e.abi.p2i_RMonoClassFieldPtr(field));
1371 uint32_t RMonoAPI::fieldGetFlags(RMonoClassFieldPtr field)
1374 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(field_get_flags);
1376 return apid->apply([&](
auto& e) {
1377 return e.api.field_get_flags(e.abi.p2i_RMonoClassFieldPtr(field));
1382 void RMonoAPI::fieldSetValue(RMonoObjectPtr obj, RMonoClassFieldPtr field,
const RMonoVariant& val)
1385 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(field_set_value);
1387 apid->apply([&](
auto& e) {
1389 e.api.field_set_value(e.abi.p2i_RMonoObjectPtr(obj), e.abi.p2i_RMonoClassFieldPtr(field), val);
1391 RMonoClassPtr cls = fieldGetParent(field);
1392 RMonoVTablePtr vtable = classVTable(domainGet(), cls);
1393 fieldStaticSetValue(vtable, field, val);
1399 void RMonoAPI::fieldGetValue(RMonoObjectPtr obj, RMonoClassFieldPtr field, RMonoVariant& val)
1402 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(field_get_value);
1404 return apid->apply([&](
auto& e) {
1406 e.api.field_get_value(e.abi.p2i_RMonoObjectPtr(obj), e.abi.p2i_RMonoClassFieldPtr(field), val);
1408 RMonoClassPtr cls = fieldGetParent(field);
1409 RMonoVTablePtr vtable = classVTable(domainGet(), cls);
1410 fieldStaticGetValue(vtable, field, val);
1416 void RMonoAPI::fieldGetValue(RMonoObjectPtr obj, RMonoClassFieldPtr field, RMonoVariant&& val)
1418 fieldGetValue(obj, field, val);
1422 template <
typename T>
1423 T RMonoAPI::fieldGetValue(RMonoObjectPtr obj, RMonoClassFieldPtr field)
1426 if constexpr(std::is_base_of_v<RMonoObjectHandleTag, T>) {
1427 fieldGetValue(obj, field, &val);
1429 fieldGetValue(obj, field, RMonoVariant(&val));
1435 RMonoObjectPtr RMonoAPI::fieldGetValueObject(RMonoDomainPtr domain, RMonoClassFieldPtr field, RMonoObjectPtr obj)
1438 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(field_get_value_object);
1440 return apid->apply([&](
auto& e) {
1441 return e.abi.i2p_RMonoObjectPtr(e.api.field_get_value_object (
1442 e.abi.p2i_RMonoDomainPtr(domain),
1443 e.abi.p2i_RMonoClassFieldPtr(field),
1444 e.abi.p2i_RMonoObjectPtr(obj)
1450 RMonoObjectPtr RMonoAPI::fieldGetValueObject(RMonoClassFieldPtr field, RMonoObjectPtr obj)
1452 return fieldGetValueObject(domainGet(), field, obj);
1456 void RMonoAPI::fieldStaticSetValue(RMonoVTablePtr vtable, RMonoClassFieldPtr field,
const RMonoVariant& val)
1459 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(field_static_set_value);
1461 apid->apply([&](
auto& e) {
1462 e.api.field_static_set_value(e.abi.p2i_RMonoVTablePtr(vtable), e.abi.p2i_RMonoClassFieldPtr(field), val);
1467 void RMonoAPI::fieldStaticGetValue(RMonoVTablePtr vtable, RMonoClassFieldPtr field, RMonoVariant& val)
1470 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(field_static_get_value);
1472 apid->apply([&](
auto& e) {
1473 e.api.field_static_get_value(e.abi.p2i_RMonoVTablePtr(vtable), e.abi.p2i_RMonoClassFieldPtr(field), val);
1478 void RMonoAPI::fieldStaticGetValue(RMonoVTablePtr vtable, RMonoClassFieldPtr field, RMonoVariant&& val)
1480 fieldStaticGetValue(vtable, field, val);
1484 template <
typename T>
1485 T RMonoAPI::fieldStaticGetValue(RMonoVTablePtr vtable, RMonoClassFieldPtr field)
1488 if constexpr(std::is_base_of_v<RMonoObjectHandleTag, T>) {
1489 fieldStaticGetValue(vtable, field, &val);
1491 fieldStaticGetValue(vtable, field, RMonoVariant(&val));
1497 uint32_t RMonoAPI::fieldGetOffset(RMonoClassFieldPtr field)
1500 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(field_get_offset);
1502 return apid->apply([&](
auto& e) {
1503 return e.api.field_get_offset(e.abi.p2i_RMonoClassFieldPtr(field));
1509 RMonoClassPtr RMonoAPI::methodGetClass(RMonoMethodPtr method)
1512 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(method_get_class);
1514 return apid->apply([&](
auto& e) {
1515 return e.abi.i2p_RMonoClassPtr(e.api.method_get_class(e.abi.p2i_RMonoMethodPtr(method)));
1520 std::string RMonoAPI::methodGetName(RMonoMethodPtr method)
1523 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(method_get_name);
1525 return apid->apply([&](
auto& e) {
1526 return e.api.method_get_name(e.abi.p2i_RMonoMethodPtr(method));
1531 std::string RMonoAPI::methodFullName(RMonoMethodPtr method,
bool signature)
1534 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(method_full_name);
1536 return apid->apply([&](
auto& e) {
1537 return e.api.method_full_name(e.abi.p2i_RMonoMethodPtr(method), e.abi.p2i_rmono_bool(signature ? 1 : 0));
1542 uint32_t RMonoAPI::methodGetFlags(RMonoMethodPtr method, uint32_t* iflags)
1545 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(method_get_flags);
1547 return apid->apply([&](
auto& e) {
1548 return e.api.method_get_flags(e.abi.p2i_RMonoMethodPtr(method), iflags);
1553 RMonoMethodSignaturePtr RMonoAPI::methodSignature(RMonoMethodPtr method)
1556 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(method_signature);
1558 return apid->apply([&](
auto& e) {
1559 return e.abi.i2p_RMonoMethodSignaturePtr(e.api.method_signature(e.abi.p2i_RMonoMethodPtr(method)));
1564 RMonoMethodHeaderPtr RMonoAPI::methodGetHeader(RMonoMethodPtr method)
1567 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(method_get_header);
1569 return apid->apply([&](
auto& e) {
1570 return e.abi.i2p_RMonoMethodHeaderPtr(e.api.method_get_header(e.abi.p2i_RMonoMethodPtr(method)));
1575 rmono_voidp RMonoAPI::methodHeaderGetCode(RMonoMethodHeaderPtr header, uint32_t* codeSize, uint32_t* maxStack)
1578 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(method_header_get_code);
1580 return apid->apply([&](
auto& e) {
1581 return e.abi.i2p_rmono_voidp(e.api.method_header_get_code(e.abi.p2i_RMonoMethodHeaderPtr(header), codeSize, maxStack));
1586 RMonoMethodDescPtr RMonoAPI::methodDescNew(
const std::string_view& name,
bool includeNamespace)
1589 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(method_desc_new);
1591 return apid->apply([&](
auto& e) {
1592 return e.abi.i2p_RMonoMethodDescPtr(e.api.method_desc_new(name, includeNamespace));
1597 void RMonoAPI::methodDescFree(RMonoMethodDescPtrRaw desc)
1600 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(method_desc_free);
1602 return apid->apply([&](
auto& e) {
1603 e.api.method_desc_free(e.abi.p2i_RMonoMethodDescPtrRaw(desc));
1608 bool RMonoAPI::methodDescMatch(RMonoMethodDescPtr desc, RMonoMethodPtr method)
1611 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(method_desc_match);
1613 return apid->apply([&](
auto& e) {
1614 return e.abi.i2p_rmono_bool(e.api.method_desc_match(e.abi.p2i_RMonoMethodDescPtr(desc), e.abi.p2i_RMonoMethodPtr(method))) != 0;
1619 RMonoMethodPtr RMonoAPI::methodDescSearchInClass(RMonoMethodDescPtr desc, RMonoClassPtr cls)
1622 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(method_desc_search_in_class);
1624 return apid->apply([&](
auto& e) {
1625 return e.abi.i2p_RMonoMethodPtr(e.api.method_desc_search_in_class(e.abi.p2i_RMonoMethodDescPtr(desc), e.abi.p2i_RMonoClassPtr(cls)));
1630 RMonoMethodPtr RMonoAPI::methodDescSearchInClass(
const std::string_view& desc,
bool includeNamespace, RMonoClassPtr cls)
1632 return methodDescSearchInClass(methodDescNew(desc, includeNamespace), cls);
1636 RMonoMethodPtr RMonoAPI::methodDescSearchInImage(RMonoMethodDescPtr desc, RMonoImagePtr image)
1639 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(method_desc_search_in_image);
1641 return apid->apply([&](
auto& e) {
1642 return e.abi.i2p_RMonoMethodPtr(e.api.method_desc_search_in_image(e.abi.p2i_RMonoMethodDescPtr(desc), e.abi.p2i_RMonoImagePtr(image)));
1647 RMonoMethodPtr RMonoAPI::methodDescSearchInImage(
const std::string_view& desc,
bool includeNamespace, RMonoImagePtr image)
1649 return methodDescSearchInImage(methodDescNew(desc, includeNamespace), image);
1654 std::string RMonoAPI::propertyGetName(RMonoPropertyPtr prop)
1657 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(property_get_name);
1659 return apid->apply([&](
auto& e) {
1660 return e.api.property_get_name(e.abi.p2i_RMonoPropertyPtr(prop));
1665 uint32_t RMonoAPI::propertyGetFlags(RMonoPropertyPtr prop)
1668 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(property_get_flags);
1670 return apid->apply([&](
auto& e) {
1671 return e.api.property_get_flags(e.abi.p2i_RMonoPropertyPtr(prop));
1676 RMonoClassPtr RMonoAPI::propertyGetParent(RMonoPropertyPtr prop)
1679 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(property_get_parent);
1681 return apid->apply([&](
auto& e) {
1682 return e.abi.i2p_RMonoClassPtr(e.api.property_get_parent(e.abi.p2i_RMonoPropertyPtr(prop)));
1687 RMonoMethodPtr RMonoAPI::propertyGetSetMethod(RMonoPropertyPtr prop)
1690 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(property_get_set_method);
1692 return apid->apply([&](
auto& e) {
1693 return e.abi.i2p_RMonoMethodPtr(e.api.property_get_set_method(e.abi.p2i_RMonoPropertyPtr(prop)));
1698 RMonoMethodPtr RMonoAPI::propertyGetGetMethod(RMonoPropertyPtr prop)
1701 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(property_get_get_method);
1703 return apid->apply([&](
auto& e) {
1704 return e.abi.i2p_RMonoMethodPtr(e.api.property_get_get_method(e.abi.p2i_RMonoPropertyPtr(prop)));
1709 RMonoObjectPtr RMonoAPI::propertyGetValue(RMonoPropertyPtr prop,
const RMonoVariant& obj, RMonoVariantArray& params,
bool catchExceptions)
1712 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(property_get_value);
1714 return apid->apply([&](
auto& e) {
1715 return e.abi.i2p_RMonoObjectPtr(e.api.property_get_value(e.abi.p2i_RMonoPropertyPtr(prop), obj, params, catchExceptions));
1720 RMonoObjectPtr RMonoAPI::propertyGetValue(RMonoPropertyPtr prop,
const RMonoVariant& obj, RMonoVariantArray&& params,
bool catchExceptions)
1723 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(property_get_value);
1725 return apid->apply([&](
auto& e) {
1726 return e.abi.i2p_RMonoObjectPtr(e.api.property_get_value(e.abi.p2i_RMonoPropertyPtr(prop), obj, params, catchExceptions));
1731 void RMonoAPI::propertySetValue(RMonoPropertyPtr prop,
const RMonoVariant& obj, RMonoVariantArray& params,
bool catchExceptions)
1734 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(property_set_value);
1736 apid->apply([&](
auto& e) {
1737 e.api.property_set_value(e.abi.p2i_RMonoPropertyPtr(prop), obj, params, catchExceptions);
1742 void RMonoAPI::propertySetValue(RMonoPropertyPtr prop,
const RMonoVariant& obj, RMonoVariantArray&& params,
bool catchExceptions)
1745 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(property_set_value);
1747 apid->apply([&](
auto& e) {
1748 e.api.property_set_value(e.abi.p2i_RMonoPropertyPtr(prop), obj, params, catchExceptions);
1754 RMonoTypePtr RMonoAPI::signatureGetReturnType(RMonoMethodSignaturePtr sig)
1757 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(signature_get_return_type);
1759 return apid->apply([&](
auto& e) {
1760 return e.abi.i2p_RMonoTypePtr(e.api.signature_get_return_type(e.abi.p2i_RMonoMethodSignaturePtr(sig)));
1765 uint32_t RMonoAPI::signatureGetCallConv(RMonoMethodSignaturePtr sig)
1768 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(signature_get_call_conv);
1770 return apid->apply([&](
auto& e) {
1771 return e.api.signature_get_call_conv(e.abi.p2i_RMonoMethodSignaturePtr(sig));
1776 std::string RMonoAPI::signatureGetDesc(RMonoMethodSignaturePtr sig,
bool includeNamespace)
1779 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(signature_get_desc);
1781 return apid->apply([&](
auto& e) {
1782 return e.api.signature_get_desc(e.abi.p2i_RMonoMethodSignaturePtr(sig), e.abi.p2i_rmono_bool(includeNamespace ? 1 : 0));
1787 std::vector<RMonoTypePtr> RMonoAPI::signatureGetParams(RMonoMethodSignaturePtr sig)
1790 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(signature_get_params);
1792 std::vector<RMonoTypePtr> out;
1794 apid->apply([&](
auto& e) {
1795 typedef decltype(e.abi) ABI;
1797 blackbone::MemBlock rIter = prepareIterator<ABI>();
1798 typename ABI::irmono_voidpp iptr = (typename ABI::irmono_voidpp) rIter.ptr();
1800 typename ABI::IRMonoTypePtr param;
1801 typename ABI::IRMonoMethodSignaturePtr isig = e.abi.p2i_RMonoMethodSignaturePtr(sig);
1804 param = e.api.signature_get_params(isig, iptr);
1806 out.push_back(e.abi.i2p_RMonoTypePtr(param));
1816 RMonoClassPtr RMonoAPI::objectGetClass(RMonoObjectPtr obj)
1819 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(object_get_class);
1821 return apid->apply([&](
auto& e) {
1822 return e.abi.i2p_RMonoClassPtr(e.api.object_get_class(e.abi.p2i_RMonoObjectPtr(obj)));
1827 RMonoObjectPtr RMonoAPI::objectNew(RMonoDomainPtr domain, RMonoClassPtr cls)
1830 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(object_new);
1832 return apid->apply([&](
auto& e) {
1833 return e.abi.i2p_RMonoObjectPtr(e.api.object_new(e.abi.p2i_RMonoDomainPtr(domain), e.abi.p2i_RMonoClassPtr(cls)));
1838 RMonoObjectPtr RMonoAPI::objectNew(RMonoClassPtr cls)
1840 return objectNew(domainGet(), cls);
1844 void RMonoAPI::runtimeObjectInit(
const RMonoVariant& obj)
1847 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(runtime_object_init);
1849 apid->apply([&](
auto& e) {
1850 e.api.runtime_object_init(obj);
1855 template <
typename T>
1856 T RMonoAPI::objectUnbox(RMonoObjectPtr obj)
1859 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(object_unbox);
1862 RMonoVariant var(&res);
1863 apid->apply([&](
auto& e) {
1864 e.api.object_unbox(var, e.abi.p2i_RMonoObjectPtr(obj));
1870 RMonoVariant RMonoAPI::objectUnboxRaw(RMonoObjectPtr obj)
1873 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(object_unbox);
1876 RMonoVariant var(&p, RMonoVariant::rawPtr);
1877 apid->apply([&](
auto& e) {
1878 e.api.object_unbox(var, e.abi.p2i_RMonoObjectPtr(obj));
1880 return RMonoVariant(p, RMonoVariant::rawPtr);
1884 RMonoObjectPtr RMonoAPI::valueBox(RMonoDomainPtr domain, RMonoClassPtr cls,
const RMonoVariant& val)
1887 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(value_box);
1889 return apid->apply([&](
auto& e) {
1890 return e.abi.i2p_RMonoObjectPtr(e.api.value_box(e.abi.p2i_RMonoDomainPtr(domain), e.abi.p2i_RMonoClassPtr(cls), val));
1895 RMonoObjectPtr RMonoAPI::valueBox(RMonoClassPtr cls,
const RMonoVariant& val)
1897 return valueBox(domainGet(), cls, val);
1901 RMonoStringPtr RMonoAPI::objectToString(
const RMonoVariant& obj,
bool catchExceptions)
1905 return apid->apply([&](
auto& e) {
1906 if (e.api.object_to_string) {
1907 return e.abi.i2p_RMonoStringPtr(e.api.object_to_string(obj, catchExceptions));
1911 assert(obj.getType() == RMonoVariant::TypeMonoObjectPtr);
1913 auto toStr = classGetMethodFromName(getObjectClass(),
"ToString", 0);
1914 auto virtualToStr = objectGetVirtualMethod(obj.getMonoObjectPtr(), toStr);
1915 return (RMonoStringPtr) runtimeInvoke(virtualToStr, obj.getMonoObjectPtr(), {}, catchExceptions);
1921 RMonoObjectPtr RMonoAPI::objectClone(RMonoObjectPtr obj)
1924 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(object_clone);
1926 return apid->apply([&](
auto& e) {
1927 return e.abi.i2p_RMonoObjectPtr(e.api.object_clone(e.abi.p2i_RMonoObjectPtr(obj)));
1932 RMonoDomainPtr RMonoAPI::objectGetDomain(RMonoObjectPtr obj)
1935 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(object_get_domain);
1937 return apid->apply([&](
auto& e) {
1938 return e.abi.i2p_RMonoDomainPtr(e.api.object_get_domain(e.abi.p2i_RMonoObjectPtr(obj)));
1943 RMonoMethodPtr RMonoAPI::objectGetVirtualMethod(RMonoObjectPtr obj, RMonoMethodPtr method)
1946 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(object_get_virtual_method);
1948 return apid->apply([&](
auto& e) {
1949 return e.abi.i2p_RMonoMethodPtr(e.api.object_get_virtual_method(e.abi.p2i_RMonoObjectPtr(obj), e.abi.p2i_RMonoMethodPtr(method)));
1954 RMonoObjectPtr RMonoAPI::objectIsInst(RMonoObjectPtr obj, RMonoClassPtr cls)
1957 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(object_isinst);
1959 return apid->apply([&](
auto& e) {
1960 return e.abi.i2p_RMonoObjectPtr(e.api.object_isinst(e.abi.p2i_RMonoObjectPtr(obj), e.abi.p2i_RMonoClassPtr(cls)));
1965 rmono_uint RMonoAPI::objectGetSize(RMonoObjectPtr obj)
1968 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(object_get_size);
1970 return apid->apply([&](
auto& e) {
1971 return e.abi.i2p_rmono_uint(e.api.object_get_size(e.abi.p2i_RMonoObjectPtr(obj)));
1977 RMonoStringPtr RMonoAPI::stringNew(RMonoDomainPtr domain,
const std::string_view& str)
1980 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(string_new_len);
1982 return apid->apply([&](
auto& e) {
1983 typedef decltype(e.abi) ABI;
1984 return e.abi.i2p_RMonoStringPtr(e.api.string_new_len(e.abi.p2i_RMonoDomainPtr(domain), str, (typename ABI::irmono_uint) str.size()));
1989 RMonoStringPtr RMonoAPI::stringNew(const std::string_view& str)
1991 return stringNew(domainGet(), str);
1995 RMonoStringPtr RMonoAPI::stringNewUTF16(RMonoDomainPtr domain,
const std::u16string_view& str)
1998 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(string_new_utf16);
2000 return apid->apply([&](
auto& e) {
2001 typedef decltype(e.abi) ABI;
2002 return e.abi.i2p_RMonoStringPtr(e.api.string_new_utf16(e.abi.p2i_RMonoDomainPtr(domain), str, (int32_t) str.size()));
2007 RMonoStringPtr RMonoAPI::stringNewUTF16(const std::u16string_view& str)
2009 return stringNewUTF16(domainGet(), str);
2013 RMonoStringPtr RMonoAPI::stringNewUTF32(RMonoDomainPtr domain,
const std::u32string_view& str)
2016 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(string_new_utf32);
2018 return apid->apply([&](
auto& e) {
2019 typedef decltype(e.abi) ABI;
2020 return e.abi.i2p_RMonoStringPtr(e.api.string_new_utf32(e.abi.p2i_RMonoDomainPtr(domain), str, (int32_t) str.size()));
2025 RMonoStringPtr RMonoAPI::stringNewUTF32(const std::u32string_view& str)
2027 return stringNewUTF32(domainGet(), str);
2031 std::string RMonoAPI::stringToUTF8(RMonoStringPtr str)
2034 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(string_to_utf8);
2036 return apid->apply([&](
auto& e) {
2037 return e.api.string_to_utf8(e.abi.p2i_RMonoStringPtr(str));
2042 std::u16string RMonoAPI::stringToUTF16(RMonoStringPtr str)
2045 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(string_to_utf16);
2047 return apid->apply([&](
auto& e) {
2048 return e.api.string_to_utf16(e.abi.p2i_RMonoStringPtr(str));
2053 std::u32string RMonoAPI::stringToUTF32(RMonoStringPtr str)
2056 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(string_to_utf32);
2058 return apid->apply([&](
auto& e) {
2059 return e.api.string_to_utf32(e.abi.p2i_RMonoStringPtr(str));
2064 std::u16string RMonoAPI::stringChars(RMonoStringPtr str)
2067 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(string_chars);
2069 return apid->apply([&](
auto& e) {
2070 return e.api.string_chars(e.abi.p2i_RMonoStringPtr(str));
2075 int32_t RMonoAPI::stringLength(RMonoStringPtr str)
2078 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(string_length);
2080 return apid->apply([&](
auto& e) {
2081 return e.api.string_length(e.abi.p2i_RMonoStringPtr(str));
2086 bool RMonoAPI::stringEqual(RMonoStringPtr a, RMonoStringPtr b)
2089 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(string_equal);
2091 return apid->apply([&](
auto& e) {
2092 return e.abi.i2p_rmono_bool(e.api.string_equal(e.abi.p2i_RMonoStringPtr(a), e.abi.p2i_RMonoStringPtr(b))) != 0;
2098 RMonoArrayPtr RMonoAPI::arrayNew(RMonoDomainPtr domain, RMonoClassPtr cls, rmono_uintptr_t n)
2101 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(array_new);
2103 return apid->apply([&](
auto& e) {
2104 return e.abi.i2p_RMonoArrayPtr(e.api.array_new(e.abi.p2i_RMonoDomainPtr(domain), e.abi.p2i_RMonoClassPtr(cls),
2105 e.abi.p2i_rmono_uintptr_t(n)));
2110 RMonoArrayPtr RMonoAPI::arrayNew(RMonoClassPtr cls, rmono_uintptr_t n)
2112 return arrayNew(domainGet(), cls, n);
2116 RMonoArrayPtr RMonoAPI::arrayNewFull (
2117 RMonoDomainPtr domain,
2119 const std::vector<rmono_uintptr_t>& lengths,
2120 const std::vector<rmono_intptr_t>& lowerBounds
2123 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(array_new_full);
2125 return apid->apply([&](
auto& e) {
2126 typedef decltype(e.abi) ABI;
2127 typedef typename ABI::irmono_voidp irmono_voidp;
2128 typedef typename ABI::irmono_uintptr_t irmono_uintptr_t;
2129 typedef typename ABI::irmono_intptr_t irmono_intptr_t;
2131 size_t blockSize = lengths.size() * sizeof(irmono_voidp);
2132 if (!lowerBounds.empty()) {
2133 blockSize += lowerBounds.size() *
sizeof(irmono_voidp);
2136 char* data =
new char[blockSize];
2137 char* dataPtr = data;
2152 bool newApi = (bool) e.api.free;
2155 for (rmono_uintptr_t len : lengths) {
2156 *((irmono_uintptr_t*) dataPtr) = e.abi.p2i_rmono_uintptr_t(len);
2157 dataPtr +=
sizeof(irmono_uintptr_t);
2159 for (rmono_intptr_t bounds : lowerBounds) {
2160 *((irmono_intptr_t*) dataPtr) = e.abi.p2i_rmono_intptr_t(bounds);
2161 dataPtr +=
sizeof(irmono_intptr_t);
2164 for (rmono_uintptr_t len : lengths) {
2165 *((uint32_t*) dataPtr) = uint32_t(len);
2166 dataPtr +=
sizeof(uint32_t);
2168 for (rmono_intptr_t bounds : lowerBounds) {
2169 *((uint32_t*) dataPtr) = uint32_t(bounds);
2170 dataPtr +=
sizeof(uint32_t);
2174 blackbone::MemBlock block = std::move(process.memory().Allocate(blockSize, PAGE_READWRITE).result());
2175 block.Write(0, blockSize, data);
2179 irmono_voidp lengthsPtr = irmono_voidp(block.ptr());
2180 irmono_voidp lowerBoundsPtr = lowerBounds.empty() ? 0 : irmono_voidp(lengthsPtr + lengths.size()*
sizeof(irmono_voidp));
2182 RMonoArrayPtr arr = e.abi.i2p_RMonoArrayPtr(e.api.array_new_full(e.abi.p2i_RMonoDomainPtr(domain), e.abi.p2i_RMonoClassPtr(cls),
2183 lengthsPtr, lowerBoundsPtr));
2192 RMonoArrayPtr RMonoAPI::arrayNewFull (
2194 const std::vector<rmono_uintptr_t>& lengths,
2195 const std::vector<rmono_intptr_t>& lowerBounds
2197 return arrayNewFull(cls, lengths, lowerBounds);
2201 RMonoClassPtr RMonoAPI::arrayClassGet(RMonoClassPtr cls, uint32_t rank)
2204 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(array_class_get);
2206 return apid->apply([&](
auto& e) {
2207 return e.abi.i2p_RMonoClassPtr(e.api.array_class_get(e.abi.p2i_RMonoClassPtr(cls), rank));
2212 rmono_voidp RMonoAPI::arrayAddrWithSize(RMonoArrayPtr arr, rmono_int size, rmono_uintptr_t idx)
2215 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(array_addr_with_size);
2218 apid->apply([&](
auto& e) {
2219 e.api.array_addr_with_size(RMonoVariant(&addr, RMonoVariant::rawPtr), e.abi.p2i_RMonoArrayPtr(arr),
2220 e.abi.p2i_rmono_int(size), e.abi.p2i_rmono_uintptr_t(idx));
2226 rmono_uintptr_t RMonoAPI::arrayLength(RMonoArrayPtr arr)
2230 return apid->apply([&](
auto& e) {
2231 if (e.api.array_length) {
2232 return e.abi.i2p_rmono_uintptr_t(e.api.array_length(e.abi.p2i_RMonoArrayPtr(arr)));
2234 RMonoClassPtr cls = objectGetClass(arr);
2235 RMonoPropertyPtr lenProp = classGetPropertyFromName(cls,
"Length");
2236 RMonoObjectPtr lenObj = propertyGetValue(lenProp, arr);
2237 return (rmono_uintptr_t) objectUnbox<int32_t>(lenObj);
2243 int32_t RMonoAPI::arrayElementSize(RMonoClassPtr cls)
2246 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(array_element_size);
2248 return apid->apply([&](
auto& e) {
2249 return e.api.array_element_size(e.abi.p2i_RMonoClassPtr(cls));
2254 int32_t RMonoAPI::classArrayElementSize(RMonoClassPtr cls)
2257 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(class_array_element_size);
2259 return apid->apply([&](
auto& e) {
2260 return e.api.class_array_element_size(e.abi.p2i_RMonoClassPtr(cls));
2265 RMonoArrayPtr RMonoAPI::arrayClone(RMonoArrayPtr arr)
2268 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(array_clone);
2270 return apid->apply([&](
auto& e) {
2271 return e.abi.i2p_RMonoArrayPtr(e.api.array_clone(e.abi.p2i_RMonoArrayPtr(arr)));
2276 template <
typename T>
2277 T RMonoAPI::arrayGet(RMonoArrayPtr arr, rmono_uintptr_t idx)
2280 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(array_addr_with_size);
2283 apid->apply([&](
auto& e) {
2284 typedef decltype(e.abi) ABI;
2291 if constexpr(std::is_base_of_v<RMonoObjectHandleTag, T>) {
2292 e.api.array_addr_with_size(RMonoVariant(&val), e.abi.p2i_RMonoArrayPtr(arr),
2293 e.abi.p2i_rmono_int((rmono_int)
sizeof(
typename ABI::IRMonoObjectPtrRaw)), e.abi.p2i_rmono_uintptr_t(idx));
2295 e.api.array_addr_with_size(RMonoVariant(&val), e.abi.p2i_RMonoArrayPtr(arr),
2296 e.abi.p2i_rmono_int((rmono_int)
sizeof(T)), e.abi.p2i_rmono_uintptr_t(idx));
2303 void RMonoAPI::arraySet(RMonoArrayPtr arr, rmono_uintptr_t idx,
const RMonoVariant& val)
2307 apid->apply([&](
auto& e) {
2310 if (val.getType() == RMonoVariant::TypeMonoObjectPtr) {
2311 e.api.rmono_array_setref(e.abi.p2i_rmono_gchandle(*arr), e.abi.p2i_rmono_uintptr_t(idx),
2312 e.abi.p2i_rmono_gchandle(*val.getMonoObjectPtr()));
2313 }
else if (val.getType() == RMonoVariant::TypeRawPtr) {
2314 RMonoClassPtr arrCls = objectGetClass(arr);
2315 rmono_int size = (rmono_int) arrayElementSize(arrCls);
2316 rmono_voidp p = arrayAddrWithSize(arr, size, idx);
2317 char* data = new char[size];
2318 process.memory().Read((blackbone::ptr_t) val.getRawPtr(), size, data);
2319 process.memory().Write((blackbone::ptr_t) p, size, data);
2323 rmono_int size = (rmono_int) val.getRemoteMemorySize(e.abi, align);
2324 rmono_voidp p = arrayAddrWithSize(arr, size, idx);
2325 char* data = new char[size];
2326 val.copyForRemoteMemory(e.abi, data);
2327 process.memory().Write((blackbone::ptr_t) p, size, data);
2335 rmono_gchandle RMonoAPI::gchandleNew(RMonoObjectPtr obj,
bool pinned)
2338 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(gchandle_new);
2340 return apid->apply([&](
auto& e) {
2341 return e.abi.i2p_rmono_gchandle(e.api.gchandle_new(e.abi.p2i_RMonoObjectPtr(obj), e.abi.p2i_rmono_bool(pinned ? 1 : 0)));
2346 rmono_gchandle RMonoAPI::gchandleNewRaw(RMonoObjectPtrRaw obj,
bool pinned)
2349 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(gchandle_new);
2351 return apid->apply([&](
auto& e) {
2352 return e.abi.i2p_rmono_gchandle(e.api.gchandle_new.invokeRaw(e.abi.p2i_RMonoObjectPtrRaw(obj), e.abi.p2i_rmono_bool(pinned ? 1 : 0)));
2357 rmono_gchandle RMonoAPI::gchandleNewWeakref(RMonoObjectPtr obj,
bool trackResurrection)
2360 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(gchandle_new_weakref);
2362 return apid->apply([&](
auto& e) {
2363 return e.abi.i2p_rmono_gchandle(e.api.gchandle_new_weakref(e.abi.p2i_RMonoObjectPtr(obj),
2364 e.abi.p2i_rmono_bool(trackResurrection ? 1 : 0)));
2369 rmono_gchandle RMonoAPI::gchandleNewWeakrefRaw(RMonoObjectPtrRaw obj,
bool trackResurrection)
2372 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(gchandle_new_weakref);
2374 return apid->apply([&](
auto& e) {
2375 return e.abi.i2p_rmono_gchandle(e.api.gchandle_new_weakref.invokeRaw(e.abi.p2i_RMonoObjectPtrRaw(obj),
2376 e.abi.p2i_rmono_bool(trackResurrection ? 1 : 0)));
2381 RMonoObjectPtrRaw RMonoAPI::gchandleGetTarget(rmono_gchandle gchandle)
2384 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(gchandle_get_target);
2386 return apid->apply([&](
auto& e) {
2387 return e.abi.i2p_RMonoObjectPtrRaw(e.api.gchandle_get_target(e.abi.p2i_rmono_gchandle(gchandle)));
2392 void RMonoAPI::gchandleFree(rmono_gchandle gchandle)
2395 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(gchandle_free);
2397 return apid->apply([&](
auto& e) {
2398 e.api.gchandle_free(e.abi.p2i_rmono_gchandle(gchandle));
2403 void RMonoAPI::gcCollect(rmono_int generation)
2406 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(gc_collect);
2408 apid->apply([&](
auto& e) {
2409 e.api.gc_collect(e.abi.p2i_rmono_int(generation));
2414 rmono_int RMonoAPI::gcMaxGeneration()
2417 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(gc_max_generation);
2419 return apid->apply([&](
auto& e) {
2420 return e.abi.i2p_rmono_int(e.api.gc_max_generation());
2425 rmono_int RMonoAPI::gcGetGeneration(RMonoObjectPtr obj)
2428 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(gc_get_generation);
2430 return apid->apply([&](
auto& e) {
2431 return e.abi.i2p_rmono_int(e.api.gc_get_generation(e.abi.p2i_RMonoObjectPtr(obj)));
2437 RMonoObjectPtr RMonoAPI::runtimeInvoke(RMonoMethodPtr method,
const RMonoVariant& obj, RMonoVariantArray& params,
bool catchExceptions)
2440 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(runtime_invoke);
2442 return apid->apply([&](
auto& e) {
2443 return e.abi.i2p_RMonoObjectPtr(e.api.runtime_invoke(e.abi.p2i_RMonoMethodPtr(method), obj, params, catchExceptions));
2448 RMonoObjectPtr RMonoAPI::runtimeInvoke(RMonoMethodPtr method,
const RMonoVariant& obj, RMonoVariantArray&& params,
bool catchExceptions)
2451 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(runtime_invoke);
2453 return apid->apply([&](
auto& e) {
2454 return e.abi.i2p_RMonoObjectPtr(e.api.runtime_invoke(e.abi.p2i_RMonoMethodPtr(method), obj, params, catchExceptions));
2460 rmono_voidp RMonoAPI::compileMethod(RMonoMethodPtr method)
2463 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(compile_method);
2465 return apid->apply([&](
auto& e) {
2466 return e.abi.i2p_rmono_voidp(e.api.compile_method(e.abi.p2i_RMonoMethodPtr(method)));
2472 RMonoJitInfoPtr RMonoAPI::jitInfoTableFind(RMonoDomainPtr domain, rmono_voidp addr)
2475 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(jit_info_table_find);
2477 return apid->apply([&](
auto& e) {
2478 return e.abi.i2p_RMonoJitInfoPtr(e.api.jit_info_table_find(e.abi.p2i_RMonoDomainPtr(domain), e.abi.p2i_rmono_voidp(addr)));
2483 RMonoJitInfoPtr RMonoAPI::jitInfoTableFind(rmono_voidp addr)
2485 return jitInfoTableFind(domainGet(), addr);
2489 rmono_voidp RMonoAPI::jitInfoGetCodeStart(RMonoJitInfoPtr jinfo)
2492 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(jit_info_get_code_start);
2494 return apid->apply([&](
auto& e) {
2495 return e.abi.i2p_rmono_voidp(e.api.jit_info_get_code_start(e.abi.p2i_RMonoJitInfoPtr(jinfo)));
2500 int32_t RMonoAPI::jitInfoGetCodeSize(RMonoJitInfoPtr jinfo)
2503 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(jit_info_get_code_size);
2505 return apid->apply([&](
auto& e) {
2506 return e.api.jit_info_get_code_size(e.abi.p2i_RMonoJitInfoPtr(jinfo));
2511 RMonoMethodPtr RMonoAPI::jitInfoGetMethod(RMonoJitInfoPtr jinfo)
2514 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(jit_info_get_method);
2516 return apid->apply([&](
auto& e) {
2517 return e.abi.i2p_RMonoMethodPtr(e.api.jit_info_get_method(e.abi.p2i_RMonoJitInfoPtr(jinfo)));
2523 std::string RMonoAPI::disasmCode(RMonoDisHelperPtr helper, RMonoMethodPtr method, rmono_voidp ip, rmono_voidp end)
2526 REMOTEMONO_RMONOAPI_CHECK_SUPPORTED(disasm_code);
2528 return apid->apply([&](
auto& e) {
2529 return e.api.disasm_code(e.abi.p2i_RMonoDisHelperPtr(helper), e.abi.p2i_RMonoMethodPtr(method), e.abi.p2i_rmono_voidp(ip),
2530 e.abi.p2i_rmono_voidp(end));
2555 std::vector<RMonoClassPtr> out;
2558 rmono_int rows = tableInfoGetRows(tableInfo);
2560 for (rmono_int i = 0 ; i < rows ; i++) {
2561 uint32_t nameGuid = metadataDecodeRowCol(tableInfo, i, MONO_TYPEDEF_NAME);
2562 uint32_t nameSpaceGuid = metadataDecodeRowCol(tableInfo, i, MONO_TYPEDEF_NAMESPACE);
2563 std::string name = metadataStringHeap(image, nameGuid);
2564 std::string nameSpace = metadataStringHeap(image, nameSpaceGuid);
2580 return stringToUTF8(objectToString(obj, catchExceptions));
2584 template <
typename T>
2589 rmono_uintptr_t len = arrayLength(arr);
2590 for (rmono_uintptr_t i = 0 ; i < len ; i++) {
2591 out.push_back(arrayGet<T>(arr, i));
2598 template <
typename T>
2603 for (
size_t i = 0 ; i < vec.size() ; i++) {
2604 arraySet(arr, (rmono_uintptr_t) i,
RMonoVariant(vec[i]));
2611 template <
typename T>
2614 return arrayFromVector(domainGet(), cls, vec);
2619 rmono_gchandle RMonoAPI::gchandlePin(rmono_gchandle gchandle)
2621 return apid->apply([&](
auto& e) {
2622 return e.abi.i2p_rmono_gchandle(e.api.rmono_gchandle_pin(e.abi.p2i_rmono_gchandle(gchandle)));