home *** CD-ROM | disk | FTP | other *** search
- {$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,P-,Q-,R-,S-,T-,V-,X-,M 16384,0,0}
-
- (*===================================================================*)
- (* EXEGR.PAS *)
- (* Copyright (C) 1993 te-wi Verlag *)
- (*-------------------------------------------------------------------*)
- (* Demoprogramm, das seine effektive und die im Header angegebene *)
- (* Länge ermittelt und ausgibt *)
- (*===================================================================*)
- (* Aufbau des EXE-Header (hierfür relevante Daten): *)
- (* Byte_1 = "M" = erstes Byte der Kennung *)
- (* Byte_2 = "Z" = zweites Byte der Kennung *)
- (* DateigrößeinByte = ((Byte_6*256+Byte_5)-1)*512+(Byte_4*256+Byte_3)*)
- (*-------------------------------------------------------------------*)
- (* Die Daten im Exe-Header können dafür genutzt werden, um beim An- *)
- (* hängen zusätzlicher Binärdateien (beispielsweise mit COPY/B) an *)
- (* das Programm selbst (OVL-Simulation) die Position dieser zusätz- *)
- (* lich angehängten Daten zu finden (Addition der EXE-Größe). *)
- (* Die Funktion GetFileLenFromHeader übergibt immer die Länge des *)
- (* vom Linker erstellten Programms zurück. Die Länge der Datei, die *)
- (* durch Anhängen von anderen (Daten-Dateien) entstanden ist, kann *)
- (* einfach durch Öffnen der Datei als untypisierte Datei mit einer *)
- (* Recordlänge von 1 ermittelt werden. *)
- (* Ausprobiert können die Demofunktionen im Programm dadurch, daß *)
- (* man an das Programm EXEGR.EXE eine beliebige andere Datei anhängt:*)
- (* COPY/B EXEGR.EXE+TURBO.PCK TEST.EXE *)
- (* Es wird einmal die ursprüngliche Länge von EXEGR.EXE ausgegeben *)
- (* und zusätzlich noch die effektive Dateilänge. *)
- (* Trotz der Längenänderung ist das Programm voll lauffähig, da im *)
- (* Gegensatz zu .COM-Dateien die Codelänge vom Linker festgelegt *)
- (* wird und nicht aus der Dateilänge errecht ist. Spätere Änderungen *)
- (* werden deshalb ignoriert. Den selben Effekt machen sich auch *)
- (* Linkviren zunutze. Über diesen Effekt kann deshalb auch ein in *)
- (* ein Programm eingebauter Virentest arbeiten: *)
- (* 1. Test der Dateilänge über GetFileLenFromHeader. *)
- (* 2. Test der Dateilänge über FileSize bei Recordlänge 1 *)
- (* Bei nicht modifizierten Programmen müssen beide Werte gleich sein.*)
- (*===================================================================*)
-
- PROGRAM GetMyLength;
-
- USES
- DosUtil;
-
- VAR
- ExeFile: FILE;
- FSize,
- ExeLen : LONGINT;
-
- BEGIN
- WriteLn('Programmdatei : ', ParamStr(0));
- ExeLen := ExeFileLength(ParamStr(0));
- IF ExeLen > 0 THEN
- BEGIN
- WriteLn('Programmlänge : ', ExeLen:6, ' Bytes');
- Assign(ExeFile, ParamStr(0));
- Reset(ExeFile, 1);
- FSize := FileSize(ExeFile);
- WriteLn('Echte Dateilänge : ', FSize:6, ' Bytes');
- Close(ExeFile);
- WriteLn('Angehängter Bereich: ', (FSize - FSize):6, ' Bytes');
- END
- ELSE
- WriteLn('Diese Datei ist kein gültiges Exe-Programm');
- (* --> Diese Meldung ist recht unwahrscheinlich, da das Programm *)
- (* nur dann startet, wenn es ein echtes Exe-File ist. *)
- END.
-
- (*===================================================================*)
-