remotemono
RMonoAPIBackend_Def.h
1 /*
2  Copyright 2020 David "Alemarius Nexus" Lerch
3 
4  This file is part of RemoteMono.
5 
6  RemoteMono is free software: you can redistribute it and/or modify
7  it under the terms of the GNU Lesser General Public License as published
8  by the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  RemoteMono is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU Lesser General Public License for more details.
15 
16  You should have received a copy of the GNU Lesser General Public License
17  along with RemoteMono. If not, see <https://www.gnu.org/licenses/>.
18  */
19 
20 #pragma once
21 
22 #include "../config.h"
23 
24 #include <string>
25 #include <string_view>
26 #include <unordered_set>
27 #include <BlackBone/Process/Process.h>
28 #include "RMonoTypes.h"
29 #include "RMonoAPIFunctionSimple_Def.h"
30 #include "RMonoAPIFunction_Def.h"
31 #include "RMonoAPIFunctionTypeAdapters.h"
32 #include "../IPCVector.h"
33 #include "../util.h"
34 #include "visit_struct/visit_struct_intrusive.hpp"
35 #include "abi/RMonoABITypeTraits.h"
36 
37 
38 
39 
40 #define REMOTEMONO_API_PART_BEGIN(structname, part) \
41  struct structname ## Part ## part { \
42  BEGIN_VISITABLES(structname ## Part ## part);
43 #define REMOTEMONO_API_PART_END() \
44  END_VISITABLES; \
45  };
46 
47 #define REMOTEMONO_API_PART_LIST1(structname) structname ## Part1
48 #define REMOTEMONO_API_PART_LIST2(structname) structname ## Part1, structname ## Part2
49 #define REMOTEMONO_API_PART_LIST3(structname) structname ## Part1, structname ## Part2, structname ## Part3
50 #define REMOTEMONO_API_PART_LIST4(structname) structname ## Part1, structname ## Part2, structname ## Part3, structname ## Part4
51 #define REMOTEMONO_API_PART_LIST5(structname) structname ## Part1, structname ## Part2, structname ## Part3, structname ## Part4, structname ## Part5
52 #define REMOTEMONO_API_PART_LISTN(structname, n) REMOTEMONO_API_PART_LIST ## n(structname)
53 
54 #define REMOTEMONO_API_MAIN_DECLARE(structname, nparts) \
55  struct structname : public REMOTEMONO_API_PART_LISTN(structname, nparts) { \
56  using internal_api_parts = PackHelper<REMOTEMONO_API_PART_LISTN(structname, nparts)>; \
57  };
58 
59 #define REMOTEMONO_API_FUNCTYPE(required, ret, ...) \
60  RMonoAPIFunction<ABI, required, ret, __VA_ARGS__>
61 #define REMOTEMONO_API(name, required, ret, ...) \
62  VISITABLE(REMOTEMONO_API_FUNCTYPE(required, ret, __VA_ARGS__), name);
63 
64 #define REMOTEMONO_API_SIMPLE_FUNCTYPE(ret, ...) \
65  RMonoAPIFunctionSimple<ret, __VA_ARGS__>
66 #define REMOTEMONO_API_SIMPLE(name, ret, ...) \
67  VISITABLE(REMOTEMONO_API_SIMPLE_FUNCTYPE(ret, __VA_ARGS__), name);
68 
69 
70 
71 
72 
73 namespace remotemono
74 {
75 
76 
77 
83 template <typename ABI>
85 {
86 private:
87  REMOTEMONO_ABI_TYPETRAITS_TYPEDEFS(RMonoABITypeTraits<ABI>)
88 
89  template <typename TypeT> using ParamOut = tags::ParamOut<TypeT>;
90  template <typename TypeT> using ParamInOut = tags::ParamInOut<TypeT>;
91  template <typename TypeT> using ParamOvwrInOut = tags::ParamOvwrInOut<TypeT>;
92  template <typename TypeT> using ParamException = tags::ParamException<TypeT>;
93  template <typename TypeT> using ReturnOwn = tags::ReturnOwn<TypeT>;
94 
95  using string = std::string;
96  using u16string = std::u16string;
97  using u32string = std::u32string;
98 
99  using string_view = std::string_view;
100  using u16string_view = std::u16string_view;
101  using u32string_view = std::u32string_view;
102 
103  using Variant = RMonoVariant;
105 
106 public:
107 
108  // NOTE: Be sure to USE INTERNAL TYPES in the API function definitions below. If one of the types in RETURN or ARGUMENTS starts
109  // with 'rmono_' or 'RMono' instead of 'irmono_' or 'IRMono', then something is wrong.
110 
111  // **********************************************************
112  // * *
113  // * MAIN MONO API *
114  // * *
115  // **********************************************************
116 
117  // NOTE: For the functions listed under MonoAPI only, the actual function name in the remote process will have 'mono_' prepended.
118  // This is to keep this definition table short and readable.
119 
120  // TODO: mono_string_chars() - Returns char*, but doesn't seem to pass ownership?
121 
122 REMOTEMONO_API_PART_BEGIN(MonoAPI, 1)
123 
124  // FUNCTION REQD RETURN ARGUMENTS
125 
126  REMOTEMONO_API( free, false, void, irmono_voidp )
127 
128  REMOTEMONO_API( jit_init, false, IRMonoDomainPtr, string_view )
129  REMOTEMONO_API( jit_cleanup, false, void, IRMonoDomainPtr )
130 
131  REMOTEMONO_API( get_root_domain, true, IRMonoDomainPtr )
132  REMOTEMONO_API( domain_set, false, irmono_bool, IRMonoDomainPtr, irmono_bool )
133  REMOTEMONO_API( domain_get, false, IRMonoDomainPtr )
134  REMOTEMONO_API( domain_foreach, false, void, irmono_funcp, irmono_voidp )
135  REMOTEMONO_API( domain_create_appdomain, false, IRMonoDomainPtr, string_view, string_view )
136  REMOTEMONO_API( domain_assembly_open, false, IRMonoAssemblyPtr, IRMonoDomainPtr, string_view )
137  REMOTEMONO_API( domain_unload, false, void, IRMonoDomainPtr )
138  REMOTEMONO_API( domain_get_friendly_name, false, string, IRMonoDomainPtr )
139 
140  REMOTEMONO_API( thread_attach, true, IRMonoThreadPtr, IRMonoDomainPtr )
141  REMOTEMONO_API( thread_detach, true, void, IRMonoThreadPtr )
142 
143  REMOTEMONO_API( assembly_close, false, void, IRMonoAssemblyPtr )
144  REMOTEMONO_API( assembly_foreach, false, void, irmono_funcp, irmono_voidp )
145  REMOTEMONO_API( assembly_get_image, false, IRMonoImagePtr, IRMonoAssemblyPtr )
146  REMOTEMONO_API( assembly_get_name, false, IRMonoAssemblyNamePtr, IRMonoAssemblyPtr )
147  REMOTEMONO_API( assembly_name_new, false, ReturnOwn<IRMonoAssemblyNamePtr>,
148  string_view )
149  REMOTEMONO_API( assembly_name_parse, false, irmono_bool, string_view, IRMonoAssemblyNamePtr )
150  REMOTEMONO_API( assembly_name_free, false, void, IRMonoAssemblyNamePtrRaw )
151  REMOTEMONO_API( assembly_name_get_name, false, std::string, IRMonoAssemblyNamePtr )
152  REMOTEMONO_API( assembly_name_get_culture, false, std::string, IRMonoAssemblyNamePtr )
153  REMOTEMONO_API( assembly_name_get_version, false, uint16_t, IRMonoAssemblyNamePtr, ParamOut<uint16_t>,
154  ParamOut<uint16_t>, ParamOut<uint16_t> )
155  REMOTEMONO_API( stringify_assembly_name, false, ReturnOwn<string>, IRMonoAssemblyNamePtr )
156  REMOTEMONO_API( assembly_loaded, false, IRMonoAssemblyPtr, IRMonoAssemblyNamePtr )
157 
158  REMOTEMONO_API( image_get_name, false, string, IRMonoImagePtr )
159  REMOTEMONO_API( image_get_filename, false, string, IRMonoImagePtr )
160  REMOTEMONO_API( image_get_table_info, false, IRMonoTableInfoPtr, IRMonoImagePtr, irmono_int )
161  REMOTEMONO_API( table_info_get_rows, false, irmono_int, IRMonoTableInfoPtr )
162  REMOTEMONO_API( image_rva_map, false, irmono_voidp, IRMonoImagePtr, uint32_t )
163 
164  REMOTEMONO_API( metadata_decode_row_col, false, uint32_t, IRMonoTableInfoPtr, irmono_int, irmono_uint )
165  REMOTEMONO_API( metadata_guid_heap, false, irmono_voidp, IRMonoImagePtr, uint32_t )
166  REMOTEMONO_API( metadata_string_heap, false, string, IRMonoImagePtr, uint32_t )
167  REMOTEMONO_API( metadata_blob_heap, false, irmono_voidp, IRMonoImagePtr, uint32_t )
168  REMOTEMONO_API( metadata_user_string, false, string, IRMonoImagePtr, uint32_t )
169  REMOTEMONO_API( metadata_decode_blob_size, false, uint32_t, irmono_voidp, ParamOut<irmono_voidp> )
170 
171  REMOTEMONO_API( get_object_class, false, IRMonoClassPtr )
172  REMOTEMONO_API( get_int16_class, false, IRMonoClassPtr )
173  REMOTEMONO_API( get_int32_class, false, IRMonoClassPtr )
174  REMOTEMONO_API( get_int64_class, false, IRMonoClassPtr )
175  REMOTEMONO_API( get_double_class, false, IRMonoClassPtr )
176  REMOTEMONO_API( get_single_class, false, IRMonoClassPtr )
177  REMOTEMONO_API( get_string_class, false, IRMonoClassPtr )
178  REMOTEMONO_API( get_thread_class, false, IRMonoClassPtr )
179  REMOTEMONO_API( get_uint16_class, false, IRMonoClassPtr )
180  REMOTEMONO_API( get_uint32_class, false, IRMonoClassPtr )
181  REMOTEMONO_API( get_uint64_class, false, IRMonoClassPtr )
182  REMOTEMONO_API( get_void_class, false, IRMonoClassPtr )
183  REMOTEMONO_API( get_array_class, false, IRMonoClassPtr )
184  REMOTEMONO_API( get_boolean_class, false, IRMonoClassPtr )
185  REMOTEMONO_API( get_byte_class, false, IRMonoClassPtr )
186  REMOTEMONO_API( get_sbyte_class, false, IRMonoClassPtr )
187  REMOTEMONO_API( get_char_class, false, IRMonoClassPtr )
188  REMOTEMONO_API( get_exception_class, false, IRMonoClassPtr )
189 
190  REMOTEMONO_API( class_vtable, false, IRMonoVTablePtr, IRMonoDomainPtr, IRMonoClassPtr )
191  REMOTEMONO_API( runtime_class_init, false, void, IRMonoVTablePtr )
192  REMOTEMONO_API( class_get_parent, false, IRMonoClassPtr, IRMonoClassPtr )
193  REMOTEMONO_API( class_get_type, false, IRMonoTypePtr, IRMonoClassPtr )
194  REMOTEMONO_API( class_from_name, false, IRMonoClassPtr, IRMonoImagePtr, string_view, string_view )
195  REMOTEMONO_API( class_from_mono_type, false, IRMonoClassPtr, IRMonoTypePtr )
196  REMOTEMONO_API( class_get_name, false, string, IRMonoClassPtr )
197  REMOTEMONO_API( class_get_namespace, false, string, IRMonoClassPtr )
198  REMOTEMONO_API( class_get_fields, false, IRMonoClassFieldPtr, IRMonoClassPtr, irmono_voidpp )
199  REMOTEMONO_API( class_get_methods, false, IRMonoMethodPtr, IRMonoClassPtr, irmono_voidpp )
200  REMOTEMONO_API( class_get_properties, false, IRMonoPropertyPtr, IRMonoClassPtr, irmono_voidpp )
201  REMOTEMONO_API( class_get_field_from_name, false, IRMonoClassFieldPtr, IRMonoClassPtr, string_view )
202  REMOTEMONO_API( class_get_method_from_name, false, IRMonoMethodPtr, IRMonoClassPtr, string_view, irmono_int )
203  REMOTEMONO_API( class_get_property_from_name, false, IRMonoPropertyPtr, IRMonoClassPtr, string_view )
204  REMOTEMONO_API( class_get_element_class, false, IRMonoClassPtr, IRMonoClassPtr )
205  REMOTEMONO_API( class_get_flags, false, uint32_t, IRMonoClassPtr )
206  REMOTEMONO_API( class_get_rank, false, irmono_int, IRMonoClassPtr )
207  REMOTEMONO_API( class_is_valuetype, true, irmono_bool, IRMonoClassPtr )
208  REMOTEMONO_API( class_data_size, false, uint32_t, IRMonoClassPtr )
209  REMOTEMONO_API( class_instance_size, false, uint32_t, IRMonoClassPtr )
210  REMOTEMONO_API( class_value_size, true, int32_t, IRMonoClassPtr, ParamOut<uint32_t> )
211 
212  REMOTEMONO_API( type_get_object, false, IRMonoReflectionTypePtr, IRMonoDomainPtr, IRMonoTypePtr )
213  REMOTEMONO_API( type_get_name, false, ReturnOwn<string>, IRMonoTypePtr )
214  REMOTEMONO_API( type_get_class, false, IRMonoClassPtr, IRMonoTypePtr )
215  REMOTEMONO_API( type_get_type, false, irmono_int, IRMonoTypePtr )
216  REMOTEMONO_API( type_is_byref, false, irmono_bool, IRMonoTypePtr )
217  REMOTEMONO_API( type_is_pointer, false, irmono_bool, IRMonoTypePtr )
218  REMOTEMONO_API( type_is_reference, false, irmono_bool, IRMonoTypePtr )
219  REMOTEMONO_API( type_is_struct, false, irmono_bool, IRMonoTypePtr )
220  REMOTEMONO_API( type_is_void, false, irmono_bool, IRMonoTypePtr )
221  REMOTEMONO_API( type_size, false, irmono_int, IRMonoTypePtr, ParamOut<irmono_int> )
222  REMOTEMONO_API( type_stack_size, false, irmono_int, IRMonoTypePtr, ParamOut<irmono_int> )
223 
224  REMOTEMONO_API( field_get_name, false, string, IRMonoClassFieldPtr )
225  REMOTEMONO_API( field_get_flags, false, uint32_t, IRMonoClassFieldPtr )
226  REMOTEMONO_API( field_get_parent, false, IRMonoClassPtr, IRMonoClassFieldPtr )
227  REMOTEMONO_API( field_get_type, false, IRMonoTypePtr, IRMonoClassFieldPtr )
228  REMOTEMONO_API( field_set_value, false, void, IRMonoObjectPtr, IRMonoClassFieldPtr, Variant )
229  REMOTEMONO_API( field_get_value, false, void, IRMonoObjectPtr, IRMonoClassFieldPtr, ParamOut<Variant> )
230  REMOTEMONO_API( field_get_value_object, false, IRMonoObjectPtr, IRMonoDomainPtr, IRMonoClassFieldPtr, IRMonoObjectPtr )
231  REMOTEMONO_API( field_static_set_value, false, void, IRMonoVTablePtr, IRMonoClassFieldPtr, Variant )
232  REMOTEMONO_API( field_static_get_value, false, void, IRMonoVTablePtr, IRMonoClassFieldPtr, ParamOut<Variant> )
233  REMOTEMONO_API( field_get_offset, false, uint32_t, IRMonoClassFieldPtr )
234 
235 REMOTEMONO_API_PART_END()
236 REMOTEMONO_API_PART_BEGIN(MonoAPI, 2)
237 
238  REMOTEMONO_API( method_get_class, false, IRMonoClassPtr, IRMonoMethodPtr )
239  REMOTEMONO_API( method_get_name, false, string, IRMonoMethodPtr )
240  REMOTEMONO_API( method_get_flags, false, uint32_t, IRMonoMethodPtr, ParamOut<uint32_t> )
241  REMOTEMONO_API( method_full_name, false, ReturnOwn<string>, IRMonoMethodPtr, irmono_bool )
242  REMOTEMONO_API( method_signature, false, IRMonoMethodSignaturePtr, IRMonoMethodPtr )
243  REMOTEMONO_API( method_get_header, false, IRMonoMethodHeaderPtr, IRMonoMethodPtr )
244  REMOTEMONO_API( method_header_get_code, false, irmono_voidp, IRMonoMethodHeaderPtr, ParamOut<uint32_t>,
245  ParamOut<uint32_t> )
246  REMOTEMONO_API( method_desc_new, false, ReturnOwn<IRMonoMethodDescPtr>,
247  string_view, irmono_bool )
248  REMOTEMONO_API( method_desc_free, false, void, IRMonoMethodDescPtrRaw )
249  REMOTEMONO_API( method_desc_match, false, irmono_bool, IRMonoMethodDescPtr, IRMonoMethodPtr )
250  REMOTEMONO_API( method_desc_search_in_class, false, IRMonoMethodPtr, IRMonoMethodDescPtr, IRMonoClassPtr )
251  REMOTEMONO_API( method_desc_search_in_image, false, IRMonoMethodPtr, IRMonoMethodDescPtr, IRMonoImagePtr )
252 
253  REMOTEMONO_API( property_get_name, false, string, IRMonoPropertyPtr )
254  REMOTEMONO_API( property_get_flags, false, uint32_t, IRMonoPropertyPtr )
255  REMOTEMONO_API( property_get_parent, false, IRMonoClassPtr, IRMonoPropertyPtr )
256  REMOTEMONO_API( property_get_set_method, false, IRMonoMethodPtr, IRMonoPropertyPtr )
257  REMOTEMONO_API( property_get_get_method, false, IRMonoMethodPtr, IRMonoPropertyPtr )
258  REMOTEMONO_API( property_get_value, false, IRMonoObjectPtr, IRMonoPropertyPtr, RMonoVariant,
259  ParamOvwrInOut<ParamOut<VariantArray>>,
260  ParamException<IRMonoExceptionPtr> )
261  REMOTEMONO_API( property_set_value, false, void, IRMonoPropertyPtr, RMonoVariant,
262  ParamOvwrInOut<VariantArray>,
263  ParamException<IRMonoExceptionPtr> )
264 
265  REMOTEMONO_API( signature_get_return_type, false, IRMonoTypePtr, IRMonoMethodSignaturePtr )
266  REMOTEMONO_API( signature_get_params, false, IRMonoTypePtr, IRMonoMethodSignaturePtr, irmono_voidpp )
267  REMOTEMONO_API( signature_get_call_conv, false, uint32_t, IRMonoMethodSignaturePtr )
268  REMOTEMONO_API( signature_get_desc, false, ReturnOwn<string>, IRMonoMethodSignaturePtr, irmono_bool )
269 
270  REMOTEMONO_API( object_get_class, true, IRMonoClassPtr, IRMonoObjectPtr )
271  REMOTEMONO_API( object_new, false, IRMonoObjectPtr, IRMonoDomainPtr, IRMonoClassPtr )
272  REMOTEMONO_API( runtime_object_init, false, void, Variant )
273  REMOTEMONO_API( object_unbox, true, Variant, IRMonoObjectPtr )
274  REMOTEMONO_API( value_box, false, IRMonoObjectPtr, IRMonoDomainPtr, IRMonoClassPtr, RMonoVariant )
275  REMOTEMONO_API( object_to_string, false, IRMonoStringPtr, Variant, ParamException<IRMonoExceptionPtr> )
276  REMOTEMONO_API( object_clone, false, IRMonoObjectPtr, IRMonoObjectPtr )
277  REMOTEMONO_API( object_get_domain, false, IRMonoDomainPtr, IRMonoObjectPtr )
278  REMOTEMONO_API( object_get_virtual_method, false, IRMonoMethodPtr, IRMonoObjectPtr, IRMonoMethodPtr )
279  REMOTEMONO_API( object_isinst, false, IRMonoObjectPtr, IRMonoObjectPtr, IRMonoClassPtr )
280  REMOTEMONO_API( object_get_size, false, irmono_uint, IRMonoObjectPtr )
281 
282  REMOTEMONO_API( string_new, false, IRMonoStringPtr, IRMonoDomainPtr, string_view )
283  REMOTEMONO_API( string_new_len, false, IRMonoStringPtr, IRMonoDomainPtr, string_view, irmono_uint )
284  REMOTEMONO_API( string_new_utf16, false, IRMonoStringPtr, IRMonoDomainPtr, u16string_view, int32_t )
285  REMOTEMONO_API( string_new_utf32, false, IRMonoStringPtr, IRMonoDomainPtr, u32string_view, int32_t )
286  REMOTEMONO_API( string_to_utf8, false, ReturnOwn<string>, IRMonoStringPtr )
287  REMOTEMONO_API( string_to_utf16, false, ReturnOwn<u16string>, IRMonoStringPtr )
288  REMOTEMONO_API( string_to_utf32, false, ReturnOwn<u32string>, IRMonoStringPtr )
289  REMOTEMONO_API( string_chars, false, u16string, IRMonoStringPtr )
290  REMOTEMONO_API( string_length, false, irmono_int, IRMonoStringPtr )
291  REMOTEMONO_API( string_equal, false, irmono_bool, IRMonoStringPtr, IRMonoStringPtr )
292 
293  REMOTEMONO_API( array_new, false, IRMonoArrayPtr, IRMonoDomainPtr, IRMonoClassPtr, irmono_uintptr_t )
294  REMOTEMONO_API( array_new_full, false, IRMonoArrayPtr, IRMonoDomainPtr, IRMonoClassPtr, irmono_voidp, irmono_voidp )
295  REMOTEMONO_API( array_class_get, false, IRMonoClassPtr, IRMonoClassPtr, uint32_t )
296  REMOTEMONO_API( array_addr_with_size, false, Variant, IRMonoArrayPtr, irmono_int, irmono_uintptr_t )
297  REMOTEMONO_API( array_length, false, irmono_uintptr_t, IRMonoArrayPtr )
298  REMOTEMONO_API( array_element_size, false, int32_t, IRMonoClassPtr )
299  REMOTEMONO_API( class_array_element_size, false, int32_t, IRMonoClassPtr )
300  REMOTEMONO_API( array_clone, false, IRMonoArrayPtr, IRMonoArrayPtr )
301 
302  REMOTEMONO_API( gchandle_new, true, irmono_gchandle, IRMonoObjectPtr, irmono_bool )
303  REMOTEMONO_API( gchandle_new_weakref, false, irmono_gchandle, IRMonoObjectPtr, irmono_bool )
304  REMOTEMONO_API( gchandle_get_target, true, IRMonoObjectPtrRaw, irmono_gchandle )
305  REMOTEMONO_API( gchandle_free, true, void, irmono_gchandle )
306 
307  REMOTEMONO_API( gc_collect, false, void, irmono_int )
308  REMOTEMONO_API( gc_max_generation, false, irmono_int )
309  REMOTEMONO_API( gc_get_generation, false, irmono_int, IRMonoObjectPtr )
310  REMOTEMONO_API( gc_wbarrier_set_arrayref, false, void, IRMonoArrayPtr, irmono_voidp, IRMonoObjectPtr )
311 
312  REMOTEMONO_API( runtime_invoke, false, IRMonoObjectPtr, IRMonoMethodPtr, Variant,
313  ParamOvwrInOut<VariantArray>,
314  ParamException<IRMonoExceptionPtr> )
315 
316  REMOTEMONO_API( compile_method, false, irmono_voidp, IRMonoMethodPtr )
317 
318  REMOTEMONO_API( jit_info_table_find, false, IRMonoJitInfoPtr, IRMonoDomainPtr, irmono_voidp )
319  REMOTEMONO_API( jit_info_get_code_start, false, irmono_voidp, IRMonoJitInfoPtr )
320  REMOTEMONO_API( jit_info_get_code_size, false, irmono_int, IRMonoJitInfoPtr )
321  REMOTEMONO_API( jit_info_get_method, false, IRMonoMethodPtr, IRMonoJitInfoPtr )
322 
323  REMOTEMONO_API( disasm_code, false, ReturnOwn<string>, IRMonoDisHelperPtr, IRMonoMethodPtr,
324  irmono_cbytep, irmono_cbytep )
325 REMOTEMONO_API_PART_END()
326 
327  REMOTEMONO_API_MAIN_DECLARE(MonoAPI, 2)
328 
329 
330 
331 
332 
333 
334 
335  // **********************************************************
336  // * *
337  // * MISC MONO API *
338  // * *
339  // **********************************************************
340 
341 REMOTEMONO_API_PART_BEGIN(MiscAPI, 1)
342 
343  // FUNCTION REQD RETURN ARGUMENTS
344 
345  REMOTEMONO_API( g_free, false, void, irmono_voidp )
346 
347 REMOTEMONO_API_PART_END()
348 
349  REMOTEMONO_API_MAIN_DECLARE(MiscAPI, 1)
350 
351 
352 
353 
354 
355 
356  // **********************************************************
357  // * *
358  // * BOILERPLATE API *
359  // * *
360  // **********************************************************
361 
362  // These functions are RemoteMono additions. They are created by assembleBoilerplateCode() and then injected into the remote process.
363 
364 REMOTEMONO_API_PART_BEGIN(BoilerplateAPI, 1)
365 
366  // FUNCTION RETURN ARGUMENTS
367 
368  REMOTEMONO_API_SIMPLE( rmono_foreach_ipcvec_adapter, void, irmono_voidp, irmono_voidp )
369  REMOTEMONO_API_SIMPLE( rmono_gchandle_pin, irmono_gchandle, irmono_gchandle )
370  REMOTEMONO_API_SIMPLE( rmono_array_setref, void, irmono_gchandle, irmono_uintptr_t, irmono_gchandle )
371 
372 REMOTEMONO_API_PART_END()
373 
374  REMOTEMONO_API_MAIN_DECLARE(BoilerplateAPI, 1)
375 };
376 
377 
378 
379 
383 template <typename ABI>
385  public RMonoAPIBackendStructs<ABI>::MonoAPI,
386  public RMonoAPIBackendStructs<ABI>::MiscAPI,
387  public RMonoAPIBackendStructs<ABI>::BoilerplateAPI
388 {
389 private:
390  REMOTEMONO_ABI_TYPETRAITS_TYPEDEFS(RMonoABITypeTraits<ABI>)
391 
392  typedef typename RMonoAPIBackendStructs<ABI>::MonoAPI MonoAPI;
393  typedef typename RMonoAPIBackendStructs<ABI>::MiscAPI MiscAPI;
394  typedef typename RMonoAPIBackendStructs<ABI>::BoilerplateAPI BoilerplateAPI;
395 
396 public:
398 
399 public:
400  RMonoAPIBackend(ABI* abi);
401  ~RMonoAPIBackend();
402 
411  void injectAPI(RMonoAPI* mono, blackbone::Process& process, blackbone::ThreadPtr workerThread);
412 
416  void uninjectAPI();
417 
418 
422  IPCVec& getIPCVector() { return ipcVec; }
423 
429  typename IPCVec::VectorPtr getIPCVectorInstance() { return ipcVecPtr; }
430 
431  bool isAPIFunctionSupported(const std::string& name) const { return validAPIFuncNames.find(name) != validAPIFuncNames.end(); }
432 
433 private:
434  ABI* getABI() { return abi; }
435 
436  std::string assembleBoilerplateCode();
437 
438  template <typename FuncT, typename MainT, typename... PartialT>
439  void foreachAPIPacked(MainT& main, FuncT func, PackHelper<PartialT...>);
440 
441  template <typename FuncT, typename FirstT, typename... OtherT>
442  void foreachAPIRecurse(FuncT func, FirstT& part, OtherT&... other);
443 
444  template <typename MainAPIT, typename FuncT>
445  void foreachAPI(MainAPIT& api, FuncT func);
446 
447 private:
448  ABI* abi;
449  blackbone::Process* process;
450  IPCVec ipcVec;
451  typename IPCVec::VectorPtr ipcVecPtr;
452  blackbone::MemBlock remDataBlock;
453  blackbone::ThreadPtr worker;
454  bool injected;
455  std::unordered_set<std::string> validAPIFuncNames;
456 
457  //MonoAPI monoAPI;
458  //MiscAPI miscAPI;
459  //BoilerplateAPI boilerAPI;
460 };
461 
462 
463 }
remotemono::RMonoAPI
Definition: RMonoAPI_Def.h:58
remotemono::IPCVector< irmono_voidp, irmono_voidp >
remotemono::RMonoAPIBackend::getIPCVectorInstance
IPCVec::VectorPtr getIPCVectorInstance()
Definition: RMonoAPIBackend_Def.h:429
remotemono::RMonoVariantArray
Definition: RMonoVariantArray_Def.h:47
remotemono::RMonoAPIBackend::uninjectAPI
void uninjectAPI()
Definition: RMonoAPIBackend_Impl.h:309
remotemono::RMonoAPIBackend::getIPCVector
IPCVec & getIPCVector()
Definition: RMonoAPIBackend_Def.h:422
remotemono::RMonoAPIBackend::injectAPI
void injectAPI(RMonoAPI *mono, blackbone::Process &process, blackbone::ThreadPtr workerThread)
Definition: RMonoAPIBackend_Impl.h:55
remotemono::RMonoVariant
Definition: RMonoVariant_Def.h:71
remotemono::RMonoAPIBackendStructs
Definition: RMonoAPIBackend_Def.h:85
remotemono::RMonoAPIBackend
Definition: RMonoAPIBackend_Def.h:388