@@ -307,8 +307,10 @@ impl Emu {
307307 log::debug!(" Dereferencing: mem_addr=0x{:x}, size={} bits", mem_addr, sz);
308308 }*/
309309
310- if let Some ( hook_fn) = self . hooks . hook_on_memory_read {
311- hook_fn ( self , self . regs ( ) . rip , mem_addr, sz)
310+ if let Some ( mut hook_fn) = self . hooks . hook_on_memory_read . take ( ) {
311+ let rip = self . regs ( ) . rip ;
312+ hook_fn ( self , rip, mem_addr, sz) ;
313+ self . hooks . hook_on_memory_read = Some ( hook_fn) ;
312314 }
313315
314316 value = match sz {
@@ -561,11 +563,13 @@ impl Emu {
561563
562564 let sz = self . get_operand_sz ( ins, noperand) ;
563565
564- let value2 = match self . hooks . hook_on_memory_write {
565- Some ( hook_fn) => {
566- hook_fn ( self , self . regs ( ) . rip , mem_addr, sz, value as u128 ) as u64
567- }
568- None => value,
566+ let value2 = if let Some ( mut hook_fn) = self . hooks . hook_on_memory_write . take ( ) {
567+ let rip = self . regs ( ) . rip ;
568+ let result = hook_fn ( self , rip, mem_addr, sz, value as u128 ) as u64 ;
569+ self . hooks . hook_on_memory_write = Some ( hook_fn) ;
570+ result
571+ } else {
572+ value
569573 } ;
570574
571575 let old_value = if self . cfg . trace_mem {
@@ -774,8 +778,10 @@ impl Emu {
774778 } ;
775779
776780 if do_derref {
777- if let Some ( hook_fn) = self . hooks . hook_on_memory_read {
778- hook_fn ( self , self . regs ( ) . rip , mem_addr, 128 )
781+ if let Some ( mut hook_fn) = self . hooks . hook_on_memory_read . take ( ) {
782+ let rip = self . regs ( ) . rip ;
783+ hook_fn ( self , rip, mem_addr, 128 ) ;
784+ self . hooks . hook_on_memory_read = Some ( hook_fn) ;
779785 }
780786
781787 let value: u128 = match self . maps . read_128bits_le ( mem_addr) {
@@ -816,9 +822,13 @@ impl Emu {
816822 }
817823 } ;
818824
819- let value2 = match self . hooks . hook_on_memory_write {
820- Some ( hook_fn) => hook_fn ( self , self . regs ( ) . rip , mem_addr, 128 , value) ,
821- None => value,
825+ let value2 = if let Some ( mut hook_fn) = self . hooks . hook_on_memory_write . take ( ) {
826+ let rip = self . regs ( ) . rip ;
827+ let result = hook_fn ( self , rip, mem_addr, 128 , value) ;
828+ self . hooks . hook_on_memory_write = Some ( hook_fn) ;
829+ result
830+ } else {
831+ value
822832 } ;
823833
824834 for ( i, b) in value2. to_le_bytes ( ) . iter ( ) . enumerate ( ) {
@@ -862,8 +872,10 @@ impl Emu {
862872 } ;
863873
864874 if do_derref {
865- if let Some ( hook_fn) = self . hooks . hook_on_memory_read {
866- hook_fn ( self , self . regs ( ) . rip , mem_addr, 256 )
875+ if let Some ( mut hook_fn) = self . hooks . hook_on_memory_read . take ( ) {
876+ let rip = self . regs ( ) . rip ;
877+ hook_fn ( self , rip, mem_addr, 256 ) ;
878+ self . hooks . hook_on_memory_read = Some ( hook_fn) ;
867879 }
868880
869881 let bytes = self . maps . read_bytes ( mem_addr, 32 ) ;
@@ -906,9 +918,13 @@ impl Emu {
906918
907919 // ymm dont support value modification from hook, for now
908920 let value_u128: u128 = ( ( value. 0 [ 1 ] as u128 ) << 64 ) | value. 0 [ 0 ] as u128 ;
909- let value2 = match self . hooks . hook_on_memory_write {
910- Some ( hook_fn) => hook_fn ( self , self . regs ( ) . rip , mem_addr, 256 , value_u128) ,
911- None => value_u128,
921+ let value2 = if let Some ( mut hook_fn) = self . hooks . hook_on_memory_write . take ( ) {
922+ let rip = self . regs ( ) . rip ;
923+ let result = hook_fn ( self , rip, mem_addr, 256 , value_u128) ;
924+ self . hooks . hook_on_memory_write = Some ( hook_fn) ;
925+ result
926+ } else {
927+ value_u128
912928 } ;
913929
914930 let mut bytes: Vec < u8 > = vec ! [ 0 ; 32 ] ;
0 commit comments