Вроде как я понял, что адрес любой функции/процедуры можно вернуть функцией 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.



