[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]