[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]