cheat-engine/Cheat Engine/frmDissectwindowUnit.pas
cheatengine@gmail.com 0f35a52416 move the processid and handle from cefuncproc to processhandlerunit
move the processlist function from cefuncproc to it's own unit
start work on the jni library for java
2014-09-08 12:00:14 +00:00

369 lines
9.3 KiB
ObjectPascal

unit frmDissectwindowUnit;
{$MODE Delphi}
interface
uses
windows, LCLIntf, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls,StdCtrls,CEFuncProc, ExtCtrls, LResources, Menus;
type TCETimerhookdata=record
processed: boolean;
returnhandle: thandle;
window: thandle;
timerid: dword;
timerproc: dword;
targetprocess: dword;
end;
type
{ TfrmdissectWindow }
TfrmdissectWindow = class(TForm)
TreeView1: TTreeView;
Button1: TButton;
Panel1: TPanel;
Button2: TButton;
Button3: TButton;
Button5: TButton;
Button4: TButton;
Button6: TButton;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
private
{ Private declarations }
timerhook: thandle;
cehookdll:thandle;
public
{ Public declarations }
CETimerHook:pointer;
CETIMERHOOKDATA: ^TCETimerhookdata;
end;
var
frmdissectWindow: TfrmdissectWindow;
implementation
uses frmCapturedTimersUnit, ProcessHandlerUnit;
//uses frmCapturedTimersUnit;
resourcestring
rsInvis = 'Invis';
rsRemoved = 'Removed';
rsDissectWindows = 'Dissect Windows';
rsGiveTheNewTextForThisWindow = 'Give the new text for this window';
procedure TfrmdissectWindow.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
action:=cafree;
frmdissectWindow:=nil;
end;
procedure TfrmdissectWindow.FormCreate(Sender: TObject);
var title:pchar;
classname:pchar;
winhandle,h:thandle;
winprocess:dword;
i,err: integer;
// processid: dword;
begin
//fill the treeview with stuff
//find the windows that have this processid as owner
// processid:=getcurrentprocessid;
winhandle:=getwindow(getforegroundwindow,GW_HWNDFIRST);
getmem(title,101);
getmem(classname,101);
while winhandle<>0 do
begin
GetWindowThreadProcessId(winhandle,addr(winprocess));
title[0]:=#0;
classname[0]:=#0;
getwindowtext(winhandle,title,100);
GetClassName(winhandle,classname,100);
classname[100]:=#0;
title[100]:=#0;
if winprocess=processid then
if iswindowvisible(winhandle) then
treeview1.Items.Add(nil,IntToHex(winhandle,8)+'-'+title+' - ('+classname+')')
else
treeview1.Items.Add(nil, IntToHex(winhandle, 8)+'-'+title+' - ('+classname+') ('+rsInvis+')');
winhandle:=getwindow(winhandle,GW_HWNDNEXT);
end;
i:=0;
while i<treeview1.Items.Count-1 do
begin
err:=pos('-',treeview1.items[i].Text);
try
h:=StrToQWordEx('$'+copy(treeview1.items[i].Text, 1, err-1));
winhandle:=getwindow(h,GW_CHILD);
while winhandle<>0 do
begin
GetWindowThreadProcessId(winhandle,addr(winprocess));
title[0]:=#0;
classname[0]:=#0;
getwindowtext(winhandle,title,100);
GetClassName(winhandle,classname,100);
classname[100]:=#0;
title[100]:=#0;
if iswindowvisible(winhandle) then
treeview1.Items.Addchild(treeview1.items[i],IntToHex(winhandle,8)+'-'+title+' - ('+classname+')')
else
treeview1.Items.Add(nil, IntToHex(winhandle, 8)+'-'+title+' - ('+classname+') ('+rsInvis+')');
winhandle:=getwindow(winhandle,GW_HWNDNEXT);
end;
except
continue;
end;
inc(i);
end;
freemem(title);
freemem(classname);
end;
procedure TfrmdissectWindow.Button2Click(Sender: TObject);
var h:Thandle;
err:integer;
title,classname: pchar;
begin
//get the handle
getmem(title,101);
getmem(classname,101);
if treeview1.Selected<>nil then
begin
err:=pos('-',treeview1.selected.Text);
try
h:=StrToQWordEx('$'+copy(treeview1.selected.Text, 1, err-1));
title[0]:=#0;
classname[0]:=#0;
getwindowtext(h,title,100);
GetClassName(h,classname,100);
classname[100]:=#0;
title[100]:=#0;
if iswindowvisible(h) then
showwindow(h,sw_hide)
else
showwindow(h,sw_show);
if iswindowvisible(h) then
treeview1.selected.text:=IntToHex(h,8)+'-'+title+' - ('+classname+')'
else
treeview1.selected.text:=IntToHex(h, 8)+'-'+title+' - ('+classname+') ('+rsInvis+')';
except
end;
end;
freemem(classname);
freemem(title);
end;
procedure TfrmdissectWindow.Button1Click(Sender: TObject);
var w_exstyle,w_style,w_wndproc,w_hinstance,w_hwndParent,w_id,w_USERDATA: dword;
h:Thandle;
err:integer;
begin
//get info like title, windowclass structure, etc...
{ if treeview1.Selected<>nil then
begin
val('$'+treeview1.Selected.Text,h,err);
w_exstyle:=GetWindowLong(h,GWL_EXSTYLE);
w_style:=GetWindowLong(h,GWL_STYLE);
w_wndproc:=GetWindowLong(h,GWL_WNDPROC);
w_hinstance:=GetWindowLong(h,GWL_HINSTANCE);
w_hwndparent:=GetWindowLong(h,GWL_HWNDPARENT);
w_id:=GetWindowLong(h,GWL_ID);
w_USERDATA:=GetwindowLong(h,GWL_USERDATA);
showmessage(
'EXSTYLE='+IntToHex(w_exstyle,8)+#13#10+
'STYLE='+IntToHex(w_style,8)+#13#10+
'WNDPROC='+IntToHex(w_WNDPROC,8)+#13#10+
'HINSTANCE='+IntToHex(W_hinstance,8)+#13#10+
'HWNDPARENT='+IntToHex(w_hwndparent,8)+#13#10+
'ID='+IntToHex(w_id,8)+#13#10+
'USERDATA='+IntToHex(w_userdata,8)
);
frmDissectwindowextra:=TFrmDissectWindowExtra.create(self);
with frmDissectwindowextra do
begin
label1.Caption:='EXSTYLE='+IntToHex(w_exstyle,8);
label2.Caption:='STYLE='+IntToHex(w_style,8);
label3.Caption:='WNDPROC='+IntToHex(w_WNDPROC,8);
label4.Caption:='HINSTANCE='+IntToHex(W_hinstance,8);
label5.Caption:='HWNDPARENT='+IntToHex(w_hwndparent,8);
label6.Caption:='ID='+IntToHex(w_id,8);
label7.Caption:='USERDATA='+IntToHex(w_userdata,8);
showmodal;
end;
end; }
end;
procedure TfrmdissectWindow.Button4Click(Sender: TObject);
{var
winhandle,possiblewinhandle: thandle;
winprocess: dword;
winthreadid: dword;
err:integer;
TimerhookdataMapping:thandle; }
begin
raise exception.Create(rsRemoved);
{
raise exception.Create('I said Removed dickwad');
CEHOOKDLL:=LoadLibrary('CEHook.dll');
if CEHOOKDLL=0 then exit;
//still here so the dll is loaded
CETimerHook:=GetProcAddress(CEHOOKDLL,'MyTimerHook');
if (CETimerHook=nil) then exit;
TimerhookdataMapping:=CreateFileMapping($FFFFFFFF,nil,PAGE_READWRITE,0,sizeof(tscansettings),'CETIMERHOOKDATA');
if TimerhookdataMapping=0 then
begin
FreeLibrary(CEHOOKDLL);
exit;
end;
CETIMERHOOKDATA:=MapViewOfFile(TimerhookdataMapping,FILE_MAP_ALL_ACCESS,0,0,0);
if CETIMERHOOKDATA=nil then
begin
closehandle(TimerhookdataMapping);
FreeLibrary(CEHOOKDLL);
exit;
end;
frmCapturedtimers:=TFrmCapturedTimers.create(self);
CETIMERHOOKDATA.returnhandle:=frmCapturedTimers.Handle;
CETIMERHOOKDATA.processed:=true;
CETIMERHOOKDATA.targetprocess:=processid;
TimerHook:=setwindowshookex(WH_GETMESSAGE,CETimerHook,CEHOOKDLL,0);
sendmessage(windowhandle,wm_user+666,dword($87654321),TimerHook);
frmCapturedTimers.windowhandle:=windowhandle;
frmCapturedTimers.showmodal;
sendmessage(windowhandle,wm_user+666,$12345678,0);
UnhookWindowsHookEx(TimerHook);
FreeLibrary(CEHOOKDLL);
UnmapViewOfFile(CETIMERHOOKDATA);
closehandle(TimerhookdataMapping);
}
end;
procedure TfrmdissectWindow.Button3Click(Sender: TObject);
var h: thandle;
err,i: integer;
begin
if treeview1.Selected<>nil then
begin
err:=pos('-',treeview1.selected.Text);
try
h:=StrToQWordEx('$'+copy(treeview1.selected.Text, 1, err-1));
closewindow(h);
except
end;
end;
end;
procedure TfrmdissectWindow.Button6Click(Sender: TObject);
var oldname:pchar;
h:hwnd;
err: integer;
name:string;
title,classname: pchar;
begin
if treeview1.Selected=nil then exit;
err:=pos('-',treeview1.selected.Text);
try
h:=StrToQWordEx('$'+copy(treeview1.selected.Text, 1, err-1));
getmem(oldname,255);
try
GetWindowText(h,oldname,254);
oldname[254]:=#0; //make sure
name:=oldname;
if inputquery(rsDissectWindows, rsGiveTheNewTextForThisWindow, name) then
begin
SetWindowText(h,pchar(name));
getmem(title,101);
getmem(classname,101);
try
title[0]:=#0;
classname[0]:=#0;
getwindowtext(h,title,100);
GetClassName(h,classname,100);
classname[100]:=#0;
title[100]:=#0;
if iswindowvisible(h) then
treeview1.selected.text:=IntToHex(h,8)+'-'+title+' - ('+classname+')'
else
treeview1.selected.text:=IntToHex(h, 8)+'-'+title+' - ('+classname+') ('+rsInvis+')';
finally
freemem(title);
freemem(classname);
end;
end;
finally
freemem(oldname);
end;
except
end;
end;
initialization
{$i frmDissectwindowUnit.lrs}
end.