void ReadV2(uint record_size) { uint index_offset = 0; var first_offset_str = m_enc.GetString(m_entry_buf, 8, 8); uint first_offset = Convert.ToUInt32(first_offset_str, 16); while (index_offset < first_offset) { var offset_str = m_enc.GetString(m_entry_buf, 8, 8); var offset = Convert.ToUInt32(offset_str, 16); if (m_file.MaxOffset == offset) { break; } var name = m_enc.GetString(m_entry_buf, 0, 8); var entry = new OdnEntry { Name = name, Offset = offset }; m_dir.Add(entry); index_offset += record_size; if (record_size != m_file.View.Read(index_offset, m_entry_buf, 0, record_size)) { throw new InvalidFormatException(); } } }
void ReadEncrypted(byte key) { uint index_offset = 0; for (;;) { index_offset += 0x10; if (m_entry_buf.AsciiEqual(0, "ffffffffffffffff")) { break; } var name = m_enc.GetString(m_entry_buf, 0, 8); var offset = m_enc.GetString(m_entry_buf, 8, 8); var entry = new OdnEntry { Name = name, Offset = Convert.ToUInt32(offset, 16) }; m_dir.Add(entry); if (0x10 != m_file.View.Read(index_offset, m_entry_buf, 0, 0x10)) { throw new InvalidFormatException(); } key = OdnOpener.Decrypt(m_entry_buf, 0x10, key); } foreach (var entry in m_dir) { entry.Offset += index_offset; } }
void ReadV1() { uint index_offset = 0; for (;;) { if (0x10 != m_file.View.Read(index_offset, m_entry_buf, 0, 0x10)) { throw new InvalidFormatException(); } index_offset += 0x10; if (m_entry_buf.AsciiEqual(0, "END_ffffffffffff")) { break; } else if (m_entry_buf.AsciiEqual(0, "ffffffffffffffff")) { m_scripts_encrypted = false; break; } else if (m_entry_buf.AsciiEqual(0, "HIME_END")) { index_offset += 8; break; } var name = m_enc.GetString(m_entry_buf, 0, 8); var offset = m_enc.GetString(m_entry_buf, 8, 8); var entry = new OdnEntry { Name = name, Offset = Convert.ToUInt32(offset, 16) }; m_dir.Add(entry); } foreach (OdnEntry entry in m_dir) { entry.Offset += index_offset; } if (m_dir.Any() && m_dir[m_dir.Count - 1].Offset == m_file.MaxOffset) { m_dir.RemoveAt(m_dir.Count - 1); } }