home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / das_buch / dos / exegr.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-05-13  |  3.4 KB  |  70 lines

  1. {$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,P-,Q-,R-,S-,T-,V-,X-,M 16384,0,0}
  2.  
  3. (*===================================================================*)
  4. (*                            EXEGR.PAS                              *)
  5. (*                 Copyright (C) 1993 te-wi Verlag                   *)
  6. (*-------------------------------------------------------------------*)
  7. (*  Demoprogramm, das seine effektive und die im Header angegebene   *)
  8. (*                    Länge ermittelt und ausgibt                    *)
  9. (*===================================================================*)
  10. (* Aufbau des EXE-Header (hierfür relevante Daten):                  *)
  11. (* Byte_1 = "M"     = erstes Byte der Kennung                        *)
  12. (* Byte_2 = "Z"     = zweites Byte der Kennung                       *)
  13. (* DateigrößeinByte = ((Byte_6*256+Byte_5)-1)*512+(Byte_4*256+Byte_3)*)
  14. (*-------------------------------------------------------------------*)
  15. (* Die Daten im Exe-Header können dafür genutzt werden, um beim An-  *)
  16. (* hängen zusätzlicher Binärdateien (beispielsweise mit COPY/B) an   *)
  17. (* das Programm selbst (OVL-Simulation) die Position dieser zusätz-  *)
  18. (* lich angehängten Daten zu finden (Addition der EXE-Größe).        *)
  19. (* Die Funktion GetFileLenFromHeader übergibt immer die Länge des    *)
  20. (* vom Linker erstellten Programms zurück. Die Länge der Datei, die  *)
  21. (* durch Anhängen von anderen (Daten-Dateien) entstanden ist, kann   *)
  22. (* einfach durch Öffnen der Datei als untypisierte Datei mit einer   *)
  23. (* Recordlänge von 1 ermittelt werden.                               *)
  24. (* Ausprobiert können die Demofunktionen im Programm dadurch, daß    *)
  25. (* man an das Programm EXEGR.EXE eine beliebige andere Datei anhängt:*)
  26. (* COPY/B EXEGR.EXE+TURBO.PCK TEST.EXE                               *)
  27. (* Es wird einmal die ursprüngliche Länge von EXEGR.EXE ausgegeben   *)
  28. (* und zusätzlich noch die effektive Dateilänge.                     *)
  29. (* Trotz der Längenänderung ist das Programm voll lauffähig, da im   *)
  30. (* Gegensatz zu .COM-Dateien die Codelänge vom Linker festgelegt     *)
  31. (* wird und nicht aus der Dateilänge errecht ist. Spätere Änderungen *)
  32. (* werden deshalb ignoriert. Den selben Effekt machen sich auch      *)
  33. (* Linkviren zunutze. Über diesen Effekt kann deshalb auch ein in    *)
  34. (* ein Programm eingebauter Virentest arbeiten:                      *)
  35. (* 1. Test der Dateilänge über GetFileLenFromHeader.                 *)
  36. (* 2. Test der Dateilänge über FileSize bei Recordlänge 1            *)
  37. (* Bei nicht modifizierten Programmen müssen beide Werte gleich sein.*)
  38. (*===================================================================*)
  39.  
  40. PROGRAM GetMyLength;
  41.  
  42. USES
  43.   DosUtil;
  44.  
  45. VAR
  46.   ExeFile: FILE;
  47.   FSize,
  48.   ExeLen : LONGINT;
  49.  
  50. BEGIN
  51.   WriteLn('Programmdatei      :  ', ParamStr(0));
  52.   ExeLen := ExeFileLength(ParamStr(0));
  53.   IF ExeLen > 0 THEN
  54.   BEGIN
  55.     WriteLn('Programmlänge      : ', ExeLen:6, ' Bytes');
  56.     Assign(ExeFile, ParamStr(0));
  57.     Reset(ExeFile, 1);
  58.     FSize := FileSize(ExeFile);
  59.     WriteLn('Echte Dateilänge   : ', FSize:6, ' Bytes');
  60.     Close(ExeFile);
  61.     WriteLn('Angehängter Bereich: ', (FSize - FSize):6, ' Bytes');
  62.   END
  63.   ELSE
  64.     WriteLn('Diese Datei ist kein gültiges Exe-Programm');
  65.     (* --> Diese Meldung ist recht unwahrscheinlich, da das Programm *)
  66.     (* nur dann startet, wenn es ein echtes Exe-File ist.            *)
  67. END.
  68.  
  69. (*===================================================================*)
  70.