diff --git a/src/core/hle/service/fs/fs_user.cpp b/src/core/hle/service/fs/fs_user.cpp index 4e774394b0..1b439bf337 100644 --- a/src/core/hle/service/fs/fs_user.cpp +++ b/src/core/hle/service/fs/fs_user.cpp @@ -113,18 +113,18 @@ static void OpenFile(Service::Interface* self) { * 3 : File handle */ static void OpenFileDirectly(Service::Interface* self) { - u32* cmd_buff = Kernel::GetCommandBuffer(); + IPC::RequestParser rp(Kernel::GetCommandBuffer(), 0x803, 8, 4); + rp.Skip(1, false); // Transaction - auto archive_id = static_cast(cmd_buff[2]); - auto archivename_type = static_cast(cmd_buff[3]); - u32 archivename_size = cmd_buff[4]; - auto filename_type = static_cast(cmd_buff[5]); - u32 filename_size = cmd_buff[6]; - FileSys::Mode mode; - mode.hex = cmd_buff[7]; - u32 attributes = cmd_buff[8]; // TODO(Link Mauve): do something with those attributes. - u32 archivename_ptr = cmd_buff[10]; - u32 filename_ptr = cmd_buff[12]; + auto archive_id = rp.PopEnum(); + auto archivename_type = rp.PopEnum(); + u32 archivename_size = rp.Pop(); + auto filename_type = rp.PopEnum(); + u32 filename_size = rp.Pop(); + FileSys::Mode mode{rp.Pop()}; + u32 attributes = rp.Pop(); // TODO(Link Mauve): do something with those attributes. + u32 archivename_ptr = rp.PopStaticBuffer(nullptr); + u32 filename_ptr = rp.PopStaticBuffer(nullptr); FileSys::Path archive_path(archivename_type, archivename_size, archivename_ptr); FileSys::Path file_path(filename_type, filename_size, filename_ptr); @@ -132,25 +132,27 @@ static void OpenFileDirectly(Service::Interface* self) { static_cast(archive_id), archive_path.DebugStr().c_str(), file_path.DebugStr().c_str(), mode.hex, attributes); + IPC::RequestBuilder rb = rp.MakeBuilder(1, 2); + ResultVal archive_handle = OpenArchive(archive_id, archive_path); if (archive_handle.Failed()) { LOG_ERROR(Service_FS, "Failed to get a handle for archive archive_id=0x%08X archive_path=%s", static_cast(archive_id), archive_path.DebugStr().c_str()); - cmd_buff[1] = archive_handle.Code().raw; - cmd_buff[3] = 0; + rb.Push(archive_handle.Code()); + rb.PushMoveHandles(0); return; } SCOPE_EXIT({ CloseArchive(*archive_handle); }); ResultVal> file_res = OpenFileFromArchive(*archive_handle, file_path, mode); - cmd_buff[1] = file_res.Code().raw; + rb.Push(file_res.Code()); if (file_res.Succeeded()) { std::shared_ptr file = *file_res; - cmd_buff[3] = Kernel::g_handle_table.Create(file->Connect()).Unwrap(); + rb.PushMoveHandles(Kernel::g_handle_table.Create(file->Connect()).Unwrap()); } else { - cmd_buff[3] = 0; + rb.PushMoveHandles(0); LOG_ERROR(Service_FS, "failed to get a handle for file %s mode=%u attributes=%u", file_path.DebugStr().c_str(), mode.hex, attributes); } @@ -478,11 +480,11 @@ static void CloseArchive(Service::Interface* self) { } /* -* FS_User::IsSdmcDetected service function -* Outputs: -* 1 : Result of function, 0 on success, otherwise error code -* 2 : Whether the Sdmc could be detected -*/ + * FS_User::IsSdmcDetected service function + * Outputs: + * 1 : Result of function, 0 on success, otherwise error code + * 2 : Whether the Sdmc could be detected + */ static void IsSdmcDetected(Service::Interface* self) { u32* cmd_buff = Kernel::GetCommandBuffer();