129 lines
4.9 KiB
Plaintext
129 lines
4.9 KiB
Plaintext
|
|
Appending Files to EXEs.
|
|
|
|
After seeing several questions on appending files to EXEs, I decided to
|
|
write this text. I did NOT originate this idea. While this text describes
|
|
"a" way of implementing the technique it may not be the best way for your
|
|
needs. I have simply attempted to supply you with a basic understanding of
|
|
the process.
|
|
|
|
|
|
WHY?
|
|
|
|
A couple years ago, I purchased a copy of Ultima 7. After installing it
|
|
I looked at the directory. There were a lot of files and moving any one of
|
|
them out of the directory crashed the program. When I got Unreal by Future
|
|
Crew all of my preconceived ideas went out the window.
|
|
|
|
1. You can't run a 2meg EXE, can you?!
|
|
2. Where are the music and graphic files?!
|
|
3. How'd they do that? (This includes the effects :)
|
|
|
|
The answer to #1 : "It runs; therefore, you must be able to do it. Idiot!"
|
|
The answer to #2 : "All the music and graphic files are contained IN the EXE."
|
|
Question #3 is a little harder to explain, I still don't know exactly what FC
|
|
did, but the technique I discuss in this file gives you similar results.
|
|
|
|
|
|
|
|
Appending a file
|
|
|
|
Before you append a file to the end of your EXE, ask yourself how do
|
|
access it. If your adding 10 files how do you know where they are? This is
|
|
actually really simple once you think it through. Create a directory
|
|
structure of your own and make it the very last file you append! Use your own
|
|
structure if you want but feel free to use mine.
|
|
|
|
Directory structure:
|
|
|
|
repeat
|
|
name - string
|
|
filepos - long int, pointer to the first byte of the file
|
|
filesize - long int
|
|
for each file being attach
|
|
|
|
long int - number of entries
|
|
|
|
|
|
|
|
Since this is similar to a WAD file, we'll call is a KAD file.
|
|
KAD = Kodiak Wad file, get it a KAD file.
|
|
Okay, so it wasn't that good, lets move on.
|
|
|
|
To build the KAD file all you have to do is tack one file after another INTO
|
|
a single file and add the directory to the end of it.
|
|
|
|
|
|
see packer.c
|
|
|
|
Open output file
|
|
repeat
|
|
save the output's file position in directory structure
|
|
save the input's file name, ignoring path, in directory structure
|
|
save the input's file size in directory structure
|
|
open input file
|
|
copy input file to output file
|
|
close input file
|
|
until all files are appended
|
|
save directory info
|
|
close file
|
|
|
|
Simple, ehh?
|
|
|
|
Now that you have the KAD file what do you do with it?
|
|
|
|
To access the KAD your code should read the directory into a memory array.
|
|
Just read the last dword of the KAD multiply by 8 (2 dwords) add 4, and seek
|
|
from the end of the file back that many bytes and fill your directory array
|
|
from there.
|
|
|
|
Now if you want to load the first file from the KAD, get the file offset from
|
|
your directory array, seek to the file position and load. What could be
|
|
simpler? How about using a pre-written function GETFILE. :)
|
|
|
|
While you are developing your program use the KAD file. Once your code is
|
|
done your ready for the final step. Instead of reading from the KAD file,
|
|
change the input name your program is looking for, to itself. Then repack the
|
|
files to the end of your EXE.
|
|
|
|
see packer.c
|
|
|
|
Open EXE file
|
|
seek the end of the EXE file
|
|
repeat
|
|
save the output's file position in directory structure
|
|
save the input's file type in directory structure
|
|
save the input's file size in directory structure
|
|
open input file
|
|
copy input file to output file
|
|
close input file
|
|
until all files are appended
|
|
save directory info
|
|
close file
|
|
|
|
That's it! YOUR DONE!
|
|
|
|
|
|
Keep in mind that this is NOT the only way to accomplish this. I have
|
|
included a fully functional KAD system implemented for Watcom C. It includes
|
|
LZARI decompression routine. If this file has helped you, let me know. Feel
|
|
free to use the code included, but if you do greet me. A postcard would be
|
|
nice too. :)
|
|
|
|
|
|
NOTE: I have heard it said "you can't do this when using an EXE compression
|
|
loader like Pklite." I have one thing to say......BULL! The trick is to
|
|
compress your EXE prior to appending the KAD to it.
|
|
|
|
|
|
|
|
Coded by Kodiak of The Apollo Project
|
|
AKA Charles Jones
|
|
1122 s 32nd St #2
|
|
Omaha, NE 68105
|
|
(402)-346-8974
|
|
|
|
Email: CAD@UnOmaha.edu
|
|
IRC : #Coders (lo *, Bri_acid: I still want to be on OPPER's list)
|
|
|