Как узнать адрес функции

Всем привет! Пишу программу, которая работает с WinAPI, интересует вопрос, как узнать адрес функции?
Вроде как я понял, что адрес любой функции/процедуры можно вернуть функцией Addr(x) (если не прав - поправьте пожалуйста)
Интересует вопрос, как можно найти адрес главной функции в Object Pascal ?
В Си/плюсах это делается вот так
А в паскале честно говоря даже и не знаю, как можно к главной функции обратиться по имени, как её звать величать так сказать (тоже хотелось бы узнать)
Вот мой код:
Вроде как я понял, что адрес любой функции/процедуры можно вернуть функцией Addr(x) (если не прав - поправьте пожалуйста)
Интересует вопрос, как можно найти адрес главной функции в Object Pascal ?
В Си/плюсах это делается вот так
- Код: Выделить всё
LPTHREAD_START_ROUTINE r;
r = (LPTHREAD_START_ROUTINE) main
А в паскале честно говоря даже и не знаю, как можно к главной функции обратиться по имени, как её звать величать так сказать (тоже хотелось бы узнать)
Вот мой код:
- Код: Выделить всё
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs,
StdCtrls, windows;
type
{ TForm1 }
TForm1 = class(TForm)
Button_create_remote_thread: TButton;
Button_suspend_thread: TButton;
Button_terminate_process: TButton;
Button_open_process: TButton;
Button_terminate_thread: TButton;
Button_resume_thread: TButton;
Button_open_remote_thr: TButton;
Edit_func_addr: TEdit;
Edit_process_id: TEdit;
Edit_remote_thr_id: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
proc_info: TMemo;
procedure Button_create_remote_threadClick(Sender: TObject);
procedure Button_open_processClick(Sender: TObject);
procedure Button_open_remote_thrClick(Sender: TObject);
procedure Button_resume_threadClick(Sender: TObject);
procedure Button_suspend_threadClick(Sender: TObject);
procedure Button_terminate_processClick(Sender: TObject);
procedure Button_terminate_threadClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure create_process(proc_name: string);
private
public
hThread, hProcess: THANDLE;
thr_id: LongInt;
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
var
proc_id, thread_id: LongWord;
begin
proc_id:=GetCurrentProcessId();
thread_id:=GetCurrentThreadId();
proc_info.Text:=Format('ID Процесса: %d'+LineEnding+
'ID Потока: %d'+LineEnding+
'Адрес функции: %p'+LineEnding,[proc_id, thread_id, Addr(proc_id)]); // тут я хочу записать адрес главной функции в ТМемо
create_process('A');
//create_process('B');
end;
procedure TForm1.Button_open_remote_thrClick(Sender: TObject);
begin
try
thr_id:=StrToInt64(Edit_remote_thr_id.Text);
hThread:=OpenThread(THREAD_ALL_ACCESS,False,thr_id);
If (hThread <> 0) then
ShowMessage(Format('Доступ к удаленному потоку %d получен!',[thr_id]))
else ShowMessage('Ошибка доступа к удаленному потоку!');
except
on E: EConvertError do
ShowMessage('Введено некорректное значение!');
end;
end;
procedure TForm1.Button_open_processClick(Sender: TObject);
var
pr_id: DWORD;
begin
try
pr_id:=StrToDWord(Edit_process_id.Text);
hProcess:=OpenProcess(PROCESS_ALL_ACCESS,False,pr_id);
if (hProcess <> 0) then
ShowMessage(Format('Доступ к удаленному процессу %d получен!',[pr_id]))
else ShowMessage('Ошибка доступа к удаленному процессу!');
except
on E: EConvertError do
ShowMessage('Введено некорректное значение!');
end;
end;
procedure TForm1.Button_create_remote_threadClick(Sender: TObject);
var
r: LPTHREAD_START_ROUTINE;
r3: Integer;
ID: DWORD;
begin
r3:=1;
SScanf(Edit_func_addr.Text,'%d',[@r]);
hThread:=CreateRemoteThread(hProcess,Nil,0,r,@r3,CREATE_SUSPENDED,@ID);
if (hThread <> 0) then ShowMessage(Format('Поток %d в удаленном процессе создан!',[ID]))
else ShowMessage('Ошибка создания потока!');
end;
procedure TForm1.Button_resume_threadClick(Sender: TObject);
var
flok: DWORD;
begin
flok:=ResumeThread(hThread);
if (flok <> 0) then ShowMessage(Format('Удаленный поток %d запущен!',[thr_id]))
else ShowMessage('Ошибка запуска потока');
end;
procedure TForm1.Button_suspend_threadClick(Sender: TObject);
var
flok: DWORD;
begin
flok:=SuspendThread(hThread);
if (flok = 0) then ShowMessage(Format('Удаленный поток %d приостановлен',[thr_id]))
else ShowMessage('Ошибка приостановки потока!');
end;
procedure TForm1.Button_terminate_processClick(Sender: TObject);
begin
TerminateProcess(hProcess,1);
end;
procedure TForm1.Button_terminate_threadClick(Sender: TObject);
var
flok: WINBOOL;
begin
flok:=TerminateThread(hThread, 1);
if (flok) then ShowMessage(Format('Поток %d уничтожен',[thr_id]))
else ShowMessage('Ошибка уничтожения потока');
end;
procedure TForm1.create_process(proc_name: string);
var
si: TSTARTUPINFO;
ProcInfo: TPROCESSINFORMATION;
cmdline: string;
begin
si:=Default(TSTARTUPINFO);
si.cb:=SizeOf(si);
cmdline:=Format('rabit.exe %s',[proc_name]);
CreateProcess(PChar(Nil),PChar(cmdline),Nil,Nil,False,0,Nil,PChar(Nil),si,ProcInfo);
end;
end.