public SaveDataFileSystem(Keyset keyset, IStorage storage, IntegrityCheckLevel integrityCheckLevel, bool leaveOpen) { BaseStorage = storage; LeaveOpen = leaveOpen; Keyset = keyset; Header = new Header(BaseStorage, keyset); FsLayout layout = Header.Layout; IStorage dataRemapBase = BaseStorage.Slice(layout.FileMapDataOffset, layout.FileMapDataSize); IStorage dataRemapEntries = BaseStorage.Slice(layout.FileMapEntryOffset, layout.FileMapEntrySize); IStorage metadataRemapEntries = BaseStorage.Slice(layout.MetaMapEntryOffset, layout.MetaMapEntrySize); DataRemapStorage = new RemapStorage(dataRemapBase, Header.MainRemapHeader, dataRemapEntries, leaveOpen); DuplexStorage = InitDuplexStorage(DataRemapStorage, Header); MetaRemapStorage = new RemapStorage(DuplexStorage, Header.MetaDataRemapHeader, metadataRemapEntries, leaveOpen); var journalMapInfo = new JournalMapParams { MapStorage = MetaRemapStorage.Slice(layout.JournalMapTableOffset, layout.JournalMapTableSize), PhysicalBlockBitmap = MetaRemapStorage.Slice(layout.JournalPhysicalBitmapOffset, layout.JournalPhysicalBitmapSize), VirtualBlockBitmap = MetaRemapStorage.Slice(layout.JournalVirtualBitmapOffset, layout.JournalVirtualBitmapSize), FreeBlockBitmap = MetaRemapStorage.Slice(layout.JournalFreeBitmapOffset, layout.JournalFreeBitmapSize), }; IStorage journalData = DataRemapStorage.Slice(layout.JournalDataOffset, layout.JournalDataSizeB + layout.JournalSize); JournalStorage = new JournalStorage(journalData, Header.JournalHeader, journalMapInfo, leaveOpen); IvfcStorage = InitJournalIvfcStorage(integrityCheckLevel); IStorage fatStorage = MetaRemapStorage.Slice(layout.FatOffset, layout.FatSize); if (Header.Layout.Version >= 0x50000) { fatStorage = InitFatIvfcStorage(integrityCheckLevel); } SaveDataFileSystemCore = new SaveDataFileSystemCore(IvfcStorage, fatStorage, Header.SaveHeader); }
private HierarchicalIntegrityVerificationStorage InitJournalIvfcStorage(IntegrityCheckLevel integrityCheckLevel) { const int ivfcLevels = 5; IvfcHeader ivfc = Header.Ivfc; var levels = new List <IStorage> { Header.DataIvfcMaster }; for (int i = 0; i < ivfcLevels - 2; i++) { IvfcLevelHeader level = ivfc.LevelHeaders[i]; levels.Add(MetaRemapStorage.Slice(level.Offset, level.Size)); } IvfcLevelHeader dataLevel = ivfc.LevelHeaders[ivfcLevels - 2]; levels.Add(JournalStorage.Slice(dataLevel.Offset, dataLevel.Size)); return(new HierarchicalIntegrityVerificationStorage(ivfc, levels, IntegrityStorageType.Save, integrityCheckLevel, LeaveOpen)); }
public SaveDataFileSystem(Keyset keyset, IStorage storage, IntegrityCheckLevel integrityCheckLevel, bool leaveOpen) { BaseStorage = storage; LeaveOpen = leaveOpen; Keyset = keyset; var headerA = new Header(BaseStorage, keyset); var headerB = new Header(BaseStorage.Slice(0x4000), keyset); if (headerA.HeaderHashValidity == Validity.Valid) { IsFirstHeaderInUse = true; } else if (headerB.HeaderHashValidity == Validity.Valid) { IsFirstHeaderInUse = false; } else { ThrowHelper.ThrowResult(ResultFs.InvalidSaveDataHeader, "Savedata header is not valid."); } Header = IsFirstHeaderInUse ? headerA : headerB; FsLayout layout = Header.Layout; IStorage dataRemapBase = BaseStorage.Slice(layout.FileMapDataOffset, layout.FileMapDataSize); IStorage dataRemapEntries = BaseStorage.Slice(layout.FileMapEntryOffset, layout.FileMapEntrySize); IStorage metadataRemapEntries = BaseStorage.Slice(layout.MetaMapEntryOffset, layout.MetaMapEntrySize); DataRemapStorage = new RemapStorage(dataRemapBase, Header.MainRemapHeader, dataRemapEntries, leaveOpen); DuplexStorage = InitDuplexStorage(DataRemapStorage, Header); MetaRemapStorage = new RemapStorage(DuplexStorage, Header.MetaDataRemapHeader, metadataRemapEntries, leaveOpen); var journalMapInfo = new JournalMapParams { MapStorage = MetaRemapStorage.Slice(layout.JournalMapTableOffset, layout.JournalMapTableSize), PhysicalBlockBitmap = MetaRemapStorage.Slice(layout.JournalPhysicalBitmapOffset, layout.JournalPhysicalBitmapSize), VirtualBlockBitmap = MetaRemapStorage.Slice(layout.JournalVirtualBitmapOffset, layout.JournalVirtualBitmapSize), FreeBlockBitmap = MetaRemapStorage.Slice(layout.JournalFreeBitmapOffset, layout.JournalFreeBitmapSize), }; IStorage journalData = DataRemapStorage.Slice(layout.JournalDataOffset, layout.JournalDataSizeB + layout.JournalSize); JournalStorage = new JournalStorage(journalData, Header.JournalHeader, journalMapInfo, leaveOpen); CoreDataIvfcStorage = InitJournalIvfcStorage(integrityCheckLevel); IStorage fatStorage = MetaRemapStorage.Slice(layout.FatOffset, layout.FatSize); if (Header.Layout.Version >= 0x50000) { FatIvfcStorage = InitFatIvfcStorage(integrityCheckLevel); fatStorage = FatIvfcStorage; } SaveDataFileSystemCore = new SaveDataFileSystemCore(CoreDataIvfcStorage, fatStorage, Header.SaveHeader); }