Advertisement
TheyCallMeTim13

I2CETableCEA.lua

Oct 2nd, 2018
661
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 20.80 KB | None | 0 0
  1. --[====================================================================================================================[
  2.  
  3. I2 Cheat Engine CEA File Assembler
  4.  
  5.     Version: 2.1.1
  6.         1.0.1:
  7.             * First release.
  8.         1.0.2:
  9.             * Fixed load error.
  10.         1.0.3:
  11.             * Added reset function, to reset the state of all assembled scripts.
  12.             * Changed "autoAssembleFile" to work as toggle, with optional "forceDisable".
  13.         2.0.1:
  14.             * Reworked to work with "memrec" variable.
  15.         2.0.2:
  16.             * Fixed Toggle Error.
  17.         2.0.4:
  18.             * Fixed assebling error clear the disassembly info.
  19.         2.1.1:
  20.             * Added "getOpcodeAddress" Lua and AA functions.
  21.  
  22.  
  23.  
  24.     Author: Matt - TheyCallMeTim13 - MattI2.com
  25.  
  26.  
  27.     Features:
  28.         - A Lua module for assembling CEA files be it, table files or local files, in a Cheat Engine table.
  29.             Note: Local files will override the table files, this is meant for updating scripts.
  30.         - Really the only function meant to be used is autoAssembleFile(ceaFile, targetSelf, disable)
  31.  
  32.  
  33.     Settings:
  34.         CEAFilesDirectory           : The directory to check for local files.
  35.                                         Can be set to nil to look in current folder.
  36.                                         i.e.: 'ceaFiles'
  37.  
  38.  
  39.     Install / Setup Method:
  40.         This is a Lua module so place it in the Cheat Engine 'lua' folder or in the same directory as the cheat table
  41.         then just import (require) the module to use
  42.  
  43.  
  44.     Examples:
  45.         require 'I2CETableCEA'
  46.         I2CETableCEA.autoAssembleFile('CoordHook.CEA', memrec)
  47.  
  48.  
  49.     Note:
  50.         The "Table Require" template in my "pluginI2CELuaScriptTemplateGenerator.lua" plug-in will also allow for
  51.             Lua modules to be added as table files then imported, but local files will override the table files.
  52.  
  53.             Table Require Code:
  54.                 --------
  55.                 -------- CE Table Require
  56.                 --------
  57.                 local TableLuaFilesDirectory = 'luaFiles'
  58.                 function CETrequire(moduleStr)
  59.                     if moduleStr ~= nil then
  60.                         local localTableLuaFilePath = moduleStr
  61.                         if TableLuaFilesDirectory ~= nil or TableLuaFilesDirectory ~= '' then
  62.                             local sep = package.config:sub(1,1)
  63.                             localTableLuaFilePath = TableLuaFilesDirectory .. sep .. moduleStr
  64.                         end
  65.                         local f, err = io.open(localTableLuaFilePath .. '.lua')
  66.                         if f and not err then
  67.                             f:close()
  68.                             return require(localTableLuaFilePath)
  69.                         else
  70.                             local tableFile = findTableFile(moduleStr .. '.lua')
  71.                             if tableFile == nil then
  72.                                 return nil
  73.                             end
  74.                             local stream = tableFile.getData()
  75.                             local fileStr = nil
  76.                             local bytes = stream.read(stream.Size)
  77.                             for i = 1, #bytes do
  78.                                 if fileStr == nil then
  79.                                     fileStr = ''
  80.                                 end
  81.                                 fileStr = fileStr .. string.char(bytes[i])
  82.                             end
  83.                             if fileStr then
  84.                                 return assert(loadstring(fileStr))()
  85.                             end
  86.                         end
  87.                     end
  88.                     return nil
  89.                 end
  90.                 CETrequire('I2CETableCEA')
  91.                 -- I2CETableCEA.autoAssembleFile('CoordHook.CEA', false, false)
  92.  
  93.  
  94.  
  95. ]====================================================================================================================]--
  96.  
  97.  
  98. local NAME = 'I2 Cheat Engine Table CEA'
  99. local CLASS_NAME = 'I2CETableCEA'
  100. local VERSION = '2.1.1'
  101. local AUTHOR = 'Matt Irwin; Matt.Irwin.US@Gmail.com'
  102. local LICENSE = [=[MIT License
  103.  
  104. Copyright (c) 2017 Matt Irwin
  105.  
  106. Permission is hereby granted, free of charge, to any person obtaining a copy
  107. of this software and associated documentation files (the "Software"), to deal
  108. in the Software without restriction, including without limitation the rights
  109. to use, copy, modify, merge, publish, distribute, sub-license, and/or sell
  110. copies of the Software, and to permit persons to whom the Software is
  111. furnished to do so, subject to the following conditions:
  112.  
  113. The above copyright notice and this permission notice shall be included in all
  114. copies or substantial portions of the Software.
  115.  
  116. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  117. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  118. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  119. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  120. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  121. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  122. SOFTWARE.
  123. ]=]
  124.  
  125.  
  126.  
  127. local format = string.format
  128. local strE = string.empty or STRING_EMPTY or ''
  129. local t = translate
  130.  
  131.  
  132. local default_CEAFilesDirectory = 'ceaFiles'
  133. local default_AOBSignaturePrivileges = '+X*C*W' -- '+X-C-W'
  134. local default_CodePrintLines = {
  135.     Before = 7,
  136.     After = 8,
  137. }
  138.  
  139. AOBaddr = nil
  140. INJaddr = nil
  141. INJos = 0
  142. MemRec = nil
  143. -- memrec = nil
  144.  
  145.  
  146. -- local Logger = {
  147. --  LEVELS = {
  148. --      OFF = 0,
  149. --      FATAL = 1,
  150. --      ERROR = 2,
  151. --      WARN = 3,
  152. --      INFO = 4,
  153. --      DEBUG = 5,
  154. --      TRACE = 6
  155. --  },
  156. -- }
  157. -- for k, v in pairs(Logger.LEVELS) do
  158. --  -- Logger[k:lower()] = function( ... ) return end
  159. --  -- Logger[k:lower() .. 'f'] = function( ... ) return end
  160. --  Logger[k:lower()] = function(msg, ex) return print(msg, ex) end
  161. --  Logger[k:lower() .. 'f'] = function(msg, ... ) return print(string.format(msg, ... )) end
  162. -- end
  163. local Logger = Logger
  164. if Logger == nil then
  165.     if type(CETrequire) == 'function' then
  166.         Logger = CETrequire('I2CETLogger')
  167.     else
  168.         Logger = require('I2CETLogger')
  169.     end
  170.     Logger.LogName = 'I2CETC'
  171. end
  172.  
  173.  
  174. if type(CETrequire) == 'function' then
  175.     I2CEHelpers = CETrequire('I2CEHelpers')
  176. else
  177.     I2CEHelpers = require('I2CEHelpers')
  178. end
  179.  
  180. local function split(s, delimiter)
  181.     return I2CEHelpers.split(s, delimiter)
  182. end
  183.  
  184.  
  185. local function clearGlobals()
  186.     Logger.trace()
  187.     AOBstr = nil
  188.     AOBaddr = nil
  189.     INJaddr = nil
  190.     INJos = 0
  191.     INJbytes = nil
  192.     INJdb = nil
  193.     Logger.debugf('clearGlobals: All %s globals cleared', I2CETableCEA.ClassName)
  194. end
  195.  
  196.  
  197. I2CETableCEA = {
  198.     Name = NAME,
  199.     ClassName = CLASS_NAME,
  200.     Version = VERSION,
  201.     Author = AUTHOR,
  202.     License = LICENSE,
  203.     CEAFilesDirectory = default_CEAFilesDirectory,
  204.     AOBSignaturePrivileges = default_AOBSignaturePrivileges,
  205.     CodePrintLines = default_CodePrintLines,
  206.     Logger = Logger,
  207. }
  208. I2CETableCEA.TableFileInfoSets = {}
  209.  
  210.  
  211. function I2CETableCEA.getPath( ... )
  212.     return I2CEHelpers.getPath( ... )
  213. end
  214.  
  215. function I2CETableCEA.exists(path)
  216.     return I2CEHelpers.exists(path)
  217. end
  218.  
  219. function I2CETableCEA.isFile(path)
  220.     return I2CEHelpers.isFile(path)
  221. end
  222.  
  223. function I2CETableCEA.isDirectory(path)
  224.     return I2CEHelpers.isDirectory(path)
  225. end
  226.  
  227. function I2CETableCEA.reset(prompt)
  228.     Logger.trace()
  229.     local msg = t('Reset I2CETableCEA?')
  230.     local mr = messageDialog(msg, mtConfirmation, mbYes, mbNo, mbCancel)
  231.     if mr == mrYes then
  232.         I2CETableCEA.TableFileInfoSets = {}
  233.         Logger.warn('Table reset.')
  234.     end
  235. end
  236.  
  237.  
  238. function I2CETableCEA.getFileStr(ceaFile)
  239.     Logger.trace()
  240.     if ceaFile ~= nil then
  241.         Logger.debugf('Loading CEA file: "%s"', ceaFile)
  242.         local localCEAFilePath = ceaFile
  243.         if I2CETableCEA.CEAFilesDirectory ~= nil or I2CETableCEA.CEAFilesDirectory ~= strE then
  244.             localCEAFilePath = I2CETableCEA.getPath(I2CETableCEA.CEAFilesDirectory, ceaFile)
  245.         end
  246.         local fileStr = nil
  247.         local f, err = io.open(localCEAFilePath, 'r')
  248.         if f and not err then
  249.             fileStr = f:read('*all')
  250.             f:close()
  251.             Logger.infof('Returning local file string; "%s"', ceaFile)
  252.             return fileStr
  253.         else
  254.             local tableFile = findTableFile(ceaFile)
  255.             if tableFile == nil then
  256.                 Logger.error(format('Error opening table file: "%s"', ceaFile))
  257.                 clearGlobals()
  258.                 error(format('Error opening table file: "%s"', ceaFile))
  259.                 return nil
  260.             end
  261.             local stream = tableFile.getData()
  262.             local fileStr = nil
  263.             local bytes = stream.read(stream.Size)
  264.             for i = 1, #bytes do
  265.                 if fileStr == nil then
  266.                     fileStr = strE
  267.                 end
  268.                 fileStr = fileStr .. string.char(bytes[i])
  269.             end
  270.             Logger.infof('Returning table file string; "%s"', ceaFile)
  271.             return fileStr
  272.         end
  273.     end
  274.     return nil
  275. end
  276.  
  277.  
  278. local function getCodeLines(address)
  279.     Logger.trace()
  280.     if type(address) == 'string' then
  281.         address = tonumber(address, 16)
  282.     end
  283.     local codeStr = disassemble(address) .. '   <<<---- Injection point'
  284.     if type(I2CETableCEA.CodePrintLines) == 'table' then
  285.         if type(I2CETableCEA.CodePrintLines.Before) == 'number'
  286.         and I2CETableCEA.CodePrintLines.Before > 0 then
  287.             local addr = getPreviousOpcode(address)
  288.             for i = 1, I2CETableCEA.CodePrintLines.Before do
  289.                 local le = '\r\n'
  290.                 if addr == AOBaddr then
  291.                     le = '   <<<---- AOB' .. le
  292.                 end
  293.                 codeStr = disassemble(addr) .. le .. codeStr
  294.                 addr = getPreviousOpcode(addr)
  295.             end
  296.         end
  297.         if type(I2CETableCEA.CodePrintLines.After) == 'number'
  298.         and I2CETableCEA.CodePrintLines.After > 0 then
  299.             local addr = address + getInstructionSize(address)
  300.             for i = 1, I2CETableCEA.CodePrintLines.After do
  301.                 codeStr = codeStr .. '\r\n' .. disassemble(addr)
  302.                 if addr == AOBaddr then
  303.                     codeStr = codeStr .. '   <<<---- AOB'
  304.                 end
  305.                 addr = addr + getInstructionSize(addr)
  306.             end
  307.         end
  308.     end
  309.     return '-------------------- CODE --------------------\r\n'
  310.         .. codeStr .. '\r\n------------------ CODE END ------------------'
  311. end
  312.  
  313.  
  314. function I2CETableCEA.autoAssembleFile(ceaFile, memrec)
  315.     Logger.trace()
  316.     if type(ceaFile) ~= 'string' then
  317.         local msg = 'Error "ceaFile" must be a string.'
  318.         Logger.error(msg)
  319.         error(msg)
  320.     end
  321.     if memrec == nil then
  322.         local msg = format('Error "memrec" can not be nil; "%s"', ceaFile)
  323.         Logger.error(msg)
  324.         error(msg)
  325.     end
  326.     Logger.debugf('Start: Auto Assemble File: "%s"', ceaFile)
  327.  
  328.     CEAfile = ceaFile
  329.     MemRec = memrec
  330.     local enable = not memrec.Active
  331.  
  332.     local fileStr = I2CETableCEA.getFileStr(ceaFile)
  333.     if fileStr then
  334.         Logger.debugf('Assembling File: "%s"', ceaFile)
  335.         if I2CETableCEA.TableFileInfoSets[ceaFile] == nil then
  336.             I2CETableCEA.TableFileInfoSets[ceaFile] = {}
  337.         end
  338.         local assembled = nil
  339.         local disableInfo = I2CETableCEA.TableFileInfoSets[ceaFile].DisableInfo
  340.         local checkOk, errMsg = autoAssembleCheck(fileStr, enable)
  341.         if not checkOk then
  342.             if errMsg == nil or errMsg == strE then
  343.                 errMsg = 'No Error Message!'
  344.             end
  345.             Logger.errorf('Syntax error in file: "%s"\r\n%s', ceaFile, errMsg)
  346.             clearGlobals()
  347.             error(format('Syntax error in file: "%s"\r\n%s', ceaFile, errMsg))
  348.         end
  349.         if enable then
  350.             disableInfo = nil
  351.             Logger.infof('ENABLING; "%s"', ceaFile)
  352.         else
  353.             Logger.infof('DISABLING; "%s"', ceaFile)
  354.         end
  355.         assembled, disableInfo = autoAssemble(fileStr, targetSelf, disableInfo)
  356.         if assembled then
  357.             I2CETableCEA.TableFileInfoSets[ceaFile].DisableInfo = disableInfo
  358.             Logger.debugf('File assembled: "%s"', ceaFile)
  359.             clearGlobals()
  360.             Logger.debugf('Done: Auto Assemble File: "%s"', ceaFile)
  361.             return assembled, disableInfo
  362.         else
  363.             Logger.errorf('Error assembling file: "%s"', ceaFile)
  364.             error(format('Error assembling file: "%s"', ceaFile))
  365.         end
  366.         Logger.debugf('Done: Auto Assemble File: "%s"; Error 2', ceaFile)
  367.         return false
  368.     end
  369.     Logger.debugf('Done: Auto Assemble File: "%s"; Error 1', ceaFile)
  370.     return false
  371. end
  372.  
  373.  
  374. function I2CETableCEA.aobScan(strSignature, aobSignaturePrivileges, ceaFile, index)
  375.     Logger.trace()
  376.     if index == nil then
  377.         index = 0
  378.     end
  379.     local file = ceaFile or CEAfile
  380.     result = AOBScan(strSignature, aobSignaturePrivileges)
  381.     if result == nil then
  382.         local msg = format('Error with "%s", AOB pattern not found: "%s"', file, strSignature)
  383.         Logger.errorf(msg)
  384.         clearGlobals()
  385.         error(msg)
  386.     elseif result.Count >= 1 then
  387.         local aobAddr = result[index]
  388.         result.destroy()
  389.         if type(aobAddr) == 'string' then
  390.             aobAddr = tonumber(aobAddr, 16)
  391.         end
  392.         Logger.infof('AOB scan pattern found at: %016X; "%s"', aobAddr, file)
  393.         return aobAddr
  394.     end
  395. end
  396.  
  397. function I2CETableCEA.reinterpretChildren(memrec)
  398.     local function reintMemrec(memrec)
  399.         for i = 1, memrec.Count - 1 do
  400.             memrec[i].reinterpret()
  401.             if memrec[i].Count > 0 then
  402.                 reintMemrec(memrec[i])
  403.             end
  404.         end
  405.     end
  406.     local timer = createTimer(getMainForm())
  407.     timer.Interval = 500
  408.     timer.OnTimer = function(timer)
  409.         reintMemrec(memrec)
  410.         if DoneState == true then
  411.             timer.destroy()
  412.         end
  413.     end
  414. end
  415.  
  416. function I2CETableCEA.getOpcodeAddress(strSignature, offset, aobSignaturePrivileges, ceaFile, index)
  417.     if offset == nil then
  418.         offset = 0
  419.     end
  420.     if type(strSignature) ~= 'string' then
  421.         local msg = 'Error "strSignature" must be a string.'
  422.         Logger.error(msg)
  423.         error(msg)
  424.     end
  425.     if type(offset) ~= 'number' then
  426.         local msg = 'Error "offset" must be a number.'
  427.         Logger.error(msg)
  428.         error(msg)
  429.     end
  430.     local addr = I2CETableCEA.aobScan(strSignature, aobSignaturePrivileges or I2CETableCEA.AOBSignaturePrivileges, ceaFile, index)
  431.     addr = addr + offset
  432.     if targetIs64Bit() then
  433.         local os = readInteger(addr, true)
  434.         return (addr + 4) + os
  435.     else
  436.         return readInteger(addr)
  437.     end
  438. end
  439.  
  440.  
  441. local function getOpcodeAddress(parameters, syntaxcheck)
  442.     ---- getOpcodeAddress(symbol, aob, (optional) offset, (optional) privileges, (optional) index)
  443.     local tbl = split(parameters, ',')
  444.     local symbol = tbl[1]:gsub(' ', strE)
  445.     local aob = tbl[2]:gsub(' ', strE)
  446.     local offset = tbl[3]
  447.     if offset ~= nil then
  448.         offset = offset:gsub(' ', strE)
  449.         offset = tonumber(offset, 16)
  450.     else
  451.         offset = 0
  452.     end
  453.     local privileges = tbl[4]
  454.     if privileges ~= nil then
  455.         privileges = privileges:gsub(' ', strE)
  456.     end
  457.     local index = tbl[5]
  458.     if index ~= nil then
  459.         index = index:gsub(' ', strE)
  460.         index = tonumber(index, 16)
  461.     else
  462.         index = 0
  463.     end
  464.     if symbol == nil then
  465.         local msg = t('Wrong number of parameters, no "symbol", for "getOpcodeAddress" I2CETableCEA AA command.')
  466.         Logger.error(msg)
  467.         error(msg)
  468.         return nil, msg
  469.     end
  470.     if aob == nil then
  471.         local msg = t('Wrong number of parameters, no "aob", for "getOpcodeAddress" I2CETableCEA AA command.')
  472.         Logger.error(msg)
  473.         error(msg)
  474.         return nil, msg
  475.     end
  476.     if syntaxcheck then
  477.         return format('define(%s,%016X)', symbol, 0)
  478.     end
  479.     local addr = I2CETableCEA.getOpcodeAddress(aob, offset, privileges or I2CETableCEA.AOBSignaturePrivileges, nil, index)
  480.     return format('define(%s,%016X)', symbol, addr or 0)
  481. end
  482. registerAutoAssemblerCommand('getOpcodeAddress', getOpcodeAddress)
  483.  
  484.  
  485.  
  486. local function setCeaFile(parameters, syntaxcheck)
  487.     ---- setCEAfile(ceaFile)
  488.     ---- setCEAfile(someCeaFile.CEA)
  489.     local ceaFile = parameters
  490.     if ceaFile == nil then
  491.         local msg = t('Wrong number of parameters, no "ceaFile", for "setCEAfile" I2CETableCEA AA command.')
  492.         Logger.error(msg)
  493.         error(msg)
  494.         return nil, msg
  495.     end CEAfile = ceaFile
  496.     return strE
  497. end
  498. local function getCeaFile(parameters, syntaxcheck)
  499.     ---- getCEAfile()
  500.     return CEAfile
  501. end
  502. registerAutoAssemblerCommand('setCEAfile', setCeaFile)
  503. registerAutoAssemblerCommand('getCEAfile', getCeaFile)
  504.  
  505.  
  506. local function i2AOBscan(parameters, syntaxcheck)
  507.     ---- i2AobScan(symbol, aob, (optional) privileges, (optional) index)
  508.     ---- i2AobScan(injPoint, EBxxxxxxxx90909090)
  509.     ---- i2AobScan(injPoint, EBxxxxxxxx90909090, +X-C*W)
  510.     local tbl = split(parameters, ',')
  511.     local symbol = tbl[1]:gsub(' ', strE)
  512.     local aob = tbl[2]:gsub(' ', strE)
  513.     local privileges = tbl[3]
  514.     if privileges ~= nil then
  515.         privileges = privileges:gsub(' ', strE)
  516.     end
  517.     local index = tbl[4]
  518.     if index ~= nil then
  519.         index = index:gsub(' ', strE)
  520.         index = tonumber(index, 16)
  521.     else
  522.         index = 0
  523.     end
  524.     if symbol == nil then
  525.         local msg = t('Wrong number of parameters, no "symbol", for "i2AobScan" I2CETableCEA AA command.')
  526.         Logger.error(msg)
  527.         error(msg)
  528.         return nil, msg
  529.     end
  530.     if aob == nil then
  531.         local msg = t('Wrong number of parameters, no "aob", for "i2AobScan" I2CETableCEA AA command.')
  532.         Logger.error(msg)
  533.         error(msg)
  534.         return nil, msg
  535.     end
  536.     if syntaxcheck then
  537.         return format('define(%s,%016X)', symbol, 0)
  538.     end
  539.     local addr = I2CETableCEA.aobScan(aob, privileges or I2CETableCEA.AOBSignaturePrivileges, nil, index)
  540.     return format('define(%s,%016X)', symbol, addr or 0)
  541. end
  542. local function i2AOBscanModule(parameters, syntaxcheck)
  543.     ---- i2AobScanModule(symbol, module, aob, (optional) privileges, (optional) index)
  544.     ---- i2AobScanModule(injPoint, game.exe, EBxxxxxxxx90909090)
  545.     ---- i2AobScanModule(injPoint, game.exe, EBxxxxxxxx90909090, +X-C*W)
  546.     local tbl = split(parameters, ',')
  547.     local symbol = tbl[1]:gsub(' ', strE)
  548.     local mod = tbl[2]:gsub(' ', strE)
  549.     local aob = tbl[3]:gsub(' ', strE)
  550.     local privileges = tbl[4]
  551.     if privileges ~= nil then
  552.         privileges = privileges:gsub(' ', strE)
  553.     end
  554.     local index = tbl[4]
  555.     if index ~= nil then
  556.         index = index:gsub(' ', strE)
  557.         index = tonumber(index, 16)
  558.     else
  559.         index = 0
  560.     end
  561.     if symbol == nil then
  562.         local msg = t('Wrong number of parameters, no "symbol", for "i2AobScanModule" I2CETableCEA AA command.')
  563.         Logger.error(msg)
  564.         error(msg)
  565.         return nil, msg
  566.     end
  567.     if mod == nil then
  568.         local msg = t('Wrong number of parameters, no "module", for "i2AobScanModule" I2CETableCEA AA command.')
  569.         Logger.error(msg)
  570.         error(msg)
  571.         return nil, msg
  572.     end
  573.     if aob == nil then
  574.         local msg = t('Wrong number of parameters, no "aob", for "i2AobScanModule" I2CETableCEA AA command.')
  575.         Logger.error(msg)
  576.         error(msg)
  577.         return nil, msg
  578.     end
  579.     if syntaxcheck then
  580.         return format('define(%s,%016X)', symbol, 0)
  581.     end
  582.     local addr = I2CETableCEA.aobScan(aob, privileges or I2CETableCEA.AOBSignaturePrivileges, nil, index)
  583.     return format('define(%s,%016X)', symbol, addr or 0)
  584. end
  585. local function i2Assert(parameters, syntaxcheck)
  586.     ---- i2Assert(address, bytes)
  587.     ---- i2Assert(injPoint, 90 90 90 90 90 90)
  588.     ---- i2Assert(injPoint, 909090909090)
  589.     if syntaxcheck then
  590.         return strE
  591.     end
  592.     local tbl = split(parameters, ',')
  593.     local addr = tbl[1]
  594.     local bytes = tbl[2]
  595.     if addr == nil then
  596.         local msg = t('Wrong number of parameters, no "address", for "i2Assert" I2CETableCEA AA command.')
  597.         Logger.error(msg)
  598.         error(msg)
  599.         return nil, msg
  600.     end
  601.     if bytes == nil then
  602.         local msg = t('Wrong number of parameters, no "bytes", for "i2Assert" I2CETableCEA AA command.')
  603.         Logger.error(msg)
  604.         error(msg)
  605.         return nil, msg
  606.     end
  607.     addr = getAddressSafe(addr)
  608.     Logger.debugf('Reading from: %016X; "%s"', addr or 0, CEAfile)
  609.     local s = bytes:gsub('%s+', strE)
  610.     local b = {}
  611.     local j = 0
  612.     for i = 1, #s, 2 do
  613.         local n = tonumber(s:sub(i, i + 1), 16)
  614.         b[j] = n
  615.         j = j + 1
  616.     end
  617.     local rb = readBytes(addr, #b + 1, true)
  618.     Logger.infof('Bytes read: %02X; "%s"', #b + 1, CEAfile)
  619.     for i = 0, #b do
  620.         if b[i] ~= rb[i + 1] then
  621.             local s1 = strE
  622.             local s2 = strE
  623.             for x = 0, #b do
  624.                 s1 = s1 .. format('%02X', b[x])
  625.             end
  626.             for x = 1, #rb do
  627.                 s2 = s2 .. format('%02X', rb[x])
  628.             end
  629.             local msg = format('Error with "%s", bytes don\'t match injection point.', CEAfile)
  630.             Logger.errorf(msg .. '\r\n  At: %016X\r\n Got: %s\r\nRead: %s\r\n%s', addr, s1, s2,
  631.                             getCodeLines(addr))
  632.             clearGlobals()
  633.             error(msg)
  634.             return nil, msg
  635.         end
  636.     end
  637.     Logger.infof('Bytes matched for: "%s"', CEAfile)
  638.     return strE
  639. end
  640. registerAutoAssemblerCommand('i2AobScan', i2AOBscan)
  641. registerAutoAssemblerCommand('i2AobScanModule', i2AOBscanModule)
  642. registerAutoAssemblerCommand('i2Assert', i2Assert)
  643.  
  644. local function registerLabel(parameters, syntaxcheck)
  645.     ---- registerLabel(name)
  646.     local name = parameters
  647.     if name == nil then
  648.         local msg = t('Wrong number of parameters, no "name", for "registerLabel" I2CETableCEA AA command.')
  649.         Logger.error(msg)
  650.         error(msg)
  651.         return nil, msg
  652.     end
  653.     return format('label(%s)\r\nregisterSymbol(%s)', name, name)
  654. end
  655. local function unregisterLabel(parameters, syntaxcheck)
  656.     ---- unregisterLabel(name)
  657.     local name = parameters
  658.     if name == nil then
  659.         local msg = t('Wrong number of parameters, no "name", for "unregisterLabel" I2CETableCEA AA command.')
  660.         Logger.error(msg)
  661.         error(msg)
  662.         return nil, msg
  663.     end
  664.     return format('unregisterSymbol(%s)', name)
  665. end
  666. registerAutoAssemblerCommand('registerLabel', registerLabel)
  667. registerAutoAssemblerCommand('unregisterLabel', unregisterLabel)
  668.  
  669. local function defineSymbol(parameters, syntaxcheck)
  670.     ---- defineSymbol(name, value)
  671.     local tbl = split(parameters, ',')
  672.     local name = tbl[1]:gsub(' ', strE)
  673.     local value = tbl[2]
  674.     if name == nil then
  675.         local msg = t('Wrong number of parameters, no "name", for "defineSymbol" I2CETableCEA AA command.')
  676.         Logger.error(msg)
  677.         error(msg)
  678.         return nil, msg
  679.     end
  680.     if value == nil then
  681.         local msg = t('Wrong number of parameters, no "value", for "defineSymbol" I2CETableCEA AA command.')
  682.         Logger.error(msg)
  683.         error(msg)
  684.         return nil, msg
  685.     end
  686.     return format('define(%s,%s)\r\nregisterSymbol(%s)', name, value, name)
  687. end
  688. local function undefineSymbol(parameters, syntaxcheck)
  689.     ---- undefineSymbol(name)
  690.     local name = parameters
  691.     if name == nil then
  692.         local msg = t('Wrong number of parameters, no "name", for "undefineSymbol" I2CETableCEA AA command.')
  693.         Logger.error(msg)
  694.         error(msg)
  695.         return nil, msg
  696.     end
  697.     return format('unregisterSymbol(%s)', name)
  698. end
  699. registerAutoAssemblerCommand('defineSymbol', defineSymbol)
  700. registerAutoAssemblerCommand('undefineSymbol', undefineSymbol)
  701.  
  702.  
  703. Logger.debugf('%s: Loaded.', I2CETableCEA.ClassName)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement