예제 #1
0
        public static CatalogFile Read(Stream input)
        {
            const Endian endian = Endian.Little;

            var magic1 = input.ReadValueU64(endian);
            var magic2 = input.ReadValueU64(endian);

            if (magic1 != Signature || magic2 != Signature)
            {
                throw new FormatException();
            }

            var instance = new CatalogFile();

            var chunkCount    = input.ReadValueU32(endian);
            var unknown2Count = input.ReadValueU32(endian);
            var unknown3Count = input.ReadValueU32(endian);
            var unknown1C     = input.ReadValueU32(endian);
            var unknown20     = input.ReadValueU32(endian);
            var unknown24     = input.ReadValueU32(endian);

            if (unknown2Count != 0 || unknown1C != 0 || unknown20 != 0 || unknown24 != 0)
            {
                throw new FormatException();
            }

            instance.ChunkEntries.Clear();

            for (int i = 0; i < chunkCount; i++)
            {
                var entry = new ChunkEntry();
                entry.SHA1      = new SHA1(input.ReadBytes(20));
                entry.Offset    = input.ReadValueU32(endian);
                entry.Size      = input.ReadValueU32(endian);
                entry.TailSize  = input.ReadValueU32(endian);
                entry.DataIndex = input.ReadValueU32(endian);
                instance.ChunkEntries.Add(entry);
            }

            for (int i = 0; i < unknown3Count; i++)
            {
                var entry = new Unknown3Entry();
                entry.Unknown0 = new SHA1(input.ReadBytes(20));
                entry.Unknown1 = input.ReadValueU32(endian);
                entry.Unknown2 = input.ReadValueU32(endian);
                entry.Unknown3 = input.ReadValueU32(endian);
                entry.Unknown4 = input.ReadValueU32(endian);
                entry.Unknown5 = input.ReadValueU32(endian);
                entry.Unknown6 = new SHA1(input.ReadBytes(20));
                entry.Unknown7 = new SHA1(input.ReadBytes(20));
                instance.Unknown3s.Add(entry);
            }

            if (input.Position != input.Length)
            {
                throw new FormatException();
            }

            return(instance);
        }
예제 #2
0
        public static CatalogFile Read(Stream input)
        {
            const Endian endian = Endian.Little;

            var magic1 = input.ReadValueU64(endian);
            var magic2 = input.ReadValueU64(endian);

            if (magic1 != Signature || magic2 != Signature)
            {
                throw new FormatException();
            }

            var instance = new CatalogFile();

            var chunkCount          = input.ReadValueU32(endian);
            var patchCount          = input.ReadValueU32(endian);
            var encryptedChunkCount = input.ReadValueU32(endian);
            var unknown1C           = input.ReadValueS32(endian);
            var unknown20           = input.ReadValueS32(endian);
            var unknown24           = input.ReadValueS32(endian);

            if (patchCount != 0 || unknown1C != 0 || unknown20 != 0 || unknown24 != 0)
            {
                throw new FormatException();
            }

            instance.ChunkEntries.Clear();

            for (int i = 0; i < chunkCount; i++)
            {
                var chunk = ChunkEntry.Read(input, endian);

                if (chunk.IsEncrypted == true)
                {
                    throw new FormatException();
                }

                instance.ChunkEntries.Add(chunk);
            }

            for (int i = 0; i < encryptedChunkCount; i++)
            {
                var encryptedChunk = EncryptedChunkEntry.Read(input, endian);

                if (encryptedChunk.Chunk.IsEncrypted == false)
                {
                    throw new FormatException();
                }

                if (encryptedChunk.Chunk.Size != encryptedChunk.CryptoInfo.Size)
                {
                    throw new FormatException();
                }

                instance.EncryptedChunkEntries.Add(encryptedChunk);
            }

            if (input.Position != input.Length)
            {
                throw new FormatException();
            }

            return(instance);
        }
예제 #3
0
        public static CatalogFile Read(Stream input)
        {
            const Endian endian = Endian.Little;

            var magic1 = input.ReadValueU64(endian);
            var magic2 = input.ReadValueU64(endian);

            if (magic1 != Signature || magic2 != Signature)
            {
                throw new FormatException();
            }

            var instance = new CatalogFile();

            var normalCount    = input.ReadValueU32(endian);
            var patchCount     = input.ReadValueU32(endian);
            var encryptedCount = input.ReadValueU32(endian);
            var unknown1C      = input.ReadValueS32(endian); // patch version related?
            var unknown20      = input.ReadValueS32(endian); // patch version related?
            var unknown24      = input.ReadValueS32(endian); // patch version related?

            instance.NormalEntries.Clear();
            for (int i = 0; i < normalCount; i++)
            {
                var entry = NormalEntry.Read(input, endian);
                if (entry.IsEncrypted == true)
                {
                    throw new FormatException();
                }
                instance.NormalEntries.Add(entry);
            }

            instance.EncryptedEntries.Clear();
            for (int i = 0; i < encryptedCount; i++)
            {
                var encryptedEntry = EncryptedChunkEntry.Read(input, endian);
                if (encryptedEntry.Entry.IsEncrypted == false)
                {
                    throw new FormatException();
                }
                if (encryptedEntry.Entry.Size != encryptedEntry.CryptoInfo.Size)
                {
                    throw new FormatException();
                }
                instance.EncryptedEntries.Add(encryptedEntry);
            }

            instance.PatchEntries.Clear();
            for (int i = 0; i < patchCount; i++)
            {
                var entry = PatchEntry.Read(input, endian);
                instance.PatchEntries.Add(entry);
            }

            if (input.Position != input.Length)
            {
                throw new FormatException();
            }

            return(instance);
        }