2525#include "box32context.h"
2626#endif
2727
28- KHASH_MAP_INIT_INT64 (bridgemap , uintptr_t )
28+ KHASH_MAP_INIT_INT128 (bridgemap , uintptr_t )
2929
3030typedef struct brick_s brick_t ;
3131typedef struct brick_s {
@@ -99,12 +99,8 @@ void FreeBridge(bridge_t** bridge)
9999 * bridge = NULL ;
100100}
101101
102- #ifdef HAVE_TRACE
103- void addBridgeName (void * addr , const char * name );
104- #endif
105-
106102//static const char* default_bridge = "bridge???";
107- uintptr_t AddBridge (bridge_t * bridge , wrapper_t w , void * fnc , int N , const char * name )
103+ uintptr_t AddBridge2 (bridge_t * bridge , wrapper_t w , void * fnc , void * fnc2 , int N , const char * name )
108104{
109105 brick_t * b = NULL ;
110106 int sz = -1 ;
@@ -120,7 +116,8 @@ uintptr_t AddBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N, const char*
120116 sz = b -> sz ;
121117 b -> sz ++ ;
122118 // add bridge to map, for fast recovery
123- khint_t k = kh_put (bridgemap , bridge -> bridgemap , (uintptr_t )fnc , & ret );
119+ khint128_t key = (uintptr_t )fnc | (khint128_t )((uintptr_t )fnc2 )<<64 ;
120+ khint_t k = kh_put (bridgemap , bridge -> bridgemap , key , & ret );
124121 kh_value (bridge -> bridgemap , k ) = (uintptr_t )& b -> b [sz ].CC ;
125122 mutex_unlock (& my_context -> mutex_bridge );
126123
@@ -130,11 +127,17 @@ uintptr_t AddBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N, const char*
130127 b -> b [sz ].f = (uintptr_t )fnc ;
131128 b -> b [sz ].C3 = N ?0xC2 :0xC3 ;
132129 b -> b [sz ].N = N ;
133- b -> b [sz ].name = name /*?name:default_bridge*/ ;
130+ b -> b [sz ].func = fnc2 ?1 :0 ;
131+ b -> b [sz ].name_or_func = fnc2 ?(void * )name :fnc2 ;
134132
135133 return (uintptr_t )& b -> b [sz ].CC ;
136134}
137135
136+ uintptr_t AddBridge (bridge_t * bridge , wrapper_t w , void * fnc , int N , const char * name )
137+ {
138+ return AddBridge2 (bridge , w , fnc , NULL , N , name );
139+ }
140+
138141uintptr_t CheckBridged (bridge_t * bridge , void * fnc )
139142{
140143 // check if function alread have a bridge (the function wrapper will not be tested)
@@ -144,6 +147,16 @@ uintptr_t CheckBridged(bridge_t* bridge, void* fnc)
144147 return kh_value (bridge -> bridgemap , k );
145148}
146149
150+ uintptr_t CheckBridged2 (bridge_t * bridge , void * fnc , void * fnc2 )
151+ {
152+ // check if function alread have a bridge (the function wrapper will not be tested)
153+ khint128_t key = (uintptr_t )fnc | (khint128_t )((uintptr_t )fnc2 )<<64 ;
154+ khint_t k = kh_get (bridgemap , bridge -> bridgemap , key );
155+ if (k == kh_end (bridge -> bridgemap ))
156+ return 0 ;
157+ return kh_value (bridge -> bridgemap , k );
158+ }
159+
147160uintptr_t AddCheckBridge (bridge_t * bridge , wrapper_t w , void * fnc , int N , const char * name )
148161{
149162 if (!fnc && w )
@@ -154,6 +167,16 @@ uintptr_t AddCheckBridge(bridge_t* bridge, wrapper_t w, void* fnc, int N, const
154167 return ret ;
155168}
156169
170+ uintptr_t AddCheckBridge2 (bridge_t * bridge , wrapper_t w , void * fnc , void * fnc2 , int N , const char * name )
171+ {
172+ if (!fnc && w )
173+ return 0 ;
174+ uintptr_t ret = CheckBridged2 (bridge , fnc , fnc2 );
175+ if (!ret )
176+ ret = AddBridge2 (bridge , w , fnc , fnc2 , N , name );
177+ return ret ;
178+ }
179+
157180uintptr_t AddAutomaticBridge (bridge_t * bridge , wrapper_t w , void * fnc , int N , const char * name )
158181{
159182 if (!fnc )
@@ -260,8 +283,32 @@ const char* getBridgeName(void* addr)
260283 if (one -> C3 == 0xC3 && IsBridgeSignature (one -> S , one -> C )) {
261284 if (one -> w == NULL )
262285 return "ExitEmulation" ;
263- else
264- return one -> name ;
286+ else {
287+ if (one -> func )
288+ return GetNativeName (one -> name_or_func );
289+ else
290+ return one -> name_or_func ;
291+ }
292+ }
293+ return NULL ;
294+ }
295+
296+ const char * getBridgeFunc2 (void * addr )
297+ {
298+ if (!memExist ((uintptr_t )addr ))
299+ return NULL ;
300+ if (!(getProtection ((uintptr_t )addr )& PROT_READ ))
301+ return NULL ;
302+ onebridge_t * one = (onebridge_t * )(((uintptr_t )addr & ~(sizeof (onebridge_t )- 1 ))); // align to start of bridge
303+ if (one -> C3 == 0xC3 && IsBridgeSignature (one -> S , one -> C )) {
304+ if (one -> w == NULL )
305+ return NULL ;
306+ else {
307+ if (one -> func )
308+ return one -> name_or_func ;
309+ else
310+ return NULL ;
311+ }
265312 }
266313 return NULL ;
267314}
0 commit comments