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)); }
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)); }