Example #1
0
        /// <summary>
        ///     Loads data into a <see cref="Vault" /> instance.
        /// </summary>
        /// <param name="vault">The vault to be read and loaded.</param>
        /// <param name="loadingWrapper">The provider of the vault stream readers.</param>
        public void LoadVault(Vault vault, VaultLoadingWrapper loadingWrapper)
        {
            Debug.Assert(vault.Database == null, "vault.Database == null");
            Debug.Assert(vault.BinStream != null, "vault.BinStream != null");
            Debug.Assert(vault.VltStream != null, "vault.VltStream != null");

            vault.Database = this;
            BinaryReader binStreamReader = loadingWrapper.BinReader;
            BinaryReader vltStreamReader = loadingWrapper.VltReader;

            ChunkReader binChunkReader = new ChunkReader(binStreamReader);
            ChunkReader vltChunkReader = new ChunkReader(vltStreamReader);

            //Debug.WriteLine("Processing BIN chunks");
            processBinChunks(vault, binChunkReader);

            //Debug.WriteLine("Processing VLT chunks");
            processVltChunks(vault, vltChunkReader);

            //Debug.WriteLine("Processing pointers");
            fixPointers(vault, VltPointerType.Bin, vault.BinStream);
            fixPointers(vault, VltPointerType.Vlt, vault.VltStream);

            //Debug.WriteLine("Reading exports");
            ReadExports(vault, vltStreamReader, binStreamReader);

            Vaults.Add(vault);
        }
        public IList <Vault> Load(BinaryReader br, Database database, PackLoadingOptions loadingOptions)
        {
            ByteOrder byteOrder = loadingOptions?.ByteOrder ?? ByteOrder.Little;

            // check for VPAK header
            AttribVaultPackImage vaultPackImage = new AttribVaultPackImage();

            vaultPackImage.Read(null, br);

            br.BaseStream.Position = vaultPackImage.Header.StringBlockOffset;

            List <Vault> vaults = new List <Vault>();

            foreach (AttribVaultPackEntry attribVaultPackEntry in vaultPackImage.Entries)
            {
                br.BaseStream.Position = vaultPackImage.Header.StringBlockOffset + attribVaultPackEntry.VaultNameOffset;

                Vault vault = new Vault(NullTerminatedString.Read(br));

                br.BaseStream.Seek(attribVaultPackEntry.BinOffset, SeekOrigin.Begin);

                byte[] binData = new byte[attribVaultPackEntry.BinSize];

                if (br.Read(binData, 0, binData.Length) != binData.Length)
                {
                    throw new Exception($"Failed to read {binData.Length} bytes of BIN data");
                }

                br.BaseStream.Seek(attribVaultPackEntry.VltOffset, SeekOrigin.Begin);

                byte[] vltData = new byte[attribVaultPackEntry.VltSize];

                if (br.Read(vltData, 0, vltData.Length) != vltData.Length)
                {
                    throw new Exception($"Failed to read {vltData.Length} bytes of VLT data");
                }

                vault.BinStream = new MemoryStream(binData);
                vault.VltStream = new MemoryStream(vltData);

                using (VaultLoadingWrapper loadingWrapper = new VaultLoadingWrapper(vault, byteOrder))
                {
                    database.LoadVault(vault, loadingWrapper);
                }

                vaults.Add(vault);
            }

            return(vaults);
        }
Example #3
0
        public void Load(BinaryReader br, Database database, PackLoadingOptions loadingOptions = null)
        {
            string name = new string(br.ReadChars(0x2C)).Trim('\0');

            int binOffset = br.ReadInt32();
            int binSize   = br.ReadInt32();
            int vltOffset = br.ReadInt32();
            int vltSize   = br.ReadInt32();
            int fileSize  = br.ReadInt32();

            if (fileSize != br.BaseStream.Length)
            {
                throw new InvalidDataException("Corrupted file");
            }

            Vault vault                  = new Vault(name);
            DatabaseLoadedFile file      = new DatabaseLoadedFile();
            ByteOrder          byteOrder = loadingOptions?.ByteOrder ?? ByteOrder.Little;

            br.BaseStream.Seek(binOffset, SeekOrigin.Begin);
            byte[] binBuffer = new byte[binSize];
            if (br.Read(binBuffer, 0, binBuffer.Length) != binBuffer.Length)
            {
                throw new Exception($"Failed to read {binBuffer.Length} bytes of BIN data");
            }
            br.BaseStream.Seek(vltOffset, SeekOrigin.Begin);
            byte[] vltBuffer = new byte[vltSize];
            if (br.Read(vltBuffer, 0, vltBuffer.Length) != vltBuffer.Length)
            {
                throw new Exception($"Failed to read {vltBuffer.Length} bytes of VLT data");
            }
            vault.BinStream = new MemoryStream(binBuffer);
            vault.VltStream = new MemoryStream(vltBuffer);
            using (VaultLoadingWrapper loadingWrapper = new VaultLoadingWrapper(vault, byteOrder))
                database.LoadVault(file, vault, loadingWrapper);
            database.LoadFile(file);
        }
Example #4
0
        public IList <Vault> Load(BinaryReader br, Database database, PackLoadingOptions loadingOptions = null)
        {
            if (br.ReadUInt32() != 0x73795341)
            {
                throw new InvalidDataException("Cannot process this stream: Invalid header magic");
            }

            uint numFiles = br.ReadUInt32();

            if (numFiles != 2)
            {
                throw new InvalidDataException("Cannot process this stream: Invalid file count");
            }

            uint nameTableLength = br.ReadUInt32();

            br.ReadUInt32();

            uint vltSize = br.ReadUInt32();

            br.ReadUInt32();
            uint vltOffset = br.ReadUInt32();

            br.ReadUInt32();

            uint binSize = br.ReadUInt32();

            br.ReadUInt32();
            uint binOffset = br.ReadUInt32();

            br.ReadUInt32();

            var fileNames = new List <string>();

            for (int i = 0; i < numFiles; i++)
            {
                fileNames.Add(NullTerminatedString.Read(br));
            }

            long endOffset = br.BaseStream.Position;

            byte[] vltData = new byte[vltSize];
            br.BaseStream.Position = endOffset + vltOffset;

            if (br.Read(vltData, 0, vltData.Length) != vltData.Length)
            {
                throw new Exception("could not read VLT data");
            }

            byte[] binData = new byte[binSize];
            br.BaseStream.Position = endOffset + binOffset;

            if (br.Read(binData, 0, binData.Length) != binData.Length)
            {
                throw new Exception("could not read BIN data");
            }

            Vault vault = new Vault(fileNames[0].Substring(0, fileNames[0].IndexOf('.')))
            {
                BinStream = new MemoryStream(binData),
                VltStream = new MemoryStream(vltData)
            };

            using (VaultLoadingWrapper loadingWrapper = new VaultLoadingWrapper(vault, loadingOptions?.ByteOrder ?? ByteOrder.Little))
            {
                database.LoadVault(vault, loadingWrapper);
            }

            return(new ReadOnlyCollection <Vault>(new List <Vault>(new[] { vault })));
        }