22 #include "../config.h"
24 #include <BlackBone/Process/Process.h>
25 #include "RMonoHandle_Def.h"
26 #include "RMonoAPIBase_Def.h"
35 template <
typename PtrT>
36 void RMonoHandleAssemblyNamePtrDelete(PtrT p, RMonoAPIBase* mono)
38 RMonoAPIDispatcher* apid = mono->getAPIDispatcher();
39 apid->apply([&](
auto& e) {
42 if (e.api.assembly_name_free) {
43 e.api.assembly_name_free(e.abi.p2i_RMonoAssemblyNamePtrRaw(p));
46 if (e.api.assembly_name_new) {
48 e.api.free(e.abi.p2i_rmono_voidp((rmono_voidp) p));
49 }
else if (e.api.g_free) {
50 e.api.g_free(e.abi.p2i_rmono_voidp((rmono_voidp) p));
55 blackbone::MemBlock block(&mono->getProcess().memory(), (blackbone::ptr_t) p,
true);
62 template <
typename PtrT>
63 void RMonoHandleMethodDescPtrDelete(PtrT p, RMonoAPIBase* mono)
65 RMonoAPIDispatcher* apid = mono->getAPIDispatcher();
66 apid->apply([&](
auto& e) {
67 e.api.method_desc_free(e.abi.p2i_RMonoMethodDescPtrRaw(p));
72 void RMonoObjectHandleDelete(rmono_gchandle gchandle, RMonoAPIBase* mono)
74 RMonoAPIDispatcher* apid = mono->getAPIDispatcher();
75 apid->apply([&](
auto& e) {
76 e.api.gchandle_free(e.abi.p2i_rmono_gchandle(gchandle));
84 template<
typename HandleT,
void (*deleter)(HandleT, RMonoAPIBase*), HandleT inval
idHandle>
85 void RMonoHandle<HandleT, deleter, invalidHandle>::Data::registerBackend()
87 regIt = mono->registerMonoHandleBackend(
this);
91 template<
typename HandleT,
void (*deleter)(HandleT, RMonoAPIBase*), HandleT inval
idHandle>
92 void RMonoHandle<HandleT, deleter, invalidHandle>::Data::unregisterBackend()
94 mono->unregisterMonoHandleBackend(regIt);
101 template <
typename RawPtrT>
104 if (
this == &other || **
this == *other) {
108 auto pinnedThis = pin();
109 return pinnedThis.raw() == other.
raw();
113 template <
typename RawPtrT>
120 rmono_gchandle pinned = REMOTEMONO_GCHANDLE_INVALID;
121 apid->apply([&](
auto& e) {
122 pinned = e.abi.i2p_rmono_gchandle(e.api.rmono_gchandle_pin(e.abi.p2i_rmono_gchandle(d->handle)));
124 return Self(pinned, d->mono);
128 template <
typename RawPtrT>
135 rmono_gchandle cloned = REMOTEMONO_GCHANDLE_INVALID;
136 apid->apply([&](
auto& e) {
137 cloned = e.abi.i2p_rmono_gchandle(e.api.gchandle_new(*
this,
false));
139 return Self(cloned, d->mono);
143 template <
typename RawPtrT>
150 RawPtr p = (RawPtr) 0;
151 apid->apply([&](
auto& e) {
152 p = e.abi.i2p_rmono_voidp(e.api.gchandle_get_target(e.abi.p2i_rmono_gchandle(d->handle)));