Смотря что подразумевается под размером EXE-шника. Если размер файла на диске, то например (есть множество способов) с помощью GetFileAttributesEx. А если только размер PE-файла без каких либо оверлеев, то можно вот такие функции использовать: function GetImageSize(Instance:THandle):Cardinal;
var
Index:Integer;
Header:PImageNtHeaders;
begin
Result:=0;
Inc(Instance,PImageDosHeader(Instance)._lfanew);
Header:=PImageNtHeaders(Instance);
Inc(Instance,SizeOf(TImageNtHeaders));
for Index:=1 to Header.FileHeader.NumberOfSections do begin
with PImageSectionHeader(Instance)^ do
if PointerToRawData+SizeOfRawData>Result then
Result:=PointerToRawData+SizeOfRawData;
Inc(Instance,SizeOf(TImageSectionHeader));
end;
end;
function GetImageSize(const FileName:string):Cardinal;
var
ExeFile:HFile;
MZHeader:TImageDosHeader;
PEHeader:TImageNtHeaders;
ISHeader:TImageSectionHeader;
Readed,MaxEnd:Cardinal;
A:Integer;
begin
Result:=0;
ExeFile:=CreateFile(PChar(FileName),GENERIC_READ,FILE_SHARE_READ,nil,OPEN_EXISTING,0,0);
if ExeFile<>INVALID_HANDLE_VALUE then try
if ReadFile(ExeFile,MZHeader,SizeOf(MZHeader),Readed,nil)and(Readed=SizeOf(MZHeader))
and(MZHeader.e_magic=$5A4D)
and(SetFilePointer(ExeFile,MZHeader._lfanew,nil,FILE_BEGIN)=DWORD(MZHeader._lfanew))
and ReadFile(ExeFile,PEHeader,SizeOf(PEHeader),Readed,nil)and(Readed=SizeOf(PEHeader))
and(PEHeader.Signature=$4550) then begin
MaxEnd:=0;
for A:=0 to PEHeader.FileHeader.NumberOfSections-1 do begin
if not ReadFile(ExeFile,ISHeader,SizeOf(ISHeader),Readed,nil)
or(Readed<>SizeOf(ISHeader)) then Exit;
with ISHeader do
if PointerToRawData+SizeOfRawData>Result then
MaxEnd:=PointerToRawData+SizeOfRawData;
end;
Result:=Min(MaxEnd,GetFileSize(ExeFile,nil));
end
finally
CloseHandle(ExeFile);
end;
end; |