From e79392cb8e29be8307f6afd779e74e0db5c49f53 Mon Sep 17 00:00:00 2001 From: Pierre Bourdon Date: Wed, 16 Aug 2017 04:53:32 +0200 Subject: [PATCH] WFS: Implement WRITE and WRITE_ABSOLUTE. --- Source/Core/Core/IOS/WFS/WFSSRV.cpp | 39 +++++++++++++++++++++++++++++ Source/Core/Core/IOS/WFS/WFSSRV.h | 1 + 2 files changed, 40 insertions(+) diff --git a/Source/Core/Core/IOS/WFS/WFSSRV.cpp b/Source/Core/Core/IOS/WFS/WFSSRV.cpp index 5ef6fe0965..1ba9166eba 100644 --- a/Source/Core/Core/IOS/WFS/WFSSRV.cpp +++ b/Source/Core/Core/IOS/WFS/WFSSRV.cpp @@ -303,6 +303,45 @@ IPCCommandResult WFSSRV::IOCtl(const IOCtlRequest& request) break; } + case IOCTL_WFS_WRITE: + case IOCTL_WFS_WRITE_ABSOLUTE: + { + u32 addr = Memory::Read_U32(request.buffer_in); + u32 position = Memory::Read_U32(request.buffer_in + 4); // Only for absolute. + u16 fd = Memory::Read_U16(request.buffer_in + 0xC); + u32 size = Memory::Read_U32(request.buffer_in + 8); + + bool absolute = request.request == IOCTL_WFS_WRITE_ABSOLUTE; + + FileDescriptor* fd_obj = FindFileDescriptor(fd); + if (fd_obj == nullptr) + { + ERROR_LOG(IOS, "IOCTL_WFS_WRITE: invalid file descriptor %d", fd); + return_error_code = WFS_EBADFD; + break; + } + + u64 previous_position = fd_obj->file.Tell(); + if (absolute) + { + fd_obj->file.Seek(position, SEEK_SET); + } + fd_obj->file.WriteArray(Memory::GetPointer(addr), size); + // TODO(wfs): Handle write errors. + if (absolute) + { + fd_obj->file.Seek(previous_position, SEEK_SET); + } + else + { + fd_obj->position += size; + } + + INFO_LOG(IOS, "IOCTL_WFS_WRITE: written %d bytes from FD %d (%s)", size, fd, + fd_obj->path.c_str()); + break; + } + default: // TODO(wfs): Should be returning -3. However until we have everything // properly stubbed it's easier to simulate the methods succeeding. diff --git a/Source/Core/Core/IOS/WFS/WFSSRV.h b/Source/Core/Core/IOS/WFS/WFSSRV.h index bf7c58d170..3b2f2d5f2d 100644 --- a/Source/Core/Core/IOS/WFS/WFSSRV.h +++ b/Source/Core/Core/IOS/WFS/WFSSRV.h @@ -70,6 +70,7 @@ private: IOCTL_WFS_ATTACH_DETACH_2 = 0x2e, IOCTL_WFS_CLOSE_2 = 0x47, IOCTL_WFS_READ_ABSOLUTE = 0x48, + IOCTL_WFS_WRITE_ABSOLUTE = 0x49, }; enum