Contributor: THOMAS MOENKEMEIER
{
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;