public NARCFile(BinaryReader brrReader) { m_strMagic = new string(brrReader.ReadChars(4)); if (!m_strMagic.Contains('N'.ToString()) || !m_strMagic.Contains('A'.ToString()) || (!m_strMagic.Contains('R'.ToString()) || !m_strMagic.Contains('C'.ToString()))) { throw new FormatException(); } m_shBom = brrReader.ReadInt16(); switch (m_shBom) { case -4097: if (m_strMagic != "CNAR") { throw new FormatException(); } break; case -257: if (m_strMagic != "RCNA") { throw new FormatException(); } break; case -17: if (m_strMagic != "ARCN") { throw new FormatException(); } break; case -2: if (m_strMagic != "NARC") { throw new FormatException(); } break; default: throw new FormatException(); } m_shUnknown1 = brrReader.ReadInt16(); if ((long)brrReader.ReadInt32() != brrReader.BaseStream.Length) { throw new FormatException(); } m_shUnknown2 = brrReader.ReadInt16(); m_shFramesCount = brrReader.ReadInt16(); if (m_shFramesCount != (short)3) { throw new FormatException(); } m_fatfFATB = (FATBFrame)NARCFileFrame.ReadFrom(brrReader, (FATBFrame)null); m_fntfFNTB = (FNTBFrame)NARCFileFrame.ReadFrom(brrReader, (FATBFrame)null); m_fimgfFIMG = (FIMGFrame)NARCFileFrame.ReadFrom(brrReader, m_fatfFATB); if (brrReader.BaseStream.Position != brrReader.BaseStream.Length) { throw new FormatException(); } }
public static NARCFileFrame ReadFrom(BinaryReader brrReader, FATBFrame fatfFATB = null) { string str = Global.ReplaceOrder(new string(brrReader.ReadChars(4))); foreach (char ch in str) { if (ch < 'A' || ch > 'Z') { throw new FormatException(); } } int num = brrReader.ReadInt32() - 4 - 4; if (num < 0) { throw new FormatException(); } return((NARCFileFrame)Activator.CreateInstance(Type.GetType("NARCFileReadingDLL." + str + "Frame"), brrReader, num, fatfFATB)); }
public FIMGFrame(BinaryReader brrReader, int nSize, params object[] args) { FATBFrame fatbFrame = (FATBFrame)args[0]; if (nSize < 0 || nSize > 0 && fatbFrame.FilesCount == 0) { throw new FormatException(); } m_lstfimgeEntries = new List <FIMGFrame.FileImageEntryBase>(fatbFrame.FilesCount); int position = (int)brrReader.BaseStream.Position; int num = 0; foreach (FATBFrame.FileAllocationTableEntry entry in fatbFrame.Entries) { if ((long)entry.Start != brrReader.BaseStream.Position - (long)position) { throw new FormatException(); } FIMGFrame.FileImageEntryBase fileImageEntryBase = (FIMGFrame.FileImageEntryBase)null; foreach (byte readByte in brrReader.ReadBytes(4)) { if (readByte < (byte)65 || readByte > (byte)90) { brrReader.BaseStream.Position -= 4L; m_lstfimgeEntries.Add(fileImageEntryBase = SimpleFileImageEntry.ReadFrom(brrReader, entry.End - entry.Start, ref nSize)); break; } } if (fileImageEntryBase == null) { brrReader.ReadInt32(); bool flag = (long)brrReader.ReadInt32() > brrReader.BaseStream.Length - brrReader.BaseStream.Position + 12L; brrReader.BaseStream.Position -= 12L; try { if (flag) { m_lstfimgeEntries.Add(fileImageEntryBase = SimpleFileImageEntry.ReadFrom(brrReader, entry.End - entry.Start, ref nSize)); } else { m_lstfimgeEntries.Add(fileImageEntryBase = (FIMGFrame.FileImageEntryBase)NitroFileBase.ReadFrom(brrReader, entry.End - entry.Start, ref nSize)); } } catch { } ++num; } fileImageEntryBase.Changed += new FIMGFrame.FileImageEntryBase.FileChanged(entry.FileChanged); while ((brrReader.BaseStream.Position - (long)position) % 4L != 0L) { if (brrReader.ReadByte() != byte.MaxValue) { throw new FormatException(); } --nSize; } } if (nSize != 0) { throw new FormatException(); } }