root/Cheat Engine/formsettingsunit.pas @ 313

Revision 313, 37.7 kB (checked in by dark_byte, 7 months ago)

Release candidate 1 for 5.6

Line 
1unit formsettingsunit;
2
3interface
4
5uses
6  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
7  StdCtrls,registry, Menus,ComCtrls,cefuncproc,ExtCtrls,tlhelp32,CheckLst,
8  Buttons, frameHotkeyConfigUnit,
9
10  kerneldebugger,plugin,newkernelhandler,debugger,hotkeyhandler,
11  formhotkeyunit;
12
13
14type Tpathspecifier=class(TObject)
15  public
16    path: string;
17end;
18
19type
20  TformSettings = class(TForm)
21    defaultbuffer: TPopupMenu;
22    Default1: TMenuItem;
23    pnlConfig: TPanel;
24    tvMenuSelection: TTreeView;
25    pcSetting: TPageControl;
26    GeneralSettings: TTabSheet;
27    ScanSettings: TTabSheet;
28    Label11: TLabel;
29    Label12: TLabel;
30    Label13: TLabel;
31    Label14: TLabel;
32    Label16: TLabel;
33    Label17: TLabel;
34    Label18: TLabel;
35    Label19: TLabel;
36    Label23: TLabel;
37    Label24: TLabel;
38    cbShowUndo: TCheckBox;
39    cbShowAdvanced: TCheckBox;
40    cbCenterOnPopup: TCheckBox;
41    EditUpdateInterval: TEdit;
42    EditFreezeInterval: TEdit;
43    GroupBox1: TGroupBox;
44    cbShowAsSigned: TCheckBox;
45    cbBinariesAsDecimal: TCheckBox;
46    cbsimplecopypaste: TCheckBox;
47    EditNetworkUpdateInterval: TEdit;
48    cbUpdatefoundList: TCheckBox;
49    editUpdatefoundInterval: TEdit;
50    cbHideAllWindows: TCheckBox;
51    btnExcludeProcesses: TButton;
52    EditAutoAttach: TEdit;
53    cbAlwaysAutoAttach: TCheckBox;
54    cbSaveWindowPos: TCheckBox;
55    cbOldSpeedhack: TCheckBox;
56    Label2: TLabel;
57    Label3: TLabel;
58    Label1: TLabel;
59    Label15: TLabel;
60    Label21: TLabel;
61    checkThread: TCheckBox;
62    combothreadpriority: TComboBox;
63    cbFastscan: TCheckBox;
64    cbSkip_PAGE_NOCACHE: TCheckBox;
65    cbLowMemoryUsage: TCheckBox;
66    cbMemImage: TCheckBox;
67    cbMemMapped: TCheckBox;
68    cbMemPrivate: TCheckBox;
69    cbEnableHyperscanWhenPossible: TCheckBox;
70    EditBufsize: TEdit;
71    Plugins: TTabSheet;
72    CodeFinder: TTabSheet;
73    Assembler: TTabSheet;
74    Label4: TLabel;
75    Label6: TLabel;
76    Label7: TLabel;
77    Label8: TLabel;
78    Label9: TLabel;
79    rbDebugRegisters: TRadioButton;
80    rdWriteExceptions: TRadioButton;
81    CheckBox1: TCheckBox;
82    cbHandleBreakpoints: TCheckBox;
83    cbShowDisassembler: TCheckBox;
84    cbShowDebugoptions: TCheckBox;
85    replacewithnops: TCheckBox;
86    askforreplacewithnops: TCheckBox;
87    CheckBox2: TCheckBox;
88    rbDebugAsBreakpoint: TRadioButton;
89    rbInt3AsBreakpoint: TRadioButton;
90    cbBreakOnAttach: TCheckBox;
91    Extra: TTabSheet;
92    TauntOldOsUser: TLabel;
93    GroupBox3: TGroupBox;
94    cbKernelQueryMemoryRegion: TCheckBox;
95    cbKernelReadWriteProcessMemory: TCheckBox;
96    cbKernelOpenProcess: TCheckBox;
97    cbProcessWatcher: TCheckBox;
98    cbKdebug: TCheckBox;
99    CheckBox3: TCheckBox;
100    CheckBox4: TCheckBox;
101    cbGlobalDebug: TCheckBox;
102    tsHotkeys: TTabSheet;
103    OpenDialog1: TOpenDialog;
104    Unrandomizer: TTabSheet;
105    Label5: TLabel;
106    edtDefault: TEdit;
107    cbIncremental: TCheckBox;
108    Panel6: TPanel;
109    AboutLabel: TLabel;
110    Button2: TButton;
111    Button1: TButton;
112    frameHotkeyConfig: TframeHotkeyConfig;
113    cbProcessIcons: TCheckBox;
114    cbProcessIconsOnly: TCheckBox;
115    tsTools: TTabSheet;
116    Panel2: TPanel;
117    cbShowTools: TCheckBox;
118    Panel3: TPanel;
119    edtApplicationTool: TEdit;
120    btnSetToolShortcut: TButton;
121    Panel5: TPanel;
122    Panel4: TPanel;
123    btnToolNew: TButton;
124    btnToolDelete: TButton;
125    lvTools: TListView;
126    lblApplicationTool: TLabel;
127    lblShortcut: TLabel;
128    lblShortcutText: TLabel;
129    lblToolsName: TLabel;
130    edtToolsName: TEdit;
131    OpenButton: TSpeedButton;
132    OpenDialog2: TOpenDialog;
133    cbShowMainMenu: TCheckBox;
134    cbOldPointerAddMethod: TCheckBox;
135    Panel7: TPanel;
136    Button5: TButton;
137    Button4: TButton;
138    Panel8: TPanel;
139    Label22: TLabel;
140    clbPlugins: TCheckListBox;
141    procedure Button1Click(Sender: TObject);
142    procedure checkThreadClick(Sender: TObject);
143    procedure EditBufSizeKeyPress(Sender: TObject; var Key: Char);
144    procedure Default1Click(Sender: TObject);
145    procedure FormShow(Sender: TObject);
146    procedure cbShowDisassemblerClick(Sender: TObject);
147    procedure replacewithnopsClick(Sender: TObject);
148    procedure CheckBox1Click(Sender: TObject);
149    procedure CheckBox2Click(Sender: TObject);
150    procedure cbUpdatefoundListClick(Sender: TObject);
151    procedure AboutLabelClick(Sender: TObject);
152    procedure cbHideAllWindowsClick(Sender: TObject);
153    procedure btnExcludeProcessesClick(Sender: TObject);
154    procedure FormCreate(Sender: TObject);
155    procedure cbKernelQueryMemoryRegionClick(Sender: TObject);
156    procedure FormClose(Sender: TObject; var Action: TCloseAction);
157    procedure cbKdebugClick(Sender: TObject);
158    procedure cbProcessWatcherClick(Sender: TObject);
159    procedure Button4Click(Sender: TObject);
160    procedure Button5Click(Sender: TObject);
161    procedure tvMenuSelectionChange(Sender: TObject; Node: TTreeNode);
162    procedure Panel6Resize(Sender: TObject);
163    procedure cbProcessIconsClick(Sender: TObject);
164    procedure tvMenuSelectionCollapsing(Sender: TObject; Node: TTreeNode;
165      var AllowCollapse: Boolean);
166    procedure btnSetToolShortcutClick(Sender: TObject);
167    procedure cbShowToolsClick(Sender: TObject);
168    procedure btnToolNewClick(Sender: TObject);
169    procedure lvToolsClick(Sender: TObject);
170    procedure edtApplicationToolChange(Sender: TObject);
171    procedure btnToolDeleteClick(Sender: TObject);
172    procedure edtToolsNameChange(Sender: TObject);
173    procedure OpenButtonClick(Sender: TObject);
174  private
175    { Private declarations }
176    tempstatePopupHide:word;
177    temppopupmodifier:dword;
178    tempstatePause:word;
179    tempPausemodifier:dword;
180    tempstateSpeedhack:word;
181    tempSpeedhackmodifier:dword;
182
183    systemcallretrieverexecuted:boolean;
184    systemcallretrieverhandle: thandle;
185
186    tempmodulelist: pchar;
187    tempmodulelistsize: integer;
188    tempdenylist: boolean;
189    tempdenylistglobal: boolean;
190
191    deletedmodules: tstringlist;
192
193    procedure SetAssociations;
194    procedure startsystemcallretrieverifneeded; overload;
195    procedure startsystemcallretrieverifneeded(why:string); overload;
196  public
197    { Public declarations }
198   
199
200    tempdonthidelist: array of string;
201    temphideall: boolean;
202    laststatePopupHide:word;
203    lastpopupmodifier:dword;
204    laststatePause:word;
205    lastPausemodifier:dword;
206    laststateSpeedhack:word;
207    lastSpeedhackmodifier:dword;
208    Loadingsettingsfromregistry: boolean;
209
210    unrandomizersettings: record
211                            defaultreturn: integer;
212                            incremental: boolean;
213                          end;
214  end;
215
216var
217  formSettings: TformSettings;
218
219
220
221  {$ifdef net}
222  IsDebuggerPresentLocation: integer=0;
223  {$endif}
224
225implementation
226
227uses
228aboutunit,
229
230{$ifdef net}
231Unit2;
232{$else}
233MainUnit,
234Mainunit2,
235frmExcludeHideUnit,
236MemoryBrowserFormUnit,
237ModuleSafetyUnit,
238frmProcessWatcherUnit,
239ConfigUnrandomizerFrm;
240{$endif}
241
242
243{$R *.DFM}
244
245
246procedure decimal(var key: char);
247begin
248  case key of
249    chr(8)   : ;
250    chr(16)  : ;
251    '0'..'9' : ;
252    else key:=chr(0);
253  end;
254end;
255
256
257procedure TFormSettings.SetAssociations;
258begin
259
260end;
261
262
263procedure TformSettings.Button1Click(Sender: TObject);
264resourcestring
265  strProcessWatcherWillPreventUnloader='Enabling the process watcher will prevent the unloader from working';
266var processhandle2: Thandle;
267    reg: TRegistry;
268    bufsize: integer;
269    newmax: integer;
270    i,j,error: integer;
271    ec:dword;
272    found:boolean;
273
274    networkupdateinterval,updateinterval,freezeinterval,FoundInterval: integer;
275
276    dllpath: Tpathspecifier;
277begin
278{$ifndef net}
279  if cbProcessWatcher.checked and (frmprocesswatcher=nil) then
280  begin
281    if messagedlg(strProcessWatcherWillPreventUnloader,mtwarning,[mbok,mbcancel],0)=mrcancel then
282      exit
283    else
284    begin
285      loaddbk32;
286      frmprocesswatcher:=tfrmprocesswatcher.Create(mainform); //start the process watcher
287    end;
288  end;
289
290
291  if systemcallretrieverexecuted then
292  begin
293    if GetExitCodeProcess(systemcallretrieverhandle,ec) then
294    begin
295      if ec=STILL_ACTIVE then
296         if messagedlg('It''s best to wait till the systemcall retriever is done. Continue anyhow?',mtconfirmation,[mbyes,mbno],0)=mrno then exit;
297
298      closehandle(systemcallretrieverhandle);
299      systemcallretrieverexecuted:=false;
300    end;
301  end;
302
303{$endif}
304
305  if not ((cbMemPrivate.checked) or (cbMemImage.Checked) or (cbMemMapped.Checked)) then
306    if messagedlg('You haven''t selected any memory type. This will result in Cheat Engine finding NO memory! Are you stupid?',mtWarning,[mbyes,mbno],0)<>mryes then exit;
307
308
309  val(editUpdatefoundInterval.Text,foundinterval,error);
310  if (error<>0) or (foundinterval<=0) then raise exception.Create(editUpdatefoundInterval.Text+' is not a valid interval');
311
312  val(editupdateinterval.text,updateinterval,error);
313  if (error<>0) or (updateinterval<=0) then raise exception.Create(editupdateinterval.text+' is not a valid interval');
314
315  val(editnetworkupdateinterval.text,networkupdateinterval,error);
316  if (error<>0) or (networkupdateinterval<=0) then raise exception.Create(editnetworkupdateinterval.text+' is not a valid interval');
317
318  val(editfreezeinterval.text,freezeinterval,error);
319  if (error<>0) or (updateinterval<=0) then raise exception.Create(editfreezeinterval.text+' is not a valid interval');
320
321
322  try bufsize:=StrToInt(editbufsize.text); except bufsize:=1024; end;
323
324  if bufsize=0 then raise exception.create('The scanbuffer size has to be greater than 0');
325
326  {$ifdef net}
327  mainform.buffersize:=bufsize*1024;
328  {$else}
329  buffersize:=bufsize*1024;
330  {$endif}
331
332  mainform.UndoScan.visible:={$ifdef net}false{$else}cbshowundo.checked{$endif};
333  mainform.advancedbutton.Visible:=cbShowAdvanced.checked;
334
335
336  //save to the registry
337  reg:=Tregistry.Create;
338  try
339    Reg.RootKey := HKEY_CURRENT_USER;
340    if Reg.OpenKey('\Software\Cheat Engine',true) then
341    begin
342      //write the settings
343      reg.WriteBool('Undo',cbshowundo.checked);
344      reg.WriteBool('Advanced',cbShowAdvanced.checked);
345      reg.WriteBool('SeperateThread',checkThread.checked);
346      reg.WriteInteger('ScanThreadpriority',combothreadpriority.itemindex);
347      case combothreadpriority.itemindex of
348        0: scanpriority:=tpIdle;
349        1: scanpriority:=tpLowest;
350        2: scanpriority:=tpLower;
351        3: scanpriority:=tpLower;
352        4: scanpriority:=tpNormal;
353        5: scanpriority:=tpHigher;
354        6: scanpriority:=tpHighest;
355        7: scanpriority:=tpTimeCritical;
356      end;
357
358
359      reg.WriteInteger('Buffersize',bufsize);
360      reg.WriteInteger('Maxresults',newmax);
361      reg.WriteBool('UseDebugRegs',rbDebugRegisters.checked);
362      reg.writebool('Show Disassembler',cbShowDisassembler.checked);
363      reg.WriteBool('Center on popup',cbCenterOnPopup.checked);
364      reg.WriteInteger('Update interval',updateinterval);
365      reg.WriteInteger('Freeze interval',freezeinterval);
366      reg.writebool('Show values as signed',cbShowAsSigned.checked);
367      reg.writebool('Handle binarys as decimals',cbBinariesAsDecimal.checked);
368      reg.WriteInteger('Network Update Interval',Networkupdateinterval);
369      reg.WriteBool('Show debugger options',cbShowDebugOptions.checked);
370      reg.WriteBool('Replace incomplete opcodes with NOPS',replacewithnops.checked);
371      reg.WriteBool('Ask for replace with NOPS',askforreplacewithnops.checked);
372      reg.WriteBool('Use Anti-debugdetection',checkbox1.checked);
373      reg.WriteBool('Handle unhandled breakpoints',cbhandlebreakpoints.Checked);
374      reg.WriteBool('Fastscan on by default',cbFastscan.checked);
375
376      reg.WriteBool('Hardware breakpoints',rbDebugAsBreakpoint.checked);
377      reg.WriteBool('Update Foundaddress list',cbUpdatefoundList.checked);
378      reg.WriteInteger('Update Foundaddress list Interval',foundinterval);
379
380      reg.WriteBool('Simple copy/paste',cbsimplecopypaste.checked);
381      reg.WriteString('AutoAttach',EditAutoAttach.text);
382      reg.writebool('Always AutoAttach', cbAlwaysAutoAttach.checked);
383
384
385      {$ifndef net}
386      mainform.UpdateFoundlisttimer.Interval:=foundinterval;
387      {$endif}
388
389      reg.WriteBool('Save window positions',cbSaveWindowPos.checked);
390      reg.WriteBool('Use old speedhack',cbOldSpeedhack.checked);
391      reg.WriteBool('Show main menu',cbShowMainMenu.Checked);
392      reg.WriteBool('Get process icons',cbProcessIcons.Checked);
393      GetProcessIcons:=cbProcessIcons.Checked;
394
395      reg.WriteBool('Only show processes with icon',cbProcessIconsOnly.Checked);
396      ProcessesWithIconsOnly:=cbProcessIconsOnly.Checked;
397
398      reg.WriteBool('Pointer appending', cbOldPointerAddMethod.checked);
399
400      reg.writebool('skip PAGE_NOCACHE',cbSkip_PAGE_NOCACHE.Checked);
401      reg.WriteBool('Break when debuging',cbBreakOnAttach.Checked);
402      reg.WriteBool('Hide all windows',cbHideAllWindows.checked);
403      reg.WriteBool('Really hide all windows',temphideall);
404
405
406      //save donthidelist
407      {$ifndef net}
408      setlength(donthidelist,length(tempdonthidelist));
409      for i:=0 to length(tempdonthidelist)-1 do
410      begin
411        donthidelist[i]:=tempdonthidelist[i];
412        reg.writestring('Do not hide '+IntToStr(i),tempdonthidelist[i]);
413      end;
414
415      //end
416      reg.writestring('Do not hide '+IntToStr(length(tempdonthidelist)),'');
417      reg.WriteBool('MEM_PRIVATE',cbMemPrivate.checked);
418      reg.WriteBool('MEM_IMAGE',cbMemImage.Checked);
419      reg.WriteBool('MEM_MAPPED',cbMemMapped.Checked);
420      onlyfront:=not temphideall;
421      reg.WriteBool('Low Memory Usage',cbLowMemoryUsage.checked);
422      reg.writebool('Use Hyperscan if posible',cbEnableHyperscanWhenPossible.checked);
423
424      //check the module list
425      if frmModuleSafety<>nil then //modified
426      begin
427        freemem(modulelist);
428        modulelist:=tempmodulelist;
429        modulelistsize:=tempmodulelistsize;
430        tempmodulelist:=nil;
431        denylist:=tempdenylist;
432        denylistglobal:=tempdenylistglobal;
433
434        reg.WriteBinaryData('Module List',ModuleList^,modulelistsize);
435        reg.writeInteger('modulelistsize',modulelistsize);
436        reg.WriteBool('Global Denylist',DenyListGlobal);
437        reg.WriteBool('ModuleList as Denylist',DenyList);
438      end;
439
440      try
441        reg.WriteInteger('hotkey poll interval',strtoint(frameHotkeyConfig.edtKeypollInterval.text));
442        hotkeyPollInterval:=strtoint(frameHotkeyConfig.edtKeypollInterval.text);
443      except
444        raise exception.Create('the value for the keypoll interval ('+frameHotkeyConfig.edtKeypollInterval.text+' is invalid');
445      end;
446
447      try
448        reg.WriteInteger('Time between hotkeypress',strtoint(frameHotkeyConfig.edtHotkeyDelay.text));
449        hotkeyIdletime:=strtoint(frameHotkeyConfig.edtHotkeyDelay.text);
450      except
451        raise exception.Create('the value for the wait between hotkey presses ('+frameHotkeyConfig.edtHotkeyDelay.text+' is invalid');
452      end;
453
454
455
456
457        //save the hotkeylist
458        reg.WriteBinaryData('Show Cheat Engine Hotkey',frameHotkeyConfig.newhotkeys[0][0],10);
459        reg.WriteBinaryData('Pause process Hotkey',frameHotkeyConfig.newhotkeys[1][0],10);
460        reg.WriteBinaryData('Toggle speedhack Hotkey',frameHotkeyConfig.newhotkeys[2][0],10);
461
462
463        reg.WriteFloat('Speedhack 1 speed',frameHotkeyConfig.newspeedhackspeed1.speed);
464        reg.WriteInteger('Speedhack 1 sleeptime',frameHotkeyConfig.newspeedhackspeed1.sleeptime);
465        reg.WriteFloat('Speedhack 2 speed',frameHotkeyConfig.newspeedhackspeed2.speed);
466        reg.WriteInteger('Speedhack 2 sleeptime',frameHotkeyConfig.newspeedhackspeed2.sleeptime);
467        reg.WriteFloat('Speedhack 3 speed',frameHotkeyConfig.newspeedhackspeed3.speed);
468        reg.WriteInteger('Speedhack 3 sleeptime',frameHotkeyConfig.newspeedhackspeed3.sleeptime);
469        reg.WriteFloat('Speedhack 4 speed',frameHotkeyConfig.newspeedhackspeed4.speed);
470        reg.WriteInteger('Speedhack 4 sleeptime',frameHotkeyConfig.newspeedhackspeed4.sleeptime);
471        reg.WriteFloat('Speedhack 5 speed',frameHotkeyConfig.newspeedhackspeed5.speed);
472        reg.WriteInteger('Speedhack 5 sleeptime',frameHotkeyConfig.newspeedhackspeed5.sleeptime);
473
474        mainunit2.speedhackspeed1:=frameHotkeyConfig.newspeedhackspeed1;
475        mainunit2.speedhackspeed2:=frameHotkeyConfig.newspeedhackspeed2;
476        mainunit2.speedhackspeed3:=frameHotkeyConfig.newspeedhackspeed3;
477        mainunit2.speedhackspeed4:=frameHotkeyConfig.newspeedhackspeed4;
478        mainunit2.speedhackspeed5:=frameHotkeyConfig.newspeedhackspeed5;
479
480        reg.WriteBinaryData('Set Speedhack speed 1 Hotkey',frameHotkeyConfig.newhotkeys[3][0],10);
481        reg.WriteBinaryData('Set Speedhack speed 2 Hotkey',frameHotkeyConfig.newhotkeys[4][0],10);
482        reg.WriteBinaryData('Set Speedhack speed 3 Hotkey',frameHotkeyConfig.newhotkeys[5][0],10);
483        reg.WriteBinaryData('Set Speedhack speed 4 Hotkey',frameHotkeyConfig.newhotkeys[6][0],10);
484        reg.WriteBinaryData('Set Speedhack speed 5 Hotkey',frameHotkeyConfig.newhotkeys[7][0],10);
485
486        reg.WriteBinaryData('Increase Speedhack speed',frameHotkeyConfig.newhotkeys[8][0],10);
487        reg.WriteFloat('Increase Speedhack delta',frameHotkeyConfig.speedupdelta);
488
489        reg.WriteBinaryData('Decrease Speedhack speed',frameHotkeyConfig.newhotkeys[9][0],10);
490        reg.WriteFloat('Decrease Speedhack delta',frameHotkeyConfig.slowdowndelta);
491
492        mainunit2.speedupdelta:=frameHotkeyConfig.speedupdelta;
493        mainunit2.slowdowndelta:=frameHotkeyConfig.slowdowndelta;
494
495        reg.WriteBinaryData('Binary Hotkey',frameHotkeyConfig.newhotkeys[10][0],10);
496        reg.WriteBinaryData('Byte Hotkey',frameHotkeyConfig.newhotkeys[11][0],10);
497        reg.WriteBinaryData('2 Bytes Hotkey',frameHotkeyConfig.newhotkeys[12][0],10);
498        reg.WriteBinaryData('4 Bytes Hotkey',frameHotkeyConfig.newhotkeys[13][0],10);
499        reg.WriteBinaryData('8 Bytes Hotkey',frameHotkeyConfig.newhotkeys[14][0],10);
500        reg.WriteBinaryData('Float Hotkey',frameHotkeyConfig.newhotkeys[15][0],10);
501        reg.WriteBinaryData('Double Hotkey',frameHotkeyConfig.newhotkeys[16][0],10);
502        reg.WriteBinaryData('Text Hotkey',frameHotkeyConfig.newhotkeys[17][0],10);
503        reg.WriteBinaryData('Array of Byte Hotkey',frameHotkeyConfig.newhotkeys[18][0],10);
504        reg.WriteBinaryData('New Scan Hotkey',frameHotkeyConfig.newhotkeys[19][0],10);
505        reg.WriteBinaryData('New Scan-Exact Value',frameHotkeyConfig.newhotkeys[20][0],10);
506        reg.WriteBinaryData('Unknown Initial Value Hotkey',frameHotkeyConfig.newhotkeys[21][0],10);
507        reg.WriteBinaryData('Next Scan-Exact Value',frameHotkeyConfig.newhotkeys[22][0],10);
508        reg.WriteBinaryData('Increased Value Hotkey',frameHotkeyConfig.newhotkeys[23][0],10);
509        reg.WriteBinaryData('Decreased Value Hotkey',frameHotkeyConfig.newhotkeys[24][0],10);
510        reg.WriteBinaryData('Changed Value Hotkey',frameHotkeyConfig.newhotkeys[25][0],10);
511        reg.WriteBinaryData('Unchanged Value Hotkey',frameHotkeyConfig.newhotkeys[26][0],10);
512        reg.WriteBinaryData('Undo Last scan Hotkey',frameHotkeyConfig.newhotkeys[27][0],10);
513        reg.WriteBinaryData('Cancel scan Hotkey',frameHotkeyConfig.newhotkeys[28][0],10);
514        reg.WriteBinaryData('Debug->Run Hotkey',frameHotkeyConfig.newhotkeys[29][0],10);
515
516
517        //apply these hotkey changes
518        for i:=0 to 28 do
519        begin
520          found:=false;
521
522          for j:=0 to length(hotkeythread.hotkeylist)-1 do
523          begin
524            if (hotkeythread.hotkeylist[j].id=i) and (hotkeythread.hotkeylist[j].handler2) then
525            begin
526              //found it
527              hotkeythread.hotkeylist[j].keys:=frameHotkeyConfig.newhotkeys[i];
528              found:=true;
529              break;
530            end;
531          end;
532
533          if not found then //add it
534          begin
535            j:=length(hotkeythread.hotkeylist);
536            setlength(hotkeythread.hotkeylist,j+1);
537            hotkeythread.hotkeylist[j].keys:=frameHotkeyConfig.newhotkeys[i];
538            hotkeythread.hotkeylist[j].windowtonotify:=mainform.Handle;
539            hotkeythread.hotkeylist[j].id:=i;
540            hotkeythread.hotkeylist[j].handler2:=true;
541          end;
542
543          checkkeycombo(frameHotkeyConfig.newhotkeys[i]);
544        end;
545 
546
547
548      {$endif}
549
550      reg.WriteBool('Use dbk32 QueryMemoryRegionEx',cbKernelQueryMemoryRegion.checked);
551      reg.WriteBool('Use dbk32 ReadWriteProcessMemory',cbKernelReadWriteProcessMemory.checked);
552      reg.WriteBool('Use dbk32 OpenProcess',cbKernelOpenProcess.checked);
553
554      reg.WriteBool('Use Processwatcher',cbProcessWatcher.checked);
555      reg.WriteBool('Use Kernel Debugger',cbKdebug.checked);
556      reg.WriteBool('Use Global Debug Routines',cbGlobalDebug.checked);
557      if (cbGlobalDebug.checked) then
558        kdebugger.GlobalDebug:=cbGlobalDebug.checked;
559
560
561
562      unrandomizersettings.defaultreturn:=strtoint(edtdefault.Text);
563      unrandomizersettings.incremental:=cbincremental.Checked;
564      reg.WriteInteger('Unrandomizer: default value',unrandomizersettings.defaultreturn);
565      reg.WriteBool('Unrandomizer: incremental',unrandomizersettings.incremental);
566
567      reg.writebool('Show tools menu', cbShowTools.checked);
568      mainform.ools1.Visible:=cbShowTools.checked;
569
570    end;
571
572{$ifndef net}
573    //save the tools hotkeys
574    reg.DeleteKey('\Software\Cheat Engine\Tools');
575    if Reg.OpenKey('\Software\Cheat Engine\Tools',true) then
576    begin
577      for i:=0 to lvTools.Items.Count-1 do
578      begin
579        reg.WriteString(format('%.8x A',[i]),lvTools.Items[i].caption);
580        reg.WriteString(format('%.8x B',[i]),lvTools.Items[i].subitems[0]);
581        reg.WriteInteger(format('%.8x C',[i]),dword(lvTools.Items[i].data));
582      end;
583    end;
584    UpdateToolsMenu;
585
586    for i:=0 to deletedmodules.Count-1 do
587    begin
588      j:=pluginhandler.GetPluginID(deletedmodules[i]);
589      if j<>-1 then
590        pluginhandler.DisablePlugin(j);
591    end;
592
593    //save the plugins
594    reg.DeleteKey('\Software\Cheat Engine\Plugins');
595    if Reg.OpenKey('\Software\Cheat Engine\Plugins',true) then
596    begin
597      for i:=0 to clbplugins.Count-1 do
598      begin
599        dllpath:=Tpathspecifier(clbplugins.Items.Objects[i]);
600
601        reg.WriteString(format('%.8x A',[i]),dllpath.path);
602        reg.WriteBool(format('%.8x B',[i]),clbplugins.Checked[i]);
603      end;
604    end;
605
606    for i:=0 to clbplugins.Count-1 do
607    begin
608      dllpath:=Tpathspecifier(clbplugins.Items.Objects[i]);
609      j:=pluginhandler.GetPluginID(dllpath.path);
610
611      if j=-1 then //not loaded yet
612        j:=pluginhandler.LoadPlugin(dllpath.path);
613
614      if clbplugins.Checked[i] then
615      begin
616        //at least load it if it is loadable
617
618        pluginhandler.EnablePlugin(j);
619      end
620      else
621        pluginhandler.DisablePlugin(j);
622    end;
623{$endif}
624
625
626
627  finally
628    reg.CloseKey;
629    reg.free;
630  end;
631
632  SetAssociations;
633
634
635  {$ifndef net}
636  mainform.FreezeTimer.Interval:=freezeinterval;
637  mainform.UpdateTimer.Interval:=updateinterval;
638  {$else}
639  mainform.FreezeTimer.Interval:=freezeinterval;
640  mainform.UpdateTimer.Interval:=networkupdateinterval;
641  {$endif}
642
643  Skip_PAGE_NOCACHE:=cbSkip_PAGE_NOCACHE.Checked;
644
645  {$ifndef net}
646  Scan_MEM_PRIVATE:=cbMemPrivate.checked;
647  Scan_MEM_IMAGE:=cbMemImage.Checked;
648  Scan_MEM_MAPPED:=cbMemMapped.Checked;
649  {$endif}
650
651  laststatePopupHide:=tempstatepopuphide;
652  lastpopupmodifier:=temppopupmodifier;
653  laststatePause:=tempstatepause;
654  lastPausemodifier:=temppausemodifier;
655  laststateSpeedhack:=tempstatespeedhack;
656  lastSpeedhackmodifier:=tempspeedhackmodifier;
657
658  handleautoattachstring;
659
660  if cbShowMainMenu.Checked then
661    mainform.Menu:=mainform.MainMenu1
662  else
663    mainform.Menu:=nil;
664
665  modalresult:=mrok;
666end;
667
668procedure TformSettings.checkThreadClick(Sender: TObject);
669begin
670  if checkthread.checked then
671  begin
672    label3.Enabled:=true;
673    combothreadpriority.enabled:=true;
674  end
675  else
676  begin
677    label3.Enabled:=false;
678    combothreadpriority.enabled:=false;
679  end;
680end;
681
682procedure TformSettings.EditBufSizeKeyPress(Sender: TObject;
683  var Key: Char);
684begin
685  decimal(key);
686end;
687
688procedure TformSettings.Default1Click(Sender: TObject);
689begin
690  editbufsize.Text:='512';
691end;
692
693procedure TformSettings.FormShow(Sender: TObject);
694  function CheckAssociation(ext: string):boolean;
695  var  reg: TRegistry;
696       temp: string;
697  begin
698    reg := TRegistry.Create;
699    reg.RootKey := HKEY_CLASSES_ROOT;
700    reg.LazyWrite := false;
701
702    try
703      reg.OpenKey(ext+'\shell\open\command',false);
704    except
705      result:=false;
706      reg.free;
707      exit;
708    end;
709
710    temp:=reg.ReadString('');
711    if temp<>application.ExeName+' "%1"' then
712    begin
713      result:=false;
714      reg.CloseKey;
715      reg.free;
716      exit;
717    end;
718
719    result:=true;
720  end;
721  var reg: TRegistry;
722  i: integer;
723begin
724  tempstatepopuphide:=laststatePopupHide;
725  temppopupmodifier:=lastpopupmodifier;
726  tempstatepause:=laststatePause;
727  temppausemodifier:=lastPausemodifier;
728  tempstatespeedhack:=laststateSpeedhack;
729  tempspeedhackmodifier:=lastSpeedhackmodifier;
730
731  {$ifndef net}
732  setlength(tempdonthidelist,length(donthidelist));
733  for i:=0 to length(donthidelist)-1 do
734    tempdonthidelist[i]:=donthidelist[i];
735  {$endif net}
736
737
738  if IsDebuggerPresentLocation=0 then
739  begin
740    checkbox1.Enabled:=false;
741    checkbox2.Enabled:=false;
742  end;
743
744  {$ifndef net}
745  if debuggerthread<>nil then
746  begin
747    rbDebugAsBreakpoint.Enabled:=false;
748    rbInt3AsBreakpoint.Enabled:=false;
749  end
750  else
751  begin
752    rbDebugAsBreakpoint.Enabled:=true;
753    rbInt3AsBreakpoint.Enabled:=true;
754  end;
755  {$endif}
756
757  label1.Enabled:=not mainform.nextscanbutton.enabled;
758  editbufsize.enabled:=not mainform.nextscanbutton.enabled;
759
760  //load the settings from the register and apply them to this window
761
762
763  {$ifndef net}
764  if GetSystemType<3 then //not a supported os for hardware breakpoints
765  begin
766    rdWriteExceptions.Checked:=true;
767    rbDebugRegisters.Enabled:=false;
768
769    rbDebugAsBreakpoint.enabled:=false;
770    rbInt3AsBreakpoint.enabled:=true;
771    label6.Enabled:=false;
772    label7.Enabled:=false;
773  end;
774  {$endif}
775
776  cbOldSpeedhack.enabled:=not mainform.cbSpeedhack.Checked; //don't change it while  you're using the speedhack
777
778
779
780  //fill hotkey list
781  for i:=0 to length(hotkeythread.hotkeylist)-1 do
782    if hotkeythread.hotkeylist[i].handler2 then
783      framehotkeyconfig.newhotkeys[hotkeythread.hotkeylist[i].id]:=hotkeythread.hotkeylist[i].keys;
784
785  framehotkeyconfig.newspeedhackspeed1:=speedhackspeed1;
786  framehotkeyconfig.newspeedhackspeed2:=speedhackspeed2;
787  framehotkeyconfig.newspeedhackspeed3:=speedhackspeed3;
788  framehotkeyconfig.newspeedhackspeed4:=speedhackspeed4;
789  framehotkeyconfig.newspeedhackspeed5:=speedhackspeed5;
790
791  framehotkeyconfig.speedupdelta:=speedupdelta;
792  framehotkeyconfig.slowdowndelta:=slowdowndelta;
793
794end;
795
796procedure TformSettings.cbShowDisassemblerClick(Sender: TObject);
797begin
798  if cbshowdisassembler.Checked then
799  begin
800    cbShowDebugOptions.Enabled:=true;
801    ReplaceWithNops.enabled:=true;
802
803    askforreplacewithnops.Enabled:=replacewithnops.Checked;
804  end
805  else
806  begin
807    cbShowDebugOptions.Enabled:=false;
808    ReplaceWithNops.enabled:=false;
809    askforreplacewithnops.Enabled:=false;
810  end;
811end;
812
813procedure TformSettings.replacewithnopsClick(Sender: TObject);
814begin
815  askforreplacewithnops.Enabled:=replacewithnops.Checked;
816end;
817
818procedure TformSettings.CheckBox1Click(Sender: TObject);
819begin
820  checkbox2.Checked:=checkbox1.checked;
821end;
822
823procedure TformSettings.CheckBox2Click(Sender: TObject);
824begin
825  Checkbox1.Checked:=checkbox2.Checked;
826end;
827
828procedure TformSettings.cbUpdatefoundListClick(Sender: TObject);
829begin
830  if cbUpdatefoundList.Checked then
831  begin
832    label18.Enabled:=true;
833    editUpdatefoundInterval.Enabled:=true;
834    Label19.Enabled:=true;
835  end
836  else
837  begin
838    label18.Enabled:=false;
839    editUpdatefoundInterval.Enabled:=false;
840    Label19.Enabled:=false;
841  end;
842end;
843
844procedure TformSettings.AboutLabelClick(Sender: TObject);
845begin
846  with tabout.create(self) do
847  begin
848    showmodal;
849    free;
850  end;
851
852end;
853
854procedure TformSettings.cbHideAllWindowsClick(Sender: TObject);
855begin
856  btnExcludeProcesses.enabled:=cbHideallWindows.Checked;
857end;
858
859procedure TformSettings.btnExcludeProcessesClick(Sender: TObject);
860begin
861  {$ifndef net}
862  with tfrmExcludeHide.create(self) do
863  begin
864    showmodal;
865    free;
866  end;
867  {$endif}
868end;
869
870procedure TformSettings.FormCreate(Sender: TObject);
871var i: integer;
872  unsigned: BOOL;
873begin
874  aboutlabel.left:=aboutlabel.parent.ClientWidth-aboutlabel.width;
875  aboutlabel.top:=aboutlabel.parent.clientheight-aboutlabel.height;
876
877  //set the default popup
878  laststatePopupHide:=vk_next;
879  lastpopupmodifier:=MOD_CONTROL or MOD_ALT;
880
881  laststatepause:=ord('P');
882  lastpausemodifier:=MOD_CONTROL or MOD_ALT;
883
884  laststateSpeedhack:=ord('S');
885  laststateSpeedhack:=MOD_CONTROL or MOD_ALT;
886
887  deletedmodules:=TStringlist.Create;
888
889
890  //64-bit check
891  if is64bitos then
892  begin
893    TauntOldOsUser.Visible:=true;
894    TauntOldOsUser.Caption:='Please boot with unsigned drivers allowed(F8 during boot), or sign the driver yourself';
895
896    cbKernelQueryMemoryRegion.enabled:=false; //currently no 64-bit paging support (yet)
897
898    cbKdebug.Enabled:=isDBVMCapable;
899    cbKdebug.Caption:=cbKdebug.Caption+' (Requires DBVM)';
900    if not cbKdebug.Enabled then
901      cbKdebug.checked:=false;
902  end;
903
904
905  //make the tabs invisible
906  for i:=0 to pcSetting.PageCount-1 do
907    pcSetting.Pages[i].TabVisible:=false;
908
909  pcSetting.ActivePageIndex:=0;
910
911  tvMenuSelection.FullExpand;
912end;
913
914procedure TformSettings.cbKernelQueryMemoryRegionClick(Sender: TObject);
915begin
916  if (cbkdebug.checked) or (cbKernelQueryMemoryRegion.Checked) or (cbKernelReadWriteProcessMemory.Checked) then
917  begin
918    cbKernelOpenProcess.Checked:=true;
919    cbKernelOpenProcess.Enabled:=false;
920  end
921  else cbKernelOpenProcess.Enabled:=true;
922
923end;
924
925procedure TformSettings.FormClose(Sender: TObject;
926  var Action: TCloseAction);
927begin
928{$ifndef net}
929  deletedmodules.Clear;
930{$endif}
931end;
932
933procedure TformSettings.startsystemcallretrieverifneeded;
934begin
935  startsystemcallretrieverifneeded('');
936end;
937
938procedure TformSettings.startsystemcallretrieverifneeded(why:string);
939var
940  proc_info: TProcessInformation;
941  startinfo: TStartupInfo;
942  ec: dword;
943begin
944  if systemcallretrieverexecuted then
945  begin
946    //check if it's still running
947    if GetExitCodeProcess(systemcallretrieverhandle,ec) then
948      if ec=STILL_ACTIVE then exit; //still running
949  end;
950
951  //start the systemsignalretriever if there's no callnumbers.dat
952  if not fileexists(cheatenginedir+'kerneldata.dat') then
953  begin
954    if why<>'' then
955      if messagedlg(why,mtconfirmation,[mbyes,mbno],0)<>mryes then exit;
956
957    zeromemory(@proc_info,sizeof(proc_info));
958    zeromemory(@startinfo,sizeof(startinfo));
959    startinfo.cb:=sizeof(startinfo);
960
961    if Createprocess(nil,'systemcallretriever.exe',nil,nil,false,NORMAL_PRIORITY_CLASS,nil,nil,startinfo,proc_info) then
962    begin
963      systemcallretrieverexecuted:=true;
964      systemcallretrieverhandle:=proc_info.hProcess;
965    end;
966  end;
967
968end;
969
970procedure TformSettings.cbKdebugClick(Sender: TObject);
971begin
972  if (cbkdebug.checked) or (cbKernelQueryMemoryRegion.Checked) or (cbKernelReadWriteProcessMemory.Checked) then
973  begin
974    cbKernelOpenProcess.Checked:=true;
975    cbKernelOpenProcess.Enabled:=false;
976    cbGlobalDebug.enabled:=true;
977  end
978  else
979  begin
980    cbKernelOpenProcess.Enabled:=true;
981    cbGlobalDebug.enabled:=false;
982  end;
983
984  if cbkdebug.Checked then
985  begin
986    cbKernelOpenProcess.enabled:=false;
987    cbKernelOpenProcess.Checked:=true;
988    cbProcessWatcher.Enabled:=false;
989    cbProcesswatcher.Checked:=true;
990
991    cbProcessWatcherClick(cbProcessWatcher);
992  end else cbprocesswatcher.enableD:=true;
993end;
994
995procedure TformSettings.cbProcessWatcherClick(Sender: TObject);
996var
997  proc_info: TProcessInformation;
998  startinfo: TStartupInfo;
999begin
1000  if cbprocesswatcher.checked then
1001    startsystemcallretrieverifneeded('To get more detailed information about processes, like the processname, it''s recommended to run the kerneldataretriever program. Do you want to run it ?');
1002end;
1003
1004procedure TformSettings.Button4Click(Sender: TObject);
1005var pluginname: string;
1006    fullpath: Tpathspecifier;
1007    i: integer;
1008    s: string;
1009begin
1010{$ifndef net}
1011  if opendialog1.Execute then
1012  begin
1013    s:=uppercase(ExtractFileName(opendialog1.FileName));
1014    for i:=0 to clbplugins.count-1 do
1015      if uppercase(extractfilename(Tpathspecifier(clbplugins.Items.Objects[i]).path))=s then
1016        raise exception.Create('This plugin is already loaded');
1017
1018    pluginname:=pluginhandler.GetPluginName(opendialog1.FileName);
1019    fullpath:=Tpathspecifier.Create;
1020    fullpath.path:=opendialog1.filename;
1021    clbPlugins.Items.AddObject(extractfilename(opendialog1.FileName)+':'+pluginname,fullpath);
1022  end;
1023{$endif}
1024end;
1025
1026procedure TformSettings.Button5Click(Sender: TObject);
1027var modulename: string;
1028begin
1029{$ifndef net}
1030  if clbplugins.ItemIndex<>-1 then
1031  begin
1032    modulename:=extractfilename(Tpathspecifier(clbplugins.items.Objects[clbplugins.ItemIndex]).path);
1033    deletedmodules.add(modulename);
1034
1035    Tpathspecifier(clbPlugins.Items.Objects[clbplugins.ItemIndex]).Free;
1036    clbPlugins.Items.Delete(clbplugins.ItemIndex);
1037  end;
1038{$endif}
1039end;
1040
1041procedure TformSettings.tvMenuSelectionChange(Sender: TObject;
1042  Node: TTreeNode);
1043begin
1044  if node.Level=0 then //main settings
1045  begin
1046    pcSetting.ActivePageIndex:=node.Index;
1047  end;
1048
1049  if node.level=1 then
1050  begin
1051    if node.Parent.Index=0 then
1052    begin
1053      if node.Index=0 then //tools menu
1054      begin
1055        pcSetting.ActivePage:=tsTools;
1056      end;
1057    end;
1058
1059  end;
1060end;
1061
1062procedure TformSettings.Panel6Resize(Sender: TObject);
1063begin
1064  button1.Left:=button1.parent.ClientWidth div 2 - button1.Width - 10;
1065  button2.Left:=button2.parent.ClientWidth div 2 + 10; 
1066end;
1067
1068procedure TformSettings.cbProcessIconsClick(Sender: TObject);
1069begin
1070  cbProcessIconsOnly.Enabled:=cbProcessIcons.Checked;
1071  if not cbProcessIcons.Checked then cbProcessIconsOnly.Checked:=false;
1072end;
1073
1074procedure TformSettings.tvMenuSelectionCollapsing(Sender: TObject;
1075  Node: TTreeNode; var AllowCollapse: Boolean);
1076begin
1077  AllowCollapse:=false;
1078end;
1079
1080procedure TformSettings.btnSetToolShortcutClick(Sender: TObject);
1081var x: tshortcut;
1082begin
1083  if lvtools.Selected=nil then exit;
1084
1085  with TFormHotkey.Create(self) do
1086  begin
1087    if ShowModal=mrok then
1088    begin
1089      x:=key;
1090
1091      if (modifier and MOD_ALT)>0 then
1092        x:=x or scAlt;
1093
1094      if (modifier and MOD_CONTROL)>0 then
1095        x:=x or scCtrl;
1096
1097      if (modifier and MOD_SHIFT)>0 then
1098        x:=x or scShift;
1099
1100      lblShortcutText.caption:=ShortCutToText(x);
1101      lvtools.Selected.Data:=pointer(x);
1102      lvtools.Selected.SubItems[1]:=lblShortcutText.caption;
1103    end;
1104
1105    free;
1106  end;
1107end;
1108
1109procedure TformSettings.cbShowToolsClick(Sender: TObject);
1110begin
1111  lvTools.enabled:=cbShowTools.Checked;
1112  lblToolsName.enabled:=cbShowTools.Checked and (lvtools.Selected<>nil);
1113  edtToolsName.enabled:=cbShowTools.Checked and (lvtools.Selected<>nil);
1114  lblApplicationTool.enabled:=cbShowTools.Checked and (lvtools.Selected<>nil);
1115  edtApplicationTool.enabled:=cbShowTools.Checked and (lvtools.Selected<>nil);
1116  OpenButton.Enabled:=cbShowTools.Checked and (lvtools.Selected<>nil);
1117  lblShortcut.enabled:= cbShowTools.Checked and (lvtools.Selected<>nil);
1118  lblShortcutText.enabled:=cbShowTools.Checked and (lvtools.Selected<>nil);
1119  btnSetToolShortcut.enabled:=cbShowTools.Checked and (lvtools.Selected<>nil);
1120  btnToolNew.enabled:=cbShowTools.Checked;
1121  btnToolDelete.Enabled:=cbShowTools.Checked and (lvtools.Selected<>nil);
1122
1123  if (lvtools.Selected<>nil) then
1124  begin
1125    edtToolsName.Text:=lvtools.Selected.Caption;
1126    edtApplicationTool.Text:=lvtools.Selected.SubItems[0];
1127    lblShortcutText.caption:=lvtools.Selected.SubItems[1];
1128  end;
1129
1130end;
1131
1132procedure TformSettings.btnToolNewClick(Sender: TObject);
1133var li:tlistitem;
1134begin
1135  li:=lvTools.Items.Add;
1136  li.Data:=nil;
1137  li.Caption:='No Name';
1138  li.SubItems.Add('');
1139  li.SubItems.Add('');
1140  li.Selected:=true;
1141  lvTools.OnClick(lvTools);
1142
1143
1144  edtToolsName.SetFocus;
1145  edtToolsName.SelectAll;
1146end;
1147
1148procedure TformSettings.lvToolsClick(Sender: TObject);
1149begin
1150  lblToolsName.enabled:=lvtools.Selected<>nil;
1151  edtToolsName.enabled:=lvtools.Selected<>nil;
1152  lblApplicationTool.enabled:=lvtools.Selected<>nil;
1153  edtApplicationTool.enabled:=lvtools.Selected<>nil;
1154  lblShortcut.enabled:= lvtools.Selected<>nil;
1155  lblShortcutText.enabled:=lvtools.Selected<>nil;
1156  btnSetToolShortcut.enabled:=lvtools.Selected<>nil;
1157  btnToolDelete.Enabled:=lvtools.Selected<>nil;
1158  OpenButton.Enabled:=cbShowTools.Checked and (lvtools.Selected<>nil);
1159
1160  if lvtools.Selected<>nil then
1161  begin
1162    edtToolsName.Text:=lvtools.Selected.Caption;
1163    edtApplicationTool.Text:=lvtools.Selected.SubItems[0];
1164    lblShortcutText.caption:=lvtools.Selected.SubItems[1];
1165    edtToolsName.SetFocus;
1166  end;
1167end;
1168
1169procedure TformSettings.edtApplicationToolChange(Sender: TObject);
1170begin
1171  lvtools.Selected.subitems[0]:=edtApplicationTool.text;
1172end;
1173
1174procedure TformSettings.btnToolDeleteClick(Sender: TObject);
1175begin
1176  if lvTools.Selected<>nil then
1177    lvTools.Selected.Delete;
1178
1179  lvTools.OnClick(lvTools); //refresh
1180end;
1181
1182procedure TformSettings.edtToolsNameChange(Sender: TObject);
1183begin
1184  lvtools.Selected.Caption:=edtToolsName.text;
1185end;
1186
1187procedure TformSettings.OpenButtonClick(Sender: TObject);
1188begin
1189  if opendialog2.Execute then
1190    edtApplicationTool.Text:=opendialog2.FileName;
1191end;
1192
1193end.
1194
Note: See TracBrowser for help on using the browser.