예제 #1
0
        public HashFile(string filePath, RootFileSystem rfs)
        {
            _path = filePath;
            _rfs  = rfs;

            if (!File.Exists(_path))
            {
                return;
            }

            Fs      = File.OpenRead(_path);
            Entries = new Dictionary <ulong, ScsHashEntry>();

            Header = new ScsHeader
            {
                Magic       = ReadUint(Fs, 0x0),
                Version     = ReadUshort(Fs, 0x04),
                Salt        = ReadUshort(Fs, 0x06),
                HashMethod  = ReadUint(Fs, 0x08),
                EntryCount  = ReadInt(Fs, 0x0C),
                StartOffset = ReadInt(Fs, 0x10)
            };

            if (Header.Magic != Magic)
            {
                Log.Msg("Incorrect File Structure");
                return;
            }

            if (Header.HashMethod != HashMethod)
            {
                Log.Msg("Incorrect Hash Method");
                return;
            }

            if (Header.Version != SupportedHashVersion)
            {
                Log.Msg("Unsupported Hash Version");
                return;
            }

            for (var i = 0; i < Header.EntryCount; i++)
            {
                var offset = Header.StartOffset + i * EntryBlockSize;
                var entry  = new ScsHashEntry
                {
                    Hash           = ReadUlong(Fs, offset),
                    Offset         = ReadLong(Fs, offset + 0x08),
                    Flags          = ReadUint(Fs, offset + 0x10),
                    Crc            = ReadUint(Fs, offset + 0x14),
                    Size           = ReadInt(Fs, offset + 0x18),
                    CompressedSize = ReadInt(Fs, offset + 0x1C),
                    Hf             = this
                };

                Entries.Add(entry.Hash, entry);
            }

            _rfs.AddDirEntry(GetEntry(RootDirHash));
        }
예제 #2
0
        public HashFile(string filePath, RootFileSystem rfs)
        {
            _path = filePath;
            _rfs  = rfs;

            if (!File.Exists(_path))
            {
                return;
            }

            Br      = new BinaryReader(File.OpenRead(_path));
            Entries = new Dictionary <ulong, ScsHashEntry>();

            Header = new ScsHeader
            {
                Magic       = ReadUInt32(Br, 0x0),
                Version     = ReadUInt16(Br, 0x04),
                Salt        = ReadUInt16(Br, 0x06),
                HashMethod  = ReadUInt32(Br, 0x08),
                EntryCount  = ReadInt32(Br, 0x0C),
                StartOffset = ReadInt32(Br, 0x10)
            };

            if (Header.Magic != Magic)
            {
                Log.Msg("Incorrect File Structure");
                return;
            }

            if (Header.HashMethod != HashMethod)
            {
                Log.Msg("Incorrect Hash Method");
                return;
            }

            if (Header.Version != SupportedHashVersion)
            {
                Log.Msg("Unsupported Hash Version");
                return;
            }

            Br.BaseStream.Seek(Header.StartOffset, SeekOrigin.Begin);
            var entriesRaw = Br.ReadBytes(Header.EntryCount * EntryBlockSize);

            for (var i = 0; i < Header.EntryCount; i++)
            {
                var offset = i * EntryBlockSize;
                var entry  = new ScsHashEntry
                {
                    Hash           = MemoryHelper.ReadUInt64(entriesRaw, offset),
                    Offset         = MemoryHelper.ReadInt64(entriesRaw, offset + 0x08),
                    Flags          = MemoryHelper.ReadUInt32(entriesRaw, offset + 0x10),
                    Crc            = MemoryHelper.ReadUInt32(entriesRaw, offset + 0x14),
                    Size           = MemoryHelper.ReadInt32(entriesRaw, offset + 0x18),
                    CompressedSize = MemoryHelper.ReadInt32(entriesRaw, offset + 0x1C),
                    Hf             = this
                };

                Entries.Add(entry.Hash, entry);
            }

            _rfs.AddDirEntry(GetEntry(RootDirHash));
        }