Contributor: SWAG SUPPORT TEAM        

{
 > Your approach (as all similar ones I have seen so Far) has a major
 > drawback: you can't use PKLITE, TinYPROG, LZEXE afterwards to
 > squeeze them down in size, as the offsets of the Program change.
 > Has anyone come up With a another approach circumventing this?

Yes, you can store it at the end of the .EXE File ( after the
code ) With the following routine :
}

Function CodeLenOnDisk( FName : String ) : LongInt;
Var ImageInfo : Record
                  ExeID     : Array[ 0..1 ] of Char;
                  Remainder : Word;
                  Size : Word
                end;
    F        : File;
begin
  Assign( F, FName );
  Reset( F, 1 );
  if Ioresult <> 0 then Exit;
  BlockRead( F, ImageInfo, Sizeof( ImageInfo ));
  if ImageInfo.ExeID <> 'MZ' then Exit;
  CodeLenOnDisk := LongInt( ImageInfo.size-1 )*512 + ImageInfo.Remainder;
end;

{
With this one, you can determine the end of the code in your .EXE File,
and then Write other data there, Drawback : This Dosen't work in network
environments or With shared .EXE Files. I'd recommend an external passWord
File, and there storing a hash of the passWord.
}