cheat-engine/Cheat Engine/luasymbollisthandler.pas

243 lines
5.5 KiB
ObjectPascal

unit LuaSymbolListHandler;
{$mode delphi}
interface
uses
Classes, SysUtils, lua, lualib, LuaClass, SymbolListHandler;
procedure initializeLuaSymbolListHandler;
procedure pushSymbol(L: PLua_state; si: PCESymbolInfo);
implementation
uses LuaHandler, LuaObject, symbolhandler;
function createSymbolList(L: Plua_State): integer; cdecl;
begin
result:=1;
luaclass_newClass(L, TSymbolListHandler.create);
end;
function SymbolList_clear(L: Plua_State): integer; cdecl;
var
sl: TSymbolListHandler;
begin
sl:=luaclass_getClassObject(L);
sl.clear;
result:=0;
end;
function SymbolList_register(L: Plua_State): integer; cdecl;
var
sl: TSymbolListHandler;
begin
sl:=luaclass_getClassObject(L);
symhandler.AddSymbolList(sl);
result:=0;
end;
function SymbolList_unregister(L: Plua_State): integer; cdecl;
var
sl: TSymbolListHandler;
begin
sl:=luaclass_getClassObject(L);
symhandler.RemoveSymbolList(sl);
result:=0;
end;
procedure pushSymbol(L: PLua_state; si: PCESymbolInfo);
var tableindex: integer;
begin
lua_newtable(L);
tableindex:=lua_gettop(L);
lua_pushstring(L,'modulename');
lua_pushstring(L,si.module);
lua_settable(L, tableindex);
lua_pushstring(L,'searchkey');
lua_pushstring(L,si.originalstring);
lua_settable(L, tableindex);
lua_pushstring(L,'address');
lua_pushinteger(L,si.address);
lua_settable(L, tableindex);
lua_pushstring(L,'symbolsize');
lua_pushinteger(L,si.size);
lua_settable(L, tableindex);
end;
function SymbolList_GetSymbolFromAddress(L: Plua_State): integer; cdecl;
var
sl: TSymbolListHandler;
si: PCESymbolInfo;
begin
result:=0;
sl:=luaclass_getClassObject(L);
si:=sl.FindAddress(lua_tointeger(L, 1));
if si<>nil then
begin
pushSymbol(L, si);
result:=1;
end;
end;
function SymbolList_getSymbolFromString(L: Plua_State): integer; cdecl;
var
sl: TSymbolListHandler;
si: PCESymbolInfo;
begin
result:=0;
sl:=luaclass_getClassObject(L);
si:=sl.FindSymbol(lua_tostring(L, 1));
if si<>nil then
begin
pushSymbol(L, si);
result:=1;
end;
end;
function SymbolList_addSymbol(L: Plua_State): integer; cdecl;
var
sl: TSymbolListHandler;
si: PCESymbolInfo;
modulename: string;
searchkey: string;
address: qword;
size: integer;
skipAddressToSymbol: boolean;
esd: TExtraSymbolData;
returntype: string;
parameters: string;
begin
result:=0;
sl:=luaclass_getClassObject(L);
esd:=nil;
if lua_gettop(L)>=4 then //modulename, searchkey, address, symbolsize, skipAddressToSymbol
begin
modulename:=lua_tostring(L, 1);
searchkey:=lua_tostring(L, 2);
address:=lua_tointeger(L, 3);
size:=lua_tointeger(L, 4);
if lua_gettop(L)>=5 then
skipAddressToSymbol:=lua_toboolean(L, 5)
else
skipAddressToSymbol:=false;
if lua_gettop(L)>=6 then
begin
if lua_istable(L, 6) then
begin
lua_pushstring(L, 'returntype');
lua_gettable(L, 6);
returntype:=Lua_ToString(L, -1);
lua_pop(L,1);
lua_pushstring(L, 'parameters');
lua_gettable(L, 6);
parameters:=Lua_ToString(L, -1);
lua_pop(L,1);
if (returntype<>'') or (parameters<>'') then
begin
esd:=TExtraSymbolData.create;
esd.return:=returntype;
esd.simpleparameters:=parameters;
esd.filledin:=true;
sl.AddExtraSymbolData(esd);
end;
end;
end
else
parameters:='';
si:=sl.AddSymbol(modulename, searchkey, address, size, skipAddressToSymbol, esd);
if esd<>nil then
esd.free;
pushSymbol(L, si);
result:=1;
end;
end;
function SymbolList_deleteSymbol(L: Plua_State): integer; cdecl;
var
sl: TSymbolListHandler;
si: PCESymbolInfo;
begin
result:=0;
sl:=luaclass_getClassObject(L);
if lua_type(L,1)=LUA_TNUMBER then
begin
si:=sl.FindAddress(lua_tointeger(L, 1));
if si<>nil then
begin
if si.extra<>nil then
begin
sl.RemoveExtraSymbolData(si.extra);
si.extra.free;
end;
sl.DeleteSymbol(lua_tointeger(L, 1))
end;
end
else
begin
si:=sl.FindSymbol(lua_tostring(L, 1));
if si<>nil then
begin
if si.extra<>nil then
begin
sl.RemoveExtraSymbolData(si.extra);
si.extra.free;
end;
sl.DeleteSymbol(lua_tostring(L, 1))
end;
end;
end;
procedure SymbolList_addMetaData(L: PLua_state; metatable: integer; userdata: integer );
begin
object_addMetaData(L, metatable, userdata);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'clear', SymbolList_clear);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getSymbolFromAddress', SymbolList_GetSymbolFromAddress);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getSymbolFromString', SymbolList_getSymbolFromString);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'addSymbol', SymbolList_addSymbol);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'deleteSymbol', SymbolList_deleteSymbol);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'register', SymbolList_register);
luaclass_addClassFunctionToTable(L, metatable, userdata, 'unregister', SymbolList_unregister);
end;
procedure initializeLuaSymbolListHandler;
begin
lua_register(LuaVM, 'createSymbolList', createSymbolList);
end;
initialization
luaclass_register(TSymbolListHandler, SymbolList_addMetaData);
end.