private FileSystemBufferManager CreateManager(int size, int blockSize = 0x4000, int maxCacheCount = 16) { int orderMax = FileSystemBuddyHeap.QueryOrderMax((nuint)size, (nuint)blockSize); nuint workBufferSize = FileSystemBuddyHeap.QueryWorkBufferSize(orderMax); byte[] workBuffer = new byte[workBufferSize]; byte[] heapBuffer = new byte[size]; var bufferManager = new FileSystemBufferManager(); Assert.Success(bufferManager.Initialize(maxCacheCount, heapBuffer, blockSize, workBuffer)); return(bufferManager); }
public void Write_SingleBlock_CanReadBack() { byte[] buffer = new byte[0x18000]; byte[] workBuffer = new byte[0x18000]; var bufferManager = new FileSystemBufferManager(); Assert.Success(bufferManager.Initialize(5, buffer, 0x4000, workBuffer)); byte[] storageBuffer = new byte[0x80000]; var baseStorage = new SubStorage(new MemoryStorage(storageBuffer), 0, storageBuffer.Length); var bufferedStorage = new BufferedStorage(); Assert.Success(bufferedStorage.Initialize(baseStorage, bufferManager, 0x4000, 4)); byte[] writeBuffer = new byte[0x400]; byte[] readBuffer = new byte[0x400]; writeBuffer.AsSpan().Fill(0xAA); Assert.Success(bufferedStorage.Write(0x10000, writeBuffer)); Assert.Success(bufferedStorage.Read(0x10000, readBuffer)); Assert.Equal(writeBuffer, readBuffer); }
private static FileSystemProxyConfiguration InitializeFileSystemProxy(FileSystemServer server, FileSystemServerConfig config) { var random = new Random(); RandomDataGenerator randomGenerator = buffer => { random.NextBytes(buffer); return(Result.Success); }; var bufferManager = new FileSystemBufferManager(); Memory <byte> heapBuffer = GC.AllocateArray <byte>(BufferManagerHeapSize, true); bufferManager.Initialize(BufferManagerCacheSize, heapBuffer, BufferManagerBlockSize); var saveDataIndexerManager = new SaveDataIndexerManager(server.Hos.Fs, Fs.SaveData.SaveIndexerId, new ArrayPoolMemoryResource(), new SdHandleManager(), false); var programRegistryService = new ProgramRegistryServiceImpl(server); server.InitializeProgramRegistryImpl(programRegistryService); var baseStorageConfig = new BaseStorageServiceImpl.Configuration(); baseStorageConfig.BisStorageCreator = config.FsCreators.BuiltInStorageCreator; baseStorageConfig.GameCardStorageCreator = config.FsCreators.GameCardStorageCreator; baseStorageConfig.FsServer = server; baseStorageConfig.DeviceOperator = new ReferenceCountedDisposable <IDeviceOperator>(config.DeviceOperator); var baseStorageService = new BaseStorageServiceImpl(in baseStorageConfig); var timeService = new TimeServiceImpl(server); var baseFsServiceConfig = new BaseFileSystemServiceImpl.Configuration(); baseFsServiceConfig.BisFileSystemCreator = config.FsCreators.BuiltInStorageFileSystemCreator; baseFsServiceConfig.GameCardFileSystemCreator = config.FsCreators.GameCardFileSystemCreator; baseFsServiceConfig.SdCardFileSystemCreator = config.FsCreators.SdCardFileSystemCreator; baseFsServiceConfig.BisWiperCreator = BisWiper.CreateWiper; baseFsServiceConfig.FsServer = server; var baseFsService = new BaseFileSystemServiceImpl(in baseFsServiceConfig); var accessFailureManagementServiceConfig = new AccessFailureManagementServiceImpl.Configuration(); accessFailureManagementServiceConfig.FsServer = server; var accessFailureManagementService = new AccessFailureManagementServiceImpl(in accessFailureManagementServiceConfig); var speedEmulationRange = new InternalProgramIdRangeForSpeedEmulation(SpeedEmulationProgramIdMinimum, SpeedEmulationProgramIdMaximum); var ncaFsServiceConfig = new NcaFileSystemServiceImpl.Configuration(); ncaFsServiceConfig.BaseFsService = baseFsService; ncaFsServiceConfig.LocalFsCreator = config.FsCreators.LocalFileSystemCreator; ncaFsServiceConfig.TargetManagerFsCreator = config.FsCreators.TargetManagerFileSystemCreator; ncaFsServiceConfig.PartitionFsCreator = config.FsCreators.PartitionFileSystemCreator; ncaFsServiceConfig.RomFsCreator = config.FsCreators.RomFileSystemCreator; ncaFsServiceConfig.StorageOnNcaCreator = config.FsCreators.StorageOnNcaCreator; ncaFsServiceConfig.SubDirectoryFsCreator = config.FsCreators.SubDirectoryFileSystemCreator; ncaFsServiceConfig.EncryptedFsCreator = config.FsCreators.EncryptedFileSystemCreator; ncaFsServiceConfig.ProgramRegistryService = programRegistryService; ncaFsServiceConfig.AccessFailureManagementService = accessFailureManagementService; ncaFsServiceConfig.SpeedEmulationRange = speedEmulationRange; ncaFsServiceConfig.FsServer = server; var ncaFsService = new NcaFileSystemServiceImpl(in ncaFsServiceConfig, config.ExternalKeySet); var saveFsServiceConfig = new SaveDataFileSystemServiceImpl.Configuration(); saveFsServiceConfig.BaseFsService = baseFsService; saveFsServiceConfig.TimeService = timeService; saveFsServiceConfig.LocalFsCreator = config.FsCreators.LocalFileSystemCreator; saveFsServiceConfig.TargetManagerFsCreator = config.FsCreators.TargetManagerFileSystemCreator; saveFsServiceConfig.SaveFsCreator = config.FsCreators.SaveDataFileSystemCreator; saveFsServiceConfig.EncryptedFsCreator = config.FsCreators.EncryptedFileSystemCreator; saveFsServiceConfig.ProgramRegistryService = programRegistryService; saveFsServiceConfig.BufferManager = bufferManager; saveFsServiceConfig.GenerateRandomData = randomGenerator; saveFsServiceConfig.IsPseudoSaveData = () => true; saveFsServiceConfig.MaxSaveFsCacheCount = 1; saveFsServiceConfig.SaveIndexerManager = saveDataIndexerManager; saveFsServiceConfig.FsServer = server; var saveFsService = new SaveDataFileSystemServiceImpl(in saveFsServiceConfig); var statusReportServiceConfig = new StatusReportServiceImpl.Configuration(); statusReportServiceConfig.NcaFsServiceImpl = ncaFsService; statusReportServiceConfig.SaveFsServiceImpl = saveFsService; statusReportServiceConfig.BufferManagerMemoryReport = null; statusReportServiceConfig.ExpHeapMemoryReport = null; statusReportServiceConfig.BufferPoolMemoryReport = null; statusReportServiceConfig.GetPatrolAllocateCounts = null; statusReportServiceConfig.MainThreadStackUsageReporter = new DummyStackUsageReporter(); statusReportServiceConfig.IpcWorkerThreadStackUsageReporter = new DummyStackUsageReporter(); statusReportServiceConfig.PipeLineWorkerThreadStackUsageReporter = new DummyStackUsageReporter(); statusReportServiceConfig.FsServer = server; var statusReportService = new StatusReportServiceImpl(in statusReportServiceConfig); var accessLogServiceConfig = new AccessLogServiceImpl.Configuration(); accessLogServiceConfig.MinimumProgramIdForSdCardLog = 0x0100000000003000; accessLogServiceConfig.FsServer = server; var accessLogService = new AccessLogServiceImpl(in accessLogServiceConfig); var fspConfig = new FileSystemProxyConfiguration { FsCreatorInterfaces = config.FsCreators, BaseStorageService = baseStorageService, BaseFileSystemService = baseFsService, NcaFileSystemService = ncaFsService, SaveDataFileSystemService = saveFsService, AccessFailureManagementService = accessFailureManagementService, TimeService = timeService, StatusReportService = statusReportService, ProgramRegistryService = programRegistryService, AccessLogService = accessLogService }; server.InitializeFileSystemProxy(fspConfig); return(fspConfig); }