mirror of
https://github.com/cheat-engine/cheat-engine
synced 2026-08-15 02:26:08 -04:00
263 lines
8.4 KiB
ObjectPascal
Executable file
263 lines
8.4 KiB
ObjectPascal
Executable file
unit LuaMemscan;
|
|
|
|
{$mode delphi}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, lua, lualib, lauxlib, symbolhandler, LuaHandler, cefuncproc,
|
|
memscan, foundlisthelper, forms, commonTypeDefs;
|
|
|
|
procedure initializeMemscan;
|
|
|
|
implementation
|
|
|
|
uses luaclass, LuaObject;
|
|
|
|
resourcestring
|
|
rsNotAllParametersHaveBeenProvided = 'Not all parameters have been provided';
|
|
|
|
//memscan_firstScan(memscan, scanOption, vartype, roundingtype, input1, input2, startAddress,
|
|
// stopAddress, protectionflags, alignmenttype, "alignmentparam", isHexadecimalInput,
|
|
// isNotABinaryString, isunicodescan, iscasesensitive, ispercentagescan);
|
|
|
|
function memscan_newScan(L: Plua_State): integer; cdecl;
|
|
var memscan: TMemscan;
|
|
begin
|
|
memscan:=luaclass_getClassObject(L);
|
|
memscan.newscan;
|
|
result:=0;
|
|
|
|
end;
|
|
|
|
function memscan_firstScan(L: Plua_State): integer; cdecl;
|
|
var
|
|
paramstart, paramcount: integer;
|
|
memscan: Tmemscan;
|
|
scanOption: TScanOption;
|
|
vartype: TVariableType;
|
|
roundingtype: TRoundingType;
|
|
input1: string;
|
|
input2: string;
|
|
startaddress: ptruint;
|
|
stopaddress: ptruint;
|
|
protectionflags: string;
|
|
alignmenttype: TFastScanMethod;
|
|
alignmentparam: String;
|
|
isHexadecimalInput, isNotABinaryString, isunicodescan, iscasesensitive, ispercentagescan: boolean;
|
|
begin
|
|
result:=0;
|
|
memscan:=luaclass_getClassObject(L, @paramstart, @paramcount);
|
|
|
|
if paramcount>=14 then
|
|
begin
|
|
scanOption:=TScanOption(lua_tointeger(L, paramstart));
|
|
vartype:=TVariableType(lua_tointeger(L, paramstart+1));
|
|
roundingtype:=TRoundingType(lua_tointeger(L, paramstart+2));
|
|
input1:=Lua_ToString(L, paramstart+3);
|
|
input2:=Lua_ToString(L, paramstart+4);
|
|
|
|
if lua_type(L,paramstart+5)=LUA_TSTRING then
|
|
startaddress:=symhandler.getAddressFromNameL(Lua_ToString(L, paramstart+5))
|
|
else
|
|
startaddress:=lua_tointeger(L, paramstart+5);
|
|
|
|
if lua_type(L,paramstart+6)=LUA_TSTRING then
|
|
stopaddress:=symhandler.getAddressFromNameL(Lua_ToString(L, paramstart+6))
|
|
else
|
|
stopaddress:=lua_tointeger(L, paramstart+6);
|
|
|
|
protectionflags:=Lua_ToString(L, paramstart+7);
|
|
alignmenttype:=TFastScanMethod(lua_tointeger(L, paramstart+8));
|
|
alignmentparam:=lua_tostring(L, paramstart+9);
|
|
|
|
isHexadecimalInput:=lua_toboolean(L, paramstart+10);
|
|
isNotABinaryString:=lua_toboolean(L, paramstart+11);
|
|
isunicodescan:=lua_toboolean(L, paramstart+12);
|
|
iscasesensitive:=lua_toboolean(L, paramstart+13);
|
|
|
|
lua_pop(L, lua_gettop(L));
|
|
|
|
memscan.parseProtectionflags(protectionflags);
|
|
|
|
memscan.firstscan(scanoption, vartype, roundingtype, input1,input2, startaddress,stopaddress, isHexadecimalInput, isNotABinaryString, isunicodescan, iscasesensitive, alignmenttype, alignmentparam, nil );
|
|
end
|
|
else
|
|
raise exception.create(rsNotAllParametersHaveBeenProvided);
|
|
|
|
end;
|
|
|
|
function memscan_nextScan(L: Plua_State): integer; cdecl;
|
|
var
|
|
paramcount, paramstart: integer;
|
|
memscan: Tmemscan;
|
|
scanOption: TScanOption;
|
|
roundingtype: TRoundingType;
|
|
input1: string;
|
|
input2: string;
|
|
isHexadecimalInput, isNotABinaryString, isunicodescan, iscasesensitive, ispercentagescan: boolean;
|
|
savedscanname: string;
|
|
begin
|
|
result:=0;
|
|
memscan:=luaclass_getClassObject(L, @paramstart, @paramcount);
|
|
|
|
|
|
if paramcount>=9 then
|
|
begin
|
|
scanOption:=TScanOption(lua_tointeger(L, paramstart+0));
|
|
roundingtype:=TRoundingType(lua_tointeger(L, paramstart+1));
|
|
input1:=Lua_ToString(L, paramstart+2);
|
|
input2:=Lua_ToString(L, paramstart+3);
|
|
|
|
isHexadecimalInput:=lua_toboolean(L, paramstart+4);
|
|
isNotABinaryString:=lua_toboolean(L, paramstart+5);
|
|
isunicodescan:=lua_toboolean(L, paramstart+6);
|
|
iscasesensitive:=lua_toboolean(L, paramstart+7);
|
|
ispercentagescan:=lua_toboolean(L, paramstart+8);
|
|
|
|
if paramcount>9 then
|
|
savedscanname:=Lua_ToString(L, paramstart+9)
|
|
else
|
|
savedscanname:='';
|
|
|
|
lua_pop(L, lua_gettop(L));
|
|
|
|
memscan.nextscan(scanoption, roundingtype, input1,input2, isHexadecimalInput, isNotABinaryString, isunicodescan, iscasesensitive, ispercentagescan, savedscanname<>'', savedscanname );
|
|
end else
|
|
raise exception.create(rsNotAllParametersHaveBeenProvided);
|
|
end;
|
|
|
|
function memscan_waitTillDone(L: Plua_State): integer; cdecl;
|
|
var
|
|
memscan: Tmemscan;
|
|
begin
|
|
result:=0;
|
|
memscan:=luaclass_getClassObject(L);
|
|
if GetCurrentThreadId=MainThreadID then
|
|
begin
|
|
while memscan.waittillreallydone(100)=false do
|
|
CheckSynchronize();
|
|
end
|
|
else
|
|
memscan.waittillreallydone();
|
|
|
|
end;
|
|
|
|
function memscan_getAttachedFoundlist(L: Plua_State): integer; cdecl;
|
|
var
|
|
memscan: Tmemscan;
|
|
begin
|
|
memscan:=luaclass_getClassObject(L);
|
|
luaclass_newclass(L,memscan.attachedFoundlist);
|
|
result:=1;
|
|
end;
|
|
|
|
|
|
function memscan_saveCurrentResults(L: Plua_State): integer; cdecl;
|
|
var
|
|
parameters: integer;
|
|
memscan: Tmemscan;
|
|
name: string;
|
|
begin
|
|
result:=0;
|
|
memscan:=luaclass_getClassObject(L);
|
|
if lua_gettop(L)>=1 then
|
|
begin
|
|
name:=Lua_ToString(L, -1);
|
|
memscan.saveresults(name);
|
|
end;
|
|
end;
|
|
|
|
function memscan_getreturnOnlyOneResult(L: PLua_State): integer; cdecl;
|
|
var
|
|
memscan: Tmemscan;
|
|
begin
|
|
memscan:=luaclass_getClassObject(L);
|
|
lua_pushboolean(L,memscan.OnlyOne);
|
|
result:=1;
|
|
end;
|
|
|
|
|
|
function memscan_setreturnOnlyOneResult(L: PLua_State): integer; cdecl;
|
|
var
|
|
memscan: Tmemscan;
|
|
begin
|
|
result:=0;
|
|
memscan:=luaclass_getClassObject(L);
|
|
if lua_gettop(L)>=1 then
|
|
memscan.OnlyOne:=lua_toboolean(L,1);
|
|
end;
|
|
|
|
function memscan_getOnlyResult(L: Plua_State): integer; cdecl;
|
|
var
|
|
memscan: Tmemscan;
|
|
address: ptruint;
|
|
begin
|
|
result:=0;
|
|
memscan:=luaclass_getClassObject(L);
|
|
|
|
if memscan.GetOnlyOneResult(address) then
|
|
begin
|
|
result:=1;
|
|
lua_pushinteger(L,address);
|
|
end;
|
|
end;
|
|
|
|
function memscan_getProgress(L: Plua_State): integer; cdecl;
|
|
var
|
|
memscan: Tmemscan;
|
|
totaladdressestoscan, currentlyscanned,resultsfound: qword;
|
|
begin
|
|
memscan:=luaclass_getClassObject(L);
|
|
|
|
memscan.GetProgress(totaladdressestoscan, currentlyscanned,resultsfound);
|
|
lua_newtable(L);
|
|
lua_pushstring(L, 'TotalAddressesToScan');
|
|
lua_pushinteger(L,totaladdressestoscan);
|
|
lua_settable(L,-3);
|
|
|
|
lua_pushstring(L, 'CurrentlyScanned');
|
|
lua_pushinteger(L,currentlyscanned);
|
|
lua_settable(L,-3);
|
|
|
|
lua_pushstring(L, 'ResultsFound');
|
|
lua_pushinteger(L,resultsfound);
|
|
lua_settable(L,-3);
|
|
result:=1;
|
|
end;
|
|
|
|
procedure memscan_addMetaData(L: PLua_state; metatable: integer; userdata: integer );
|
|
begin
|
|
object_addMetaData(L, metatable, userdata);
|
|
luaclass_addClassFunctionToTable(L, metatable, userdata, 'firstScan', memscan_firstScan);
|
|
luaclass_addClassFunctionToTable(L, metatable, userdata, 'nextScan', memscan_nextScan);
|
|
luaclass_addClassFunctionToTable(L, metatable, userdata, 'newScan', memscan_newScan);
|
|
luaclass_addClassFunctionToTable(L, metatable, userdata, 'waitTillDone', memscan_waitTillDone);
|
|
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getProgress', memscan_getProgress);
|
|
luaclass_addClassFunctionToTable(L, metatable, userdata, 'saveCurrentResults', memscan_saveCurrentResults);
|
|
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getAttachedFoundlist', memscan_getAttachedFoundlist);
|
|
luaclass_addClassFunctionToTable(L, metatable, userdata, 'setOnlyOneResult', memscan_setreturnOnlyOneResult);
|
|
luaclass_addClassFunctionToTable(L, metatable, userdata, 'getOnlyResult', memscan_getOnlyResult);
|
|
|
|
luaclass_addPropertyToTable(L, metatable, userdata, 'FoundList', memscan_getAttachedFoundlist, nil);
|
|
luaclass_addPropertyToTable(L, metatable, userdata, 'OnlyOneResult', memscan_getreturnOnlyOneResult, memscan_setreturnOnlyOneResult);
|
|
luaclass_addPropertyToTable(L, metatable, userdata, 'Result', memscan_getOnlyResult, nil);
|
|
end;
|
|
|
|
procedure InitializeMemscan;
|
|
begin
|
|
Lua_register(LuaVM, 'memscan_firstScan', memscan_firstScan);
|
|
Lua_register(LuaVM, 'memscan_nextScan', memscan_nextScan);
|
|
Lua_register(LuaVM, 'memscan_waitTillDone', memscan_waitTillDone);
|
|
Lua_register(LuaVM, 'memscan_saveCurrentResults', memscan_saveCurrentResults);
|
|
Lua_register(LuaVM, 'memscan_getAttachedFoundlist', memscan_getAttachedFoundlist);
|
|
Lua_register(LuaVM, 'memscan_returnOnlyOneResult', memscan_setreturnOnlyOneResult);
|
|
Lua_register(LuaVM, 'memscan_getOnlyResult', memscan_getOnlyResult);
|
|
end;
|
|
|
|
initialization
|
|
luaclass_register(TMemScan, memscan_addMetaData);
|
|
|
|
|
|
end.
|
|
|