{ Copyright (c) 1994-95 by Piotr Warezak and Rafal Wierzbicki, Lodz, Poland function check_if_packed(var f:file); function checks if the assigned and opened file is compressed with WWPACK. Function returns byte: WWPACK version (when packed) and compression command: 3.00 3.01 3.02 3.03 3.04 PR 9 9 14 17 21 P 10 12 15 18 22 PU 11 13 16 19 23 PP n/a n/a n/a 20 24 or: 0 - not packed with WWPACK 1 - not an EXE file 2 - unrecognized WWPACK version 3 - error while reading the file } FUNCTION check_if_packed(var f:FILE):BYTE; var start,size,old_position:LONGINT; header:ARRAY [1..16]OF word; buf:ARRAY [1..75] OF BYTE; ver:word; BEGIN {$I-} ver:=0; {*** store old FilePosition ***} old_position:=FilePos(f); Seek(f,0); size:=FileSize(f); IF IOResult<>0 THEN BEGIN check_if_packed:=3; Seek(f,old_position); ver:=IOResult; Exit; END; {*** check if EXE file ***} IF size<32 THEN BEGIN check_if_packed:=1; Seek(f,old_position); Exit; END; BlockRead(f,header,32); IF (header[1]<>Ord('M')+256*Ord('Z')) AND (header[1]<>Ord('Z')+256*Ord('M')) THEN BEGIN check_if_packed:=1; Seek(f,old_position); Exit; END; IF IOResult<>0 THEN BEGIN check_if_packed:=3; Seek(f,old_position); ver:=IOResult; Exit; END; {*** jump to the begin of the code (jump to CS:IP address) ***} start:=LONGINT(header[12])*16+header[11]+header[5]*16; IF start>=65536*16 THEN dec(start,65536*16); IF start+740 THEN BEGIN check_if_packed:=3; Seek(f,old_position); ver:=IOResult; Exit; END; {*** check if WWPACK 3.00/3.01 PR code ***} IF (buf[3]=$be) AND (buf[6]=$ba) AND (buf[9]=$bf) AND (buf[12]=$b9) THEN BEGIN IF buf[2]=9 THEN ver:=9 ELSE BEGIN check_if_packed:=2; Seek(f,old_position); Exit; END; END; {*** check if WWPACK 3.02/3.03/3.04 PR code ***} IF (buf[3]=$be) AND (buf[6]=$bf) AND (buf[9]=$b9) AND (buf[12]=$8c) AND (buf[13]=$cd) AND (buf[14]=$81) AND (buf[15]=$ed) AND (buf[18]=$8b) AND (buf[19]=$dd) THEN BEGIN buf[2]:=buf[2]+14; ver:=buf[2]; IF (ver<>14) AND (ver<>17) AND (ver<>21) THEN BEGIN check_if_packed:=2; Seek(f,old_position); Exit; END; END; {*** check if WWPACK 3.0x P/PU/PP code ***} IF (buf[3]=$b8) AND (buf[6]=$8c) AND (buf[7]=$ca) AND (buf[8]=$03) AND (buf[9]=$d0) AND (buf[10]=$8c) AND (buf[11]=$c9) AND (buf[12]=$81) AND (buf[16]=$51) THEN BEGIN ver:=buf[2]; IF (ver<10) OR (ver>24) OR (ver=14) OR (ver=17) OR (ver=21) THEN BEGIN check_if_packed:=2; Seek(f,old_position); Exit; END; END; END; {*** restore old FilePosition and return WWPACK's version ***} check_if_packed:=ver; Seek(f,old_position); END;