add directory study
This commit is contained in:
128
study/sabre/os/files/Executables/AppendingFilesToEXEs.txt
Normal file
128
study/sabre/os/files/Executables/AppendingFilesToEXEs.txt
Normal file
@@ -0,0 +1,128 @@
|
||||
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user