Play-/Source/iop/Iop_FileIoHandler2200.h

320 lines
6.2 KiB
C
Raw Permalink Normal View History

#pragma once
#include <cassert>
2019-08-15 20:45:53 -04:00
#include <array>
#include "Iop_FileIo.h"
#include "Ioman_Defs.h"
namespace Iop
{
class CFileIoHandler2200 : public CFileIo::CHandler
{
public:
CFileIoHandler2200(CIoman*, CSifMan&);
2019-09-13 11:16:16 -04:00
bool Invoke(uint32, uint32*, uint32, uint32*, uint32, uint8*) override;
2018-04-30 21:01:23 +01:00
void LoadState(Framework::CZipArchiveReader&) override;
void SaveState(Framework::CZipArchiveWriter&) const override;
2016-03-20 13:29:58 -07:00
2019-08-01 12:52:43 -04:00
void ProcessCommands(CSifMan*) override;
private:
struct PENDINGREPLY
{
enum
{
REPLY_BUFFER_SIZE = 0x20,
};
template <typename T>
void SetReply(const T& reply)
{
assert(!valid);
static_assert(sizeof(T) <= REPLY_BUFFER_SIZE, "Reply buffer too small.");
valid = true;
replySize = sizeof(T);
memcpy(buffer.data(), &reply, sizeof(T));
}
bool valid = false;
uint32 fileId = 0;
uint32 replySize = 0;
std::array<uint8, REPLY_BUFFER_SIZE> buffer;
};
2019-08-01 12:50:37 -04:00
enum COMMANDID
{
COMMANDID_OPEN = 0,
COMMANDID_CLOSE = 1,
COMMANDID_READ = 2,
2021-01-03 20:07:29 -05:00
COMMANDID_WRITE = 3,
2019-08-01 12:50:37 -04:00
COMMANDID_SEEK = 4,
2021-01-08 10:36:12 -05:00
COMMANDID_REMOVE = 6,
2021-01-04 17:43:21 -05:00
COMMANDID_MKDIR = 7,
2021-01-08 10:36:12 -05:00
COMMANDID_RMDIR = 8,
2019-08-01 12:50:37 -04:00
COMMANDID_DOPEN = 9,
2021-01-04 15:11:54 -05:00
COMMANDID_DCLOSE = 10,
COMMANDID_DREAD = 11,
2019-08-01 12:50:37 -04:00
COMMANDID_GETSTAT = 12,
2021-01-04 18:42:16 -05:00
COMMANDID_CHSTAT = 13,
2021-01-02 22:29:29 -05:00
COMMANDID_FORMAT = 14,
2021-01-06 13:33:20 -05:00
COMMANDID_CHDIR = 18,
2021-01-03 20:08:12 -05:00
COMMANDID_SYNC = 19,
2019-08-01 12:50:37 -04:00
COMMANDID_MOUNT = 20,
COMMANDID_UMOUNT = 21,
2021-01-06 10:54:25 -05:00
COMMANDID_SEEK64 = 22,
2019-08-01 12:50:37 -04:00
COMMANDID_DEVCTL = 23,
2021-01-02 22:28:26 -05:00
COMMANDID_IOCTL2 = 26,
2019-08-01 12:50:37 -04:00
};
struct COMMANDHEADER
{
2018-04-30 21:01:23 +01:00
uint32 semaphoreId;
uint32 resultPtr;
uint32 resultSize;
};
struct OPENCOMMAND
{
2018-04-30 21:01:23 +01:00
COMMANDHEADER header;
uint32 flags;
uint32 somePtr1;
char fileName[256];
};
struct CLOSECOMMAND
{
2018-04-30 21:01:23 +01:00
COMMANDHEADER header;
uint32 fd;
};
struct READCOMMAND
{
2018-04-30 21:01:23 +01:00
COMMANDHEADER header;
uint32 fd;
uint32 buffer;
uint32 size;
};
2021-01-03 20:07:29 -05:00
struct WRITECOMMAND
{
COMMANDHEADER header;
uint32 fd;
uint32 buffer;
uint32 size;
uint32 unalignedSize;
uint8 unalignedData[64];
};
2021-01-08 18:30:28 -05:00
struct SEEKCOMMAND
{
2018-04-30 21:01:23 +01:00
COMMANDHEADER header;
uint32 fd;
2021-01-06 08:26:18 -05:00
int32 offset;
2018-04-30 21:01:23 +01:00
uint32 whence;
};
2021-01-04 17:43:21 -05:00
struct MKDIRCOMMAND
{
COMMANDHEADER header;
uint32 mode;
char dirName[256];
};
struct DOPENCOMMAND
{
2018-04-30 21:01:23 +01:00
COMMANDHEADER header;
char dirName[256];
};
2021-01-04 15:11:54 -05:00
struct DCLOSECOMMAND
{
COMMANDHEADER header;
uint32 fd;
};
struct DREADCOMMAND
{
COMMANDHEADER header;
uint32 fd;
uint32 dirEntryPtr;
};
2015-12-29 17:42:02 -05:00
struct GETSTATCOMMAND
{
2018-04-30 21:01:23 +01:00
COMMANDHEADER header;
uint32 statBuffer;
char fileName[256];
2015-12-29 17:42:02 -05:00
};
2021-01-04 18:42:16 -05:00
struct CHSTATCOMMAND
{
COMMANDHEADER header;
uint32 flags;
Ioman::STATEX stat;
char path[256];
};
2021-01-02 22:29:29 -05:00
struct FORMATCOMMAND
{
COMMANDHEADER header;
char device[0x400];
char blockDevice[0x400];
char args[0x400];
uint32 argsSize;
};
2021-01-08 18:30:28 -05:00
struct CCODECOMMAND
{
COMMANDHEADER header;
char path[256];
};
2021-01-03 20:08:12 -05:00
struct SYNCCOMMAND
{
COMMANDHEADER header;
char deviceName[0x400];
uint32 flags;
};
2016-03-21 07:16:32 -07:00
struct MOUNTCOMMAND
{
2018-04-30 21:01:23 +01:00
COMMANDHEADER header;
char fileSystemName[0x100];
char unused[0x300];
char deviceName[0x400];
2016-03-21 07:16:32 -07:00
};
2016-03-24 23:07:01 -04:00
struct UMOUNTCOMMAND
{
2018-04-30 21:01:23 +01:00
COMMANDHEADER header;
char deviceName[0x100];
2016-03-24 23:07:01 -04:00
};
2021-01-06 10:54:25 -05:00
struct SEEK64COMMAND
{
COMMANDHEADER header;
uint32 fd;
int64 offset;
uint32 whence;
uint32 dummy;
};
static_assert(sizeof(SEEK64COMMAND) == 0x20, "SEEK64COMMAND needs to be 0x20 bytes long.");
2016-03-16 15:10:47 -07:00
struct DEVCTLCOMMAND
{
2018-04-30 21:01:23 +01:00
COMMANDHEADER header;
char device[0x100];
char unused[0x300];
char inputBuffer[0x400];
uint32 cmdId;
uint32 inputSize;
uint32 outputPtr;
uint32 outputSize;
};
2021-01-02 22:28:26 -05:00
struct IOCTL2COMMAND
{
COMMANDHEADER header;
uint32 fd;
uint32 cmdId;
char inputBuffer[0x400];
uint32 outputPtr;
uint32 outputSize;
uint32 inputSize;
};
struct REPLYHEADER
{
2018-04-30 21:01:23 +01:00
uint32 semaphoreId;
uint32 commandId;
uint32 resultPtr;
uint32 resultSize;
};
struct GENERICREPLY
{
2018-04-30 21:01:23 +01:00
REPLYHEADER header;
uint32 result;
uint32 unknown2 = 0;
uint32 unknown3 = 0;
uint32 unknown4 = 0;
};
2021-01-08 18:30:28 -05:00
struct CLOSEREPLY
{
2018-04-30 21:01:23 +01:00
REPLYHEADER header;
uint32 result;
uint32 unknown2;
uint32 unknown3;
uint32 unknown4;
};
struct READREPLY
{
2018-04-30 21:01:23 +01:00
REPLYHEADER header;
uint32 result;
uint32 unknown2;
uint32 unknown3;
uint32 unknown4;
};
2021-01-04 15:11:54 -05:00
struct DREADREPLY
{
REPLYHEADER header;
uint32 result;
uint32 dirEntryPtr;
uint32 unknown3;
uint32 unknown4;
};
2015-12-29 17:42:02 -05:00
struct GETSTATREPLY
{
2018-04-30 21:01:23 +01:00
REPLYHEADER header;
uint32 result;
uint32 dstPtr;
Ioman::STAT stat;
2015-12-29 17:42:02 -05:00
};
2021-01-08 18:30:28 -05:00
2021-01-06 10:54:25 -05:00
struct SEEK64REPLY
{
REPLYHEADER header;
uint64 result;
uint32 unknown3;
uint32 unknown4;
};
2015-12-29 17:42:02 -05:00
2018-04-30 21:01:23 +01:00
uint32 InvokeOpen(uint32*, uint32, uint32*, uint32, uint8*);
uint32 InvokeClose(uint32*, uint32, uint32*, uint32, uint8*);
uint32 InvokeRead(uint32*, uint32, uint32*, uint32, uint8*);
2021-01-03 20:07:29 -05:00
uint32 InvokeWrite(uint32*, uint32, uint32*, uint32, uint8*);
2018-04-30 21:01:23 +01:00
uint32 InvokeSeek(uint32*, uint32, uint32*, uint32, uint8*);
2021-01-08 10:36:12 -05:00
uint32 InvokeRemove(uint32*, uint32, uint32*, uint32, uint8*);
2021-01-04 17:43:21 -05:00
uint32 InvokeMkdir(uint32*, uint32, uint32*, uint32, uint8*);
2021-01-08 10:36:12 -05:00
uint32 InvokeRmdir(uint32*, uint32, uint32*, uint32, uint8*);
2018-04-30 21:01:23 +01:00
uint32 InvokeDopen(uint32*, uint32, uint32*, uint32, uint8*);
2021-01-04 15:11:54 -05:00
uint32 InvokeDclose(uint32*, uint32, uint32*, uint32, uint8*);
uint32 InvokeDread(uint32*, uint32, uint32*, uint32, uint8*);
2018-04-30 21:01:23 +01:00
uint32 InvokeGetStat(uint32*, uint32, uint32*, uint32, uint8*);
2021-01-04 18:42:16 -05:00
uint32 InvokeChstat(uint32*, uint32, uint32*, uint32, uint8*);
2021-01-02 22:29:29 -05:00
uint32 InvokeFormat(uint32*, uint32, uint32*, uint32, uint8*);
2021-01-06 13:33:20 -05:00
uint32 InvokeChdir(uint32*, uint32, uint32*, uint32, uint8*);
2021-01-03 20:08:12 -05:00
uint32 InvokeSync(uint32*, uint32, uint32*, uint32, uint8*);
2018-04-30 21:01:23 +01:00
uint32 InvokeMount(uint32*, uint32, uint32*, uint32, uint8*);
uint32 InvokeUmount(uint32*, uint32, uint32*, uint32, uint8*);
2021-01-06 10:54:25 -05:00
uint32 InvokeSeek64(uint32*, uint32, uint32*, uint32, uint8*);
2018-04-30 21:01:23 +01:00
uint32 InvokeDevctl(uint32*, uint32, uint32*, uint32, uint8*);
2021-01-02 22:28:26 -05:00
uint32 InvokeIoctl2(uint32*, uint32, uint32*, uint32, uint8*);
2018-04-30 21:01:23 +01:00
void CopyHeader(REPLYHEADER&, const COMMANDHEADER&);
void PrepareGenericReply(uint8*, const COMMANDHEADER&, COMMANDID, uint32);
void SendPendingReply(uint8*);
2018-04-30 21:01:23 +01:00
void SendSifReply();
CSifMan& m_sifMan;
uint32 m_resultPtr[2];
PENDINGREPLY m_pendingReply;
};
};