Делюсь из пыльных закромов. Разработал для самодебажащейся программы, которая сама парсила свой 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}