private void WriteFile(FileStream file)
{
MemoryStream m = new MemoryStream();
m.Write(Header, 0, Header.Length);
NameOffset = (int)m.Length;
foreach(NameEntry e in Names)
{
m.Write(BitConverter.GetBytes(e.name.Length + 1), 0, 4);
for (int i = 0; i < e.name.Length; i++)
m.WriteByte((byte)e.name[i]);
m.WriteByte(0);
m.Write(BitConverter.GetBytes(e.unk), 0, 4);
m.Write(BitConverter.GetBytes(e.flags), 0, 4);
}
ImportOffset = (int)m.Length;
foreach (ImportEntry e in Imports)
{
m.Write(e.raw, 0, e.raw.Length);
}
ExportOffset = (int)m.Length;
for (int i = 0; i < ExportCount; i++)//add export list
{
int off = (int)m.Length;
ExportEntry e = Exports[i];
e._off = off;
Exports[i] = e;
m.Write(e.raw, 0, e.raw.Length);
}
fz.start = (int)m.Length;
fz.end = fz.start + fz.raw.Length;
m.Write(fz.raw, 0, fz.raw.Length);
for (int i = 0; i < ExportCount; i++)//add unchanged stuff
if (!Exports[i].IsChanged)
{
ExportEntry e = Exports[i];
e.offset = (int)m.Length;
m.Write(e.data, 0, e.data.Length);
Exports[i] = e;
}
else
{
ExportEntry e = Exports[i];
m.Write(e.olddata, 0, e.olddata.Length);
}
for (int i = 0; i < ExportCount; i++)//add new stuff
if (Exports[i].IsChanged)
{
ExportEntry e = Exports[i];
e.offset = (int)m.Length;
m.Write(e.data, 0, e.data.Length);
Exports[i] = e;
}
for (int i = 0; i < ExportCount; i++)//patch lists
{
ExportEntry e = Exports[i];
m.Seek(e._off + 32, SeekOrigin.Begin);
m.Write(BitConverter.GetBytes(e.data.Length), 0, 4);
m.Write(BitConverter.GetBytes(e.offset), 0, 4);
}
m.Seek(_HeaderOff, SeekOrigin.Begin);
m.Write(BitConverter.GetBytes(NameCount), 0, 4);
m.Write(BitConverter.GetBytes(NameOffset), 0, 4);
m.Write(BitConverter.GetBytes(ExportCount), 0, 4);
m.Write(BitConverter.GetBytes(ExportOffset), 0, 4);
m.Write(BitConverter.GetBytes(ImportCount), 0, 4);
m.Write(BitConverter.GetBytes(ImportOffset), 0, 4);
m.Write(BitConverter.GetBytes(fz.start), 0, 4);
m.Write(BitConverter.GetBytes(fz.end), 0, 4);
m.Seek(8, SeekOrigin.Begin);
m.Write(BitConverter.GetBytes(fz.end), 0, 4);
m.Seek(0, SeekOrigin.Begin);
for (int i = 0; i < m.Length; i++)
file.WriteByte((byte)m.ReadByte());
}