|
@@ -32,6 +32,8 @@ type
|
|
secstrofs : ptruint;
|
|
secstrofs : ptruint;
|
|
processaddress : ptruint;
|
|
processaddress : ptruint;
|
|
FunctionRelative: boolean;
|
|
FunctionRelative: boolean;
|
|
|
|
+ // Offset of the binary image forming permanent offset to all retrieved values
|
|
|
|
+ ImgOffset: ptruint;
|
|
filename : string;
|
|
filename : string;
|
|
// Allocate static buffer for reading data
|
|
// Allocate static buffer for reading data
|
|
buf : array[0..4095] of byte;
|
|
buf : array[0..4095] of byte;
|
|
@@ -84,7 +86,7 @@ uses
|
|
DOS Stub
|
|
DOS Stub
|
|
****************************************************************************}
|
|
****************************************************************************}
|
|
|
|
|
|
-{$if defined(EMX) or defined(PE32) or defined(PE32PLUS)}
|
|
|
|
|
|
+{$if defined(EMX) or defined(PE32) or defined(PE32PLUS) or defined(GO32V2)}
|
|
type
|
|
type
|
|
tdosheader = packed record
|
|
tdosheader = packed record
|
|
e_magic : word;
|
|
e_magic : word;
|
|
@@ -107,7 +109,7 @@ type
|
|
e_res2 : array[0..9] of word;
|
|
e_res2 : array[0..9] of word;
|
|
e_lfanew : longint;
|
|
e_lfanew : longint;
|
|
end;
|
|
end;
|
|
-{$endif EMX or PE32 or PE32PLUS}
|
|
|
|
|
|
+{$endif EMX or PE32 or PE32PLUS or GO32v2}
|
|
|
|
|
|
|
|
|
|
{****************************************************************************
|
|
{****************************************************************************
|
|
@@ -323,7 +325,7 @@ begin
|
|
end;
|
|
end;
|
|
if asecname=secname then
|
|
if asecname=secname then
|
|
begin
|
|
begin
|
|
- secofs:=sechdr.datapos;
|
|
|
|
|
|
+ secofs:=sechdr.datapos + E.ImgOffset;
|
|
seclen:=sechdr.datalen;
|
|
seclen:=sechdr.datalen;
|
|
FindSectionCoff:=true;
|
|
FindSectionCoff:=true;
|
|
exit;
|
|
exit;
|
|
@@ -346,14 +348,29 @@ type
|
|
flag : word;
|
|
flag : word;
|
|
other : array[0..27] of byte;
|
|
other : array[0..27] of byte;
|
|
end;
|
|
end;
|
|
|
|
+const
|
|
|
|
+ ParagraphSize = 512;
|
|
var
|
|
var
|
|
coffheader : tgo32coffheader;
|
|
coffheader : tgo32coffheader;
|
|
|
|
+ DosHeader: TDosHeader;
|
|
|
|
+ BRead: cardinal;
|
|
begin
|
|
begin
|
|
OpenGo32Coff:=false;
|
|
OpenGo32Coff:=false;
|
|
{ read and check header }
|
|
{ read and check header }
|
|
- if e.size<2048+sizeof(coffheader) then
|
|
|
|
|
|
+ if E.Size < SizeOf (DosHeader) then
|
|
|
|
+ Exit;
|
|
|
|
+ BlockRead (E.F, DosHeader, SizeOf (DosHeader), BRead);
|
|
|
|
+ if BRead <> SizeOf (DosHeader) then
|
|
|
|
+ Exit;
|
|
|
|
+ if DosHeader.E_Magic = $5A4D then
|
|
|
|
+ begin
|
|
|
|
+ E.ImgOffset := DosHeader.e_cp * ParagraphSize;
|
|
|
|
+ if DosHeader.e_cblp > 0 then
|
|
|
|
+ E.ImgOffset := E.ImgOffset + DosHeader.e_cblp - 512;
|
|
|
|
+ end;
|
|
|
|
+ if e.size < E.ImgOffset + sizeof(coffheader) then
|
|
exit;
|
|
exit;
|
|
- seek(e.f,2048);
|
|
|
|
|
|
+ seek(e.f,E.ImgOffset);
|
|
blockread(e.f,coffheader,sizeof(coffheader));
|
|
blockread(e.f,coffheader,sizeof(coffheader));
|
|
if coffheader.mach<>$14c then
|
|
if coffheader.mach<>$14c then
|
|
exit;
|
|
exit;
|
|
@@ -990,6 +1007,7 @@ begin
|
|
e.size:=filesize(e.f);
|
|
e.size:=filesize(e.f);
|
|
|
|
|
|
E.FunctionRelative := true;
|
|
E.FunctionRelative := true;
|
|
|
|
+ E.ImgOffset := 0;
|
|
if ExeProcs.OpenProc<>nil then
|
|
if ExeProcs.OpenProc<>nil then
|
|
OpenExeFile:=ExeProcs.OpenProc(e);
|
|
OpenExeFile:=ExeProcs.OpenProc(e);
|
|
end;
|
|
end;
|