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

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

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

Сообщение ivekarp » 11.04.2022 18:16:23

Всем привет! Пишу программу, которая работает с WinAPI, интересует вопрос, как узнать адрес функции?
Вроде как я понял, что адрес любой функции/процедуры можно вернуть функцией 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.
ivekarp
незнакомец
 
Сообщения: 1
Зарегистрирован: 11.04.2022 18:11:48

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

Сообщение iskander » 11.04.2022 23:16:41

ivekarp писал(а):А в паскале честно говоря даже и не знаю, как можно к главной функции обратиться по имени, как её звать величать так сказать (тоже хотелось бы узнать)

Если правильно путаю, в FPC она откликается на PASCALMAIN.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

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

Сообщение Tango » 02.05.2022 13:18:33

Ну вообще адрес функции в Паскале берётся через @. Т.е.
Pointer pp = @MyProc;
в pp будет адрес функции/процедуры.
Но в паскале нет главной функции.
Если у тебя возник такой вопрос, то твой подход не верен, ищи другой.
Аватара пользователя
Tango
постоялец
 
Сообщения: 156
Зарегистрирован: 31.05.2012 17:07:30

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

Сообщение iskander » 02.05.2022 17:18:41

Tango писал(а):Но в паскале нет главной функции.

Наверно, правильнее будет сказать, что в паскале её нет на этапе компиляции.
В откомпилированной программе она имеется, в чём можно убедиться, заглянув в ассемблерный выхлоп компилятора.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

Рейтинг@Mail.ru