private void FlushVer2() { byte[] buffer = new byte[m_Items.Count * GRF_ITEM_SIZE]; IntPtrEx pName; int i, offset, len; GrfFileInfo gfile = null; try { m_Items.SortToPosition(); using (IntPtrEx pBuffer = new IntPtrEx(buffer)) { for (i = offset = 0; i < Items.Count; i++) { len = m_Items[i].FullName.Length + 1; using (pName = new IntPtrEx(m_Items[i].FullName)) { Marshal.Copy(pName, buffer, offset, len); } offset += len; if (m_Items[i] is GrfFileInfo) { gfile = (GrfFileInfo)m_Items[i]; if (m_ForceRepack) { gfile.CompressedLength = 0; gfile.AlignedCompressedLength = 0; gfile.Position = 0; } if (gfile.CompressedLength == 0 && gfile.AlignedCompressedLength == 0 && gfile.Position == 0 && gfile.Length != 0) { if (!m_AllowCrypt) { gfile.Flags &= ~(GrfFileFlags.MixCrypt | GrfFileFlags.Des_0x14); } FlushFile(i); } pBuffer.Write <int>(offset, EndianConverter.LittleEndian(gfile.CompressedLength)); pBuffer.Write <int>(offset + 4, EndianConverter.LittleEndian(gfile.AlignedCompressedLength)); pBuffer.Write <int>(offset + 8, EndianConverter.LittleEndian(gfile.Length)); pBuffer.Write <int>(offset + 0xD, EndianConverter.LittleEndian(gfile.Position - GRF_HEADER_FULL_LEN)); } else { pBuffer.Write <int>(offset, EndianConverter.LittleEndian(GrfItem.GRFFILE_DIR_SZSMALL)); pBuffer.Write <int>(offset + 4, EndianConverter.LittleEndian(GrfItem.GRFFILE_DIR_SZFILE)); pBuffer.Write <int>(offset + 8, EndianConverter.LittleEndian(GrfItem.GRFFILE_DIR_SZORIG)); pBuffer.Write <int>(offset + 0xD, EndianConverter.LittleEndian(GrfItem.GRFFILE_DIR_OFFSET - GRF_HEADER_FULL_LEN)); } pBuffer.Write <byte>(offset + 0xC, (byte)m_Items[i].Flags); offset += 0x11; } } } catch (Exception ex) { throw new Exception(ex.Message); } Array.Resize <byte>(ref buffer, offset); buffer = ZlibStream.CompressBuffer(buffer); m_Items.SortToPosition(); int writeOffset = m_Items.FindUnused(8 + buffer.Length); if (writeOffset == 0) { FileStream.Seek(0, SeekOrigin.End); writeOffset = (int)FileStream.Position; } else { FileStream.Seek(writeOffset, SeekOrigin.Begin); } FileStream.Write(BitConverter.GetBytes(EndianConverter.LittleEndian(buffer.Length)), 0, 4); FileStream.Write(BitConverter.GetBytes(EndianConverter.LittleEndian(offset)), 0, 4); FileStream.Write(buffer, 0, buffer.Length); FileStream.Seek(GRF_HEADER_MID_LEN, SeekOrigin.Begin); FileStream.Write(BitConverter.GetBytes(EndianConverter.LittleEndian(writeOffset - GRF_HEADER_FULL_LEN)), 0, 4); FileStream.Write(BitConverter.GetBytes(0), 0, 4); FileStream.Write(BitConverter.GetBytes(EndianConverter.LittleEndian(i + 7)), 0, 4); }
private void FlushVer2() { byte[] buffer = new byte[m_Items.Count * GRF_ITEM_SIZE]; IntPtrEx pName; int i, offset, len; GrfFileInfo gfile = null; try { m_Items.SortToPosition(); using (IntPtrEx pBuffer = new IntPtrEx(buffer)) { for (i = offset = 0; i < Items.Count; i++) { len = m_Items[i].FullName.Length + 1; using (pName = new IntPtrEx(m_Items[i].FullName)) { Marshal.Copy(pName, buffer, offset, len); } offset += len; if (m_Items[i] is GrfFileInfo) { gfile = (GrfFileInfo)m_Items[i]; if (m_ForceRepack) { gfile.CompressedLength = 0; gfile.AlignedCompressedLength = 0; gfile.Position = 0; } if (gfile.CompressedLength == 0 && gfile.AlignedCompressedLength == 0 && gfile.Position == 0 && gfile.Length != 0) { if (!m_AllowCrypt) gfile.Flags &= ~(GrfFileFlags.MixCrypt | GrfFileFlags.Des_0x14); FlushFile(i); } pBuffer.Write<int>(offset, EndianConverter.LittleEndian(gfile.CompressedLength)); pBuffer.Write<int>(offset + 4, EndianConverter.LittleEndian(gfile.AlignedCompressedLength)); pBuffer.Write<int>(offset + 8, EndianConverter.LittleEndian(gfile.Length)); pBuffer.Write<int>(offset + 0xD, EndianConverter.LittleEndian(gfile.Position - GRF_HEADER_FULL_LEN)); } else { pBuffer.Write<int>(offset, EndianConverter.LittleEndian(GrfItem.GRFFILE_DIR_SZSMALL)); pBuffer.Write<int>(offset + 4, EndianConverter.LittleEndian(GrfItem.GRFFILE_DIR_SZFILE)); pBuffer.Write<int>(offset + 8, EndianConverter.LittleEndian(GrfItem.GRFFILE_DIR_SZORIG)); pBuffer.Write<int>(offset + 0xD, EndianConverter.LittleEndian(GrfItem.GRFFILE_DIR_OFFSET - GRF_HEADER_FULL_LEN)); } pBuffer.Write<byte>(offset + 0xC, (byte)m_Items[i].Flags); offset += 0x11; } } } catch (Exception ex) { throw new Exception(ex.Message); } Array.Resize<byte>(ref buffer, offset); buffer = ZlibStream.CompressBuffer(buffer); m_Items.SortToPosition(); int writeOffset = m_Items.FindUnused(8 + buffer.Length); if (writeOffset == 0) { FileStream.Seek(0, SeekOrigin.End); writeOffset = (int)FileStream.Position; } else { FileStream.Seek(writeOffset, SeekOrigin.Begin); } FileStream.Write(BitConverter.GetBytes(EndianConverter.LittleEndian(buffer.Length)), 0, 4); FileStream.Write(BitConverter.GetBytes(EndianConverter.LittleEndian(offset)), 0, 4); FileStream.Write(buffer, 0, buffer.Length); FileStream.Seek(GRF_HEADER_MID_LEN, SeekOrigin.Begin); FileStream.Write(BitConverter.GetBytes(EndianConverter.LittleEndian(writeOffset - GRF_HEADER_FULL_LEN)), 0, 4); FileStream.Write(BitConverter.GetBytes(0), 0, 4); FileStream.Write(BitConverter.GetBytes(EndianConverter.LittleEndian(i + 7)), 0, 4); }
private void FlushVer1() { byte[] buffer = new byte[m_Items.Count * GRF_ITEM_SIZE]; int i, offset, len, writeOffset; GrfFileInfo gfile = null; try { m_Items.SortToPosition(); using (IntPtrEx pBuffer = new IntPtrEx(buffer)) { for (i = offset = 0; i < Items.Count; i++) { if (m_Items[i] is GrfFileInfo) { gfile = (GrfFileInfo)m_Items[i]; if (m_ForceRepack) { gfile.CompressedLength = 0; gfile.AlignedCompressedLength = 0; gfile.Position = 0; } if (gfile.CompressedLength == 0 && gfile.AlignedCompressedLength == 0 && gfile.Position == 0 && gfile.Length != 0) { if (gfile.CheckExtension()) { gfile.Flags = (gfile.Flags & ~GrfFileFlags.MixCrypt) | GrfFileFlags.Des_0x14; } else { gfile.Flags = (gfile.Flags & ~GrfFileFlags.Des_0x14) | GrfFileFlags.MixCrypt; } FlushFile(i); } } len = m_Items[i].FullName.Length + 1; if (m_IntVersion < 0x101) { pBuffer.Write <int>(offset, len); SwapNibbles(pBuffer + offset + 4, m_Items[i].FullName, len); offset += 4 + len; } else if (m_IntVersion < 0x104) { pBuffer.Write <int>(offset, len + 6); offset += 4; SwapNibbles(pBuffer + offset + 6, GrfCrypt.EncryptNameVer1(m_Items[i].Name, len), len); offset += len + 6; } if (m_Items[i] is GrfDirectoryInfo) { pBuffer.Write <int>(offset, EndianConverter.LittleEndian(GrfItem.GRFFILE_DIR_SZSMALL + GrfItem.GRFFILE_DIR_SZORIG + 0x02CB)); pBuffer.Write <int>(offset + 4, EndianConverter.LittleEndian(GrfItem.GRFFILE_DIR_SZFILE + 0x92CB)); pBuffer.Write <int>(offset + 8, EndianConverter.LittleEndian(GrfItem.GRFFILE_DIR_SZORIG)); pBuffer.Write <int>(offset + 0xD, EndianConverter.LittleEndian(GrfItem.GRFFILE_DIR_OFFSET - GRF_HEADER_FULL_LEN)); } else { pBuffer.Write <int>(offset, EndianConverter.LittleEndian(gfile.CompressedLength + gfile.Length + 0x02CB)); pBuffer.Write <int>(offset + 4, EndianConverter.LittleEndian(gfile.AlignedCompressedLength + 0x92CB)); pBuffer.Write <int>(offset + 8, EndianConverter.LittleEndian(gfile.Length)); pBuffer.Write <int>(offset + 0xD, EndianConverter.LittleEndian(gfile.Position - GRF_HEADER_FULL_LEN)); } pBuffer.Write <byte>(offset + 0xC, (byte)(m_Items[i].Flags & GrfFileFlags.File)); offset += 0x11; } } } catch (Exception ex) { throw new Exception(ex.Message); } FileStream.Seek(0, SeekOrigin.End); writeOffset = (int)FileStream.Position; FileStream.Write(buffer, 0, offset); FileStream.Seek(GRF_HEADER_MID_LEN, SeekOrigin.End); FileStream.Write(BitConverter.GetBytes(EndianConverter.LittleEndian(writeOffset - GRF_HEADER_FULL_LEN)), 0, 4); FileStream.Write(BitConverter.GetBytes(0), 0, 4); FileStream.Write(BitConverter.GetBytes(EndianConverter.LittleEndian(i + 0 + 7)), 0, 4); }
private void FlushVer1() { byte[] buffer = new byte[m_Items.Count * GRF_ITEM_SIZE]; int i, offset, len, writeOffset; GrfFileInfo gfile = null; try { m_Items.SortToPosition(); using (IntPtrEx pBuffer = new IntPtrEx(buffer)) { for (i = offset = 0; i < Items.Count; i++) { if (m_Items[i] is GrfFileInfo) { gfile = (GrfFileInfo)m_Items[i]; if (m_ForceRepack) { gfile.CompressedLength = 0; gfile.AlignedCompressedLength = 0; gfile.Position = 0; } if (gfile.CompressedLength == 0 && gfile.AlignedCompressedLength == 0 && gfile.Position == 0 && gfile.Length != 0) { if (gfile.CheckExtension()) gfile.Flags = (gfile.Flags & ~GrfFileFlags.MixCrypt) | GrfFileFlags.Des_0x14; else gfile.Flags = (gfile.Flags & ~GrfFileFlags.Des_0x14) | GrfFileFlags.MixCrypt; FlushFile(i); } } len = m_Items[i].FullName.Length + 1; if (m_IntVersion < 0x101) { pBuffer.Write<int>(offset, len); SwapNibbles(pBuffer + offset + 4, m_Items[i].FullName, len); offset += 4 + len; } else if (m_IntVersion < 0x104) { pBuffer.Write<int>(offset, len + 6); offset += 4; SwapNibbles(pBuffer + offset + 6, GrfCrypt.EncryptNameVer1(m_Items[i].Name, len), len); offset += len + 6; } if (m_Items[i] is GrfDirectoryInfo) { pBuffer.Write<int>(offset, EndianConverter.LittleEndian(GrfItem.GRFFILE_DIR_SZSMALL + GrfItem.GRFFILE_DIR_SZORIG + 0x02CB)); pBuffer.Write<int>(offset + 4, EndianConverter.LittleEndian(GrfItem.GRFFILE_DIR_SZFILE + 0x92CB)); pBuffer.Write<int>(offset + 8, EndianConverter.LittleEndian(GrfItem.GRFFILE_DIR_SZORIG)); pBuffer.Write<int>(offset + 0xD, EndianConverter.LittleEndian(GrfItem.GRFFILE_DIR_OFFSET - GRF_HEADER_FULL_LEN)); } else { pBuffer.Write<int>(offset, EndianConverter.LittleEndian(gfile.CompressedLength + gfile.Length + 0x02CB)); pBuffer.Write<int>(offset + 4, EndianConverter.LittleEndian(gfile.AlignedCompressedLength + 0x92CB)); pBuffer.Write<int>(offset + 8, EndianConverter.LittleEndian(gfile.Length)); pBuffer.Write<int>(offset + 0xD, EndianConverter.LittleEndian(gfile.Position - GRF_HEADER_FULL_LEN)); } pBuffer.Write<byte>(offset + 0xC, (byte)(m_Items[i].Flags & GrfFileFlags.File)); offset += 0x11; } } } catch (Exception ex) { throw new Exception(ex.Message); } FileStream.Seek(0, SeekOrigin.End); writeOffset = (int)FileStream.Position; FileStream.Write(buffer, 0, offset); FileStream.Seek(GRF_HEADER_MID_LEN, SeekOrigin.End); FileStream.Write(BitConverter.GetBytes(EndianConverter.LittleEndian(writeOffset - GRF_HEADER_FULL_LEN)), 0, 4); FileStream.Write(BitConverter.GetBytes(0), 0, 4); FileStream.Write(BitConverter.GetBytes(EndianConverter.LittleEndian(i + 0 + 7)), 0, 4); }