cheat-engine/formChangedAddresses.pas
cheatengine@gmail.com 4d297adfd2
2011-07-04 19:52:19 +00:00

236 lines
6.3 KiB
ObjectPascal

unit formChangedAddresses;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,cefuncproc, ExtCtrls, ComCtrls, Menus, newkernelhandler;
type
TfrmChangedAddresses = class(TForm)
lblInfo: TLabel;
Panel1: TPanel;
OKButton: TButton;
Changedlist: TListView;
cbDisplayType: TComboBox;
Timer1: TTimer;
PopupMenu1: TPopupMenu;
Showregisterstates1: TMenuItem;
Browsethismemoryregion1: TMenuItem;
procedure OKButtonClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormShow(Sender: TObject);
procedure ChangedlistDblClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Showregisterstates1Click(Sender: TObject);
procedure Browsethismemoryregion1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure PopupMenu1Popup(Sender: TObject);
private
{ Private declarations }
procedure refetchValues;
public
{ Public declarations }
end;
var
frmChangedAddresses: TfrmChangedAddresses;
implementation
{$R *.dfm}
uses debugger, MainUnit, frmRegistersunit, MemoryBrowserFormUnit, kerneldebugger,
formsettingsunit;
procedure TfrmChangedAddresses.OKButtonClick(Sender: TObject);
var temp: dword;
i: integer;
begin
if OKButton.caption='Stop' then
begin
if (formsettings.cbKdebug.checked) and (debuggerthread=nil) then
begin
//kernelmode stop
KDebugger.DisableAllBreakpoints; //todo: Make this only disable the related breakpoints
end
else
begin
if WaitForSingleObject(semaphore,10000)=WAIT_FAILED then
raise exception.Create('OMG! I can''t stop it!');
try
debuggerthread.Suspend;
debuggerthread.breakpointset:=false;
zeromemory(@debuggerthread.DRRegs,sizeof(debuggerthread.DRRegs));
debuggerthread.DRRegs.ContextFlags:=CONTEXT_DEBUG_REGISTERS;
debuggerthread.DRRegs.Dr7:=reg0set or reg1set or reg2set or reg3set;
with debuggerthread do
for i:=0 to length(threadlist)-1 do
begin
suspendthread(threadlist[i,1]);
setthreadcontext(threadlist[i,1],DRRegs);
resumethread(threadlist[i,1]);
end;
debuggerthread.Resume;
finally
releasesemaphore(semaphore,1,nil);
end;
end;
okButton.Caption:='Close';
end else close;
end;
procedure TfrmChangedAddresses.FormClose(Sender: TObject;
var Action: TCloseAction);
var temp:dword;
i: integer;
begin
action:=caFree;
for i:=0 to changedlist.Items.Count-1 do
freemem(changedlist.Items[i].Data);
if OKButton.caption='Stop' then
OKButton.Click;
if frmChangedAddresses=self then frmChangedAddresses:=nil;
end;
procedure TfrmChangedAddresses.FormShow(Sender: TObject);
begin
OKButton.Caption:='Stop';
end;
procedure TfrmChangedAddresses.ChangedlistDblClick(Sender: TObject);
var i: integer;
ad: dword;
begin
if changedlist.Selected<>nil then
begin
ad:=strtoint('$'+changedlist.Selected.Caption);
with mainform do
begin
i:=0;
while (i<numberofrecords) and
(
(memrec[i].Address<>ad) or
(memrec[i].VarType<>2)
) do
inc(i);
//find out of this record is in the list
if i=NumberOfRecords then
begin
inc(NumberOfRecords);
ReserveMem;
memrec[NumberOfRecords-1].Description:='No Description';
memrec[NumberOfRecords-1].Address:=ad;
memrec[NumberOfRecords-1].VarType:=cbDisplayType.itemindex;
memrec[NumberOfRecords-1].Frozen:=false;
memrec[NumberOfRecords-1].FrozenValue:=0;
memrec[NumberOfRecords-1].Bit:=0;
hotkeys[NumberOfRecords-1]:=-1;
updatescreen;
updatelist;
end
else raise Exception.Create(IntToHex(ad,8)+' is already in the list!');
end;
end;
end;
procedure TfrmChangedAddresses.refetchValues;
var i: integer;
s: string;
begin
if changedlist.Items.Count>0 then
begin
if not timer1.Enabled then
timer1.Enabled:=true;
for i:=0 to changedlist.Items.Count-1 do
begin
case cbDisplayType.ItemIndex of
0: s:=ReadAndParseAddress(strtoint('$'+changedlist.items[i].caption), vtByte);
1: s:=ReadAndParseAddress(strtoint('$'+changedlist.items[i].caption), vtWord);
2: s:=ReadAndParseAddress(strtoint('$'+changedlist.items[i].caption), vtDWord);
3: s:=ReadAndParseAddress(strtoint('$'+changedlist.items[i].caption), vtSingle);
4: s:=ReadAndParseAddress(strtoint('$'+changedlist.items[i].caption), vtDouble);
end;
if Changedlist.Items[i].SubItems.Count=0 then
Changedlist.Items[i].SubItems.Add('');
Changedlist.Items[i].SubItems[0]:=s;
end;
end else timer1.Enabled:=false;
end;
procedure TfrmChangedAddresses.Timer1Timer(Sender: TObject);
begin
refetchValues;
end;
procedure TfrmChangedAddresses.Showregisterstates1Click(Sender: TObject);
begin
if changedlist.Selected<>nil then
begin
with TRegisters.create(self) do
begin
borderstyle:=bsSingle;
SetContextPointer(changedlist.Selected.Data);
show;
end;
end;
//for frmfloatingpointpanel: SetContextPointer(changedlist.Selected.Data);
end;
procedure TfrmChangedAddresses.Browsethismemoryregion1Click(
Sender: TObject);
begin
if changedlist.Selected<>nil then
begin
memorybrowser.memoryaddress:=strtoint('$'+changedlist.Selected.Caption);
memorybrowser.refreshmb;
if not memorybrowser.Visible then
memorybrowser.visible:=true;
end;
end;
procedure TfrmChangedAddresses.FormDestroy(Sender: TObject);
begin
saveformposition(self,[]);
end;
procedure TfrmChangedAddresses.FormCreate(Sender: TObject);
var x: array of integer;
begin
setlength(x, 0);
loadformposition(self,x);
end;
procedure TfrmChangedAddresses.PopupMenu1Popup(Sender: TObject);
begin
Showregisterstates1.enabled:=changedlist.selected<>nil;
Browsethismemoryregion1.enabled:=changedlist.selected<>nil;
end;
end.