diff --git a/app/src/main/assets/romfs/0100000000000806 b/app/src/main/assets/romfs/0100000000000806 new file mode 100644 index 00000000..69b91fb9 Binary files /dev/null and b/app/src/main/assets/romfs/0100000000000806 differ diff --git a/app/src/main/assets/romfs/0100000000000823 b/app/src/main/assets/romfs/0100000000000823 new file mode 100644 index 00000000..687472c1 Binary files /dev/null and b/app/src/main/assets/romfs/0100000000000823 differ diff --git a/app/src/main/cpp/skyline/services/fssrv/IFileSystemProxy.cpp b/app/src/main/cpp/skyline/services/fssrv/IFileSystemProxy.cpp index 3c44d444..c3c3fba7 100644 --- a/app/src/main/cpp/skyline/services/fssrv/IFileSystemProxy.cpp +++ b/app/src/main/cpp/skyline/services/fssrv/IFileSystemProxy.cpp @@ -69,6 +69,17 @@ namespace skyline::service::fssrv { return {}; } + Result IFileSystemProxy::OpenDataStorageByDataId(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { + auto storageId{request.Pop()}; + request.Skip>(); // 7-bytes padding + auto titleId{request.Pop()}; + + auto romFs{std::make_shared(state.os->assetFileSystem->OpenFile(fmt::format("romfs/{:016X}", titleId)), state, manager)}; + + manager.RegisterService(romFs, session, response); + return {}; + } + Result IFileSystemProxy::GetGlobalAccessLogMode(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response) { response.Push(0); return {}; diff --git a/app/src/main/cpp/skyline/services/fssrv/IFileSystemProxy.h b/app/src/main/cpp/skyline/services/fssrv/IFileSystemProxy.h index 09279ce6..1a65cc2c 100644 --- a/app/src/main/cpp/skyline/services/fssrv/IFileSystemProxy.h +++ b/app/src/main/cpp/skyline/services/fssrv/IFileSystemProxy.h @@ -42,6 +42,15 @@ namespace skyline::service::fssrv { }; static_assert(sizeof(SaveDataAttribute) == 0x40); + enum class StorageId : u8 { + None = 0, + Host = 1, + GameCard = 2, + NandSystem = 3, + NandUser = 4, + SdCard = 5, + }; + /** * @brief IFileSystemProxy or fsp-srv is responsible for providing handles to file systems * @url https://switchbrew.org/wiki/Filesystem_services#fsp-srv @@ -77,6 +86,12 @@ namespace skyline::service::fssrv { */ Result OpenDataStorageByCurrentProcess(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response); + /** + * @brief Returns a handle to an instance of #IStorage + * @url https://switchbrew.org/wiki/Filesystem_services#OpenDataStorageByDataId + */ + Result OpenDataStorageByDataId(type::KSession &session, ipc::IpcRequest &request, ipc::IpcResponse &response); + /** * @brief Returns the filesystem log access mode * @url https://switchbrew.org/wiki/Filesystem_services#GetGlobalAccessLogMode @@ -88,6 +103,7 @@ namespace skyline::service::fssrv { SFUNC(0x12, IFileSystemProxy, OpenSdCardFileSystem), SFUNC(0x33, IFileSystemProxy, OpenSaveDataFileSystem), SFUNC(0xC8, IFileSystemProxy, OpenDataStorageByCurrentProcess), + SFUNC(0xCA, IFileSystemProxy, OpenDataStorageByDataId), SFUNC(0x3ED, IFileSystemProxy, GetGlobalAccessLogMode) ) };