cheat-engine/Cheat Engine/cheatengine.lpr
2023-10-22 22:32:34 +02:00

422 lines
15 KiB
ObjectPascal
Executable File

program cheatengine;
{$mode objfpc}{$H+}
uses
{$ifdef darwin}
cthreads,
{$endif}
first,
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, {CEInterfaces,} // this includes the LCL widgetset
{$ifdef darwin}
//
macport, macportdefines,coresymbolication, macexceptiondebuggerinterface,
macCreateRemoteThread, macumm, machotkeys, macPipe,
{$endif}
betterControls, controls, sysutils, Forms, LazUTF8, dialogs, SynCompletion,
MainUnit, CEDebugger, NewKernelHandler, CEFuncProc, ProcessHandlerUnit,
symbolhandler, Assemblerunit, hypermode, byteinterpreter, addressparser,
autoassembler, ProcessWindowUnit, MainUnit2, Filehandler,
dbvmPhysicalMemoryHandler, frameHotkeyConfigUnit, formsettingsunit,
HotkeyHandler, formhotkeyunit, AdvancedOptionsUnit, inputboxtopunit, plugin,
pluginexports, tlgUnit, aboutunit, frmProcesswatcherExtraUnit,
frmProcessWatcherUnit, ModuleSafetyUnit, frmExcludeHideUnit, HotKeys,
TypePopup, CommentsUnit, FoundCodeUnit, foundlisthelper, unrandomizer,
SaveFirstScan, savedscanhandler, memscan, KernelDebugger,
formDifferentBitSizeUnit, formAddressChangeUnit, Changeoffsetunit, speedhack2,
formPointerOrPointeeUnit, AccessCheck, formmemoryregionsunit, OpenSave,
formProcessInfo, frmautoinjectunit, MenuItemExtra, MemoryBrowserFormUnit,
disassemblerviewlinesunit, disassemblerviewunit, PasteTableentryFRM,
frmBreakpointlistunit, DissectCodeThread, DissectCodeunit, Valuechange,
FindWindowUnit, stacktrace2, frmstacktraceunit, frmBreakThreadUnit,
FormDebugStringsUnit, frmDissectwindowUnit, frmCapturedTimersUnit,
frmEnumerateDLLsUnit, frmThreadlistunit, frmMemoryAllocHandlerUnit,
circularBuffer, PEInfoFunctions, PEInfounit, FileMapping, frmFindstaticsUnit,
frmModifyRegistersUnit, frmHeapsUnit, savedisassemblyfrm,
frmSaveMemoryRegionUnit, frmLoadMemoryunit, formAddToCodeList,
frmFillMemoryUnit, frmCodecaveScannerUnit, frmSelectionlistunit,
symbolconfigunit, frmFloatingPointPanelUnit, frmTracerUnit, DriverList,
frmRegistersunit, formChangedAddresses, frmGDTunit, frmIDTunit,
frmDisassemblyscanunit, frmReferencedStringsUnit, StructuresAddElementfrm,
Structuresfrm, PointerscannerSettingsFrm, simpleaobscanner,
PointerscanresultReader, pointervaluelist, rescanhelper, pointerscannerfrm,
VirtualMemory, ValueFinder, frmRescanPointerUnit, SyncObjs2,
ManualModuleLoader, SynHighlighterAA, APIhooktemplatesettingsfrm,
frmAAEditPrefsUnit, disassembler, hexviewunit, guisafecriticalsection,
debugeventhandler, formFoundcodeListExtraUnit, debuggertypedefinitions,
addresslist, MemoryRecordUnit, ThreadlistExFRM, windows7taskbar, tablist,
frmStructuresConfigUnit, VEHDebugger, VEHDebugSharedMem, DebuggerInterface,
WindowsDebugger, DebuggerInterfaceAPIWrapper, frmDebugEventsUnit, changelist,
tableconverter, DBK32functions, debug, multicpuexecution, vmxfunctions,
frmPagingUnit, bigmemallochandler, KernelDebuggerInterface, CustomTypeHandler,
LuaHandler, frmLuaEngineUnit, frmMemviewPreferencesUnit,
frmBreakpointConditionUnit, frmTracerConfigUnit, frmStackViewUnit, luaJit,
ScrollBoxEx, fileaccess, ceguicomponents, formdesignerunit, LuaCaller,
LuaSyntax, cesupport, trainergenerator, genericHotkey,
frmExeTrainerGeneratorUnit, luafile, xmplayer_server, xmplayer_defines,
ExtraTrainerComponents, frmAdConfigUnit, IconStuff, cetranslator,
frmStringMapUnit, MemFuncs, frmStringPointerScanUnit,
frmStructPointerRescanUnit, sharedMemory, disassemblerComments,
frmFilePatcherUnit, LuaCanvas, LuaPen, LuaFont, LuaBrush, LuaPicture, LuaMenu,
LuaDebug, frmUltimapUnit, DBK64SecondaryLoader, frmHotkeyExUnit,
SymbolListHandler, networkInterface, networkInterfaceApi, networkConfig,
LuaThread, LuaGraphic, LuaProgressBar, d3dhookUnit, LuaOldD3DHook,
LuaWinControl, frmSetCrosshairUnit, StructuresFrm2, scrollTreeView,
frmStructures2ElementInfoUnit, frmStructureLinkerUnit, LuaMemoryRecord,
LuaStructure, LuaForm, regionex, LuaRegion, frmgroupscanalgoritmgeneratorunit,
vartypestrings, LuaXMPlayer, groupscancommandparser, LuaMemscan, LuaFoundlist,
LuaRadioGroup, RemoteMemoryManager, LuaRasterImage, multilineinputqueryunit,
LuaCheatComponent, LuaAddresslist, frmDriverLoadedUnit, memdisplay,
frmSortPointerlistUnit, LuaClassArray, LuaObject, LuaComponent, LuaControl,
LuaStrings, LuaStringlist, LuaCustomControl, LuaGraphicControl, LuaPanel,
LuaImage, LuaButton, LuaCheckbox, LuaClass, LuaGroupbox, LuaListbox,
LuaCombobox, LuaTrackbar, LuaCollectionItem, LuaListcolumn, LuaEdit, LuaMemo,
LuaCollection, LuaListColumns, LuaListItem, LuaListItems, LuaListview,
LuaTimer, LuaGenericHotkey, LuaFileDialog, LuaStream, LuaTableFile,
LuaMemoryRecordHotkey, LuaMemoryView, LuaD3DHook, CustomBase85,
frmMemoryViewExUnit, LuaDisassembler, LuaDissectCode, LuaByteTable, LuaBinary,
frmD3DHookSnapshotConfigUnit, frmsnapshothandlerUnit, frmSaveSnapshotsUnit,
frmD3DTrainerGeneratorOptionsUnit, lua_server, frmAssemblyScanUnit,
frmManualStacktraceConfigUnit, cvconst, NetworkDebuggerInterface,
DisassemblerArm, LastDisassembleData, elfsymbols, assemblerArm,
frmPointerscanConnectDialogUnit, PageMap, CELazySocket,
PointerscanNetworkCommands, frmpointerrescanconnectdialogunit,
frmMergePointerscanResultSettingsUnit, AddresslistEditor,
FrmMemoryRecordDropdownSettingsUnit, frmMemrecComboboxUnit, tracerIgnore,
DotNetPipe, DotNetTypes, LuaPipeServer, LuaPipe, LuaPipeClient,
CEListviewItemEditor, LuaTreeview, LuaTreeNodes, LuaTreeNode, LuaCalendar,
LuaSymbolListHandler, LuaFindDialog, LuaCommonDialog, LuaSettings,
frmReferencedFunctionsUnit, LuaPageControl, DebugHelper,
frmNetworkDataCompressionUnit, lazcontrols, LuaApplication, ProcessList,
pointeraddresslist, frmResumePointerscanUnit, frmSetupPSNNodeUnit,
PointerscanWorker, PointerscanStructures, PointerscanController, zstreamext,
PointerscanConnector, PointerscanNetworkStructures, AsyncTimer,
PointerscanSettingsIPConnectionList, MemoryStreamReader, commonTypeDefs,
Parsers, Globals, NullStream, RipRelativeScanner, LuaRIPRelativeScanner,
VirtualQueryExCache, disassemblerthumb, AccessedMemory, LuaStructureFrm,
MemoryQuery, pointerparser, GnuAssembler, binutils, dbvmLoadManual, mikmod,
frmEditHistoryUnit, LuaInternet, xinput, frmUltimap2Unit, cpuidunit, libipt,
DPIHelper, Graphics, fontSaveLoadRegistry, registry, frmWatchlistUnit,
frmWatchListAddEntryUnit, frmBusyUnit, FindDialogFix, LuaCustomType, LuaSQL,
bCrypt, feces, askToRunLuaScript, frmDBVMWatchConfigUnit,
frmStructuresNewStructureUnit, frmDotNetObjectListUnit, vextypedef,
frmFindDialogUnit, frmRearrangeStructureListUnit,
autoassemblerexeptionhandler, frmstructurecompareunit, addressedit,
frmChangedAddressesCommonalityScannerUnit, ceregistry, LuaRemoteThread,
LuaManualModuleLoader, symbolhandlerstructs, frmOpenFileAsProcessDialogUnit,
BetterDLLSearchPath, UnexpectedExceptionsHelper, frmExceptionRegionListUnit,
frmExceptionIgnoreListUnit, frmcodefilterunit, CodeFilterCallOrAllDialog,
frmBranchMapperUnit, frmSymbolEventTakingLongUnit, LuaCheckListBox,
textrender, diagramtypes, diagramblock, diagram, LuaDiagram, LuaDiagramBlock,
LuaDiagramLink, diagramlink, BreakpointTypeDef, frmFoundlistPreferencesUnit,
LuaHeaderSections, frmDebuggerAttachTimeoutUnit, cheatecoins,
frmMicrotransactionsUnit, frmSyntaxHighlighterEditor, LuaCustomImageList,
dotnethost, rttihelper, cefreetype, LuaDotNetPipe, LuaRemoteExecutor,
autoassemblercode, CSharpCompiler, newhintwindow, memrecDataStructures,
LuaCECustomButton, DBVMDebuggerInterface, frmCR3SwitcherUnit, tcclib,
sourcecodehandler, frmSourceDisplayUnit, disassemblerarm64, contexthandler,
DisAssemblerARM32, frmAnchorEditor, disassemblerArm32Thumb, iptnative,
iptlogdisplay, LuaVirtualStringTree, userbytedisassembler,
LuaNetworkInterface, libcepack, symbolsync, gdbserverconnectdialog,
GDBServerDebuggerInterface;
{$R cheatengine.res}
{$IFDEF windows}
//{$R manifest.res} //lazarus now has this build in (but sucks as it explicitly turns of dpi aware)
//{$R Sounds.rc}
//{$R images.rc}
{$ifdef cpu32}
{$SetPEFlags $20}
{$endif}
{$ENDIF}
{$R sounds.res}
{$ifdef altname}
{$R Images_alt.res}
{$else}
{$R Images.res}
{$endif}
procedure HandleParameters;
{Keep in mind: Responsible for not making the mainform visible}
var i: integer;
mainformvisible: boolean;
p: string;
tabletoload: string;
origin: string;
begin
tabletoload:='';
origin:='';
mainformvisible:=true;
try
for i:=1 to Paramcount do
begin
p:=paramstr(i);
//ShowMessage('Param '+inttostr(i)+' = '+p);
if p<>'' then
begin
{$ifdef darwin}
if p='hasrights' then continue;
{$endif}
if p[1]='-' then
begin
//could be -ORIGIN
if uppercase(copy(p,1,8))='-ORIGIN:' then
origin:=AnsiDequotedStr(copy(p,9, length(p)-8),'"');
end
else
if (pos('.CETRAINER', uppercase(p))>0) or (pos('.CT', uppercase(p))>0) then
begin
//add the path of this CT to the lua lookup
LUA_DoScript('package.path = package.path .. [[;'+ExtractFilePath(p)+'?.lua]];');
mainformvisible:=uppercase(ExtractFileExt(p))<>'.CETRAINER';
tabletoload:=p; //mark this trainer to be loaded
end;
end;
end;
if tabletoload<>'' then
begin
//it needs to load a table
if fileexists(tabletoload)=false then //try to fix this
begin
if fileexists(WinCPToUTF8(tabletoload)) then
tabletoload:=WinCPToUTF8(tabletoload)
else
if fileexists(UTF8ToWinCP(tabletoload)) then
tabletoload:=UTF8ToWinCP(tabletoload);
end;
if origin='' then
origin:=ExtractFilePath(tabletoload);
if origin<>'' then
LUA_DoScript('TrainerOrigin=[['+origin+']]');
try
try
if mainformvisible then LoadSettingsFromRegistry;
LoadTable(tabletoload,false);
MainForm.Savedialog1.FileName:=tabletoload;
finally
if ExtractFileName(tabletoload)='CET_TRAINER.CETRAINER' then //Let's just hope no-one names their trainer exactly this...
DeleteFile(tabletoload);
end;
except
on e: exception do
begin
MessageDlg('Failure loading the trainer. Reason :'+e.message, mterror, [mbok], 0);
application.Terminate;
end;
end;
end
else
LoadSettingsFromRegistry;
except
end;
for i:=0 to mainform.LuaForms.count-1 do
if tceform(mainform.luaforms[i]).visible then
begin
//first visible window in the formlist becomes the new taskbar window
try
tceform(mainform.luaforms[i]).ShowInTaskBar:=stAlways;
tceform(mainform.luaforms[i]).formstyle:=fsStayOnTop;
tceform(mainform.luaforms[i]).formstyle:=fsNormal;
application.title:=tceform(mainform.luaforms[i]).Caption;
application.icon:=tceform(mainform.luaforms[i]).Icon;
except
end;
break;
end;
{$ifdef darwin}
frmmacumm.visible:=true;
{$else}
mainform.visible:=mainformvisible;
{$endif}
end;
type TFormFucker=class
private
procedure addFormEvent(Sender: TObject; Form: TCustomForm);
end;
procedure TFormFucker.addFormEvent(Sender: TObject; Form: TCustomForm);
begin
//fuuuuucking time
if (form<>nil) and (overridefont<>nil) then
begin
if (form is TsynCompletionForm)=false then //dus nut wurk with this
form.Font:=overridefont;
end;
end;
procedure setScaledTrue;
begin
application.Scaled:=true; //put it here because the lazarus ide will just nuke it on setting change otherwise
end;
var
i: integer;
ff: TFormFucker;
r: TRegistry;
path: string;
noautorun: boolean;
begin
Application.Title:='Cheat Engine 7.5';
//'Cheat Engine 7.3';
{$ifdef darwin}
macPortFixRegPath;
{$endif}
outputdebugstring('start');
Application.Initialize;
{$ifdef windows}
registerDarkModeHintHandler;
{$endif}
overridefont:=nil;
noautorun:=false;
getcedir;
doTranslation;
//first check if this is a trainer.
istrainer:=false;
for i:=1 to Paramcount do
begin
if pos('.CETRAINER', uppercase(ParamStr(i)))>0 then
begin
istrainer:=true; //a trainer could give some extra parameters like dpiaware , but that is fine
if pos('CET_TRAINER.CETRAINER', uppercase(ParamStr(i)))>0 then
isExeTrainer:=true;
break;
end;
end;
if istrainer then setScaledTrue;
if not istrainer then
begin
//check the user preferences
{$ifdef darwin}
macPortFixRegPath;
{$endif}
r := TRegistry.Create;
r.RootKey := HKEY_CURRENT_USER;
if r.OpenKey('\Software\'+strCheatEngine,false) then
begin
if r.ValueExists('RunAsAdmin') then
begin
if r.readbool('RunAsAdmin') then
begin
askAboutRunningAsAdmin:=false;
requiresAdmin;
end;
end;
if r.ValueExists('Override Default Font') then
begin
if r.ReadBool('Override Default Font') then
begin
if r.OpenKey('Font', false) then
begin
overridefont:=TFont.create;
LoadFontFromRegistry(overridefont,r);
ff:=TFormFucker.Create;
screen.AddHandlerFormAdded(@ff.addFormEvent);
end;
end;
end;
end;
end;
for i:=1 to Paramcount do
begin
if Copy(uppercase(ParamStr(i)),1,9)='FONTSIZE=' then
begin
try
if overridefont=nil then
overridefont:=TFont.create;
overridefont.size:=strtoint(copy(ParamStr(i), 10, length(ParamStr(i))));
ff:=TFormFucker.Create;
screen.AddHandlerFormAdded(@ff.addFormEvent);
except
end;
end;
if uppercase(ParamStr(i))='NOAUTORUN' then //don't load any extentions yet
noautorun:=true;
end;
symhandlerInitialize;
Application.ShowMainForm:=false;
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TMemoryBrowser, MemoryBrowser);
Application.CreateForm(TformSettings, formSettings);
Application.CreateForm(TAdvancedOptions, AdvancedOptions);
Application.CreateForm(TComments, Comments);
Application.CreateForm(TTypeForm, TypeForm);
{$ifdef darwin}
Application.CreateForm(TfrmMacUmm, frmMacUmm);
{$endif}
initcetitle;
{$ifdef darwin}
macPortFixRegPath;
{$endif}
InitializeLuaScripts(noautorun);
handleparameters;
OutputDebugString('Starting CE');
Application.Run;
end.