1
1
#![ allow( non_camel_case_types) ]
2
2
#![ allow( dead_code) ]
3
3
4
- use crate :: Unicorn ;
4
+ use crate :: { Unicorn , UnicornInner } ;
5
5
6
6
use super :: unicorn_const:: { uc_error, Arch , HookType , MemRegion , MemType , Mode , Query } ;
7
- use core:: ffi:: c_void;
7
+ use alloc:: rc:: Weak ;
8
+ use core:: { cell:: UnsafeCell , ffi:: c_void} ;
8
9
use libc:: { c_char, c_int} ;
9
10
10
11
pub type uc_handle = * mut c_void ;
@@ -89,7 +90,7 @@ extern "C" {
89
90
90
91
pub struct UcHook < ' a , D : ' a , F : ' a > {
91
92
pub callback : F ,
92
- pub uc : Unicorn < ' a , D > ,
93
+ pub uc : Weak < UnsafeCell < UnicornInner < ' a , D > > > ,
93
94
}
94
95
95
96
pub trait IsUcHook < ' a > { }
@@ -106,8 +107,11 @@ where
106
107
F : FnMut ( & mut crate :: Unicorn < D > , u64 , usize ) -> u64 ,
107
108
{
108
109
let user_data = unsafe { & mut * user_data } ;
109
- debug_assert_eq ! ( uc, user_data. uc. get_handle( ) ) ;
110
- ( user_data. callback ) ( & mut user_data. uc , offset, size)
110
+ let mut user_data_uc = Unicorn {
111
+ inner : user_data. uc . upgrade ( ) . unwrap ( ) ,
112
+ } ;
113
+ debug_assert_eq ! ( uc, user_data_uc. get_handle( ) ) ;
114
+ ( user_data. callback ) ( & mut user_data_uc, offset, size)
111
115
}
112
116
113
117
pub extern "C" fn mmio_write_callback_proxy < D , F > (
@@ -120,8 +124,11 @@ pub extern "C" fn mmio_write_callback_proxy<D, F>(
120
124
F : FnMut ( & mut crate :: Unicorn < D > , u64 , usize , u64 ) ,
121
125
{
122
126
let user_data = unsafe { & mut * user_data } ;
123
- debug_assert_eq ! ( uc, user_data. uc. get_handle( ) ) ;
124
- ( user_data. callback ) ( & mut user_data. uc , offset, size, value) ;
127
+ let mut user_data_uc = Unicorn {
128
+ inner : user_data. uc . upgrade ( ) . unwrap ( ) ,
129
+ } ;
130
+ debug_assert_eq ! ( uc, user_data_uc. get_handle( ) ) ;
131
+ ( user_data. callback ) ( & mut user_data_uc, offset, size, value) ;
125
132
}
126
133
127
134
pub extern "C" fn code_hook_proxy < D , F > (
@@ -133,8 +140,11 @@ pub extern "C" fn code_hook_proxy<D, F>(
133
140
F : FnMut ( & mut crate :: Unicorn < D > , u64 , u32 ) ,
134
141
{
135
142
let user_data = unsafe { & mut * user_data } ;
136
- debug_assert_eq ! ( uc, user_data. uc. get_handle( ) ) ;
137
- ( user_data. callback ) ( & mut user_data. uc , address, size) ;
143
+ let mut user_data_uc = Unicorn {
144
+ inner : user_data. uc . upgrade ( ) . unwrap ( ) ,
145
+ } ;
146
+ debug_assert_eq ! ( uc, user_data_uc. get_handle( ) ) ;
147
+ ( user_data. callback ) ( & mut user_data_uc, address, size) ;
138
148
}
139
149
140
150
pub extern "C" fn block_hook_proxy < D , F > (
@@ -146,8 +156,11 @@ pub extern "C" fn block_hook_proxy<D, F>(
146
156
F : FnMut ( & mut crate :: Unicorn < D > , u64 , u32 ) ,
147
157
{
148
158
let user_data = unsafe { & mut * user_data } ;
149
- debug_assert_eq ! ( uc, user_data. uc. get_handle( ) ) ;
150
- ( user_data. callback ) ( & mut user_data. uc , address, size) ;
159
+ let mut user_data_uc = Unicorn {
160
+ inner : user_data. uc . upgrade ( ) . unwrap ( ) ,
161
+ } ;
162
+ debug_assert_eq ! ( uc, user_data_uc. get_handle( ) ) ;
163
+ ( user_data. callback ) ( & mut user_data_uc, address, size) ;
151
164
}
152
165
153
166
pub extern "C" fn mem_hook_proxy < D , F > (
@@ -162,39 +175,52 @@ where
162
175
F : FnMut ( & mut crate :: Unicorn < D > , MemType , u64 , usize , i64 ) -> bool ,
163
176
{
164
177
let user_data = unsafe { & mut * user_data } ;
165
- debug_assert_eq ! ( uc, user_data. uc. get_handle( ) ) ;
166
- ( user_data. callback ) ( & mut user_data. uc , mem_type, address, size as usize , value)
178
+ let mut user_data_uc = Unicorn {
179
+ inner : user_data. uc . upgrade ( ) . unwrap ( ) ,
180
+ } ;
181
+ debug_assert_eq ! ( uc, user_data_uc. get_handle( ) ) ;
182
+ ( user_data. callback ) ( & mut user_data_uc, mem_type, address, size as usize , value)
167
183
}
168
184
169
185
pub extern "C" fn intr_hook_proxy < D , F > ( uc : uc_handle , value : u32 , user_data : * mut UcHook < D , F > )
170
186
where
171
187
F : FnMut ( & mut crate :: Unicorn < D > , u32 ) ,
172
188
{
173
189
let user_data = unsafe { & mut * user_data } ;
174
- debug_assert_eq ! ( uc, user_data. uc. get_handle( ) ) ;
175
- ( user_data. callback ) ( & mut user_data. uc , value) ;
190
+ let mut user_data_uc = Unicorn {
191
+ inner : user_data. uc . upgrade ( ) . unwrap ( ) ,
192
+ } ;
193
+ debug_assert_eq ! ( uc, user_data_uc. get_handle( ) ) ;
194
+ ( user_data. callback ) ( & mut user_data_uc, value) ;
176
195
}
177
196
178
197
pub extern "C" fn insn_in_hook_proxy < D , F > (
179
198
uc : uc_handle ,
180
199
port : u32 ,
181
200
size : usize ,
182
201
user_data : * mut UcHook < D , F > ,
183
- ) where
202
+ ) -> u32
203
+ where
184
204
F : FnMut ( & mut crate :: Unicorn < D > , u32 , usize ) -> u32 ,
185
205
{
186
206
let user_data = unsafe { & mut * user_data } ;
187
- debug_assert_eq ! ( uc, user_data. uc. get_handle( ) ) ;
188
- ( user_data. callback ) ( & mut user_data. uc , port, size) ;
207
+ let mut user_data_uc = Unicorn {
208
+ inner : user_data. uc . upgrade ( ) . unwrap ( ) ,
209
+ } ;
210
+ debug_assert_eq ! ( uc, user_data_uc. get_handle( ) ) ;
211
+ ( user_data. callback ) ( & mut user_data_uc, port, size)
189
212
}
190
213
191
214
pub extern "C" fn insn_invalid_hook_proxy < D , F > ( uc : uc_handle , user_data : * mut UcHook < D , F > ) -> bool
192
215
where
193
216
F : FnMut ( & mut crate :: Unicorn < D > ) -> bool ,
194
217
{
195
218
let user_data = unsafe { & mut * user_data } ;
196
- debug_assert_eq ! ( uc, user_data. uc. get_handle( ) ) ;
197
- ( user_data. callback ) ( & mut user_data. uc )
219
+ let mut user_data_uc = Unicorn {
220
+ inner : user_data. uc . upgrade ( ) . unwrap ( ) ,
221
+ } ;
222
+ debug_assert_eq ! ( uc, user_data_uc. get_handle( ) ) ;
223
+ ( user_data. callback ) ( & mut user_data_uc)
198
224
}
199
225
200
226
pub extern "C" fn insn_out_hook_proxy < D , F > (
@@ -207,15 +233,21 @@ pub extern "C" fn insn_out_hook_proxy<D, F>(
207
233
F : FnMut ( & mut crate :: Unicorn < D > , u32 , usize , u32 ) ,
208
234
{
209
235
let user_data = unsafe { & mut * user_data } ;
210
- debug_assert_eq ! ( uc, user_data. uc. get_handle( ) ) ;
211
- ( user_data. callback ) ( & mut user_data. uc , port, size, value) ;
236
+ let mut user_data_uc = Unicorn {
237
+ inner : user_data. uc . upgrade ( ) . unwrap ( ) ,
238
+ } ;
239
+ debug_assert_eq ! ( uc, user_data_uc. get_handle( ) ) ;
240
+ ( user_data. callback ) ( & mut user_data_uc, port, size, value) ;
212
241
}
213
242
214
243
pub extern "C" fn insn_sys_hook_proxy < D , F > ( uc : uc_handle , user_data : * mut UcHook < D , F > )
215
244
where
216
245
F : FnMut ( & mut crate :: Unicorn < D > ) ,
217
246
{
218
247
let user_data = unsafe { & mut * user_data } ;
219
- debug_assert_eq ! ( uc, user_data. uc. get_handle( ) ) ;
220
- ( user_data. callback ) ( & mut user_data. uc ) ;
248
+ let mut user_data_uc = Unicorn {
249
+ inner : user_data. uc . upgrade ( ) . unwrap ( ) ,
250
+ } ;
251
+ debug_assert_eq ! ( uc, user_data_uc. get_handle( ) ) ;
252
+ ( user_data. callback ) ( & mut user_data_uc) ;
221
253
}
0 commit comments