mirror of
https://github.com/cheat-engine/cheat-engine
synced 2026-08-15 02:26:08 -04:00
169 lines
3.7 KiB
ObjectPascal
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.
|