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

169 lines
3.7 KiB
ObjectPascal

unit frmHeapsUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls,tlhelp32,cefuncproc, frmMemoryAllocHandlerUnit;
type TFillHeapList=class(tthread)
private
c: integer;
list: array [0..63] of record
address: dword;
size: integer;
end;
expanded: boolean;
procedure enumerateHeapList(const memreclist: PMemRecTableArray; level: integer);
procedure updatelist;
public
node: ttreenode;
procedure execute; override;
end;
type
TfrmHeaps = class(TForm)
Panel1: TPanel;
Button1: TButton;
ListView1: TListView;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure ListView1DblClick(Sender: TObject);
private
{ Private declarations }
fillthread: TFillHeapList;
public
{ Public declarations }
end;
var
frmHeaps: TfrmHeaps;
implementation
{$R *.dfm}
uses memorybrowserformunit;
procedure TFillHeapList.updatelist;
var i:integer;
li: tlistitem;
begin
if GetCurrentThreadID <> MainThreadID then
exit;
if frmheaps<>nil then
begin
with frmheaps do
begin
listview1.Items.BeginUpdate;
for i:=0 to c-1 do
begin
li:=listview1.Items.Add;
li.Caption:=inttohex(list[i].address,8);
li.SubItems.Add(inttostr(list[i].size));
end;
listview1.Items.EndUpdate;
end;
end else terminate;
c:=0;
end;
procedure TFillHeapList.enumerateHeapList(const memreclist: PMemRecTableArray; level: integer);
var i: integer;
begin
if terminated then exit;
if level=7 then
begin
//add all <>nil entries
for i:=0 to 15 do
begin
if memreclist[i].memallocevent<>nil then
begin
list[c].address:=memreclist[i].memallocevent.BaseAddress;
list[c].size:=memreclist[i].memallocevent.HookEvent.HeapAllocEvent.Size;
inc(c);
if c=64 then
begin
synchronize(updatelist);
sleep(100);
end;
end;
end;
end
else
begin
for i:=0 to 15 do
begin
if memreclist[i].MemrecArray<>nil then
enumerateHeapList(memreclist[i].MemrecArray, level+1);
end;
end;
end;
procedure TFillHeapList.execute;
var check: boolean;
id: dword;
i: integer;
begin
c:=0;
frmMemoryAllocHandler.memrecCS.Enter;
try
enumerateHeapList(@frmMemoryAllocHandler.HeapBaselevel, 0);
finally
frmMemoryAllocHandler.memrecCS.Leave;
end;
if c>0 then
synchronize(updatelist);
end;
procedure TfrmHeaps.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if fillthread<>nil then
begin
fillthread.Terminate;
fillthread.WaitFor;
fillthread.Free;
end;
action:=caFree;
frmheaps:=nil;
end;
procedure TfrmHeaps.FormCreate(Sender: TObject);
begin
if frmMemoryAllocHandler=nil then
frmMemoryAllocHandler:=TfrmMemoryAllocHandler.Create(memorybrowser); //just not show
if frmMemoryAllocHandler.WaitForInitializationToFinish then
begin
//start the thread that enumerates the heaplist
button1.Left:=(clientwidth div 2) - (button1.Width div 2);
fillthread:=TFillHeapList.Create(false);
end;
end;
procedure TfrmHeaps.Button1Click(Sender: TObject);
begin
close;
end;
procedure TfrmHeaps.ListView1DblClick(Sender: TObject);
begin
if listview1.ItemIndex<>-1 then
begin
memorybrowser.memoryaddress:=strtoint('$'+listview1.Items[listview1.ItemIndex].Caption);
memorybrowser.RefreshMB;
end;
end;
end.