My idea is to create something very similar to NTFS' LCN and, just like your idea was, store a list of removed blocks so that I know where I can store data. A block would be 1 kB in size.

If I want to store a file, I just calculate how many blocks I'd need, look up the list for removed blocks, seek there and write a 1 kB of data. And so on until the the list of removed blocks is empty, then I'd just write the rest of the file at the end of the archive.

The allocation tree would be placed just after the header and the list of removed blocks. Maybe I'll post some more detailed specification later, I'd really like to have look at your code, noeska, just to make sure I haven't copied much from you.