[Back to ARCHIVES SWAG index] [Back to Main SWAG index] [Original]
{ Detection of ZIP and ARJ SFX files }
{$S-,V-,D+,I-}
USES DOS;
TYPE
ArchiveTypes = (NONE,ARJ,PKZIP);
Header = RECORD
HeadId : WORD; { 60000 }
SIG1 : WORD; { Basic Header Size }
END;
VAR
ArchiveName : PathStr;
ArchiveSize : LongInt; { actual size of archive }
ArchiveOffset : LongInt; { bytes to skip in header if SFX }
ArchiveKind : ArchiveTypes;
FUNCTION CheckSfx(SfxName : PathStr) : BOOLEAN;
{-check for self-extracting archive}
{-if Sfx Exe: set ArchiveName and ArchiveOffset}
Var ImageInfo : Record
ExeId : Array[0..1] Of Char;
Remainder,
size : Word
End;
SfxExe : File;
H : Header;
rd : Word;
Err : Boolean;
AOffset : LongInt;
ExeId : Array[0..1] Of Char;
Begin
CheckSFX := FALSE;
Assign(SfxExe, SfxName); Reset(SfxExe, 1);
If IoResult > 0 Then Exit;
ArchiveName := SfxName;
ArchiveOffset := 0;
ArchiveSize := Filesize(SfxExe);
BlockRead(SfxExe, ImageInfo, SizeOf(ImageInfo));
If ImageInfo.ExeId <> 'MZ' Then Exit;
AOffset := LongInt(ImageInfo.size-1)*512+ImageInfo.Remainder;
Seek(SfxExe, AOffset);
If IoResult > 0 Then Exit;
BlockRead(SfxExe, H, SizeOf(H), rd);
Err := (IoResult > 0) Or (rd < SizeOf(Header));
Close(SfxExe);
If Err Then Exit;
ArchiveName := SfxName;
ArchiveOffset := AOffset + (ORD(BOOLEAN(H.Sig1 = $EA60)) * 2); { add 2 bytes for ARJ241}
ArchiveKind := ArchiveTypes(ORD(ArchiveOffset > 0) + ORD(BOOLEAN(H.Sig1 <> $EA60)));
CheckSfx := (ArchiveOffset > 0);
End;
[Back to ARCHIVES SWAG index] [Back to Main SWAG index] [Original]