===========================================================================
 BBS: Canada Remote Systems
Date: 06-24-93 (15:37)             Number: 27580
From: ROB PERELMAN                 Refer#: NONE
  To: ALL                           Recvd: NO  
Subj: End of EXE                     Conf: (1221) F-PASCAL
---------------------------------------------------------------------------
This is a unit I wrote but it crashed a few times on me, so here is an
updated unit for anyone's use.  Remember not to use it from the TP
editor because if you compile to memory, PARAMSTR(0) is the editor, and
if you compile to disk, you will not have any data.

Unit ExeEnd;

Interface

Var EndOfExe: LongInt; {Shows the end of the EXE file}
    ExeFile: File; {The EXE file positioned at the end}
    Data: Boolean; {If there is data after the EXE}

Implementation

Type EXEHeader=Record
      ID: Word;                  { EXE file id }
      ByteMod: Word;             { Load module image size mod 512 }
      Pages: Word;               { File size (including header) div 512 }
      RelocItems: Word;          { Number of relocation table items }
      Size: word;                { Header size in 16-byte paragraphs }
      MinParagraphs: Word;       { Minimum number of paragraphs above program }
      MaxParagraphs: Word;       { Maximum number of paragraphs above program }
      StackSeg: Word;            { Displacement of stack segment }
      SPReg: Word;               { Initial SP register value }
      CheckSum: Integer;         { Word checksum - negative sum (not used) }
      IPReg: Word;               { Initial IP register value }
      CodeSeg: Word;             { Displacement of code segment }
      FirstReloc: Word;          { First relocation item }
      OvlN: Word                 { Overlay number }
    End;

Const CorrectExe=$5A4D;

Var Exe: EXEHeader;
    ReadIn: Integer;
    OldExitProc: Pointer;

Procedure CloseExe; Far;
Begin
  ExitProc:=OldExitProc;
  Close(ExeFile);
End;

Begin
  OldExitProc:=ExitProc;
  ExitProc:=@CloseExe;
  Assign(ExeFile, ParamStr(0));
  Reset(ExeFile, 1);
  BlockRead(ExeFile, Exe, SizeOf(Exe), ReadIn);
  With Exe do If (ReadIn<>SizeOf(Exe)) or (ID<>CorrectExe) then EndOfExe:=0
    Else EndOfExe:=Pages*512+ByteMod-512;
  Seek(ExeFile, EndOfExe);
  Data:=Not EOF(ExeFile);
End.

 * QMPro 1.50 4 * "Call waiting", great if you have two friends


--- WM v3.00/92-0215
 * Origin: High Country East, Ramona, CA (619)-789-4391  (1:202/1308.0)
