[Back to FILES SWAG index] [Back to Main SWAG index] [Original]

    {
    >I am trying to write a program that will extract a linked list from data
    >appended to the executable with the MS-Dos COPY /B command.  Is such a thing
    >possible?  I have been unable to do it with standard text file procedures.

    You can't extract a linked list but you can retreive data and then
    put it into a linked list. The linked list is a memory data
    structure whereas the data on disk is just collections of data. You
    could probably do what you want with streams, though.

    Here's a unit I wrote for using appended data which may help:
    }

    unit appnddat;

    (*
      APPNDDAT - Copyright (c) Steve Rogers, 1994

      Allows user to store configuration data at the end of an EXE file.
      The putConfig procedure stores a record at the end of the EXE file.
      If data is already present in the EXE, it will be overwritten.
      GetConfig will retreive data that has been appended to the EXE.

      NOTE: The pCfgRec parameter passed to both putConfig & getConfig is
            a raw pointer, RecSize is the size of the config record.

            Also, since this unit gets its data from the data following
            the executeable code, it won't work if you compile your EXE
            in the $d+ state (include debug information).
    *)

    (* We'll do our own i/o checking, thanks. *)
    {$i-}

    interface

    function EXESize(fname : string) : longint;
    function DataAppended(fname : string) : boolean;
    procedure putConfig(fname : string;pCfgRec : pointer;RecSize : word);
    procedure getConfig(fname : string;pCfgRec : pointer;RecSize : word);

    implementation
    uses
      dos;

    {----------------------}
    function EXESize(fname : string) : longint;
    { Returns size of executable code in EXE file }

    type
      tSizeRec=record    { first 6 bytes of EXE header }
        mz,
        remainder,
        pages : word;
      end;

    var
      f : file of tSizeRec;
      sz : tSizeRec;

    begin
      assign(f,fname);
      reset(f);
      if (ioresult<>0) then EXESize:= 0 else begin
        read(f,sz);
        close(f);
        with sz do EXESize:= remainder+(longint(pred(pages))*512);
      end;
    end;

    {----------------------}
    function DataAppended(fname : string) : boolean;
    var
      f : file;
      sz : longint;

    begin
      assign(f,fname);
      reset(f,1);
      if (ioresult<>0) then DataAppended:= false else begin
        sz:= filesize(f);
        close(f);
        DataAppended:= (sz>EXESize(fname));
      end;
    end;

    {-----------------------}
    procedure putConfig(fname : string;pCfgRec : pointer;RecSize : word);
    var
      f : file;
      DataOffset : longint;

    begin
      DataOffset:= EXESize(fname);

      assign(f,fname);
      reset(f,1);
      seek(f,DataOffset);
      blockwrite(f,pCfgRec^,RecSize);
      close(f);
    end;

    {-----------------------}
    procedure getConfig(fname : string;pCfgRec : pointer;RecSize : word);
    var
      f : file;
      DataOffset : longint;

    begin
      if (DataAppended(fname)) then begin
        DataOffset:= EXESize(fname);
        assign(f,fname);
        reset(f,1);
        seek(f,DataOffset);
        blockread(f,pCfgRec^,RecSize);
        close(f);
      end;
    end;

    {----------------------}
    end.

[Back to FILES SWAG index] [Back to Main SWAG index] [Original]