diff options
| author | Mary <1760003+Thog@users.noreply.github.com> | 2021-07-13 16:48:54 +0200 |
|---|---|---|
| committer | Mary <1760003+Thog@users.noreply.github.com> | 2021-07-13 16:48:54 +0200 |
| commit | 208ba1dde2b9a4d31446ace2bba8f0d641d2e300 (patch) | |
| tree | c7478e7eb87061400bab37daf4f2f69cf387d9f2 /Ryujinx.HLE/HOS/Services/Fs | |
| parent | 997380d48cb3b74e2438cee7fc3b017d6b59b714 (diff) | |
Revert LibHac update
Users are facing save destruction on failing extra data update apparently
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Fs')
9 files changed, 241 insertions, 974 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/FileSystemProxyHelper.cs b/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/FileSystemProxyHelper.cs index 1b6c84c3..7774af23 100644 --- a/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/FileSystemProxyHelper.cs +++ b/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/FileSystemProxyHelper.cs @@ -1,16 +1,10 @@ using LibHac; using LibHac.Common; -using LibHac.Common.Keys; using LibHac.Fs; -using LibHac.FsSrv.Impl; -using LibHac.FsSrv.Sf; using LibHac.FsSystem; using LibHac.FsSystem.NcaUtils; using LibHac.Spl; -using System; using System.IO; -using System.Runtime.InteropServices; -using Path = System.IO.Path; namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy { @@ -22,12 +16,12 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy try { - LocalStorage storage = new LocalStorage(pfsPath, FileAccess.Read, FileMode.Open); - ReferenceCountedDisposable<LibHac.Fs.Fsa.IFileSystem> nsp = new(new PartitionFileSystem(storage)); + LocalStorage storage = new LocalStorage(pfsPath, FileAccess.Read, FileMode.Open); + PartitionFileSystem nsp = new PartitionFileSystem(storage); - ImportTitleKeysFromNsp(nsp.Target, context.Device.System.KeySet); + ImportTitleKeysFromNsp(nsp, context.Device.System.KeySet); - openedFileSystem = new IFileSystem(FileSystemInterfaceAdapter.CreateShared(ref nsp)); + openedFileSystem = new IFileSystem(nsp); } catch (HorizonResultException ex) { @@ -51,9 +45,8 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy } LibHac.Fs.Fsa.IFileSystem fileSystem = nca.OpenFileSystem(NcaSectionType.Data, context.Device.System.FsIntegrityCheckLevel); - var sharedFs = new ReferenceCountedDisposable<LibHac.Fs.Fsa.IFileSystem>(fileSystem); - openedFileSystem = new IFileSystem(FileSystemInterfaceAdapter.CreateShared(ref sharedFs)); + openedFileSystem = new IFileSystem(fileSystem); } catch (HorizonResultException ex) { @@ -106,7 +99,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy return ResultCode.PathDoesNotExist; } - public static void ImportTitleKeysFromNsp(LibHac.Fs.Fsa.IFileSystem nsp, KeySet keySet) + public static void ImportTitleKeysFromNsp(LibHac.Fs.Fsa.IFileSystem nsp, Keyset keySet) { foreach (DirectoryEntryEx ticketEntry in nsp.EnumerateEntries("/", "*.tik")) { @@ -132,27 +125,5 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy return FsPath.FromSpan(out path, pathBytes); } - - public static ref readonly FspPath GetFspPath(ServiceCtx context, int index = 0) - { - ulong position = (ulong)context.Request.PtrBuff[index].Position; - ulong size = (ulong)context.Request.PtrBuff[index].Size; - - ReadOnlySpan<byte> buffer = context.Memory.GetSpan(position, (int)size); - ReadOnlySpan<FspPath> fspBuffer = MemoryMarshal.Cast<byte, FspPath>(buffer); - - return ref fspBuffer[0]; - } - - public static ref readonly LibHac.FsSrv.Sf.Path GetSfPath(ServiceCtx context, int index = 0) - { - ulong position = (ulong)context.Request.PtrBuff[index].Position; - ulong size = (ulong)context.Request.PtrBuff[index].Size; - - ReadOnlySpan<byte> buffer = context.Memory.GetSpan(position, (int)size); - ReadOnlySpan<LibHac.FsSrv.Sf.Path> pathBuffer = MemoryMarshal.Cast<byte, LibHac.FsSrv.Sf.Path>(buffer); - - return ref pathBuffer[0]; - } } } diff --git a/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IDirectory.cs b/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IDirectory.cs index 99e545b1..565ddc4c 100644 --- a/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IDirectory.cs +++ b/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IDirectory.cs @@ -1,13 +1,15 @@ using LibHac; -using LibHac.Sf; +using LibHac.Fs; +using System; +using System.Runtime.InteropServices; namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy { - class IDirectory : DisposableIpcService + class IDirectory : IpcService { - private ReferenceCountedDisposable<LibHac.FsSrv.Sf.IDirectory> _baseDirectory; + private LibHac.Fs.Fsa.IDirectory _baseDirectory; - public IDirectory(ReferenceCountedDisposable<LibHac.FsSrv.Sf.IDirectory> directory) + public IDirectory(LibHac.Fs.Fsa.IDirectory directory) { _baseDirectory = directory; } @@ -17,13 +19,14 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy public ResultCode Read(ServiceCtx context) { ulong bufferPosition = context.Request.ReceiveBuff[0].Position; - ulong bufferLen = context.Request.ReceiveBuff[0].Size; + ulong bufferLen = context.Request.ReceiveBuff[0].Size; - byte[] entryBuffer = new byte[bufferLen]; + byte[] entriesBytes = new byte[bufferLen]; + Span<DirectoryEntry> entries = MemoryMarshal.Cast<byte, DirectoryEntry>(entriesBytes); - Result result = _baseDirectory.Target.Read(out long entriesRead, new OutBuffer(entryBuffer)); + Result result = _baseDirectory.Read(out long entriesRead, entries); - context.Memory.Write(bufferPosition, entryBuffer); + context.Memory.Write(bufferPosition, entriesBytes); context.ResponseData.Write(entriesRead); return (ResultCode)result.Value; @@ -33,19 +36,11 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy // GetEntryCount() -> u64 public ResultCode GetEntryCount(ServiceCtx context) { - Result result = _baseDirectory.Target.GetEntryCount(out long entryCount); + Result result = _baseDirectory.GetEntryCount(out long entryCount); context.ResponseData.Write(entryCount); return (ResultCode)result.Value; } - - protected override void Dispose(bool isDisposing) - { - if (isDisposing) - { - _baseDirectory?.Dispose(); - } - } } } diff --git a/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IFile.cs b/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IFile.cs index 3a94a2a7..cf1611e7 100644 --- a/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IFile.cs +++ b/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IFile.cs @@ -1,15 +1,13 @@ using LibHac; using LibHac.Fs; -using LibHac.Sf; -using Ryujinx.Common; namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy { class IFile : DisposableIpcService { - private ReferenceCountedDisposable<LibHac.FsSrv.Sf.IFile> _baseFile; + private LibHac.Fs.Fsa.IFile _baseFile; - public IFile(ReferenceCountedDisposable<LibHac.FsSrv.Sf.IFile> baseFile) + public IFile(LibHac.Fs.Fsa.IFile baseFile) { _baseFile = baseFile; } @@ -20,15 +18,15 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy { ulong position = context.Request.ReceiveBuff[0].Position; - ReadOption readOption = context.RequestData.ReadStruct<ReadOption>(); + ReadOption readOption = new ReadOption(context.RequestData.ReadInt32()); context.RequestData.BaseStream.Position += 4; long offset = context.RequestData.ReadInt64(); long size = context.RequestData.ReadInt64(); - byte[] data = new byte[context.Request.ReceiveBuff[0].Size]; + byte[] data = new byte[size]; - Result result = _baseFile.Target.Read(out long bytesRead, offset, new OutBuffer(data), size, readOption); + Result result = _baseFile.Read(out long bytesRead, offset, data, readOption); context.Memory.Write(position, data); @@ -43,24 +41,24 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy { ulong position = context.Request.SendBuff[0].Position; - WriteOption writeOption = context.RequestData.ReadStruct<WriteOption>(); + WriteOption writeOption = new WriteOption(context.RequestData.ReadInt32()); context.RequestData.BaseStream.Position += 4; long offset = context.RequestData.ReadInt64(); long size = context.RequestData.ReadInt64(); - byte[] data = new byte[context.Request.SendBuff[0].Size]; + byte[] data = new byte[size]; context.Memory.Read(position, data); - return (ResultCode)_baseFile.Target.Write(offset, new InBuffer(data), size, writeOption).Value; + return (ResultCode)_baseFile.Write(offset, data, writeOption).Value; } [CommandHipc(2)] // Flush() public ResultCode Flush(ServiceCtx context) { - return (ResultCode)_baseFile.Target.Flush().Value; + return (ResultCode)_baseFile.Flush().Value; } [CommandHipc(3)] @@ -69,14 +67,14 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy { long size = context.RequestData.ReadInt64(); - return (ResultCode)_baseFile.Target.SetSize(size).Value; + return (ResultCode)_baseFile.SetSize(size).Value; } [CommandHipc(4)] // GetSize() -> u64 fileSize public ResultCode GetSize(ServiceCtx context) { - Result result = _baseFile.Target.GetSize(out long size); + Result result = _baseFile.GetSize(out long size); context.ResponseData.Write(size); diff --git a/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IFileSystem.cs b/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IFileSystem.cs index b9b4266d..5aa26258 100644 --- a/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IFileSystem.cs +++ b/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IFileSystem.cs @@ -1,19 +1,21 @@ using LibHac; +using LibHac.Common; using LibHac.Fs; -using LibHac.FsSrv.Sf; +using LibHac.Fs.Fsa; +using static Ryujinx.HLE.Utilities.StringUtils; namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy { - class IFileSystem : DisposableIpcService + class IFileSystem : IpcService { - private ReferenceCountedDisposable<LibHac.FsSrv.Sf.IFileSystem> _fileSystem; + private LibHac.Fs.Fsa.IFileSystem _fileSystem; - public IFileSystem(ReferenceCountedDisposable<LibHac.FsSrv.Sf.IFileSystem> provider) + public IFileSystem(LibHac.Fs.Fsa.IFileSystem provider) { _fileSystem = provider; } - public ReferenceCountedDisposable<LibHac.FsSrv.Sf.IFileSystem> GetBaseFileSystem() + public LibHac.Fs.Fsa.IFileSystem GetBaseFileSystem() { return _fileSystem; } @@ -22,79 +24,79 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy // CreateFile(u32 createOption, u64 size, buffer<bytes<0x301>, 0x19, 0x301> path) public ResultCode CreateFile(ServiceCtx context) { - ref readonly Path name = ref FileSystemProxyHelper.GetSfPath(context); + U8Span name = ReadUtf8Span(context); - int createOption = context.RequestData.ReadInt32(); + CreateFileOptions createOption = (CreateFileOptions)context.RequestData.ReadInt32(); context.RequestData.BaseStream.Position += 4; long size = context.RequestData.ReadInt64(); - return (ResultCode)_fileSystem.Target.CreateFile(in name, size, createOption).Value; + return (ResultCode)_fileSystem.CreateFile(name, size, createOption).Value; } [CommandHipc(1)] // DeleteFile(buffer<bytes<0x301>, 0x19, 0x301> path) public ResultCode DeleteFile(ServiceCtx context) { - ref readonly Path name = ref FileSystemProxyHelper.GetSfPath(context); + U8Span name = ReadUtf8Span(context); - return (ResultCode)_fileSystem.Target.DeleteFile(in name).Value; + return (ResultCode)_fileSystem.DeleteFile(name).Value; } [CommandHipc(2)] // CreateDirectory(buffer<bytes<0x301>, 0x19, 0x301> path) public ResultCode CreateDirectory(ServiceCtx context) { - ref readonly Path name = ref FileSystemProxyHelper.GetSfPath(context); + U8Span name = ReadUtf8Span(context); - return (ResultCode)_fileSystem.Target.CreateDirectory(in name).Value; + return (ResultCode)_fileSystem.CreateDirectory(name).Value; } [CommandHipc(3)] // DeleteDirectory(buffer<bytes<0x301>, 0x19, 0x301> path) public ResultCode DeleteDirectory(ServiceCtx context) { - ref readonly Path name = ref FileSystemProxyHelper.GetSfPath(context); + U8Span name = ReadUtf8Span(context); - return (ResultCode)_fileSystem.Target.DeleteDirectory(in name).Value; + return (ResultCode)_fileSystem.DeleteDirectory(name).Value; } [CommandHipc(4)] // DeleteDirectoryRecursively(buffer<bytes<0x301>, 0x19, 0x301> path) public ResultCode DeleteDirectoryRecursively(ServiceCtx context) { - ref readonly Path name = ref FileSystemProxyHelper.GetSfPath(context); + U8Span name = ReadUtf8Span(context); - return (ResultCode)_fileSystem.Target.DeleteDirectoryRecursively(in name).Value; + return (ResultCode)_fileSystem.DeleteDirectoryRecursively(name).Value; } [CommandHipc(5)] // RenameFile(buffer<bytes<0x301>, 0x19, 0x301> oldPath, buffer<bytes<0x301>, 0x19, 0x301> newPath) public ResultCode RenameFile(ServiceCtx context) { - ref readonly Path currentName = ref FileSystemProxyHelper.GetSfPath(context, index: 0); - ref readonly Path newName = ref FileSystemProxyHelper.GetSfPath(context, index: 1); + U8Span oldName = ReadUtf8Span(context, 0); + U8Span newName = ReadUtf8Span(context, 1); - return (ResultCode)_fileSystem.Target.RenameFile(in currentName, in newName).Value; + return (ResultCode)_fileSystem.RenameFile(oldName, newName).Value; } [CommandHipc(6)] // RenameDirectory(buffer<bytes<0x301>, 0x19, 0x301> oldPath, buffer<bytes<0x301>, 0x19, 0x301> newPath) public ResultCode RenameDirectory(ServiceCtx context) { - ref readonly Path currentName = ref FileSystemProxyHelper.GetSfPath(context, index: 0); - ref readonly Path newName = ref FileSystemProxyHelper.GetSfPath(context, index: 1); + U8Span oldName = ReadUtf8Span(context, 0); + U8Span newName = ReadUtf8Span(context, 1); - return (ResultCode)_fileSystem.Target.RenameDirectory(in currentName, in newName).Value; + return (ResultCode)_fileSystem.RenameDirectory(oldName, newName).Value; } [CommandHipc(7)] // GetEntryType(buffer<bytes<0x301>, 0x19, 0x301> path) -> nn::fssrv::sf::DirectoryEntryType public ResultCode GetEntryType(ServiceCtx context) { - ref readonly Path name = ref FileSystemProxyHelper.GetSfPath(context); + U8Span name = ReadUtf8Span(context); - Result result = _fileSystem.Target.GetEntryType(out uint entryType, in name); + Result result = _fileSystem.GetEntryType(out DirectoryEntryType entryType, name); context.ResponseData.Write((int)entryType); @@ -105,11 +107,11 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy // OpenFile(u32 mode, buffer<bytes<0x301>, 0x19, 0x301> path) -> object<nn::fssrv::sf::IFile> file public ResultCode OpenFile(ServiceCtx context) { - uint mode = context.RequestData.ReadUInt32(); + OpenMode mode = (OpenMode)context.RequestData.ReadInt32(); - ref readonly Path name = ref FileSystemProxyHelper.GetSfPath(context); + U8Span name = ReadUtf8Span(context); - Result result = _fileSystem.Target.OpenFile(out ReferenceCountedDisposable<LibHac.FsSrv.Sf.IFile> file, in name, mode); + Result result = _fileSystem.OpenFile(out LibHac.Fs.Fsa.IFile file, name, mode); if (result.IsSuccess()) { @@ -125,11 +127,11 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy // OpenDirectory(u32 filter_flags, buffer<bytes<0x301>, 0x19, 0x301> path) -> object<nn::fssrv::sf::IDirectory> directory public ResultCode OpenDirectory(ServiceCtx context) { - uint mode = context.RequestData.ReadUInt32(); + OpenDirectoryMode mode = (OpenDirectoryMode)context.RequestData.ReadInt32(); - ref readonly Path name = ref FileSystemProxyHelper.GetSfPath(context); + U8Span name = ReadUtf8Span(context); - Result result = _fileSystem.Target.OpenDirectory(out ReferenceCountedDisposable<LibHac.FsSrv.Sf.IDirectory> dir, name, mode); + Result result = _fileSystem.OpenDirectory(out LibHac.Fs.Fsa.IDirectory dir, name, mode); if (result.IsSuccess()) { @@ -145,16 +147,16 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy // Commit() public ResultCode Commit(ServiceCtx context) { - return (ResultCode)_fileSystem.Target.Commit().Value; + return (ResultCode)_fileSystem.Commit().Value; } [CommandHipc(11)] // GetFreeSpaceSize(buffer<bytes<0x301>, 0x19, 0x301> path) -> u64 totalFreeSpace public ResultCode GetFreeSpaceSize(ServiceCtx context) { - ref readonly Path name = ref FileSystemProxyHelper.GetSfPath(context); + U8Span name = ReadUtf8Span(context); - Result result = _fileSystem.Target.GetFreeSpaceSize(out long size, in name); + Result result = _fileSystem.GetFreeSpaceSize(out long size, name); context.ResponseData.Write(size); @@ -165,9 +167,9 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy // GetTotalSpaceSize(buffer<bytes<0x301>, 0x19, 0x301> path) -> u64 totalSize public ResultCode GetTotalSpaceSize(ServiceCtx context) { - ref readonly Path name = ref FileSystemProxyHelper.GetSfPath(context); + U8Span name = ReadUtf8Span(context); - Result result = _fileSystem.Target.GetTotalSpaceSize(out long size, in name); + Result result = _fileSystem.GetTotalSpaceSize(out long size, name); context.ResponseData.Write(size); @@ -178,18 +180,18 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy // CleanDirectoryRecursively(buffer<bytes<0x301>, 0x19, 0x301> path) public ResultCode CleanDirectoryRecursively(ServiceCtx context) { - ref readonly Path name = ref FileSystemProxyHelper.GetSfPath(context); + U8Span name = ReadUtf8Span(context); - return (ResultCode)_fileSystem.Target.CleanDirectoryRecursively(in name).Value; + return (ResultCode)_fileSystem.CleanDirectoryRecursively(name).Value; } [CommandHipc(14)] // GetFileTimeStampRaw(buffer<bytes<0x301>, 0x19, 0x301> path) -> bytes<0x20> timestamp public ResultCode GetFileTimeStampRaw(ServiceCtx context) { - ref readonly Path name = ref FileSystemProxyHelper.GetSfPath(context); + U8Span name = ReadUtf8Span(context); - Result result = _fileSystem.Target.GetFileTimeStampRaw(out FileTimeStampRaw timestamp, in name); + Result result = _fileSystem.GetFileTimeStampRaw(out FileTimeStampRaw timestamp, name); context.ResponseData.Write(timestamp.Created); context.ResponseData.Write(timestamp.Modified); @@ -204,13 +206,5 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy return (ResultCode)result.Value; } - - protected override void Dispose(bool isDisposing) - { - if (isDisposing) - { - _fileSystem?.Dispose(); - } - } } }
\ No newline at end of file diff --git a/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IStorage.cs b/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IStorage.cs index 08f5b87b..62a3c62a 100644 --- a/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IStorage.cs +++ b/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IStorage.cs @@ -1,14 +1,13 @@ using LibHac; -using LibHac.Sf; using Ryujinx.HLE.HOS.Ipc; namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy { class IStorage : DisposableIpcService { - private ReferenceCountedDisposable<LibHac.FsSrv.Sf.IStorage> _baseStorage; + private LibHac.Fs.IStorage _baseStorage; - public IStorage(ReferenceCountedDisposable<LibHac.FsSrv.Sf.IStorage> baseStorage) + public IStorage(LibHac.Fs.IStorage baseStorage) { _baseStorage = baseStorage; } @@ -32,7 +31,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy byte[] data = new byte[size]; - Result result = _baseStorage.Target.Read((long)offset, new OutBuffer(data), (long)size); + Result result = _baseStorage.Read((long)offset, data); context.Memory.Write(buffDesc.Position, data); @@ -46,7 +45,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy // GetSize() -> u64 size public ResultCode GetSize(ServiceCtx context) { - Result result = _baseStorage.Target.GetSize(out long size); + Result result = _baseStorage.GetSize(out long size); context.ResponseData.Write(size); diff --git a/Ryujinx.HLE/HOS/Services/Fs/IDeviceOperator.cs b/Ryujinx.HLE/HOS/Services/Fs/IDeviceOperator.cs index 2968d89c..4e6ee3a4 100644 --- a/Ryujinx.HLE/HOS/Services/Fs/IDeviceOperator.cs +++ b/Ryujinx.HLE/HOS/Services/Fs/IDeviceOperator.cs @@ -3,11 +3,11 @@ using LibHac.FsSrv; namespace Ryujinx.HLE.HOS.Services.Fs { - class IDeviceOperator : DisposableIpcService + class IDeviceOperator : IpcService { - private ReferenceCountedDisposable<LibHac.FsSrv.Sf.IDeviceOperator> _baseOperator; + private LibHac.FsSrv.IDeviceOperator _baseOperator; - public IDeviceOperator(ReferenceCountedDisposable<LibHac.FsSrv.Sf.IDeviceOperator> baseOperator) + public IDeviceOperator(LibHac.FsSrv.IDeviceOperator baseOperator) { _baseOperator = baseOperator; } @@ -16,7 +16,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs // IsSdCardInserted() -> b8 is_inserted public ResultCode IsSdCardInserted(ServiceCtx context) { - Result result = _baseOperator.Target.IsSdCardInserted(out bool isInserted); + Result result = _baseOperator.IsSdCardInserted(out bool isInserted); context.ResponseData.Write(isInserted); @@ -27,7 +27,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs // IsGameCardInserted() -> b8 is_inserted public ResultCode IsGameCardInserted(ServiceCtx context) { - Result result = _baseOperator.Target.IsGameCardInserted(out bool isInserted); + Result result = _baseOperator.IsGameCardInserted(out bool isInserted); context.ResponseData.Write(isInserted); @@ -38,19 +38,11 @@ namespace Ryujinx.HLE.HOS.Services.Fs // GetGameCardHandle() -> u32 gamecard_handle public ResultCode GetGameCardHandle(ServiceCtx context) { - Result result = _baseOperator.Target.GetGameCardHandle(out GameCardHandle handle); + Result result = _baseOperator.GetGameCardHandle(out GameCardHandle handle); context.ResponseData.Write(handle.Value); return (ResultCode)result.Value; } - - protected override void Dispose(bool isDisposing) - { - if (isDisposing) - { - _baseOperator?.Dispose(); - } - } } } diff --git a/Ryujinx.HLE/HOS/Services/Fs/IFileSystemProxy.cs b/Ryujinx.HLE/HOS/Services/Fs/IFileSystemProxy.cs index b9205e03..bd07c103 100644 --- a/Ryujinx.HLE/HOS/Services/Fs/IFileSystemProxy.cs +++ b/Ryujinx.HLE/HOS/Services/Fs/IFileSystemProxy.cs @@ -1,40 +1,33 @@ using LibHac; using LibHac.Fs; -using LibHac.Fs.Shim; using LibHac.FsSrv; -using LibHac.FsSrv.Impl; using LibHac.FsSystem; using LibHac.FsSystem.NcaUtils; using LibHac.Ncm; -using LibHac.Sf; -using LibHac.Spl; using Ryujinx.Common; using Ryujinx.Common.Logging; +using Ryujinx.Cpu; using Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy; using System.IO; using static Ryujinx.HLE.Utilities.StringUtils; -using IFileSystem = LibHac.FsSrv.Sf.IFileSystem; -using IStorage = LibHac.FsSrv.Sf.IStorage; -using RightsId = LibHac.Fs.RightsId; using StorageId = Ryujinx.HLE.FileSystem.StorageId; namespace Ryujinx.HLE.HOS.Services.Fs { [Service("fsp-srv")] - class IFileSystemProxy : DisposableIpcService + class IFileSystemProxy : IpcService { - private ReferenceCountedDisposable<LibHac.FsSrv.Sf.IFileSystemProxy> _baseFileSystemProxy; + private LibHac.FsSrv.IFileSystemProxy _baseFileSystemProxy; public IFileSystemProxy(ServiceCtx context) { - var applicationClient = context.Device.System.LibHacHorizonManager.ApplicationClient; - _baseFileSystemProxy = applicationClient.Fs.Impl.GetFileSystemProxyServiceObject(); + _baseFileSystemProxy = context.Device.FileSystem.FsServer.CreateFileSystemProxyService(); } [CommandHipc(1)] - // SetCurrentProcess(u64, pid) - public ResultCode SetCurrentProcess(ServiceCtx context) + // Initialize(u64, pid) + public ResultCode Initialize(ServiceCtx context) { return ResultCode.Success; } @@ -101,382 +94,241 @@ namespace Ryujinx.HLE.HOS.Services.Fs { BisPartitionId bisPartitionId = (BisPartitionId)context.RequestData.ReadInt32(); - ref readonly var path = ref FileSystemProxyHelper.GetFspPath(context); + Result rc = FileSystemProxyHelper.ReadFsPath(out FsPath path, context); + if (rc.IsFailure()) return (ResultCode)rc.Value; - Result result = _baseFileSystemProxy.Target.OpenBisFileSystem(out ReferenceCountedDisposable<IFileSystem> fileSystem, in path, bisPartitionId); - if (result.IsFailure()) return (ResultCode)result.Value; + rc = _baseFileSystemProxy.OpenBisFileSystem(out LibHac.Fs.Fsa.IFileSystem fileSystem, ref path, bisPartitionId); + if (rc.IsFailure()) return (ResultCode)rc.Value; MakeObject(context, new FileSystemProxy.IFileSystem(fileSystem)); return ResultCode.Success; } - [CommandHipc(12)] - // OpenBisStorage(u32 partitionId) -> object<nn::fssrv::sf::IStorage> bisStorage - public ResultCode OpenBisStorage(ServiceCtx context) - { - BisPartitionId bisPartitionId = (BisPartitionId)context.RequestData.ReadInt32(); - - Result result = _baseFileSystemProxy.Target.OpenBisStorage(out ReferenceCountedDisposable<IStorage> storage, bisPartitionId); - if (result.IsFailure()) return (ResultCode)result.Value; - - MakeObject(context, new FileSystemProxy.IStorage(storage)); - - return ResultCode.Success; - } - - [CommandHipc(13)] - // InvalidateBisCache() -> () - public ResultCode InvalidateBisCache(ServiceCtx context) - { - return (ResultCode)_baseFileSystemProxy.Target.InvalidateBisCache().Value; - } - [CommandHipc(18)] // OpenSdCardFileSystem() -> object<nn::fssrv::sf::IFileSystem> public ResultCode OpenSdCardFileSystem(ServiceCtx context) { - Result result = _baseFileSystemProxy.Target.OpenSdCardFileSystem(out var fileSystem); - if (result.IsFailure()) return (ResultCode)result.Value; + Result rc = _baseFileSystemProxy.OpenSdCardFileSystem(out LibHac.Fs.Fsa.IFileSystem fileSystem); + if (rc.IsFailure()) return (ResultCode)rc.Value; MakeObject(context, new FileSystemProxy.IFileSystem(fileSystem)); return ResultCode.Success; } - [CommandHipc(19)] - // FormatSdCardFileSystem() -> () - public ResultCode FormatSdCardFileSystem(ServiceCtx context) - { - return (ResultCode)_baseFileSystemProxy.Target.FormatSdCardFileSystem().Value; - } - [CommandHipc(21)] - // DeleteSaveDataFileSystem(u64 saveDataId) -> () public ResultCode DeleteSaveDataFileSystem(ServiceCtx context) { ulong saveDataId = context.RequestData.ReadUInt64(); - return (ResultCode)_baseFileSystemProxy.Target.DeleteSaveDataFileSystem(saveDataId).Value; + Result result = _baseFileSystemProxy.DeleteSaveDataFileSystem(saveDataId); + + return (ResultCode)result.Value; } [CommandHipc(22)] - // CreateSaveDataFileSystem(nn::fs::SaveDataAttribute attribute, nn::fs::SaveDataCreationInfo creationInfo, nn::fs::SaveDataMetaInfo metaInfo) -> () public ResultCode CreateSaveDataFileSystem(ServiceCtx context) { SaveDataAttribute attribute = context.RequestData.ReadStruct<SaveDataAttribute>(); SaveDataCreationInfo creationInfo = context.RequestData.ReadStruct<SaveDataCreationInfo>(); - SaveDataMetaInfo metaInfo = context.RequestData.ReadStruct<SaveDataMetaInfo>(); + SaveMetaCreateInfo metaCreateInfo = context.RequestData.ReadStruct<SaveMetaCreateInfo>(); + + // TODO: There's currently no program registry for FS to reference. + // Workaround that by setting the application ID and owner ID if they're not already set + if (attribute.ProgramId == ProgramId.InvalidId) + { + attribute.ProgramId = new ProgramId(context.Device.Application.TitleId); + } - return (ResultCode)_baseFileSystemProxy.Target.CreateSaveDataFileSystem(in attribute, in creationInfo, in metaInfo).Value; + Logger.Info?.Print(LogClass.ServiceFs, $"Creating save with title ID {attribute.ProgramId.Value:x16}"); + + Result result = _baseFileSystemProxy.CreateSaveDataFileSystem(ref attribute, ref creationInfo, ref metaCreateInfo); + + return (ResultCode)result.Value; } [CommandHipc(23)] - // CreateSaveDataFileSystemBySystemSaveDataId(nn::fs::SaveDataAttribute attribute, nn::fs::SaveDataCreationInfo creationInfo) -> () public ResultCode CreateSaveDataFileSystemBySystemSaveDataId(ServiceCtx context) { SaveDataAttribute attribute = context.RequestData.ReadStruct<SaveDataAttribute>(); SaveDataCreationInfo creationInfo = context.RequestData.ReadStruct<SaveDataCreationInfo>(); - return (ResultCode)_baseFileSystemProxy.Target.CreateSaveDataFileSystemBySystemSaveDataId(in attribute, in creationInfo).Value; - } + Result result = _baseFileSystemProxy.CreateSaveDataFileSystemBySystemSaveDataId(ref attribute, ref creationInfo); - [CommandHipc(24)] - // RegisterSaveDataFileSystemAtomicDeletion(buffer<u64, 5> saveDataIds) -> () - public ResultCode RegisterSaveDataFileSystemAtomicDeletion(ServiceCtx context) - { - byte[] saveIdBuffer = new byte[context.Request.SendBuff[0].Size]; - context.Memory.Read(context.Request.SendBuff[0].Position, saveIdBuffer); - - return (ResultCode)_baseFileSystemProxy.Target.RegisterSaveDataFileSystemAtomicDeletion(new InBuffer(saveIdBuffer)).Value; + return (ResultCode)result.Value; } [CommandHipc(25)] - // DeleteSaveDataFileSystemBySaveDataSpaceId(u8 spaceId, u64 saveDataId) -> () public ResultCode DeleteSaveDataFileSystemBySaveDataSpaceId(ServiceCtx context) { SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); ulong saveDataId = context.RequestData.ReadUInt64(); - return (ResultCode)_baseFileSystemProxy.Target.DeleteSaveDataFileSystemBySaveDataSpaceId(spaceId, saveDataId).Value; - } - - [CommandHipc(26)] - // FormatSdCardDryRun() -> () - public ResultCode FormatSdCardDryRun(ServiceCtx context) - { - return (ResultCode)_baseFileSystemProxy.Target.FormatSdCardDryRun().Value; - } - - [CommandHipc(27)] - // IsExFatSupported() -> (u8 isSupported) - public ResultCode IsExFatSupported(ServiceCtx context) - { - Result result = _baseFileSystemProxy.Target.IsExFatSupported(out bool isSupported); - if (result.IsFailure()) return (ResultCode)result.Value; - - context.ResponseData.Write(isSupported); + Result result = _baseFileSystemProxy.DeleteSaveDataFileSystemBySaveDataSpaceId(spaceId, saveDataId); - return ResultCode.Success; + return (ResultCode)result.Value; } [CommandHipc(28)] - // DeleteSaveDataFileSystemBySaveDataAttribute(u8 spaceId, nn::fs::SaveDataAttribute attribute) -> () public ResultCode DeleteSaveDataFileSystemBySaveDataAttribute(ServiceCtx context) { SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); SaveDataAttribute attribute = context.RequestData.ReadStruct<SaveDataAttribute>(); - return (ResultCode)_baseFileSystemProxy.Target.DeleteSaveDataFileSystemBySaveDataAttribute(spaceId, in attribute).Value; + Result result = _baseFileSystemProxy.DeleteSaveDataFileSystemBySaveDataAttribute(spaceId, ref attribute); + + return (ResultCode)result.Value; } [CommandHipc(30)] - // OpenGameCardStorage(u32 handle, u32 partitionId) -> object<nn::fssrv::sf::IStorage> + // OpenGameCardStorage(u32, u32) -> object<nn::fssrv::sf::IStorage> public ResultCode OpenGameCardStorage(ServiceCtx context) { GameCardHandle handle = new GameCardHandle(context.RequestData.ReadInt32()); GameCardPartitionRaw partitionId = (GameCardPartitionRaw)context.RequestData.ReadInt32(); - Result result = _baseFileSystemProxy.Target.OpenGameCardStorage(out ReferenceCountedDisposable<IStorage> storage, handle, partitionId); - if (result.IsFailure()) return (ResultCode)result.Value; - - MakeObject(context, new FileSystemProxy.IStorage(storage)); - - return ResultCode.Success; - } - - [CommandHipc(31)] - // OpenGameCardFileSystem(u32 handle, u32 partitionId) -> object<nn::fssrv::sf::IFileSystem> - public ResultCode OpenGameCardFileSystem(ServiceCtx context) - { - GameCardHandle handle = new GameCardHandle(context.RequestData.ReadInt32()); - GameCardPartition partitionId = (GameCardPartition)context.RequestData.ReadInt32(); - - Result result = _baseFileSystemProxy.Target.OpenGameCardFileSystem(out ReferenceCountedDisposable<IFileSystem> fileSystem, handle, partitionId); - if (result.IsFailure()) return (ResultCode)result.Value; - - MakeObject(context, new FileSystemProxy.IFileSystem(fileSystem)); - - return ResultCode.Success; - } - - [CommandHipc(32)] - // ExtendSaveDataFileSystem(u8 spaceId, u64 saveDataId, s64 dataSize, s64 journalSize) -> () - public ResultCode ExtendSaveDataFileSystem(ServiceCtx context) - { - SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); - ulong saveDataId = context.RequestData.ReadUInt64(); - long dataSize = context.RequestData.ReadInt64(); - long journalSize = context.RequestData.ReadInt64(); - - return (ResultCode)_baseFileSystemProxy.Target.ExtendSaveDataFileSystem(spaceId, saveDataId, dataSize, journalSize).Value; - } - - [CommandHipc(33)] - // DeleteCacheStorage(u16 index) -> () - public ResultCode DeleteCacheStorage(ServiceCtx context) - { - ushort index = context.RequestData.ReadUInt16(); - - return (ResultCode)_baseFileSystemProxy.Target.DeleteCacheStorage(index).Value; - } - - [CommandHipc(34)] - // GetCacheStorageSize(u16 index) -> (s64 dataSize, s64 journalSize) - public ResultCode GetCacheStorageSize(ServiceCtx context) - { - ushort index = context.RequestData.ReadUInt16(); - - Result result = _baseFileSystemProxy.Target.GetCacheStorageSize(out long dataSize, out long journalSize, index); - if (result.IsFailure()) return (ResultCode)result.Value; + Result result = _baseFileSystemProxy.OpenGameCardStorage(out LibHac.Fs.IStorage storage, handle, partitionId); - context.ResponseData.Write(dataSize); - context.ResponseData.Write(journalSize); + if (result.IsSuccess()) + { + MakeObject(context, new FileSystemProxy.IStorage(storage)); + } - return ResultCode.Success; + return (ResultCode)result.Value; } [CommandHipc(35)] - // CreateSaveDataFileSystemWithHashSalt(nn::fs::SaveDataAttribute attribute, nn::fs::SaveDataCreationInfo creationInfo, nn::fs::SaveDataMetaInfo metaInfo nn::fs::HashSalt hashSalt) -> () public ResultCode CreateSaveDataFileSystemWithHashSalt(ServiceCtx context) { SaveDataAttribute attribute = context.RequestData.ReadStruct<SaveDataAttribute>(); SaveDataCreationInfo creationInfo = context.RequestData.ReadStruct<SaveDataCreationInfo>(); - SaveDataMetaInfo metaCreateInfo = context.RequestData.ReadStruct<SaveDataMetaInfo>(); + SaveMetaCreateInfo metaCreateInfo = context.RequestData.ReadStruct<SaveMetaCreateInfo>(); HashSalt hashSalt = context.RequestData.ReadStruct<HashSalt>(); - return (ResultCode)_baseFileSystemProxy.Target.CreateSaveDataFileSystemWithHashSalt(in attribute, in creationInfo, in metaCreateInfo, in hashSalt).Value; + // TODO: There's currently no program registry for FS to reference. + // Workaround that by setting the application ID and owner ID if they're not already set + if (attribute.ProgramId == ProgramId.InvalidId) + { + attribute.ProgramId = new ProgramId(context.Device.Application.TitleId); + } + + Result result = _baseFileSystemProxy.CreateSaveDataFileSystemWithHashSalt(ref attribute, ref creationInfo, ref metaCreateInfo, ref hashSalt); + + return (ResultCode)result.Value; } [CommandHipc(51)] - // OpenSaveDataFileSystem(u8 spaceId, nn::fs::SaveDataAttribute attribute) -> object<nn::fssrv::sf::IFileSystem> saveDataFs + // OpenSaveDataFileSystem(u8 save_data_space_id, nn::fssrv::sf::SaveStruct saveStruct) -> object<nn::fssrv::sf::IFileSystem> saveDataFs public ResultCode OpenSaveDataFileSystem(ServiceCtx context) { SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); SaveDataAttribute attribute = context.RequestData.ReadStruct<SaveDataAttribute>(); - Result result = _baseFileSystemProxy.Target.OpenSaveDataFileSystem(out ReferenceCountedDisposable<IFileSystem> fileSystem, spaceId, in attribute); - if (result.IsFailure()) return (ResultCode)result.Value; + // TODO: There's currently no program registry for FS to reference. + // Workaround that by setting the application ID if it's not already set + if (attribute.ProgramId == ProgramId.InvalidId) + { + attribute.ProgramId = new ProgramId(context.Device.Application.TitleId); + } - MakeObject(context, new FileSystemProxy.IFileSystem(fileSystem)); + Result result = _baseFileSystemProxy.OpenSaveDataFileSystem(out LibHac.Fs.Fsa.IFileSystem fileSystem, spaceId, ref attribute); - return ResultCode.Success; + if (result.IsSuccess()) + { + MakeObject(context, new FileSystemProxy.IFileSystem(fileSystem)); + } + + return (ResultCode)result.Value; } [CommandHipc(52)] - // OpenSaveDataFileSystemBySystemSaveDataId(u8 spaceId, nn::fs::SaveDataAttribute attribute) -> object<nn::fssrv::sf::IFileSystem> systemSaveDataFs + // OpenSaveDataFileSystemBySystemSaveDataId(u8 save_data_space_id, nn::fssrv::sf::SaveStruct saveStruct) -> object<nn::fssrv::sf::IFileSystem> systemSaveDataFs public ResultCode OpenSaveDataFileSystemBySystemSaveDataId(ServiceCtx context) { SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); SaveDataAttribute attribute = context.RequestData.ReadStruct<SaveDataAttribute>(); - Result result = _baseFileSystemProxy.Target.OpenSaveDataFileSystemBySystemSaveDataId(out ReferenceCountedDisposable<IFileSystem> fileSystem, spaceId, in attribute); - if (result.IsFailure()) return (ResultCode)result.Value; + Result result = _baseFileSystemProxy.OpenSaveDataFileSystemBySystemSaveDataId(out LibHac.Fs.Fsa.IFileSystem fileSystem, spaceId, ref attribute); - MakeObject(context, new FileSystemProxy.IFileSystem(fileSystem)); + if (result.IsSuccess()) + { + MakeObject(context, new FileSystemProxy.IFileSystem(fileSystem)); + } - return ResultCode.Success; + return (ResultCode)result.Value; } [CommandHipc(53)] - // OpenReadOnlySaveDataFileSystem(u8 spaceId, nn::fs::SaveDataAttribute attribute) -> object<nn::fssrv::sf::IFileSystem> + // OpenReadOnlySaveDataFileSystem(u8 save_data_space_id, nn::fssrv::sf::SaveStruct save_struct) -> object<nn::fssrv::sf::IFileSystem> public ResultCode OpenReadOnlySaveDataFileSystem(ServiceCtx context) { SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); SaveDataAttribute attribute = context.RequestData.ReadStruct<SaveDataAttribute>(); - Result result = _baseFileSystemProxy.Target.OpenReadOnlySaveDataFileSystem(out ReferenceCountedDisposable<IFileSystem> fileSystem, spaceId, in attribute); - if (result.IsFailure()) return (ResultCode)result.Value; - - MakeObject(context, new FileSystemProxy.IFileSystem(fileSystem)); - - return ResultCode.Success; - } - - [CommandHipc(57)] - // ReadSaveDataFileSystemExtraDataBySaveDataSpaceId(u8 spaceId, u64 saveDataId) -> (buffer<nn::fs::SaveDataExtraData, 6> extraData) - public ResultCode ReadSaveDataFileSystemExtraDataBySaveDataSpaceId(ServiceCtx context) - { - SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); - ulong saveDataId = context.RequestData.ReadUInt64(); - - byte[] extraDataBuffer = new byte[context.Request.ReceiveBuff[0].Size]; - context.Memory.Read(context.Request.ReceiveBuff[0].Position, extraDataBuffer); - - Result result = _baseFileSystemProxy.Target.ReadSaveDataFileSystemExtraDataBySaveDataSpaceId(new OutBuffer(extraDataBuffer), spaceId, saveDataId); - if (result.IsFailure()) return (ResultCode)result.Value; - - context.Memory.Write(context.Request.ReceiveBuff[0].Position, extraDataBuffer); - - return ResultCode.Success; - } - - [CommandHipc(58)] - // ReadSaveDataFileSystemExtraData(u64 saveDataId) -> (buffer<nn::fs::SaveDataExtraData, 6> extraData) - public ResultCode ReadSaveDataFileSystemExtraData(ServiceCtx context) - { - ulong saveDataId = context.RequestData.ReadUInt64(); - - byte[] extraDataBuffer = new byte[context.Request.ReceiveBuff[0].Size]; - context.Memory.Read(context.Request.ReceiveBuff[0].Position, extraDataBuffer); - - Result result = _baseFileSystemProxy.Target.ReadSaveDataFileSystemExtraData(new OutBuffer(extraDataBuffer), saveDataId); - if (result.IsFailure()) return (ResultCode)result.Value; + // TODO: There's currently no program registry for FS to reference. + // Workaround that by setting the application ID if it's not already set + if (attribute.ProgramId == ProgramId.InvalidId) + { + attribute.ProgramId = new ProgramId(context.Device.Application.TitleId); + } - context.Memory.Write(context.Request.ReceiveBuff[0].Position, extraDataBuffer); + Result result = _baseFileSystemProxy.OpenReadOnlySaveDataFileSystem(out LibHac.Fs.Fsa.IFileSystem fileSystem, spaceId, ref attribute); - return ResultCode.Success; - } - - [CommandHipc(59)] - // WriteSaveDataFileSystemExtraData(u8 spaceId, u64 saveDataId, buffer<nn::fs::SaveDataExtraData, 5> extraData) -> () - public ResultCode WriteSaveDataFileSystemExtraData(ServiceCtx context) - { - SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); - ulong saveDataId = context.RequestData.ReadUInt64(); - - byte[] extraDataBuffer = new byte[context.Request.SendBuff[0].Size]; - context.Memory.Read(context.Request.SendBuff[0].Position, extraDataBuffer); + if (result.IsSuccess()) + { + MakeObject(context, new FileSystemProxy.IFileSystem(fileSystem)); + } - return (ResultCode)_baseFileSystemProxy.Target.WriteSaveDataFileSystemExtraData(saveDataId, spaceId, new InBuffer(extraDataBuffer)).Value; + return (ResultCode)result.Value; } [CommandHipc(60)] - // OpenSaveDataInfoReader() -> object<nn::fssrv::sf::ISaveDataInfoReader> public ResultCode OpenSaveDataInfoReader(ServiceCtx context) { - Result result = _baseFileSystemProxy.Target.OpenSaveDataInfoReader(out ReferenceCountedDisposable<LibHac.FsSrv.Sf.ISaveDataInfoReader> infoReader); - if (result.IsFailure()) return (ResultCode)result.Value; + Result result = _baseFileSystemProxy.OpenSaveDataInfoReader(out ReferenceCountedDisposable<LibHac.FsSrv.ISaveDataInfoReader> infoReader); - MakeObject(context, new ISaveDataInfoReader(infoReader)); + if (result.IsSuccess()) + { + MakeObject(context, new ISaveDataInfoReader(infoReader)); + } - return ResultCode.Success; + return (ResultCode)result.Value; } [CommandHipc(61)] - // OpenSaveDataInfoReaderBySaveDataSpaceId(u8 spaceId) -> object<nn::fssrv::sf::ISaveDataInfoReader> public ResultCode OpenSaveDataInfoReaderBySaveDataSpaceId(ServiceCtx context) { SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadByte(); - Result result = _baseFileSystemProxy.Target.OpenSaveDataInfoReaderBySaveDataSpaceId(out ReferenceCountedDisposable<LibHac.FsSrv.Sf.ISaveDataInfoReader> infoReader, spaceId); - if (result.IsFailure()) return (ResultCode)result.Value; + Result result = _baseFileSystemProxy.OpenSaveDataInfoReaderBySaveDataSpaceId(out ReferenceCountedDisposable<LibHac.FsSrv.ISaveDataInfoReader> infoReader, spaceId); - MakeObject(context, new ISaveDataInfoReader(infoReader)); + if (result.IsSuccess()) + { + MakeObject(context, new ISaveDataInfoReader(infoReader)); + } - return ResultCode.Success; + return (ResultCode)result.Value; } [CommandHipc(62)] - // OpenSaveDataInfoReaderOnlyCacheStorage() -> object<nn::fssrv::sf::ISaveDataInfoReader> public ResultCode OpenSaveDataInfoReaderOnlyCacheStorage(ServiceCtx context) { - Result result = _baseFileSystemProxy.Target.OpenSaveDataInfoReaderOnlyCacheStorage(out ReferenceCountedDisposable<LibHac.FsSrv.Sf.ISaveDataInfoReader> infoReader); - if (result.IsFailure()) return (ResultCode)result.Value; - - MakeObject(context, new ISaveDataInfoReader(infoReader)); - - return ResultCode.Success; - } - - [CommandHipc(64)] - // OpenSaveDataInternalStorageFileSystem(u8 spaceId, u64 saveDataId) -> object<nn::fssrv::sf::ISaveDataInfoReader> - public ResultCode OpenSaveDataInternalStorageFileSystem(ServiceCtx context) - { - SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); - ulong saveDataId = context.RequestData.ReadUInt64(); - - Result result = _baseFileSystemProxy.Target.OpenSaveDataInternalStorageFileSystem(out ReferenceCountedDisposable<IFileSystem> fileSystem, spaceId, saveDataId); - if (result.IsFailure()) return (ResultCode)result.Value; - - MakeObject(context, new FileSystemProxy.IFileSystem(fileSystem)); - - return ResultCode.Success; - } - - [CommandHipc(65)] - // UpdateSaveDataMacForDebug(u8 spaceId, u64 saveDataId) -> () - public ResultCode UpdateSaveDataMacForDebug(ServiceCtx context) - { - SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); - ulong saveDataId = context.RequestData.ReadUInt64(); - - return (ResultCode)_baseFileSystemProxy.Target.UpdateSaveDataMacForDebug(spaceId, saveDataId).Value; - } - - [CommandHipc(66)] - public ResultCode WriteSaveDataFileSystemExtraDataWithMask(ServiceCtx context) - { - SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); - ulong saveDataId = context.RequestData.ReadUInt64(); + SaveDataFilter filter = new SaveDataFilter(); + filter.SetSaveDataType(SaveDataType.Cache); + filter.SetProgramId(new ProgramId(context.Process.TitleId)); - byte[] extraDataBuffer = new byte[context.Request.SendBuff[0].Size]; - context.Memory.Read(context.Request.SendBuff[0].Position, extraDataBuffer); + // FS would query the User and SdCache space IDs to find where the existing cache is (if any). + // We always have the SD card inserted, so we can always use SdCache for now. + Result result = _baseFileSystemProxy.OpenSaveDataInfoReaderBySaveDataSpaceId( + out ReferenceCountedDisposable<LibHac.FsSrv.ISaveDataInfoReader> infoReader, SaveDataSpaceId.SdCache); - byte[] maskBuffer = new byte[context.Request.SendBuff[1].Size]; - context.Memory.Read(context.Request.SendBuff[1].Position, maskBuffer); + if (result.IsSuccess()) + { + MakeObject(context, new ISaveDataInfoReader(infoReader)); + } - return (ResultCode)_baseFileSystemProxy.Target.WriteSaveDataFileSystemExtraDataWithMask(saveDataId, spaceId, new InBuffer(extraDataBuffer), new InBuffer(maskBuffer)).Value; + return (ResultCode)result.Value; } [CommandHipc(67)] @@ -490,13 +342,12 @@ namespace Ryujinx.HLE.HOS.Services.Fs byte[] infoBuffer = new byte[bufferLen]; - Result result = _baseFileSystemProxy.Target.FindSaveDataWithFilter(out long count, new OutBuffer(infoBuffer), spaceId, in filter); - if (result.IsFailure()) return (ResultCode)result.Value; + Result result = _baseFileSystemProxy.FindSaveDataWithFilter(out long count, infoBuffer, spaceId, ref filter); context.Memory.Write(bufferPosition, infoBuffer); context.ResponseData.Write(count); - return ResultCode.Success; + return (ResultCode)result.Value; } [CommandHipc(68)] @@ -505,160 +356,23 @@ namespace Ryujinx.HLE.HOS.Services.Fs SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); SaveDataFilter filter = context.RequestData.ReadStruct<SaveDataFilter>(); - Result result = _baseFileSystemProxy.Target.OpenSaveDataInfoReaderWithFilter(out ReferenceCountedDisposable<LibHac.FsSrv.Sf.ISaveDataInfoReader> infoReader, spaceId, in filter); - if (result.IsFailure()) return (ResultCode)result.Value; - - MakeObject(context, new ISaveDataInfoReader(infoReader)); - - return ResultCode.Success; - } - - [CommandHipc(69)] - public ResultCode ReadSaveDataFileSystemExtraDataBySaveDataAttribute(ServiceCtx context) - { - SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); - SaveDataAttribute attribute = context.RequestData.ReadStruct<SaveDataAttribute>(); - - byte[] outputBuffer = new byte[context.Request.ReceiveBuff[0].Size]; - context.Memory.Read(context.Request.ReceiveBuff[0].Position, outputBuffer); + Result result = _baseFileSystemProxy.OpenSaveDataInfoReaderWithFilter( + out ReferenceCountedDisposable<LibHac.FsSrv.ISaveDataInfoReader> infoReader, spaceId, ref filter); - Result result = _baseFileSystemProxy.Target.ReadSaveDataFileSystemExtraDataBySaveDataAttribute(new OutBuffer(outputBuffer), spaceId, in attribute); - if (result.IsFailure()) return (ResultCode)result.Value; - - context.Memory.Write(context.Request.ReceiveBuff[0].Position, outputBuffer); - - return ResultCode.Success; - } - - [CommandHipc(70)] - public ResultCode WriteSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute(ServiceCtx context) - { - SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); - SaveDataAttribute attribute = context.RequestData.ReadStruct<SaveDataAttribute>(); - - byte[] extraDataBuffer = new byte[context.Request.SendBuff[0].Size]; - context.Memory.Read(context.Request.SendBuff[0].Position, extraDataBuffer); - - byte[] maskBuffer = new byte[context.Request.SendBuff[1].Size]; - context.Memory.Read(context.Request.SendBuff[1].Position, maskBuffer); + if (result.IsSuccess()) + { + MakeObject(context, new ISaveDataInfoReader(infoReader)); + } - return (ResultCode)_baseFileSystemProxy.Target.WriteSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute(in attribute, spaceId, new InBuffer(extraDataBuffer), new InBuffer(maskBuffer)).Value; + return (ResultCode)result.Value; } [CommandHipc(71)] public ResultCode ReadSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute(ServiceCtx context) { - SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); - SaveDataAttribute attribute = context.RequestData.ReadStruct<SaveDataAttribute>(); - - byte[] maskBuffer = new byte[context.Request.SendBuff[0].Size]; - context.Memory.Read(context.Request.SendBuff[0].Position, maskBuffer); - - byte[] outputBuffer = new byte[context.Request.ReceiveBuff[0].Size]; - context.Memory.Read(context.Request.ReceiveBuff[0].Position, outputBuffer); - - Result result = _baseFileSystemProxy.Target.ReadSaveDataFileSystemExtraDataWithMaskBySaveDataAttribute(new OutBuffer(outputBuffer), spaceId, in attribute, new InBuffer(maskBuffer)); - if (result.IsFailure()) return (ResultCode)result.Value; - - context.Memory.Write(context.Request.ReceiveBuff[0].Position, outputBuffer); - - return ResultCode.Success; - } - - [CommandHipc(80)] - public ResultCode OpenSaveDataMetaFile(ServiceCtx context) - { - SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt32(); - SaveDataMetaType metaType = (SaveDataMetaType)context.RequestData.ReadInt32(); - SaveDataAttribute attribute = context.RequestData.ReadStruct<SaveDataAttribute>(); - - Result result = _baseFileSystemProxy.Target.OpenSaveDataMetaFile(out ReferenceCountedDisposable<LibHac.FsSrv.Sf.IFile> file, spaceId, in attribute, metaType); - if (result.IsFailure()) return (ResultCode)result.Value; - - MakeObject(context, new IFile(file)); - - return ResultCode.Success; - } - - [CommandHipc(84)] - public ResultCode ListAccessibleSaveDataOwnerId(ServiceCtx context) - { - int startIndex = context.RequestData.ReadInt32(); - int bufferCount = context.RequestData.ReadInt32(); - ProgramId programId = context.RequestData.ReadStruct<ProgramId>(); - - byte[] outputBuffer = new byte[context.Request.ReceiveBuff[0].Size]; - context.Memory.Read(context.Request.ReceiveBuff[0].Position, outputBuffer); - - Result result = _baseFileSystemProxy.Target.ListAccessibleSaveDataOwnerId(out int readCount, new OutBuffer(outputBuffer), programId, startIndex, bufferCount); - if (result.IsFailure()) return (ResultCode)result.Value; - - context.ResponseData.Write(readCount); - - return ResultCode.Success; - } - - [CommandHipc(100)] - public ResultCode OpenImageDirectoryFileSystem(ServiceCtx context) - { - ImageDirectoryId directoryId = (ImageDirectoryId)context.RequestData.ReadInt32(); - - Result result = _baseFileSystemProxy.Target.OpenImageDirectoryFileSystem(out ReferenceCountedDisposable<IFileSystem> fileSystem, directoryId); - if (result.IsFailure()) return (ResultCode)result.Value; - - MakeObject(context, new FileSystemProxy.IFileSystem(fileSystem)); - - return ResultCode.Success; - } - - [CommandHipc(101)] - public ResultCode OpenBaseFileSystem(ServiceCtx context) - { - BaseFileSystemId fileSystemId = (BaseFileSystemId)context.RequestData.ReadInt32(); - - Result result = _baseFileSystemProxy.Target.OpenBaseFileSystem(out ReferenceCountedDisposable<IFileSystem> fileSystem, fileSystemId); - if (result.IsFailure()) return (ResultCode)result.Value; - - MakeObject(context, new FileSystemProxy.IFileSystem(fileSystem)); - - return ResultCode.Success; - } - - [CommandHipc(110)] - public ResultCode OpenContentStorageFileSystem(ServiceCtx context) - { - ContentStorageId contentStorageId = (ContentStorageId)context.RequestData.ReadInt32(); - - Result result = _baseFileSystemProxy.Target.OpenContentStorageFileSystem(out ReferenceCountedDisposable<IFileSystem> fileSystem, contentStorageId); - if (result.IsFailure()) return (ResultCode)result.Value; - - MakeObject(context, new FileSystemProxy.IFileSystem(fileSystem)); - - return ResultCode.Success; - } - - [CommandHipc(120)] - public ResultCode OpenCloudBackupWorkStorageFileSystem(ServiceCtx context) - { - CloudBackupWorkStorageId storageId = (CloudBackupWorkStorageId)context.RequestData.ReadInt32(); - - Result result = _baseFileSystemProxy.Target.OpenCloudBackupWorkStorageFileSystem(out ReferenceCountedDisposable<IFileSystem> fileSystem, storageId); - if (result.IsFailure()) return (ResultCode)result.Value; - - MakeObject(context, new FileSystemProxy.IFileSystem(fileSystem)); - - return ResultCode.Success; - } - - [CommandHipc(130)] - public ResultCode OpenCustomStorageFileSystem(ServiceCtx context) - { - CustomStorageId customStorageId = (CustomStorageId)context.RequestData.ReadInt32(); + Logger.Stub?.PrintStub(LogClass.ServiceFs); - Result result = _baseFileSystemProxy.Target.OpenCustomStorageFileSystem(out ReferenceCountedDisposable<IFileSystem> fileSystem, customStorageId); - if (result.IsFailure()) return (ResultCode)result.Value; - - MakeObject(context, new FileSystemProxy.IFileSystem(fileSystem)); + MemoryHelper.FillWithZeros(context.Memory, context.Request.ReceiveBuff[0].Position, (int)context.Request.ReceiveBuff[0].Size); return ResultCode.Success; } @@ -667,17 +381,13 @@ namespace Ryujinx.HLE.HOS.Services.Fs // OpenDataStorageByCurrentProcess() -> object<nn::fssrv::sf::IStorage> dataStorage public ResultCode OpenDataStorageByCurrentProcess(ServiceCtx context) { - var storage = context.Device.FileSystem.RomFs.AsStorage(true); - var sharedStorage = new ReferenceCountedDisposable<LibHac.Fs.IStorage>(storage); - ReferenceCountedDisposable<IStorage> sfStorage = StorageInterfaceAdapter.CreateShared(ref sharedStorage); - - MakeObject(context, new FileSystemProxy.IStorage(sfStorage)); + MakeObject(context, new FileSystemProxy.IStorage(context.Device.FileSystem.RomFs.AsStorage())); - return ResultCode.Success; + return 0; } [CommandHipc(202)] - // OpenDataStorageByDataId(u8 storageId, nn::ncm::DataId dataId) -> object<nn::fssrv::sf::IStorage> dataStorage + // OpenDataStorageByDataId(u8 storageId, nn::ApplicationId tid) -> object<nn::fssrv::sf::IStorage> dataStorage public ResultCode OpenDataStorageByDataId(ServiceCtx context) { StorageId storageId = (StorageId)context.RequestData.ReadByte(); @@ -686,15 +396,11 @@ namespace Ryujinx.HLE.HOS.Services.Fs // We do a mitm here to find if the request is for an AOC. // This is because AOC can be distributed over multiple containers in the emulator. - if (context.Device.System.ContentManager.GetAocDataStorage(titleId, out LibHac.Fs.IStorage aocStorage, context.Device.Configuration.FsIntegrityCheckLevel)) + if (context.Device.System.ContentManager.GetAocDataStorage((ulong)titleId, out LibHac.Fs.IStorage aocStorage, context.Device.Configuration.FsIntegrityCheckLevel)) { Logger.Info?.Print(LogClass.Loader, $"Opened AddOnContent Data TitleID={titleId:X16}"); - var storage = context.Device.FileSystem.ModLoader.ApplyRomFsMods(titleId, aocStorage); - var sharedStorage = new ReferenceCountedDisposable<LibHac.Fs.IStorage>(storage); - ReferenceCountedDisposable<IStorage> sfStorage = StorageInterfaceAdapter.CreateShared(ref sharedStorage); - - MakeObject(context, new FileSystemProxy.IStorage(sfStorage)); + MakeObject(context, new FileSystemProxy.IStorage(context.Device.FileSystem.ModLoader.ApplyRomFsMods((ulong)titleId, aocStorage))); return ResultCode.Success; } @@ -726,10 +432,8 @@ namespace Ryujinx.HLE.HOS.Services.Fs LibHac.Fs.IStorage ncaStorage = new LocalStorage(ncaPath, FileAccess.Read, FileMode.Open); Nca nca = new Nca(context.Device.System.KeySet, ncaStorage); LibHac.Fs.IStorage romfsStorage = nca.OpenStorage(NcaSectionType.Data, context.Device.System.FsIntegrityCheckLevel); - var sharedStorage = new ReferenceCountedDisposable<LibHac.Fs.IStorage>(romfsStorage); - ReferenceCountedDisposable<IStorage> sfStorage = StorageInterfaceAdapter.CreateShared(ref sharedStorage); - MakeObject(context, new FileSystemProxy.IStorage(sfStorage)); + MakeObject(context, new FileSystemProxy.IStorage(romfsStorage)); } catch (HorizonResultException ex) { @@ -756,11 +460,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs // OpenPatchDataStorageByCurrentProcess() -> object<nn::fssrv::sf::IStorage> public ResultCode OpenPatchDataStorageByCurrentProcess(ServiceCtx context) { - var storage = context.Device.FileSystem.RomFs.AsStorage(true); - var sharedStorage = new ReferenceCountedDisposable<LibHac.Fs.IStorage>(storage); - ReferenceCountedDisposable<IStorage> sfStorage = StorageInterfaceAdapter.CreateShared(ref sharedStorage); - - MakeObject(context, new FileSystemProxy.IStorage(sfStorage)); + MakeObject(context, new FileSystemProxy.IStorage(context.Device.FileSystem.RomFs.AsStorage())); return ResultCode.Success; } @@ -769,325 +469,43 @@ namespace Ryujinx.HLE.HOS.Services.Fs // OpenDataStorageByCurrentProcess() -> object<nn::fssrv::sf::IStorage> dataStorage public ResultCode OpenDeviceOperator(ServiceCtx context) { - Result result = _baseFileSystemProxy.Target.OpenDeviceOperator(out ReferenceCountedDisposable<LibHac.FsSrv.Sf.IDeviceOperator> deviceOperator); - if (result.IsFailure()) return (ResultCode)result.Value; - - MakeObject(context, new IDeviceOperator(deviceOperator)); - - return ResultCode.Success; - } - - [CommandHipc(601)] - public ResultCode QuerySaveDataTotalSize(ServiceCtx context) - { - long dataSize = context.RequestData.ReadInt64(); - long journalSize = context.RequestData.ReadInt64(); - - Result result = _baseFileSystemProxy.Target.QuerySaveDataTotalSize(out long totalSize, dataSize, journalSize); - if (result.IsFailure()) return (ResultCode)result.Value; - - context.ResponseData.Write(totalSize); - - return ResultCode.Success; - } - - [CommandHipc(511)] - public ResultCode NotifySystemDataUpdateEvent(ServiceCtx context) - { - return (ResultCode)_baseFileSystemProxy.Target.NotifySystemDataUpdateEvent().Value; - } - - [CommandHipc(523)] - public ResultCode SimulateDeviceDetectionEvent(ServiceCtx context) - { - bool signalEvent = context.RequestData.ReadBoolean(); - context.RequestData.BaseStream.Seek(3, SeekOrigin.Current); - SdmmcPort port = context.RequestData.ReadStruct<SdmmcPort>(); - SimulatingDeviceDetectionMode mode = context.RequestData.ReadStruct<SimulatingDeviceDetectionMode>(); - - return (ResultCode)_baseFileSystemProxy.Target.SimulateDeviceDetectionEvent(port, mode, signalEvent).Value; - } - - [CommandHipc(602)] - public ResultCode VerifySaveDataFileSystem(ServiceCtx context) - { - ulong saveDataId = context.RequestData.ReadUInt64(); - - byte[] readBuffer = new byte[context.Request.ReceiveBuff[0].Size]; - context.Memory.Read(context.Request.ReceiveBuff[0].Position, readBuffer); - - return (ResultCode)_baseFileSystemProxy.Target.VerifySaveDataFileSystem(saveDataId, new OutBuffer(readBuffer)).Value; - } - - [CommandHipc(603)] - public ResultCode CorruptSaveDataFileSystem(ServiceCtx context) - { - ulong saveDataId = context.RequestData.ReadUInt64(); - - return (ResultCode)_baseFileSystemProxy.Target.CorruptSaveDataFileSystem(saveDataId).Value; - } - - [CommandHipc(604)] - public ResultCode CreatePaddingFile(ServiceCtx context) - { - long size = context.RequestData.ReadInt64(); - - return (ResultCode)_baseFileSystemProxy.Target.CreatePaddingFile(size).Value; - } - - [CommandHipc(605)] - public ResultCode DeleteAllPaddingFiles(ServiceCtx context) - { - return (ResultCode)_baseFileSystemProxy.Target.DeleteAllPaddingFiles().Value; - } - - [CommandHipc(606)] - public ResultCode GetRightsId(ServiceCtx context) - { - LibHac.Ncm.StorageId storageId = (LibHac.Ncm.StorageId)context.RequestData.ReadInt64(); - ProgramId programId = context.RequestData.ReadStruct<ProgramId>(); - - Result result = _baseFileSystemProxy.Target.GetRightsId(out RightsId rightsId, programId, storageId); - if (result.IsFailure()) return (ResultCode)result.Value; - - context.ResponseData.WriteStruct(rightsId); - - return ResultCode.Success; - } - - [CommandHipc(607)] - public ResultCode RegisterExternalKey(ServiceCtx context) - { - RightsId rightsId = context.RequestData.ReadStruct<RightsId>(); - AccessKey accessKey = context.RequestData.ReadStruct<AccessKey>(); - - return (ResultCode)_baseFileSystemProxy.Target.RegisterExternalKey(in rightsId, in accessKey).Value; - } - - [CommandHipc(608)] - public ResultCode UnregisterAllExternalKey(ServiceCtx context) - { - return (ResultCode)_baseFileSystemProxy.Target.UnregisterAllExternalKey().Value; - } - - [CommandHipc(609)] - public ResultCode GetRightsIdByPath(ServiceCtx context) - { - ref readonly var path = ref FileSystemProxyHelper.GetFspPath(context); - - Result result = _baseFileSystemProxy.Target.GetRightsIdByPath(out RightsId rightsId, in path); - if (result.IsFailure()) return (ResultCode)result.Value; - - context.ResponseData.WriteStruct(rightsId); - - return ResultCode.Success; - } - - [CommandHipc(610)] - public ResultCode GetRightsIdAndKeyGenerationByPath(ServiceCtx context) - { - ref readonly var path = ref FileSystemProxyHelper.GetFspPath(context); - - Result result = _baseFileSystemProxy.Target.GetRightsIdAndKeyGenerationByPath(out RightsId rightsId, out byte keyGeneration, in path); - if (result.IsFailure()) return (ResultCode)result.Value; - - context.ResponseData.Write(keyGeneration); - context.ResponseData.BaseStream.Seek(7, SeekOrigin.Current); - context.ResponseData.WriteStruct(rightsId); - - return ResultCode.Success; - } - - [CommandHipc(611)] - public ResultCode SetCurrentPosixTimeWithTimeDifference(ServiceCtx context) - { - int timeDifference = context.RequestData.ReadInt32(); - context.RequestData.BaseStream.Seek(4, SeekOrigin.Current); - long time = context.RequestData.ReadInt64(); - - return (ResultCode)_baseFileSystemProxy.Target.SetCurrentPosixTimeWithTimeDifference(time, timeDifference).Value; - } - - [CommandHipc(612)] - public ResultCode GetFreeSpaceSizeForSaveData(ServiceCtx context) - { - SaveDataSpaceId spaceId = context.RequestData.ReadStruct<SaveDataSpaceId>(); - - Result result = _baseFileSystemProxy.Target.GetFreeSpaceSizeForSaveData(out long freeSpaceSize, spaceId); - if (result.IsFailure()) return (ResultCode)result.Value; - - context.ResponseData.Write(freeSpaceSize); - - return ResultCode.Success; - } - - [CommandHipc(613)] - public ResultCode VerifySaveDataFileSystemBySaveDataSpaceId(ServiceCtx context) - { - SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); - ulong saveDataId = context.RequestData.ReadUInt64(); - - byte[] readBuffer = new byte[context.Request.ReceiveBuff[0].Size]; - context.Memory.Read(context.Request.ReceiveBuff[0].Position, readBuffer); - - return (ResultCode)_baseFileSystemProxy.Target.VerifySaveDataFileSystemBySaveDataSpaceId(spaceId, saveDataId, new OutBuffer(readBuffer)).Value; - } - - [CommandHipc(614)] - public ResultCode CorruptSaveDataFileSystemBySaveDataSpaceId(ServiceCtx context) - { - SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); - ulong saveDataId = context.RequestData.ReadUInt64(); - - return (ResultCode)_baseFileSystemProxy.Target.CorruptSaveDataFileSystemBySaveDataSpaceId(spaceId, saveDataId).Value; - } - - [CommandHipc(615)] - public ResultCode QuerySaveDataInternalStorageTotalSize(ServiceCtx context) - { - SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); - ulong saveDataId = context.RequestData.ReadUInt64(); - - Result result = _baseFileSystemProxy.Target.QuerySaveDataInternalStorageTotalSize(out long size, spaceId, saveDataId); - if (result.IsFailure()) return (ResultCode)result.Value; - - context.ResponseData.Write(size); - - return ResultCode.Success; - } - - [CommandHipc(616)] - public ResultCode GetSaveDataCommitId(ServiceCtx context) - { - SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); - ulong saveDataId = context.RequestData.ReadUInt64(); - - Result result = _baseFileSystemProxy.Target.GetSaveDataCommitId(out long commitId, spaceId, saveDataId); - if (result.IsFailure()) return (ResultCode)result.Value; - - context.ResponseData.Write(commitId); - - return ResultCode.Success; - } - - [CommandHipc(617)] - public ResultCode UnregisterExternalKey(ServiceCtx context) - { - RightsId rightsId = context.RequestData.ReadStruct<RightsId>(); + Result result = _baseFileSystemProxy.OpenDeviceOperator(out LibHac.FsSrv.IDeviceOperator deviceOperator); - return (ResultCode)_baseFileSystemProxy.Target.UnregisterExternalKey(in rightsId).Value; - } - - [CommandHipc(620)] - public ResultCode SetSdCardEncryptionSeed(ServiceCtx context) - { - EncryptionSeed encryptionSeed = context.RequestData.ReadStruct<EncryptionSeed>(); + if (result.IsSuccess()) + { + MakeObject(context, new IDeviceOperator(deviceOperator)); + } - return (ResultCode)_baseFileSystemProxy.Target.SetSdCardEncryptionSeed(in encryptionSeed).Value; + return (ResultCode)result.Value; } [CommandHipc(630)] - // SetSdCardAccessibility(u8 isAccessible) + // SetSdCardAccessibility(u8) public ResultCode SetSdCardAccessibility(ServiceCtx context) { bool isAccessible = context.RequestData.ReadBoolean(); - return (ResultCode)_baseFileSystemProxy.Target.SetSdCardAccessibility(isAccessible).Value; + return (ResultCode)_baseFileSystemProxy.SetSdCardAccessibility(isAccessible).Value; } [CommandHipc(631)] - // IsSdCardAccessible() -> u8 isAccessible + // IsSdCardAccessible() -> u8 public ResultCode IsSdCardAccessible(ServiceCtx context) { - Result result = _baseFileSystemProxy.Target.IsSdCardAccessible(out bool isAccessible); - if (result.IsFailure()) return (ResultCode)result.Value; + Result result = _baseFileSystemProxy.IsSdCardAccessible(out bool isAccessible); context.ResponseData.Write(isAccessible); - return ResultCode.Success; - } - - [CommandHipc(702)] - public ResultCode IsAccessFailureDetected(ServiceCtx context) - { - ulong processId = context.RequestData.ReadUInt64(); - - Result result = _baseFileSystemProxy.Target.IsAccessFailureDetected(out bool isDetected, processId); - if (result.IsFailure()) return (ResultCode)result.Value; - - context.ResponseData.Write(isDetected); - - return ResultCode.Success; - } - - [CommandHipc(710)] - public ResultCode ResolveAccessFailure(ServiceCtx context) - { - ulong processId = context.RequestData.ReadUInt64(); - - return (ResultCode)_baseFileSystemProxy.Target.ResolveAccessFailure(processId).Value; - } - - [CommandHipc(720)] - public ResultCode AbandonAccessFailure(ServiceCtx context) - { - ulong processId = context.RequestData.ReadUInt64(); - - return (ResultCode)_baseFileSystemProxy.Target.AbandonAccessFailure(processId).Value; - } - - [CommandHipc(800)] - public ResultCode GetAndClearErrorInfo(ServiceCtx context) - { - Result result = _baseFileSystemProxy.Target.GetAndClearErrorInfo(out FileSystemProxyErrorInfo errorInfo); - if (result.IsFailure()) return (ResultCode)result.Value; - - context.ResponseData.WriteStruct(errorInfo); - - return ResultCode.Success; - } - - [CommandHipc(810)] - public ResultCode RegisterProgramIndexMapInfo(ServiceCtx context) - { - int programCount = context.RequestData.ReadInt32(); - - byte[] mapInfoBuffer = new byte[context.Request.SendBuff[0].Size]; - context.Memory.Read(context.Request.SendBuff[0].Position, mapInfoBuffer); - - return (ResultCode)_baseFileSystemProxy.Target.RegisterProgramIndexMapInfo(new InBuffer(mapInfoBuffer), programCount).Value; - } - - [CommandHipc(1000)] - public ResultCode SetBisRootForHost(ServiceCtx context) - { - BisPartitionId partitionId = (BisPartitionId)context.RequestData.ReadInt32(); - ref readonly var path = ref FileSystemProxyHelper.GetFspPath(context); - - return (ResultCode)_baseFileSystemProxy.Target.SetBisRootForHost(partitionId, in path).Value; - } - - [CommandHipc(1001)] - public ResultCode SetSaveDataSize(ServiceCtx context) - { - long dataSize = context.RequestData.ReadInt64(); - long journalSize = context.RequestData.ReadInt64(); - - return (ResultCode)_baseFileSystemProxy.Target.SetSaveDataSize(dataSize, journalSize).Value; - } - - [CommandHipc(1002)] - public ResultCode SetSaveDataRootPath(ServiceCtx context) - { - ref readonly var path = ref FileSystemProxyHelper.GetFspPath(context); - - return (ResultCode)_baseFileSystemProxy.Target.SetSaveDataRootPath(in path).Value; + return (ResultCode)result.Value; } [CommandHipc(1003)] + // DisableAutoSaveDataCreation() public ResultCode DisableAutoSaveDataCreation(ServiceCtx context) { - return (ResultCode)_baseFileSystemProxy.Target.DisableAutoSaveDataCreation().Value; + // NOTE: This call does nothing in original service. + + return ResultCode.Success; } [CommandHipc(1004)] @@ -1124,39 +542,11 @@ namespace Ryujinx.HLE.HOS.Services.Fs return ResultCode.Success; } - [CommandHipc(1007)] - public ResultCode RegisterUpdatePartition(ServiceCtx context) - { - return (ResultCode)_baseFileSystemProxy.Target.RegisterUpdatePartition().Value; - } - - [CommandHipc(1008)] - public ResultCode OpenRegisteredUpdatePartition(ServiceCtx context) - { - Result result = _baseFileSystemProxy.Target.OpenRegisteredUpdatePartition(out ReferenceCountedDisposable<IFileSystem> fileSystem); - if (result.IsFailure()) return (ResultCode)result.Value; - - MakeObject(context, new FileSystemProxy.IFileSystem(fileSystem)); - - return ResultCode.Success; - } - - [CommandHipc(1009)] - public ResultCode GetAndClearMemoryReportInfo(ServiceCtx context) - { - Result result = _baseFileSystemProxy.Target.GetAndClearMemoryReportInfo(out MemoryReportInfo reportInfo); - if (result.IsFailure()) return (ResultCode)result.Value; - - context.ResponseData.WriteStruct(reportInfo); - - return ResultCode.Success; - } - [CommandHipc(1011)] public ResultCode GetProgramIndexForAccessLog(ServiceCtx context) { - Result result = _baseFileSystemProxy.Target.GetProgramIndexForAccessLog(out int programIndex, out int programCount); - if (result.IsFailure()) return (ResultCode)result.Value; + int programIndex = 0; + int programCount = 1; context.ResponseData.Write(programIndex); context.ResponseData.Write(programCount); @@ -1164,82 +554,18 @@ namespace Ryujinx.HLE.HOS.Services.Fs return ResultCode.Success; } - [CommandHipc(1012)] - public ResultCode GetFsStackUsage(ServiceCtx context) - { - FsStackUsageThreadType threadType = context.RequestData.ReadStruct<FsStackUsageThreadType>(); - - Result result = _baseFileSystemProxy.Target.GetFsStackUsage(out uint usage, threadType); - if (result.IsFailure()) return (ResultCode)result.Value; - - context.ResponseData.Write(usage); - - return ResultCode.Success; - } - - [CommandHipc(1013)] - public ResultCode UnsetSaveDataRootPath(ServiceCtx context) - { - return (ResultCode)_baseFileSystemProxy.Target.UnsetSaveDataRootPath().Value; - } - - [CommandHipc(1014)] - public ResultCode OutputMultiProgramTagAccessLog(ServiceCtx context) - { - return (ResultCode)_baseFileSystemProxy.Target.OutputMultiProgramTagAccessLog().Value; - } - - [CommandHipc(1016)] - public ResultCode FlushAccessLogOnSdCard(ServiceCtx context) - { - return (ResultCode)_baseFileSystemProxy.Target.FlushAccessLogOnSdCard().Value; - } - - [CommandHipc(1017)] - public ResultCode OutputApplicationInfoAccessLog(ServiceCtx context) - { - ApplicationInfo info = context.RequestData.ReadStruct<ApplicationInfo>(); - - return (ResultCode)_baseFileSystemProxy.Target.OutputApplicationInfoAccessLog(in info).Value; - } - - [CommandHipc(1100)] - public ResultCode OverrideSaveDataTransferTokenSignVerificationKey(ServiceCtx context) - { - byte[] keyBuffer = new byte[context.Request.SendBuff[0].Size]; - context.Memory.Read(context.Request.SendBuff[0].Position, keyBuffer); - - return (ResultCode)_baseFileSystemProxy.Target.OverrideSaveDataTransferTokenSignVerificationKey(new InBuffer(keyBuffer)).Value; - } - - [CommandHipc(1110)] - public ResultCode CorruptSaveDataFileSystemByOffset(ServiceCtx context) - { - SaveDataSpaceId spaceId = (SaveDataSpaceId)context.RequestData.ReadInt64(); - ulong saveDataId = context.RequestData.ReadUInt64(); - long offset = context.RequestData.ReadInt64(); - - return (ResultCode)_baseFileSystemProxy.Target.CorruptSaveDataFileSystemByOffset(spaceId, saveDataId, offset).Value; - } - [CommandHipc(1200)] // 6.0.0+ // OpenMultiCommitManager() -> object<nn::fssrv::sf::IMultiCommitManager> public ResultCode OpenMultiCommitManager(ServiceCtx context) { - Result result = _baseFileSystemProxy.Target.OpenMultiCommitManager(out ReferenceCountedDisposable<LibHac.FsSrv.Sf.IMultiCommitManager> commitManager); - if (result.IsFailure()) return (ResultCode)result.Value; + Result result = _baseFileSystemProxy.OpenMultiCommitManager(out LibHac.FsSrv.IMultiCommitManager commitManager); - MakeObject(context, new IMultiCommitManager(commitManager)); - - return ResultCode.Success; - } - - protected override void Dispose(bool isDisposing) - { - if (isDisposing) + if (result.IsSuccess()) { - _baseFileSystemProxy?.Dispose(); + MakeObject(context, new IMultiCommitManager(commitManager)); } + + return (ResultCode)result.Value; } } }
\ No newline at end of file diff --git a/Ryujinx.HLE/HOS/Services/Fs/IMultiCommitManager.cs b/Ryujinx.HLE/HOS/Services/Fs/IMultiCommitManager.cs index f8245819..675f71d2 100644 --- a/Ryujinx.HLE/HOS/Services/Fs/IMultiCommitManager.cs +++ b/Ryujinx.HLE/HOS/Services/Fs/IMultiCommitManager.cs @@ -3,11 +3,11 @@ using Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy; namespace Ryujinx.HLE.HOS.Services.Fs { - class IMultiCommitManager : DisposableIpcService // 6.0.0+ + class IMultiCommitManager : IpcService // 6.0.0+ { - private ReferenceCountedDisposable<LibHac.FsSrv.Sf.IMultiCommitManager> _baseCommitManager; + private LibHac.FsSrv.IMultiCommitManager _baseCommitManager; - public IMultiCommitManager(ReferenceCountedDisposable<LibHac.FsSrv.Sf.IMultiCommitManager> baseCommitManager) + public IMultiCommitManager(LibHac.FsSrv.IMultiCommitManager baseCommitManager) { _baseCommitManager = baseCommitManager; } @@ -18,7 +18,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs { IFileSystem fileSystem = GetObject<IFileSystem>(context, 0); - Result result = _baseCommitManager.Target.Add(fileSystem.GetBaseFileSystem()); + Result result = _baseCommitManager.Add(fileSystem.GetBaseFileSystem()); return (ResultCode)result.Value; } @@ -27,17 +27,9 @@ namespace Ryujinx.HLE.HOS.Services.Fs // Commit() public ResultCode Commit(ServiceCtx context) { - Result result = _baseCommitManager.Target.Commit(); + Result result = _baseCommitManager.Commit(); return (ResultCode)result.Value; } - - protected override void Dispose(bool isDisposing) - { - if (isDisposing) - { - _baseCommitManager?.Dispose(); - } - } } } diff --git a/Ryujinx.HLE/HOS/Services/Fs/ISaveDataInfoReader.cs b/Ryujinx.HLE/HOS/Services/Fs/ISaveDataInfoReader.cs index 43e9a85a..bc4a2eb9 100644 --- a/Ryujinx.HLE/HOS/Services/Fs/ISaveDataInfoReader.cs +++ b/Ryujinx.HLE/HOS/Services/Fs/ISaveDataInfoReader.cs @@ -1,13 +1,13 @@ -using LibHac; -using LibHac.Sf; +using System; +using LibHac; namespace Ryujinx.HLE.HOS.Services.Fs { class ISaveDataInfoReader : DisposableIpcService { - private ReferenceCountedDisposable<LibHac.FsSrv.Sf.ISaveDataInfoReader> _baseReader; + private ReferenceCountedDisposable<LibHac.FsSrv.ISaveDataInfoReader> _baseReader; - public ISaveDataInfoReader(ReferenceCountedDisposable<LibHac.FsSrv.Sf.ISaveDataInfoReader> baseReader) + public ISaveDataInfoReader(ReferenceCountedDisposable<LibHac.FsSrv.ISaveDataInfoReader> baseReader) { _baseReader = baseReader; } @@ -21,7 +21,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs byte[] infoBuffer = new byte[bufferLen]; - Result result = _baseReader.Target.Read(out long readCount, new OutBuffer(infoBuffer)); + Result result = _baseReader.Target.Read(out long readCount, infoBuffer); context.Memory.Write(bufferPosition, infoBuffer); context.ResponseData.Write(readCount); |
