#pragma once #include #include "fsa_types.h" namespace iosu { namespace fsa { struct FSARequest { uint32be ukn0; union { uint8 ukn04[0x51C]; struct { MEMPTR dest; uint32be size; uint32be count; uint32be filePos; uint32be fileHandle; uint32be flag; } cmdReadFile; struct { MEMPTR dest; uint32be size; uint32be count; uint32be filePos; uint32be fileHandle; uint32be flag; } cmdWriteFile; struct { uint8 path[FSA_CMD_PATH_MAX_LENGTH]; uint8 mode[12]; // +0x284 note: code seems to access this value like it has a size of 0x10 but the actual struct element is only 12 bytes? Maybe a typo (10 instead of 0x10 in the struct def) uint32be createMode; // +0x290 uint32be openFlags; // +0x294 uint32be preallocSize; // +0x298 } cmdOpenFile; struct { uint32be fileHandle; } cmdCloseFile; struct { uint8 path[FSA_CMD_PATH_MAX_LENGTH]; } cmdRemove; struct { uint8 path[FSA_CMD_PATH_MAX_LENGTH]; uint8 ukn0284[12]; // +0x284 } cmdOpenDir; struct { betype dirHandle; } cmdReadDir; struct { betype dirHandle; } cmdCloseDir; struct { uint8 path[FSA_CMD_PATH_MAX_LENGTH]; uint32be uknParam; } cmdMakeDir; struct { uint8 path[FSA_CMD_PATH_MAX_LENGTH]; } cmdChangeDir; struct { uint8 query[FSA_CMD_PATH_MAX_LENGTH]; uint32be queryType; } cmdQueryInfo; struct { uint8 srcPath[FSA_CMD_PATH_MAX_LENGTH]; uint8 dstPath[FSA_CMD_PATH_MAX_LENGTH]; } cmdRename; struct { uint32be size; uint32be count; uint32be fileHandle; uint32be uknParam; } cmdAppendFile; struct { uint32be fileHandle; } cmdTruncateFile; struct { uint32be fileHandle; } cmdGetStatFile; struct { uint8 path[FSA_CMD_PATH_MAX_LENGTH]; } cmdFlushQuota; struct { uint32be fileHandle; uint32be filePos; } cmdSetPosFile; struct { uint32be fileHandle; } cmdGetPosFile; struct { uint32be fileHandle; } cmdIsEof; struct { uint32be dirHandle; } cmdRewindDir; struct { uint32be fileHandle; } cmdFlushFile; struct { uint8 path[FSA_CMD_PATH_MAX_LENGTH]; uint32be mode1; uint32be mode2; } cmdChangeMode; }; }; static_assert(sizeof(FSARequest) == 0x520); #pragma pack(1) struct FSAResponse { uint32be ukn0; union { uint8 ukn04[0x28F]; struct { uint32be fileHandleOutput; // +0x584 used to return file handle on success } cmdOpenFile; struct { uint32be dirHandleOutput; // +0x584 used to return dir handle on success } cmdOpenDir; struct { uint32be filePos; } cmdGetPosFile; struct { FSStat_t statOut; } cmdStatFile; struct { FSDirEntry_t dirEntry; } cmdReadDir; struct { char path[FSA_CMD_PATH_MAX_LENGTH]; } cmdGetCWD; struct { union { uint8 ukn04[0x64]; struct { uint64be freespace; } queryFreeSpace; struct { FSStat_t stat; } queryStat; struct { FSADeviceInfo_t info; } queryDeviceInfo; }; } cmdQueryInfo; }; }; static_assert(sizeof(FSAResponse) == 0x293); #pragma pack() struct FSAShimBuffer { FSARequest request; uint8 ukn0520[0x60]; FSAResponse response; uint8 ukn0813[0x6D]; IPCIoctlVector ioctlvVec[3]; uint8 ukn08A4[0x5C]; /* +0x0900 */ uint32be operationType; betype fsaDevHandle; /* +0x0908 */ uint16be ipcReqType; // 0 -> IoctlAsync, 1 -> IoctlvAsync uint8 ioctlvVecIn; uint8 ioctlvVecOut; uint32 ukn090C; uint32 ukn0910; uint32 ukn0914; uint32 ukn0918; uint32 ukn091C; uint32 ukn0920; uint32 ukn0924; uint32 ukn0928; uint32 ukn092C; uint32 ukn0930; uint32 ukn0934; }; static_assert(sizeof(FSAShimBuffer) == 0x938); // exact size of this is not known void Initialize(); void Shutdown(); } // namespace fsa } // namespace iosu