по адресу в коде узнаём имя экзешника, Win + Lin

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

по адресу в коде узнаём имя экзешника, Win + Lin

Сообщение Cheb » 02.08.2015 12:54:16

..а также его allocation base.

Делюсь из пыльных закромов. Разработал для самодебажащейся программы, которая сама парсила свой dwarf2

Код: Выделить всё
  procedure GetModuleByAddr(addr: pointer; var baseaddr: pointer; var filename: string);
  {$ifdef unix}
  var
    dlinfo: dl_info;
  begin
    FillChar(dlinfo, sizeof(dlinfo), 0);
    dladdr(addr, @dlinfo);
    baseaddr:= dlinfo.dli_fbase;
    filename:= String(dlinfo.dli_fname);
    if ExtractFileName(filename) = ExtractFileName(ParamStr(0))
      then baseaddr:= nil;
  end;
  {$else}
  var
    Tmm: TMemoryBasicInformation;
    TST: array[0..Max_Path] of Char;
  begin
    if VirtualQuery(addr, @Tmm, SizeOf(Tmm)) <> sizeof(Tmm)
      then raise Exception.Create('The VirtualQuery() call failed.');
    baseaddr:=Tmm.AllocationBase;
    TST[0]:= #0;
    //На заметку: это не юникод. Надо бы переделать на UnicodeChar и GetModuleFileNameW
    GetModuleFileName(
      THandle(Tmm.AllocationBase), //грязный хак, который *всегда* работает
        //Фактически, винда использует allocation base в качестве хэндла.
      TST, SizeOf(TST));
    filename:= String(PChar(@TST));
  end;
  {$endif} 
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 738
Зарегистрирован: 06.06.2005 15:54:34

Вернуться в Общие вопросы

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

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

Рейтинг@Mail.ru