Advertisement
Guest User

Untitled

a guest
Dec 19th, 2018
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.93 KB | None | 0 0
  1. function restoreOrigBytes(sender)
  2. selectedAddress_redo = disassemblerview_getSelectedAddress(redo_dv)
  3. if origBytesTable[selectedAddress_redo]==nil then return end
  4.  
  5. local bytes={}
  6. local start=origBytesTable[selectedAddress_redo].startaddress
  7. local size=origBytesTable[selectedAddress_redo].size
  8.  
  9. --prepare subset
  10. for i=1,size do bytes[#bytes+1]=origBytesTable[start+i-1].byte end
  11.  
  12. local script=string.format('%X',start)..':\r\n'..'db '..'#'..(table.concat(bytes,' #'))
  13.  
  14. skip_myAssemblerWithRedo=true
  15. if not autoAssemble(script) then return nil end
  16. skip_myAssemblerWithRedo=false
  17. end
  18.  
  19. skip_myAssemblerWithRedo=false
  20. function myAssemblerWithRedo(addr,inst)
  21.  
  22. if skip_myAssemblerWithRedo -- forced skip?
  23. or
  24. origBytesTable[addr]~=nil -- we already have collected orig bytes
  25. then return nil end
  26.  
  27. local origsize=getInstructionSize(addr)
  28. local sizes={}
  29. local tmpVar=0
  30.  
  31. -- get sizes of those next lines
  32. for i=1,20 do
  33. sizes[i]=getInstructionSize(addr+tmpVar)
  34. tmpVar=tmpVar+sizes[i]
  35. end
  36.  
  37. --get bytes of those next lines
  38. local originalbytes=readBytes(addr,tmpVar,true)
  39. if originalbytes==nil then return nil end
  40.  
  41. -- save original bytes if not already saved
  42. tmpVar=1
  43. for i=1,20 do
  44. for j=1,sizes[i] do
  45. local tmp={startaddress=addr, byte=originalbytes[tmpVar], size=sizes[i]}
  46. if not origBytesTable[addr+j-1] then origBytesTable[addr+j-1]=tmp end
  47. tmpVar=tmpVar+1
  48. end
  49. addr=addr+sizes[i]
  50. end
  51.  
  52. return nil
  53. end
  54.  
  55. getVisibleDisassembler().OnDisassembleOverride =
  56. function (vd, a, ldd)
  57. if origBytesTable[a]==nil then return nil,nil end -- 100% not changed
  58.  
  59. disAsm_redo.syntaxhighlighting=vd.syntaxhighlighting
  60. disAsm_redo.disassemble(a)
  61.  
  62. local modified=false
  63. local startbyte=origBytesTable[a].startaddress
  64. local endbyte=startbyte+origBytesTable[a].size-1
  65.  
  66. -- search for differences
  67. for i=startbyte,endbyte do
  68. if disAsm_redo.LastDisassembleData.bytes[i-origBytesTable[a].startaddress+1]~=
  69. origBytesTable[i].byte
  70. then modified=true break end
  71. end
  72.  
  73. if not modified then return nil,nil end -- bytes the same, not modified
  74.  
  75. for k,v in pairs(disAsm_redo.LastDisassembleData) do ldd[k]=v end
  76.  
  77. ldd.opcode=' '..ldd.opcode -- add few spaces at the beginning
  78. return ldd.opcode,ldd.description
  79. end
  80.  
  81. function addRedoMenuItem()
  82. redo_dv=getMemoryViewForm().DisassemblerView
  83.  
  84. if redoMenuItem==nil then
  85. local pmenu=redo_dv.PopupMenu
  86. redoMenuItem=createMenuItem(pmenu)
  87. pmenu.Items.add(redoMenuItem)
  88. end
  89. redoMenuItem.Caption='Restore Original Bytes'
  90. redoMenuItem.Shortcut='Ctrl+Shift+R'
  91. redoMenuItem.OnClick=restoreOrigBytes
  92. end
  93.  
  94. if myAssemblerWithRedo_ID==nil then myAssemblerWithRedo_ID=registerAssembler(myAssemblerWithRedo) end
  95. if disAsm_redo==nil then disAsm_redo=createDisassembler() end
  96. if origBytesTable==nil then origBytesTable={} end
  97.  
  98. addRedoMenuItem()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement