没有办法由 PE 文件结构准确确定文件的大小,因为 PE 文件后面可能附加有数据(copy /b)。
纯粹 PE 文件本身的大小可以这样计算:
////////////////////////////////////////////////////////////////////////////////
//功能: 获取文件大小
//参数:
////////////////////////////////////////////////////////////////////////////////
function GetExeSize(Instance: LongWord = 0): Cardinal;
var
p: Pchar;
nSectCount, I: Integer;
begin
Result := 0;
if Instance = 0 then
p := Pointer(HInstance)
else p := Pointer(Instance);
Inc(p, PImageDosHeader(p)._lfanew + SizeOf(DWORD));
nSectCount := PImageFileHeader(p).NumberOfSections;
Inc(p, SizeOf(TImageFileHeader)+ SizeOf(TImageOptionalHeader));
for I := 0 to nSectCount - 1 do
begin
with PImageSectionHeader(p)^ do
if PointerToRawData + SizeOfRawData > Result then
Result := PointerToRawData + SizeOfRawData ;
Inc(p, SizeOf(TImageSectionHeader));
end;
end;