📄 structuresfrm.pas
字号:
end;
procedure TfrmStructures.PopupMenu1Popup(Sender: TObject);
begin
AddElement1.Visible:=currentstructure<>nil;
Deleteelement1.Visible:=(treeview1.selected<>nil);
n3.Visible:=(treeview1.selected<>nil) and (treeview1.selected.Level=1);
Recalculateaddress1.visible:=n3.Visible;
end;
procedure TfrmStructures.Deleteelement1Click(Sender: TObject);
var s: tstructure;
elementnr: integer;
i: integer;
begin
if treeview1.Selected<>nil then
begin
elementnr:=treeview1.Selected.Index;
s:=tstructure(treeview1.Selected.Data);
if s=nil then exit;
if s.basestructure<0 then exit;
for i:=elementnr to length(definedstructures[s.basestructure].structelement)-2 do
definedstructures[s.basestructure].structelement[i]:=definedstructures[s.basestructure].structelement[i+1];
setlength(definedstructures[s.basestructure].structelement,length(definedstructures[s.basestructure].structelement)-1);
end;
currentstructure.refresh;
end;
procedure TfrmStructures.Save1Click(Sender: TObject);
var f: tfilestream;
i,j: integer;
x: dword;
cemarker: string;
begin
if savedialog1.Execute then
begin
f:=tfilestream.Create(savedialog1.FileName,fmcreate);
try
cemarker:='CHEATENGINE';
f.WriteBuffer(cemarker[1],length(cemarker));
x:=structureversion;
f.writebuffer(x,4);
x:=length(definedstructures);
f.WriteBuffer(x,4);
for i:=0 to length(definedstructures)-1 do
begin
x:=length(definedstructures[i].name);
f.WriteBuffer(x,4); //namelength
if x>0 then f.WriteBuffer(definedstructures[i].name[1],x);
x:=length(definedstructures[i].structelement);
f.WriteBuffer(x,4);
for j:=0 to length(definedstructures[i].structelement)-1 do
begin
x:=length(definedstructures[i].structelement[j].description);
f.WriteBuffer(x,4);
if x>0 then f.Write(definedstructures[i].structelement[j].description[1],x);
f.WriteBuffer(definedstructures[i].structelement[j].pointerto,sizeof(definedstructures[i].structelement[j].pointerto));
f.WriteBuffer(definedstructures[i].structelement[j].pointertoSize,sizeof(definedstructures[i].structelement[j].pointerto));
f.WriteBuffer(definedstructures[i].structelement[j].structurenr,sizeof(definedstructures[i].structelement[j].structurenr));
f.WriteBuffer(definedstructures[i].structelement[j].bytesize,sizeof(definedstructures[i].structelement[j].bytesize));
end;
end;
finally
f.free;
end;
end;
end;
procedure TfrmStructures.Open1Click(Sender: TObject);
var f: tfilestream;
i,j: integer;
x: dword;
cemarker: string;
c: pchar;
s: string;
begin
if opendialog1.Execute then
begin
f:=tfilestream.Create(opendialog1.FileName,fmopenread);
try
cemarker:='CHEATENGINE';
getmem(c,12);
try
f.ReadBuffer(c^,11);
c[11]:=#0;
s:=c;
finally
freemem(c);
end;
if s<>cemarker then raise exception.Create('This is not a valid structure file');
f.ReadBuffer(x,4);
if x<>structureversion then raise exception.Create('This structure fils was generated with a newer version of Cheat Engine. (That means there''s more than likely a new version so please update....)');
f.ReadBuffer(x,4);
setlength(definedstructures,x);
for i:=0 to length(definedstructures)-1 do
begin
f.readbuffer(x,4);
getmem(c,x+1);
try
f.ReadBuffer(c^,x);
c[x]:=#0;
definedstructures[i].name:=c;
finally
freemem(c);
end;
f.readbuffer(x,4);
setlength(definedstructures[i].structelement,x);
for j:=0 to length(definedstructures[i].structelement)-1 do
begin
f.readbuffer(x,4);
getmem(c,x+1);
try
f.ReadBuffer(c^,x);
c[x]:=#0;
definedstructures[i].structelement[j].description:=c;
finally
freemem(c);
end;
f.ReadBuffer(definedstructures[i].structelement[j].pointerto,sizeof(definedstructures[i].structelement[j].pointerto));
f.ReadBuffer(definedstructures[i].structelement[j].pointertoSize,sizeof(definedstructures[i].structelement[j].pointerto));
f.ReadBuffer(definedstructures[i].structelement[j].structurenr,sizeof(definedstructures[i].structelement[j].structurenr));
f.ReadBuffer(definedstructures[i].structelement[j].bytesize,sizeof(definedstructures[i].structelement[j].bytesize));
end;
end;
finally
f.free;
end;
TMenuItem.Create(self);
RefreshMenuItems;
end;
end;
procedure TfrmStructures.New1Click(Sender: TObject);
begin
if (length(definedstructures)>0) and (messagedlg('Are you sure you want to remove all structures?',mtconfirmation,[mbyes,mbno],0)=mryes) then
begin
currentstructure.Free;
currentstructure:=nil;
setlength(definedstructures,0);
refreshmenuitems;
end;
end;
procedure TfrmStructures.ChangeElement1Click(Sender: TObject);
var i,j: integer;
size: dword;
structtype: string;
selectedstructure: tstructure;
selectedelement: integer;
selectednode: ttreenode;
begin
if treeview1.Selected=treeview1.Items.GetFirstNode then
begin
inputquery('Rename structure','Give the new name of this structure',definedstructures[currentstructure.basestructure].name);
address:=address+1-1;
currentstructure.refresh;
exit;
end;
selectednode:=treeview1.Selected;
if selectednode=nil then exit;
selectedstructure:=tstructure(selectednode.Data);
if selectedstructure=nil then exit;
selectedelement:=selectednode.Index;
i:=selectedstructure.basestructure;
size:=definedstructures[i].structelement[selectedelement].bytesize;
with tfrmstructuresaddelement.create(self) do
begin
//fill the combobox with possible types
//the base types, and defined types
cbtype.Items.AddObject('Byte',pointer(1));
cbtype.Items.AddObject('Byte Signed',pointer(1));
cbtype.Items.AddObject('Byte Hexadecimal',pointer(1));
cbtype.Items.AddObject('2 Bytes',pointer(2));
cbtype.Items.AddObject('2 Bytes Signed',pointer(2));
cbtype.Items.AddObject('2 Bytes Hexadecimal',pointer(2));
cbtype.Items.AddObject('4 Bytes',pointer(4));
cbtype.Items.AddObject('4 Bytes Signed',pointer(4));
cbtype.Items.AddObject('4 Bytes Hexadecimal',pointer(4));
cbtype.Items.AddObject('8 Bytes',pointer(8));
cbtype.Items.AddObject('8 Bytes Hexadecimal',pointer(8));
cbtype.Items.AddObject('Float',pointer(4));
cbtype.Items.AddObject('Double',pointer(8));
cbtype.Items.AddObject('String',pointer(size));
cbtype.Items.AddObject('String Unicode',pointer(size));
cbtype.DropDownCount:=17;
//and add the other defined structures as well
for i:=0 to length(definedstructures)-1 do
begin
size:=0;
for j:=0 to length(definedstructures[i].structelement)-1 do
inc(size,definedstructures[i].structelement[j].bytesize);
cbtype.Items.AddObject(definedstructures[i].name,pointer(size));
end;
if definedstructures[selectedstructure.basestructure].structelement[selectedelement].structurenr<0 then
cbtype.ItemIndex:=-definedstructures[selectedstructure.basestructure].structelement[selectedelement].structurenr-1
else
cbtype.itemindex:=definedstructures[selectedstructure.basestructure].structelement[selectedelement].structurenr+15;
edtDescription.text:=definedstructures[selectedstructure.basestructure].structelement[selectedelement].description;
cbpointerto.checked:=definedstructures[selectedstructure.basestructure].structelement[selectedelement].pointerto;
if cbpointerto.Checked then
edtByteSize.Text:=inttostr(definedstructures[selectedstructure.basestructure].structelement[selectedelement].pointertosize);
// else
// edtByteSize.Text
cbType.OnChange(cbType);
if showmodal=mrok then
begin
definedstructures[selectedstructure.basestructure].structelement[selectedelement].description:=edtDescription.text;
definedstructures[selectedstructure.basestructure].structelement[selectedelement].pointerto:=cbpointerto.checked;
definedstructures[selectedstructure.basestructure].structelement[selectedelement].pointertosize:=bytesize;
if cbtype.itemindex<=14 then
definedstructures[selectedstructure.basestructure].structelement[selectedelement].structurenr:=-(cbtype.ItemIndex+1)
else
definedstructures[selectedstructure.basestructure].structelement[selectedelement].structurenr:=cbtype.ItemIndex-15;
if definedstructures[selectedstructure.basestructure].structelement[selectedelement].pointerto then
definedstructures[selectedstructure.basestructure].structelement[selectedelement].bytesize:=4
else
definedstructures[selectedstructure.basestructure].structelement[selectedelement].bytesize:=bytesize;
currentstructure.refresh;
end;
end;
end;
procedure TfrmStructures.TreeView1DblClick(Sender: TObject);
var
selectedstructure: tstructure;
selectednode: ttreenode;
selectedelement: integer;
i: integer;
a: dword;
begin
selectednode:=treeview1.Selected;
if selectednode<>nil then
begin
selectedstructure:=tstructure(selectednode.Data);
if selectedstructure<>nil then
begin
selectedelement:=selectednode.Index;
a:=selectedstructure.address;
for i:=0 to selectedelement-1 do
inc(a,definedstructures[selectedstructure.basestructure].structelement[i].bytesize);
with Tvaluechangeform.Create(application) do
begin
address:=a;
case definedstructures[selectedstructure.basestructure].structelement[selectedelement].structurenr of
-1,-2,-3: vtype:=0;
-4,-5,-6: vtype:=1;
-7,-8,-9: vtype:=2;
-10,-11: vtype:=6;
-12: vtype:=4;
-13: vtype:=5;
-14:
begin
slength:=definedstructures[selectedstructure.basestructure].structelement[selectedelement].bytesize;
unicode:=false;
vtype:=7;
end;
-15:
begin
unicode:=true;
slength:=definedstructures[selectedstructure.basestructure].structelement[selectedelement].bytesize div 2;
vtype:=7;
end;
else vtype:=0;
end;
ShowModal;
currentstructure.refresh;
end;
end;
end;
end;
procedure TfrmStructures.Addtoaddresslist1Click(Sender: TObject);
var
selectedstructure: tstructure;
selectednode: ttreenode;
selectedelement: integer;
offsets: array of dword;
objectname: string;
snr: integer;
vtype: integer;
vlength: integer;
unicode,ispointer,showashex: boolean;
i: integer;
begin
showashex:=false;
selectednode:=treeview1.Selected;
if selectednode<>nil then
begin
selectedstructure:=tstructure(selectednode.Data);
if selectedstructure<>nil then
begin
if selectedstructure.basestructure>=0 then
case definedstructures[selectedstructure.basestructure].structelement[selectednode.Index].structurenr of
-1,-2,-3: vtype:=0;
-4,-5,-6: vtype:=1;
-7,-8,-9: vtype:=2;
-10,-11: vtype:=6;
-12: vtype:=3;
-13: vtype:=4;
-14: begin
vtype:=7;
vlength:=definedstructures[selectedstructure.basestructure].structelement[selectednode.Index].bytesize;
unicode:=false;
end;
-15: begin
vtype:=8;
vlength:=definedstructures[selectedstructure.basestructure].structelement[selectednode.Index].bytesize div 2;
unicode:=true;
end;
0..maxint :
begin
vtype:=2;
showashex:=true;
end;
end else
case selectedstructure.basestructure of
-1,-2,-3: vtype:=0;
-4,-5,-6: vtype:=1;
-7,-8,-9: vtype:=2;
-10,-11: vtype:=6;
-12: vtype:=3;
-13: vtype:=4;
-14: begin
vtype:=7;
vlength:=4;
unicode:=false;
end;
-15: begin
vtype:=8;
vlength:=4;
unicode:=true;
end;
0..maxint : exit;
end
end else exit;
objectname:='';
setlength(offsets,0);
while (selectedstructure<>nil) do
begin
//get the offsets for each structure till you get to the base address
selectedelement:=selectednode.Index;
snr:=selectedstructure.basestructure;
setlength(offsets,length(offsets)+1);
offsets[length(offsets)-1]:=0;
if snr>=0 then
begin
for i:=0 to selectedelement-1 do
inc(offsets[length(offsets)-1],definedstructures[snr].structelement[i].bytesize);
end;
selectednode:=selectednode.Parent;
if selectednode<>nil then
selectedstructure:=tstructure(selectednode.data)
else
break;
end;
//now add it to the list
mainform.addaddress('bla',address+offsets[length(offsets)-1],offsets[0],length(offsets)-1,length(offsets)>1,vtype,vlength,0,unicode,showashex);
end;
end;
procedure TfrmStructures.Recalculateaddress1Click(Sender: TObject);
var a: string;
oldaddress,newaddress: dword;
selectedstructure: tstructure;
selectednode: ttreenode;
selectedelement,snr: integer;
i: integer;
delta: integer;
begin
selectednode:=treeview1.Selected;
if selectednode<>nil then
begin
selectedstructure:=tstructure(selectednode.Data);
selectedelement:=selectednode.Index;
snr:=selectedstructure.basestructure;
oldaddress:=address;
for i:=0 to selectedelement-1 do
inc(oldaddress,definedstructures[snr].structelement[i].bytesize);
a:=inttohex(memorybrowser.memoryaddress,8);
if inputquery('Recalculate base of structure','Give the address of this element',a) then
begin
try
newaddress:=strtoint('$'+a);
except
raise exception.Create('I have no idea what '+a+' means');
end;
delta:=newaddress-oldaddress;
address:=address+delta;
currentstructure.refresh;
end;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -