mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	Merge pull request #3441 from wwylele/fs-new-framework
Service/FS: convert to ServiceFramework
This commit is contained in:
		
						commit
						941ccaeed6
					
				
					 8 changed files with 963 additions and 871 deletions
				
			
		|  | @ -128,8 +128,6 @@ public: | |||
|     template <typename... O> | ||||
|     void PushMoveObjects(Kernel::SharedPtr<O>... pointers); | ||||
| 
 | ||||
|     void PushCurrentPIDHandle(); | ||||
| 
 | ||||
|     [[deprecated]] void PushStaticBuffer(VAddr buffer_vaddr, size_t size, u8 buffer_id); | ||||
|     void PushStaticBuffer(const std::vector<u8>& buffer, u8 buffer_id); | ||||
| 
 | ||||
|  | @ -208,11 +206,6 @@ inline void RequestBuilder::PushMoveObjects(Kernel::SharedPtr<O>... pointers) { | |||
|     PushMoveHandles(context->AddOutgoingHandle(std::move(pointers))...); | ||||
| } | ||||
| 
 | ||||
| inline void RequestBuilder::PushCurrentPIDHandle() { | ||||
|     Push(CallingPidDesc()); | ||||
|     Push(u32(0)); | ||||
| } | ||||
| 
 | ||||
| inline void RequestBuilder::PushStaticBuffer(VAddr buffer_vaddr, size_t size, u8 buffer_id) { | ||||
|     Push(StaticBufferDesc(size, buffer_id)); | ||||
|     Push(buffer_vaddr); | ||||
|  | @ -338,6 +331,8 @@ public: | |||
|         std::tie(pointers...) = PopObjects<T...>(); | ||||
|     } | ||||
| 
 | ||||
|     u32 PopPID(); | ||||
| 
 | ||||
|     /**
 | ||||
|      * @brief Pops the static buffer vaddr | ||||
|      * @return                  The virtual address of the buffer | ||||
|  | @ -507,6 +502,11 @@ inline std::tuple<Kernel::SharedPtr<T>...> RequestParser::PopObjects() { | |||
|                                           std::index_sequence_for<T...>{}); | ||||
| } | ||||
| 
 | ||||
| inline u32 RequestParser::PopPID() { | ||||
|     ASSERT(Pop<u32>() == static_cast<u32>(DescriptorType::CallingPid)); | ||||
|     return Pop<u32>(); | ||||
| } | ||||
| 
 | ||||
| inline VAddr RequestParser::PopStaticBuffer(size_t* data_size) { | ||||
|     const u32 sbuffer_descriptor = Pop<u32>(); | ||||
|     StaticBufferDescInfo bufferInfo{sbuffer_descriptor}; | ||||
|  |  | |||
|  | @ -39,23 +39,6 @@ | |||
| #include "core/hle/service/service.h" | ||||
| #include "core/memory.h" | ||||
| 
 | ||||
| // Specializes std::hash for ArchiveIdCode, so that we can use it in std::unordered_map.
 | ||||
| // Workaroung for libstdc++ bug: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60970
 | ||||
| namespace std { | ||||
| template <> | ||||
| struct hash<Service::FS::ArchiveIdCode> { | ||||
|     typedef Service::FS::ArchiveIdCode argument_type; | ||||
|     typedef std::size_t result_type; | ||||
| 
 | ||||
|     result_type operator()(const argument_type& id_code) const { | ||||
|         typedef std::underlying_type<argument_type>::type Type; | ||||
|         return std::hash<Type>()(static_cast<Type>(id_code)); | ||||
|     } | ||||
| }; | ||||
| } // namespace std
 | ||||
| 
 | ||||
| static constexpr Kernel::Handle INVALID_HANDLE{}; | ||||
| 
 | ||||
| namespace Service { | ||||
| namespace FS { | ||||
| 
 | ||||
|  | @ -320,42 +303,41 @@ Kernel::SharedPtr<Kernel::ClientSession> File::Connect() { | |||
| 
 | ||||
| Directory::Directory(std::unique_ptr<FileSys::DirectoryBackend>&& backend, | ||||
|                      const FileSys::Path& path) | ||||
|     : path(path), backend(std::move(backend)) {} | ||||
|     : ServiceFramework("", 1), path(path), backend(std::move(backend)) { | ||||
|     static const FunctionInfo functions[] = { | ||||
|         // clang-format off
 | ||||
|         {0x08010042, &Directory::Read, "Read"}, | ||||
|         {0x08020000, &Directory::Close, "Close"}, | ||||
|         // clang-format on
 | ||||
|     }; | ||||
|     RegisterHandlers(functions); | ||||
| } | ||||
| 
 | ||||
| Directory::~Directory() {} | ||||
| 
 | ||||
| void Directory::HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) { | ||||
|     u32* cmd_buff = Kernel::GetCommandBuffer(); | ||||
|     DirectoryCommand cmd = static_cast<DirectoryCommand>(cmd_buff[0]); | ||||
|     switch (cmd) { | ||||
|     // Read from directory...
 | ||||
|     case DirectoryCommand::Read: { | ||||
|         u32 count = cmd_buff[1]; | ||||
|         u32 address = cmd_buff[3]; | ||||
|         std::vector<FileSys::Entry> entries(count); | ||||
|         LOG_TRACE(Service_FS, "Read %s: count=%d", GetName().c_str(), count); | ||||
| void Directory::Read(Kernel::HLERequestContext& ctx) { | ||||
|     IPC::RequestParser rp(ctx, 0x0801, 1, 2); | ||||
|     u32 count = rp.Pop<u32>(); | ||||
|     auto& buffer = rp.PopMappedBuffer(); | ||||
|     std::vector<FileSys::Entry> entries(count); | ||||
|     LOG_TRACE(Service_FS, "Read %s: count=%u", GetName().c_str(), count); | ||||
|     // Number of entries actually read
 | ||||
|     u32 read = backend->Read(static_cast<u32>(entries.size()), entries.data()); | ||||
|     buffer.Write(entries.data(), 0, read * sizeof(FileSys::Entry)); | ||||
| 
 | ||||
|         // Number of entries actually read
 | ||||
|         u32 read = backend->Read(static_cast<u32>(entries.size()), entries.data()); | ||||
|         cmd_buff[2] = read; | ||||
|         Memory::WriteBlock(address, entries.data(), read * sizeof(FileSys::Entry)); | ||||
|         break; | ||||
|     } | ||||
|     IPC::RequestBuilder rb = rp.MakeBuilder(2, 2); | ||||
|     rb.Push(RESULT_SUCCESS); | ||||
|     rb.Push(read); | ||||
|     rb.PushMappedBuffer(buffer); | ||||
| } | ||||
| 
 | ||||
|     case DirectoryCommand::Close: { | ||||
|         LOG_TRACE(Service_FS, "Close %s", GetName().c_str()); | ||||
|         backend->Close(); | ||||
|         break; | ||||
|     } | ||||
| void Directory::Close(Kernel::HLERequestContext& ctx) { | ||||
|     IPC::RequestParser rp(ctx, 0x0802, 0, 0); | ||||
|     LOG_TRACE(Service_FS, "Close %s", GetName().c_str()); | ||||
|     backend->Close(); | ||||
| 
 | ||||
|     // Unknown command...
 | ||||
|     default: | ||||
|         LOG_ERROR(Service_FS, "Unknown command=0x%08X!", static_cast<u32>(cmd)); | ||||
|         ResultCode error = UnimplementedFunction(ErrorModule::FS); | ||||
|         cmd_buff[1] = error.raw; // TODO(Link Mauve): use the correct error code for that.
 | ||||
|         return; | ||||
|     } | ||||
|     cmd_buff[1] = RESULT_SUCCESS.raw; // No error
 | ||||
|     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||||
|     rb.Push(RESULT_SUCCESS); | ||||
| } | ||||
| 
 | ||||
| ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
|  | @ -552,8 +534,9 @@ ResultVal<FileSys::ArchiveFormatInfo> GetArchiveFormatInfo(ArchiveIdCode id_code | |||
|     return archive->second->GetFormatInfo(archive_path); | ||||
| } | ||||
| 
 | ||||
| ResultCode CreateExtSaveData(MediaType media_type, u32 high, u32 low, VAddr icon_buffer, | ||||
|                              u32 icon_size, const FileSys::ArchiveFormatInfo& format_info) { | ||||
| ResultCode CreateExtSaveData(MediaType media_type, u32 high, u32 low, | ||||
|                              const std::vector<u8>& smdh_icon, | ||||
|                              const FileSys::ArchiveFormatInfo& format_info) { | ||||
|     // Construct the binary path to the archive first
 | ||||
|     FileSys::Path path = | ||||
|         FileSys::ConstructExtDataBinaryPath(static_cast<u32>(media_type), high, low); | ||||
|  | @ -571,11 +554,6 @@ ResultCode CreateExtSaveData(MediaType media_type, u32 high, u32 low, VAddr icon | |||
|     if (result.IsError()) | ||||
|         return result; | ||||
| 
 | ||||
|     if (!Memory::IsValidVirtualAddress(icon_buffer)) | ||||
|         return ResultCode(-1); // TODO(Subv): Find the right error code
 | ||||
| 
 | ||||
|     std::vector<u8> smdh_icon(icon_size); | ||||
|     Memory::ReadBlock(icon_buffer, smdh_icon.data(), smdh_icon.size()); | ||||
|     ext_savedata->WriteIcon(path, smdh_icon.data(), smdh_icon.size()); | ||||
|     return RESULT_SUCCESS; | ||||
| } | ||||
|  | @ -708,9 +686,6 @@ void UnregisterArchiveTypes() { | |||
| /// Initialize archives
 | ||||
| void ArchiveInit() { | ||||
|     next_handle = 1; | ||||
| 
 | ||||
|     AddService(new FS::Interface); | ||||
| 
 | ||||
|     RegisterArchiveTypes(); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -87,7 +87,7 @@ private: | |||
|     void OpenSubFile(Kernel::HLERequestContext& ctx); | ||||
| }; | ||||
| 
 | ||||
| class Directory final : public Kernel::SessionRequestHandler { | ||||
| class Directory final : public ServiceFramework<Directory> { | ||||
| public: | ||||
|     Directory(std::unique_ptr<FileSys::DirectoryBackend>&& backend, const FileSys::Path& path); | ||||
|     ~Directory(); | ||||
|  | @ -100,11 +100,8 @@ public: | |||
|     std::unique_ptr<FileSys::DirectoryBackend> backend; ///< File backend interface
 | ||||
| 
 | ||||
| protected: | ||||
|     void HandleSyncRequest(Kernel::SharedPtr<Kernel::ServerSession> server_session) override; | ||||
| 
 | ||||
|     std::unique_ptr<SessionDataBase> MakeSessionData() const override { | ||||
|         return nullptr; | ||||
|     } | ||||
|     void Read(Kernel::HLERequestContext& ctx); | ||||
|     void Close(Kernel::HLERequestContext& ctx); | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  | @ -251,13 +248,13 @@ ResultVal<FileSys::ArchiveFormatInfo> GetArchiveFormatInfo(ArchiveIdCode id_code | |||
|  * @param media_type The media type of the archive to create (NAND / SDMC) | ||||
|  * @param high The high word of the extdata id to create | ||||
|  * @param low The low word of the extdata id to create | ||||
|  * @param icon_buffer VAddr of the SMDH icon for this ExtSaveData | ||||
|  * @param icon_size Size of the SMDH icon | ||||
|  * @param smdh_icon the SMDH icon for this ExtSaveData | ||||
|  * @param format_info Format information about the new archive | ||||
|  * @return ResultCode 0 on success or the corresponding code on error | ||||
|  */ | ||||
| ResultCode CreateExtSaveData(MediaType media_type, u32 high, u32 low, VAddr icon_buffer, | ||||
|                              u32 icon_size, const FileSys::ArchiveFormatInfo& format_info); | ||||
| ResultCode CreateExtSaveData(MediaType media_type, u32 high, u32 low, | ||||
|                              const std::vector<u8>& smdh_icon, | ||||
|                              const FileSys::ArchiveFormatInfo& format_info); | ||||
| 
 | ||||
| /**
 | ||||
|  * Deletes the SharedExtSaveData archive for the specified extdata ID | ||||
|  |  | |||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -4,20 +4,493 @@ | |||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include "common/common_types.h" | ||||
| #include "core/hle/service/service.h" | ||||
| 
 | ||||
| namespace Service { | ||||
| namespace FS { | ||||
| 
 | ||||
| /// Interface to "fs:USER" service
 | ||||
| class Interface : public Service::Interface { | ||||
| class FS_USER final : public ServiceFramework<FS_USER> { | ||||
| public: | ||||
|     Interface(); | ||||
|     FS_USER(); | ||||
| 
 | ||||
|     std::string GetPortName() const override { | ||||
|         return "fs:USER"; | ||||
|     } | ||||
| private: | ||||
|     void Initialize(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /**
 | ||||
|      * FS_User::OpenFile service function | ||||
|      *  Inputs: | ||||
|      *      1 : Transaction | ||||
|      *      2 : Archive handle lower word | ||||
|      *      3 : Archive handle upper word | ||||
|      *      4 : Low path type | ||||
|      *      5 : Low path size | ||||
|      *      6 : Open flags | ||||
|      *      7 : Attributes | ||||
|      *      8 : (LowPathSize << 14) | 2 | ||||
|      *      9 : Low path data pointer | ||||
|      *  Outputs: | ||||
|      *      1 : Result of function, 0 on success, otherwise error code | ||||
|      *      3 : File handle | ||||
|      */ | ||||
|     void OpenFile(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /**
 | ||||
|      * FS_User::OpenFileDirectly service function | ||||
|      *  Inputs: | ||||
|      *      1 : Transaction | ||||
|      *      2 : Archive ID | ||||
|      *      3 : Archive low path type | ||||
|      *      4 : Archive low path size | ||||
|      *      5 : File low path type | ||||
|      *      6 : File low path size | ||||
|      *      7 : Flags | ||||
|      *      8 : Attributes | ||||
|      *      9 : (ArchiveLowPathSize << 14) | 0x802 | ||||
|      *      10 : Archive low path | ||||
|      *      11 : (FileLowPathSize << 14) | 2 | ||||
|      *      12 : File low path | ||||
|      *  Outputs: | ||||
|      *      1 : Result of function, 0 on success, otherwise error code | ||||
|      *      3 : File handle | ||||
|      */ | ||||
|     void OpenFileDirectly(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /*
 | ||||
|      * FS_User::DeleteFile service function | ||||
|      *  Inputs: | ||||
|      *      1 : Transaction | ||||
|      *      2 : Archive handle lower word | ||||
|      *      3 : Archive handle upper word | ||||
|      *      4 : File path string type | ||||
|      *      5 : File path string size | ||||
|      *      7 : File path string data | ||||
|      *  Outputs: | ||||
|      *      1 : Result of function, 0 on success, otherwise error code | ||||
|      */ | ||||
|     void DeleteFile(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /*
 | ||||
|      * FS_User::RenameFile service function | ||||
|      *  Inputs: | ||||
|      *      1 : Transaction | ||||
|      *      2 : Source archive handle lower word | ||||
|      *      3 : Source archive handle upper word | ||||
|      *      4 : Source file path type | ||||
|      *      5 : Source file path size | ||||
|      *      6 : Dest archive handle lower word | ||||
|      *      7 : Dest archive handle upper word | ||||
|      *      8 : Dest file path type | ||||
|      *      9 : Dest file path size | ||||
|      *      11: Source file path string data | ||||
|      *      13: Dest file path string | ||||
|      *  Outputs: | ||||
|      *      1 : Result of function, 0 on success, otherwise error code | ||||
|      */ | ||||
|     void RenameFile(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /*
 | ||||
|      * FS_User::DeleteDirectory service function | ||||
|      *  Inputs: | ||||
|      *      1 : Transaction | ||||
|      *      2 : Archive handle lower word | ||||
|      *      3 : Archive handle upper word | ||||
|      *      4 : Directory path string type | ||||
|      *      5 : Directory path string size | ||||
|      *      7 : Directory path string data | ||||
|      *  Outputs: | ||||
|      *      1 : Result of function, 0 on success, otherwise error code | ||||
|      */ | ||||
|     void DeleteDirectory(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /*
 | ||||
|      * FS_User::DeleteDirectoryRecursively service function | ||||
|      *  Inputs: | ||||
|      *      0 : Command header 0x08070142 | ||||
|      *      1 : Transaction | ||||
|      *      2 : Archive handle lower word | ||||
|      *      3 : Archive handle upper word | ||||
|      *      4 : Directory path string type | ||||
|      *      5 : Directory path string size | ||||
|      *      7 : Directory path string data | ||||
|      *  Outputs: | ||||
|      *      1 : Result of function, 0 on success, otherwise error code | ||||
|      */ | ||||
|     void DeleteDirectoryRecursively(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /*
 | ||||
|      * FS_User::CreateFile service function | ||||
|      *  Inputs: | ||||
|      *      0 : Command header 0x08080202 | ||||
|      *      1 : Transaction | ||||
|      *      2 : Archive handle lower word | ||||
|      *      3 : Archive handle upper word | ||||
|      *      4 : File path string type | ||||
|      *      5 : File path string size | ||||
|      *      6 : File attributes | ||||
|      *      7-8 : File size | ||||
|      *      10: File path string data | ||||
|      *  Outputs: | ||||
|      *      1 : Result of function, 0 on success, otherwise error code | ||||
|      */ | ||||
|     void CreateFile(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /*
 | ||||
|      * FS_User::CreateDirectory service function | ||||
|      *  Inputs: | ||||
|      *      1 : Transaction | ||||
|      *      2 : Archive handle lower word | ||||
|      *      3 : Archive handle upper word | ||||
|      *      4 : Directory path string type | ||||
|      *      5 : Directory path string size | ||||
|      *      6 : Directory attributes | ||||
|      *      8 : Directory path string data | ||||
|      *  Outputs: | ||||
|      *      1 : Result of function, 0 on success, otherwise error code | ||||
|      */ | ||||
|     void CreateDirectory(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /*
 | ||||
|      * FS_User::RenameDirectory service function | ||||
|      *  Inputs: | ||||
|      *      1 : Transaction | ||||
|      *      2 : Source archive handle lower word | ||||
|      *      3 : Source archive handle upper word | ||||
|      *      4 : Source dir path type | ||||
|      *      5 : Source dir path size | ||||
|      *      6 : Dest archive handle lower word | ||||
|      *      7 : Dest archive handle upper word | ||||
|      *      8 : Dest dir path type | ||||
|      *      9 : Dest dir path size | ||||
|      *      11: Source dir path string data | ||||
|      *      13: Dest dir path string | ||||
|      *  Outputs: | ||||
|      *      1 : Result of function, 0 on success, otherwise error code | ||||
|      */ | ||||
|     void RenameDirectory(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /**
 | ||||
|      * FS_User::OpenDirectory service function | ||||
|      *  Inputs: | ||||
|      *      1 : Archive handle low word | ||||
|      *      2 : Archive handle high word | ||||
|      *      3 : Low path type | ||||
|      *      4 : Low path size | ||||
|      *      7 : (LowPathSize << 14) | 2 | ||||
|      *      8 : Low path data pointer | ||||
|      *  Outputs: | ||||
|      *      1 : Result of function, 0 on success, otherwise error code | ||||
|      *      3 : Directory handle | ||||
|      */ | ||||
|     void OpenDirectory(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /**
 | ||||
|      * FS_User::OpenArchive service function | ||||
|      *  Inputs: | ||||
|      *      1 : Archive ID | ||||
|      *      2 : Archive low path type | ||||
|      *      3 : Archive low path size | ||||
|      *      4 : (LowPathSize << 14) | 2 | ||||
|      *      5 : Archive low path | ||||
|      *  Outputs: | ||||
|      *      1 : Result of function, 0 on success, otherwise error code | ||||
|      *      2 : Archive handle lower word (unused) | ||||
|      *      3 : Archive handle upper word (same as file handle) | ||||
|      */ | ||||
|     void OpenArchive(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /**
 | ||||
|      * FS_User::CloseArchive service function | ||||
|      *  Inputs: | ||||
|      *      0 : 0x080E0080 | ||||
|      *      1 : Archive handle low word | ||||
|      *      2 : Archive handle high word | ||||
|      *  Outputs: | ||||
|      *      0 : 0x080E0040 | ||||
|      *      1 : Result of function, 0 on success, otherwise error code | ||||
|      */ | ||||
|     void CloseArchive(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /*
 | ||||
|      * FS_User::IsSdmcDetected service function | ||||
|      *  Outputs: | ||||
|      *      1 : Result of function, 0 on success, otherwise error code | ||||
|      *      2 : Whether the Sdmc could be detected | ||||
|      */ | ||||
|     void IsSdmcDetected(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /**
 | ||||
|      * FS_User::IsSdmcWriteable service function | ||||
|      *  Outputs: | ||||
|      *      0 : Command header 0x08180080 | ||||
|      *      1 : Result of function, 0 on success, otherwise error code | ||||
|      *      2 : Whether the Sdmc is currently writeable | ||||
|      */ | ||||
|     void IsSdmcWriteable(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /**
 | ||||
|      * FS_User::FormatSaveData service function, | ||||
|      * formats the SaveData specified by the input path. | ||||
|      *  Inputs: | ||||
|      *      0  : 0x084C0242 | ||||
|      *      1  : Archive ID | ||||
|      *      2  : Archive path type | ||||
|      *      3  : Archive path size | ||||
|      *      4  : Size in Blocks (1 block = 512 bytes) | ||||
|      *      5  : Number of directories | ||||
|      *      6  : Number of files | ||||
|      *      7  : Directory bucket count | ||||
|      *      8  : File bucket count | ||||
|      *      9  : Duplicate data | ||||
|      *      10 : (PathSize << 14) | 2 | ||||
|      *      11 : Archive low path | ||||
|      *  Outputs: | ||||
|      *      1 : Result of function, 0 on success, otherwise error code | ||||
|      */ | ||||
|     void FormatSaveData(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /**
 | ||||
|      * FS_User::FormatThisUserSaveData service function | ||||
|      *  Inputs: | ||||
|      *      0  : 0x080F0180 | ||||
|      *      1  : Size in Blocks (1 block = 512 bytes) | ||||
|      *      2  : Number of directories | ||||
|      *      3  : Number of files | ||||
|      *      4  : Directory bucket count | ||||
|      *      5  : File bucket count | ||||
|      *      6  : Duplicate data | ||||
|      *  Outputs: | ||||
|      *      1 : Result of function, 0 on success, otherwise error code | ||||
|      */ | ||||
|     void FormatThisUserSaveData(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /**
 | ||||
|      * FS_User::GetFreeBytes service function | ||||
|      *  Inputs: | ||||
|      *      0: 0x08120080 | ||||
|      *      1: Archive handle low word | ||||
|      *      2: Archive handle high word | ||||
|      *  Outputs: | ||||
|      *      1: Result of function, 0 on success, otherwise error code | ||||
|      *      2: Free byte count low word | ||||
|      *      3: Free byte count high word | ||||
|      */ | ||||
|     void GetFreeBytes(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /**
 | ||||
|      * FS_User::CreateExtSaveData service function | ||||
|      *  Inputs: | ||||
|      *      0 : 0x08510242 | ||||
|      *      1 : Media type (NAND / SDMC) | ||||
|      *      2 : Low word of the saveid to create | ||||
|      *      3 : High word of the saveid to create | ||||
|      *      4 : Unknown | ||||
|      *      5 : Number of directories | ||||
|      *      6 : Number of files | ||||
|      *      7-8 : Size limit | ||||
|      *      9 : Size of the SMDH icon | ||||
|      *      10: (SMDH Size << 4) | 0x0000000A | ||||
|      *      11: Pointer to the SMDH icon for the new ExtSaveData | ||||
|      *  Outputs: | ||||
|      *      1 : Result of function, 0 on success, otherwise error code | ||||
|      */ | ||||
|     void CreateExtSaveData(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /**
 | ||||
|      * FS_User::DeleteExtSaveData service function | ||||
|      *  Inputs: | ||||
|      *      0 : 0x08520100 | ||||
|      *      1 : Media type (NAND / SDMC) | ||||
|      *      2 : Low word of the saveid to create | ||||
|      *      3 : High word of the saveid to create | ||||
|      *      4 : Unknown | ||||
|      *  Outputs: | ||||
|      *      1 : Result of function, 0 on success, otherwise error code | ||||
|      */ | ||||
|     void DeleteExtSaveData(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /**
 | ||||
|      * FS_User::CardSlotIsInserted service function. | ||||
|      *  Inputs: | ||||
|      *      0 : 0x08210000 | ||||
|      *  Outputs: | ||||
|      *      1 : Result of function, 0 on success, otherwise error code | ||||
|      *      2 : Whether there is a game card inserted into the slot or not. | ||||
|      */ | ||||
|     void CardSlotIsInserted(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /**
 | ||||
|      * FS_User::DeleteSystemSaveData service function. | ||||
|      *  Inputs: | ||||
|      *      0 : 0x08570080 | ||||
|      *      1 : High word of the SystemSaveData id to delete | ||||
|      *      2 : Low word of the SystemSaveData id to delete | ||||
|      *  Outputs: | ||||
|      *      1 : Result of function, 0 on success, otherwise error code | ||||
|      */ | ||||
|     void DeleteSystemSaveData(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /**
 | ||||
|      * FS_User::CreateSystemSaveData service function. | ||||
|      *  Inputs: | ||||
|      *      0 : 0x08560240 | ||||
|      *      1 : u8 MediaType of the system save data | ||||
|      *      2 : SystemSaveData id to create | ||||
|      *      3 : Total size | ||||
|      *      4 : Block size | ||||
|      *      5 : Number of directories | ||||
|      *      6 : Number of files | ||||
|      *      7 : Directory bucket count | ||||
|      *      8 : File bucket count | ||||
|      *      9 : u8 Whether to duplicate data or not | ||||
|      *  Outputs: | ||||
|      *      1 : Result of function, 0 on success, otherwise error code | ||||
|      */ | ||||
|     void CreateSystemSaveData(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /**
 | ||||
|      * FS_User::CreateLegacySystemSaveData service function. | ||||
|      *  This function appears to be obsolete and seems to have been replaced by | ||||
|      *  command 0x08560240 (CreateSystemSaveData). | ||||
|      * | ||||
|      *  Inputs: | ||||
|      *      0 : 0x08100200 | ||||
|      *      1 : SystemSaveData id to create | ||||
|      *      2 : Total size | ||||
|      *      3 : Block size | ||||
|      *      4 : Number of directories | ||||
|      *      5 : Number of files | ||||
|      *      6 : Directory bucket count | ||||
|      *      7 : File bucket count | ||||
|      *      8 : u8 Duplicate data | ||||
|      *  Outputs: | ||||
|      *      1 : Result of function, 0 on success, otherwise error code | ||||
|      */ | ||||
|     void CreateLegacySystemSaveData(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /**
 | ||||
|      * FS_User::InitializeWithSdkVersion service function. | ||||
|      *  Inputs: | ||||
|      *      0 : 0x08610042 | ||||
|      *      1 : Used SDK Version | ||||
|      *      2 : ProcessId Header | ||||
|      *      3 : placeholder for ProcessId | ||||
|      *  Outputs: | ||||
|      *      1 : Result of function, 0 on success, otherwise error code | ||||
|      */ | ||||
|     void InitializeWithSdkVersion(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /**
 | ||||
|      * FS_User::SetPriority service function. | ||||
|      *  Inputs: | ||||
|      *      0 : 0x08620040 | ||||
|      *      1 : priority | ||||
|      *  Outputs: | ||||
|      *      1 : Result of function, 0 on success, otherwise error code | ||||
|      */ | ||||
|     void SetPriority(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /**
 | ||||
|      * FS_User::GetPriority service function. | ||||
|      *  Inputs: | ||||
|      *      0 : 0x08630000 | ||||
|      *  Outputs: | ||||
|      *      1 : Result of function, 0 on success, otherwise error code | ||||
|      *      2 : priority | ||||
|      */ | ||||
|     void GetPriority(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /**
 | ||||
|      * FS_User::GetArchiveResource service function. | ||||
|      *  Inputs: | ||||
|      *      0 : 0x08490040 | ||||
|      *      1 : Media type | ||||
|      *  Outputs: | ||||
|      *      1 : Result of function, 0 on success, otherwise error code | ||||
|      *      2 : Sector byte-size | ||||
|      *      3 : Cluster byte-size | ||||
|      *      4 : Partition capacity in clusters | ||||
|      *      5 : Available free space in clusters | ||||
|      */ | ||||
|     void GetArchiveResource(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /**
 | ||||
|      * FS_User::GetFormatInfo service function. | ||||
|      *  Inputs: | ||||
|      *      0 : 0x084500C2 | ||||
|      *      1 : Archive ID | ||||
|      *      2 : Archive path type | ||||
|      *      3 : Archive path size | ||||
|      *      4 : (PathSize << 14) | 2 | ||||
|      *      5 : Archive low path | ||||
|      *  Outputs: | ||||
|      *      0 : 0x08450140 | ||||
|      *      1 : Result of function, 0 on success, otherwise error code | ||||
|      *      2 : Total size | ||||
|      *      3 : Number of directories | ||||
|      *      4 : Number of files | ||||
|      *      5 : Duplicate data | ||||
|      */ | ||||
|     void GetFormatInfo(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /**
 | ||||
|      * FS_User::GetProgramLaunchInfo service function. | ||||
|      *  Inputs: | ||||
|      *      0 : 0x082F0040 | ||||
|      *      1 : Process ID | ||||
|      *  Outputs: | ||||
|      *      0 : 0x082F0140 | ||||
|      *      1 : Result of function, 0 on success, otherwise error code | ||||
|      *      2-3 : Program ID | ||||
|      *      4 : Media type | ||||
|      *      5 : Unknown | ||||
|      */ | ||||
|     void GetProgramLaunchInfo(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /**
 | ||||
|      * FS_User::GetNumSeeds service function. | ||||
|      *  Inputs: | ||||
|      *      0 : 0x087D0000 | ||||
|      *  Outputs: | ||||
|      *      0 : 0x087D0080 | ||||
|      *      1 : Result of function, 0 on success, otherwise error code | ||||
|      *      2 : Number of seeds in the SEEDDB | ||||
|      */ | ||||
|     void GetNumSeeds(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /**
 | ||||
|      * FS_User::SetSaveDataSecureValue service function. | ||||
|      *  Inputs: | ||||
|      *      0 : 0x08650140 | ||||
|      *      1-2 : Secure Value | ||||
|      *      3 : Secure Value Slot | ||||
|      *      4 : Title Id | ||||
|      *      5 : Title Variation | ||||
|      *  Outputs: | ||||
|      *      0 : 0x08650140 | ||||
|      *      1 : Result of function, 0 on success, otherwise error code | ||||
|      */ | ||||
|     void SetSaveDataSecureValue(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     /**
 | ||||
|      * FS_User::GetSaveDataSecureValue service function. | ||||
|      *  Inputs: | ||||
|      *      0 : 0x086600C0 | ||||
|      *      1 : Secure Value Slot | ||||
|      *      2 : Title Id | ||||
|      *      3 : Title Variation | ||||
|      *  Outputs: | ||||
|      *      0 : 0x086600C0 | ||||
|      *      1 : Result of function, 0 on success, otherwise error code | ||||
|      *      2 : If Secure Value doesn't exist, 0, if it exists, 1 | ||||
|      *      3-4 : Secure Value | ||||
|      */ | ||||
|     void GetSaveDataSecureValue(Kernel::HLERequestContext& ctx); | ||||
| 
 | ||||
|     u32 priority = -1; ///< For SetPriority and GetPriority service functions
 | ||||
| }; | ||||
| 
 | ||||
| void InstallInterfaces(SM::ServiceManager& service_manager); | ||||
| 
 | ||||
| } // namespace FS
 | ||||
| } // namespace Service
 | ||||
|  |  | |||
|  | @ -26,6 +26,7 @@ | |||
| #include "core/hle/service/err_f.h" | ||||
| #include "core/hle/service/frd/frd.h" | ||||
| #include "core/hle/service/fs/archive.h" | ||||
| #include "core/hle/service/fs/fs_user.h" | ||||
| #include "core/hle/service/gsp/gsp.h" | ||||
| #include "core/hle/service/gsp_lcd.h" | ||||
| #include "core/hle/service/hid/hid.h" | ||||
|  | @ -233,6 +234,7 @@ void Init() { | |||
|     MIC::InstallInterfaces(*SM::g_service_manager); | ||||
|     NWM::InstallInterfaces(*SM::g_service_manager); | ||||
| 
 | ||||
|     FS::InstallInterfaces(*SM::g_service_manager); | ||||
|     FS::ArchiveInit(); | ||||
|     ACT::Init(); | ||||
|     AM::Init(); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue