From ed9905785fef282414e68d91a4aca8b0ff75c821 Mon Sep 17 00:00:00 2001 From: Thog Date: Thu, 16 Aug 2018 00:04:13 +0200 Subject: [PATCH] Update SwIPC submodule This also add enum and versioning support. Please note that actual SwIPC master doesn't have parameters for LaunchProcess (in pm:shel) --- Ctu.h | 19 ++++++ SwIPC | 2 +- generateIpcStubs.py | 76 ++++++++++++++++++------ ipcimpl/bsd.cpp | 11 ++-- ipcimpl/fsp.cpp | 141 +++++++++++++++++++++++--------------------- ipcimpl/lm.cpp | 2 +- ipcimpl/nim.cpp | 4 +- ipcimpl/pm.cpp | 4 +- 8 files changed, 165 insertions(+), 94 deletions(-) diff --git a/Ctu.h b/Ctu.h index 43ac280..d938d30 100644 --- a/Ctu.h +++ b/Ctu.h @@ -221,4 +221,23 @@ private: unordered_map> handles; }; +// TODO: move this/autogenerate this +#define VERSION_1_0_0 0 +#define VERSION_2_0_0 1 +#define VERSION_2_1_0 2 +#define VERSION_2_2_0 3 +#define VERSION_2_3_0 4 +#define VERSION_3_0_0 5 +#define VERSION_3_0_1 6 +#define VERSION_3_0_2 7 +#define VERSION_4_0_0 8 +#define VERSION_4_0_1 9 +#define VERSION_4_1_0 10 +#define VERSION_5_0_0 11 +#define VERSION_5_0_1 12 +#define VERSION_5_0_2 13 +#define VERSION_5_1_0 14 + +#define TARGET_VERSION VERSION_5_1_0 + #include "IpcStubs.h" diff --git a/SwIPC b/SwIPC index 4282eba..9bb8420 160000 --- a/SwIPC +++ b/SwIPC @@ -1 +1 @@ -Subproject commit 4282ebae9017873b6ae9940e781ef6026026282c +Subproject commit 9bb842022806979ce6f6c97dce686c378c386c86 diff --git a/generateIpcStubs.py b/generateIpcStubs.py index 674d6fb..aedeca9 100644 --- a/generateIpcStubs.py +++ b/generateIpcStubs.py @@ -67,15 +67,15 @@ def splitByNs(obj): ons[ns][name] = x return ons -def retype(spec, noIndex=False, forStruct=False): +def retype(spec, noIndex=False, noArray=False): if spec[0] == 'unknown': return 'uint8_t' elif spec[0] == 'bytes': - if forStruct: + if noArray: return 'uint8_t' return 'uint8_t%s' % ('[%s]' % emitInt(spec[1]) if not noIndex else ' *') else: - return typemap[spec[0]] if spec[0] in typemap else spec[0] + return typemap[spec[0]] if spec[0] in typemap else spec[0]; def formatParam(param, input, i): name, spec = param @@ -92,7 +92,7 @@ def formatParam(param, input, i): elif spec[0] == 'unknown': assert False elif spec[0] == 'buffer': - type = '%s *' % retype(spec[1]) + type = '%s *' % retype(spec[1], noArray=True) hasSize = True elif spec[0] == 'array': type = retype(spec[1]) + ' *' @@ -112,7 +112,6 @@ def formatParam(param, input, i): type = type[:-len(arrspec)] else: arrspec = '' - return '%s %s%s %s%s%s' % ('IN' if input else 'OUT', type, '&' if not input and (not type.endswith('*') and not arrspec) else '', name, arrspec, ', guint %s_size' % name if hasSize else '') def generatePrototype(func): @@ -125,7 +124,7 @@ def isPointerType(type): return True elif type[0] in allTypes: return isPointerType(allTypes[type[0]]) - elif type[0] == 'struct': + elif type[0] == 'struct' or type[0] == 'enum': return False return True @@ -156,9 +155,9 @@ def generateCaller(qname, fname, func): yield 'auto %s = req.getBuffer(%s, %i, %s);' % (an, emitInt(rest[1]), cbo, sn) yield 'auto %s = new uint8_t[%s];' % (bn, sn) yield 'ctu->cpu.readmem(%s, %s, %s);' % (an, bn, sn) - params.append('(%s *) %s' % (retype(rest[0]), bn)) + params.append('(%s *) %s' % (retype(rest[0], noArray=True), bn)) params.append(sn) - logFmt.append('%s *%s= buffer<0x" ADDRFMT ">' % (retype(rest[0]), '%s ' % name if name else '')) + logFmt.append('%s *%s= buffer<0x" ADDRFMT ">' % (retype(rest[0], noArray=True), '%s ' % name if name else '')) logElems.append(sn) bufSizes += 1 yield AFTER, 'delete[] %s;' % bn @@ -301,6 +300,29 @@ def parsePartials(code): code = '\n'.join(re.findall(r'/\*\$IPC\$(.*?)\*/', code, re.M|re.S)) return partialparser.parse(code) +def getVersionName(version): + if version == None: + return None + return "VERSION_%s" % version.replace(".", "_") + +def getVersionId(target_version): + for id, version in enumerate(idparser.versionInfo): + if (version == target_version): + return id + return -1 + + +def generateVersionChecks(first_version, last_version): + first_version_id = getVersionId(first_version) + last_version_id = getVersionId(last_version) + if first_version_id > 0 and last_version_id != -1: + return '#if TARGET_VERSION >= %s && TARGET_VERSION <= %s' % (getVersionName(first_version), getVersionName(last_version)) + if first_version_id > 0: + return '#if TARGET_VERSION >= %s' % getVersionName(first_version) + elif last_version_id != -1: + return '#if TARGET_VERSION <= %s' % getVersionName(last_version) + return None + usedInts = [] def uniqInt(*args): args = ''.join(map(str, args)) @@ -314,15 +336,7 @@ def uniqInt(*args): def main(): global allTypes - fns = ['SwIPC/ipcdefs/auto.id'] + [x for x in glob.glob('SwIPC/ipcdefs/*.id') if x != 'SwIPC/ipcdefs/auto.id'] - - if os.path.exists('SwIPC/ipcdefs/cache') and all(os.path.getmtime('SwIPC/ipcdefs/cache') > os.path.getmtime(x) for x in fns): - res = json.load(file('SwIPC/ipcdefs/cache')) - else: - res = idparser.parse('\n'.join(file(fn).read() for fn in fns)) - with file('SwIPC/ipcdefs/cache', 'w') as fp: - json.dump(res, fp) - types, ifaces, services = res + types, ifaces, services = idparser.getAll() allTypes = types @@ -339,7 +353,12 @@ def main(): extra_data = '' if sub_spec[1][0] == 'bytes': extra_data = '[%s]' % emitInt(sub_spec[1][1]) - namespaces[ns].append('\t%s %s%s;' % (retype(sub_spec[1], forStruct=True), sub_spec[0], extra_data)) + namespaces[ns].append('\t%s %s%s;' % (retype(sub_spec[1], noArray=True), sub_spec[0], extra_data)) + namespaces[ns].append('};') + elif spec[0] == 'enum': + namespaces[ns].append('using %s = enum {' % (name)) + for sub_spec in spec[1:][0]: + namespaces[ns].append('\t%s = %d,' % (sub_spec[0], sub_spec[1])) namespaces[ns].append('};') else: retyped, plain = retype(spec, noIndex=True), retype(spec) @@ -354,6 +373,12 @@ def main(): print >>fp, '#include "Ctu.h"' print >>fp + for id, version in enumerate(idparser.versionInfo): + version = getVersionName(version) + print >>fp,"#ifndef %s" % (version) + print >>fp, "#define %s %d" % (version, id) + print >>fp, "#endif\n" + print >>fp, '#define SERVICE_MAPPING() do { \\' for iname, snames in sorted(services.items(), key=lambda x: x[0]): for sname in snames: @@ -397,9 +422,14 @@ def main(): print >>fp, '\t\tuint32_t dispatch(IncomingIpcMessage &req, OutgoingIpcMessage &resp) {' print >>fp, '\t\t\tswitch(req.cmdId) {' for func in sorted(funcs['cmds'], key=lambda x: x['cmdId']): + conditional_case = generateVersionChecks(func['versionAdded'], func['lastVersion']) + if conditional_case != None: + print >>fp, '\t\t\t%s' % conditional_case print >>fp, '\t\t\tcase %i: {' % func['cmdId'] print >>fp, '\n'.join('\t\t\t\t' + x for x in reorder(generateCaller(qname, func['name'], func))) print >>fp, '\t\t\t}' + if conditional_case != None: + print >>fp, '\t\t\t#endif' print >>fp, '\t\t\tdefault:' print >>fp, '\t\t\t\tLOG_ERROR(IpcStubs, "Unknown message cmdId %%u to interface %s", req.cmdId);' % ('%s::%s' % (ns, name) if ns else name) print >>fp, '\t\t\t}' @@ -407,7 +437,12 @@ def main(): for func in sorted(funcs['cmds'], key=lambda x: x['name']): fname = func['name'] implemented = re.search('[^a-zA-Z0-9:]%s::%s[^a-zA-Z0-9:]' % (qname, fname), allcode) + conditional_case = generateVersionChecks(func['versionAdded'], func['lastVersion']) + if conditional_case != None: + print >>fp, '\t\t%s' % conditional_case print >>fp, '\t\tuint32_t %s(%s);' % (fname, generatePrototype(func)) + if conditional_case != None: + print >>fp, '\t\t#endif' if partial: for x in partial[0]: print >>fp, '\t\t%s' % x @@ -422,6 +457,9 @@ def main(): fname = func['name'] implemented = re.search('[^a-zA-Z0-9:]%s::%s[^a-zA-Z0-9:]' % (qname, fname), allcode) if not implemented: + conditional_case = generateVersionChecks(func['versionAdded'], func['lastVersion']) + if conditional_case != None: + print >>fp, '%s' % conditional_case print >>fp, 'uint32_t %s::%s(%s) {' % (qname, fname, generatePrototype(func)) print >>fp, '\tLOG_DEBUG(IpcStubs, "Stub implementation for %s::%s");' % (qname, fname) for i, (name, elem) in enumerate(func['outputs']): @@ -436,6 +474,8 @@ def main(): print >>fp, '\t%s = make_shared(0x%x);' % (name, uniqInt(qname, fname, name)) print >>fp, '\treturn 0;' print >>fp, '}' + if conditional_case != None: + print >>fp, '#endif' print >>fp, '#endif // DEFINE_STUBS' code = fp.getvalue() diff --git a/ipcimpl/bsd.cpp b/ipcimpl/bsd.cpp index a30326c..8722503 100644 --- a/ipcimpl/bsd.cpp +++ b/ipcimpl/bsd.cpp @@ -27,7 +27,7 @@ nn::socket::sf::IClient::IClient(Ctu *_ctu) : IpcService(_ctu) { passthrough = _ctu->socketsEnabled; } -uint32_t nn::socket::sf::IClient::Accept(IN uint32_t socket, OUT int32_t& ret, OUT uint32_t& bsd_errno, OUT uint32_t& sockaddr_len, OUT sockaddr * _4, guint _4_size) { +uint32_t nn::socket::sf::IClient::Accept(IN uint32_t socket, OUT int32_t& ret, OUT uint32_t& bsd_errno, OUT uint32_t& sockaddr_len, OUT nn::socket::sockaddr_in * _4, guint _4_size) { LOG_DEBUG(IpcStubs, "Stub implementation for nn::socket::sf::IClient::accept"); if(passthrough) { struct sockaddr *addr = (struct sockaddr *) _4; @@ -42,7 +42,8 @@ uint32_t nn::socket::sf::IClient::Accept(IN uint32_t socket, OUT int32_t& ret, O } return 0; } -uint32_t nn::socket::sf::IClient::Bind(IN uint32_t socket, IN sockaddr * _1, guint _1_size, OUT int32_t& ret, OUT uint32_t& bsd_errno) { + +uint32_t nn::socket::sf::IClient::Bind(IN uint32_t socket, IN nn::socket::sockaddr_in * _1, guint _1_size, OUT int32_t& ret, OUT uint32_t& bsd_errno) { LOG_DEBUG(IpcStubs, "Stub implementation for nn::socket::sf::IClient::bind"); if(passthrough) { struct sockaddr *addr = (struct sockaddr *) _1; @@ -66,7 +67,7 @@ uint32_t nn::socket::sf::IClient::Close(IN uint32_t socket, OUT int32_t& ret, OU } return 0; } -uint32_t nn::socket::sf::IClient::Connect(IN uint32_t socket, IN sockaddr * _1, guint _1_size, OUT int32_t& ret, OUT uint32_t& bsd_errno) { +uint32_t nn::socket::sf::IClient::Connect(IN uint32_t socket, IN nn::socket::sockaddr_in * _1, guint _1_size, OUT int32_t& ret, OUT uint32_t& bsd_errno) { LOG_DEBUG(IpcStubs, "Stub implementation for nn::socket::sf::IClient::connect"); if(passthrough) { struct sockaddr *addr = (struct sockaddr *) _1; @@ -79,7 +80,7 @@ uint32_t nn::socket::sf::IClient::Connect(IN uint32_t socket, IN sockaddr * _1, } return 0; } -uint32_t nn::socket::sf::IClient::GetSockName(IN uint32_t socket, OUT int32_t& ret, OUT uint32_t& bsd_errno, OUT uint32_t& sockaddr_len, OUT sockaddr * _4, guint _4_size) { +uint32_t nn::socket::sf::IClient::GetSockName(IN uint32_t socket, OUT int32_t& ret, OUT uint32_t& bsd_errno, OUT uint32_t& sockaddr_len, OUT nn::socket::sockaddr_in * _4, guint _4_size) { LOG_DEBUG(IpcStubs, "Stub implementation for nn::socket::sf::IClient::getsockname"); if(passthrough) { struct sockaddr *addr = (struct sockaddr *) _4; @@ -128,7 +129,7 @@ uint32_t nn::socket::sf::IClient::Send(IN uint32_t socket, IN uint32_t flags, IN } return 0; } -uint32_t nn::socket::sf::IClient::SendTo(IN uint32_t socket, IN uint32_t flags, IN int8_t * _2, guint _2_size, IN sockaddr * _3, guint _3_size, OUT int32_t& ret, OUT uint32_t& bsd_errno) { +uint32_t nn::socket::sf::IClient::SendTo(IN uint32_t socket, IN uint32_t flags, IN int8_t * _2, guint _2_size, IN nn::socket::sockaddr_in * _3, guint _3_size, OUT int32_t& ret, OUT uint32_t& bsd_errno) { LOG_DEBUG(IpcStubs, "Stub implementation for nn::socket::sf::IClient::sendto"); if(passthrough) { struct sockaddr *addr = (struct sockaddr *) _3; diff --git a/ipcimpl/fsp.cpp b/ipcimpl/fsp.cpp index ad6dbf9..a889e9b 100644 --- a/ipcimpl/fsp.cpp +++ b/ipcimpl/fsp.cpp @@ -60,7 +60,7 @@ uint32_t nn::fssrv::sf::IStorage::GetSize(OUT uint64_t& size) { LOG_DEBUG(Fsp, "Failed to get file size!"); return 0; } -uint32_t nn::fssrv::sf::IStorage::Read(IN uint64_t offset, IN uint64_t length, OUT int8_t * buffer, guint buffer_size) { +uint32_t nn::fssrv::sf::IStorage::Read(IN uint64_t offset, IN uint64_t length, OUT uint8_t * buffer, guint buffer_size) { if(isOpen && fp != nullptr) { uint32_t s = ((uint32_t)buffer_size < (uint32_t)length ? (uint32_t)buffer_size : (uint32_t)length); bufferOffset = offset; @@ -87,7 +87,7 @@ uint32_t nn::fssrv::sf::IStorage::SetSize(IN uint64_t size) { } return 0; } -uint32_t nn::fssrv::sf::IStorage::Write(IN uint64_t offset, IN uint64_t length, IN int8_t * data, guint data_size) { +uint32_t nn::fssrv::sf::IStorage::Write(IN uint64_t offset, IN uint64_t length, IN uint8_t * data, guint data_size) { if(isOpen && fp != nullptr) { bufferOffset = offset; uint32_t s = ((uint32_t)data_size < (uint32_t)length ? (uint32_t)data_size : (uint32_t)length); @@ -106,19 +106,21 @@ uint32_t nn::fssrv::sf::IStorage::Write(IN uint64_t offset, IN uint64_t length, } // Funcs -uint32_t nn::fssrv::sf::IFileSystemProxy::OpenBisPartition(IN nn::fssrv::sf::Partition partitionID, OUT shared_ptr& BisPartition) { - LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenBisPartition"); +uint32_t nn::fssrv::sf::IFileSystemProxy::OpenBisStorage(IN nn::fssrv::sf::Partition partitionID, OUT shared_ptr& BisPartition) { + LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenBisStorage"); BisPartition = buildInterface(nn::fssrv::sf::IStorage, "bis.istorage"); return 0x0; } -uint32_t nn::fssrv::sf::IFileSystemProxy::OpenDataStorageByApplicationId(IN nn::ApplicationId tid, OUT shared_ptr& dataStorage) { - LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenDataStorageByApplicationId 0x" ADDRFMT, tid); +#if TARGET_VERSION >= VERSION_3_0_0 +uint32_t nn::fssrv::sf::IFileSystemProxy::OpenDataStorageByProgramId(IN nn::ApplicationId tid, OUT shared_ptr& dataStorage) { + LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenDataStorageByProgramId 0x" ADDRFMT, tid); std::stringstream ss; ss << "tid_archives_" << hex << tid << ".istorage"; dataStorage = buildInterface(nn::fssrv::sf::IStorage, ss.str()); return 0; } +#endif uint32_t nn::fssrv::sf::IFileSystemProxy::OpenDataStorageByCurrentProcess(OUT shared_ptr& dataStorage) { LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenDataStorageByCurrentProcess"); @@ -127,22 +129,23 @@ uint32_t nn::fssrv::sf::IFileSystemProxy::OpenDataStorageByCurrentProcess(OUT sh return 0; } -uint32_t nn::fssrv::sf::IFileSystemProxy::OpenDataStorageByDataId(IN nn::ApplicationId tid, IN uint8_t storageId, OUT shared_ptr& dataStorage) { - LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenDataStorageByDataId 0x" ADDRFMT, 0x0100000000000800+(uint64_t)storageId); +uint32_t nn::fssrv::sf::IFileSystemProxy::OpenDataStorageByDataId(IN uint8_t storageId, IN nn::ApplicationId tid, OUT shared_ptr& dataStorage) { + LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenDataStorageByDataId 0x" ADDRFMT, tid); std::stringstream ss; - ss << "archives/" << hex << setw(16) << setfill('0') << 0x0100000000000800+(uint64_t)storageId << ".istorage"; + ss << "archives/" << hex << setw(16) << setfill('0') << tid << ".istorage"; + dataStorage = buildInterface(nn::fssrv::sf::IStorage, ss.str()); return 0; } -uint32_t nn::fssrv::sf::IFileSystemProxy::OpenGameCardPartition(IN nn::fssrv::sf::Partition partitionID, IN uint32_t _1, OUT shared_ptr& gameCardFs) { - LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenGameCardPartition"); +uint32_t nn::fssrv::sf::IFileSystemProxy::OpenGameCardStorage(IN nn::fssrv::sf::Partition partitionID, IN uint32_t _1, OUT shared_ptr& gameCardFs) { + LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenGameCardStorage"); gameCardFs = buildInterface(nn::fssrv::sf::IStorage, "GamePartition.istorage"); return 0; } -uint32_t nn::fssrv::sf::IFileSystemProxy::OpenRomStorage(OUT shared_ptr& _0) { - LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenRomStorage"); +uint32_t nn::fssrv::sf::IFileSystemProxy::OpenPatchDataStorageByCurrentProcess(OUT shared_ptr& _0) { + LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenPatchDataStorageByCurrentProcess"); _0 = buildInterface(nn::fssrv::sf::IStorage, "RomStorage.istorage"); return 0; } @@ -156,13 +159,13 @@ nn::fssrv::sf::IFileSystem::IFileSystem(Ctu *_ctu, string _fnPath) : IpcService LOG_DEBUG(Fsp, "Open path %s", fnPath.c_str()); } -uint32_t nn::fssrv::sf::IFileSystem::DeleteFile(IN int8_t * path, guint path_size) { +uint32_t nn::fssrv::sf::IFileSystem::DeleteFile(IN uint8_t * path, guint path_size) { LOG_DEBUG(Fsp, "Delete file %s", (fnPath+string((char*)path)).c_str()); remove((fnPath+string((char*)path)).c_str()); return 0; } -uint32_t nn::fssrv::sf::IFileSystem::CreateFile(IN uint32_t mode, IN uint64_t size, IN int8_t * path, guint path_size) { +uint32_t nn::fssrv::sf::IFileSystem::CreateFile(IN uint32_t mode, IN uint64_t size, IN uint8_t * path, guint path_size) { LOG_DEBUG(Fsp, "Create file %s", (fnPath+string((char*)path)).c_str()); FILE *fp = fopen((fnPath+string((char*)path)).c_str(), "wb"); if(!fp) @@ -171,22 +174,22 @@ uint32_t nn::fssrv::sf::IFileSystem::CreateFile(IN uint32_t mode, IN uint64_t si return 0; } -uint32_t nn::fssrv::sf::IFileSystem::CreateDirectory(IN int8_t * path, guint path_size) { +uint32_t nn::fssrv::sf::IFileSystem::CreateDirectory(IN uint8_t * path, guint path_size) { LOG_DEBUG(Fsp, "Create directory %s", (fnPath+string((char*)path)).c_str()); if (mkdir((fnPath+string((char*)path)).c_str(), 0755) == -1) return 0x7d402; return 0; } -uint32_t nn::fssrv::sf::IFileSystem::GetEntryType(IN int8_t * path, guint path_size, OUT uint32_t& _1) { +uint32_t nn::fssrv::sf::IFileSystem::GetEntryType(IN uint8_t * path, guint path_size, OUT nn::fssrv::sf::DirectoryEntryType& _1) { LOG_DEBUG(IpcStubs, "GetEntryType for file %s", (fnPath + string((char*)path)).c_str()); struct stat path_stat; stat((fnPath+string((char*)path)).c_str(), &path_stat); if (S_ISREG(path_stat.st_mode)) - _1 = 1; + _1 = File; else if (S_ISDIR(path_stat.st_mode)) - _1 = 0; + _1 = Directory; else return 0x271002; return 0; @@ -194,95 +197,111 @@ uint32_t nn::fssrv::sf::IFileSystem::GetEntryType(IN int8_t * path, guint path_s // Funcs +#if TARGET_VERSION == VERSION_1_0_0 +uint32_t nn::fssrv::sf::IFileSystemProxy::OpenFileSystem(IN nn::fssrv::sf::FileSystemType filesystem_type, IN nn::ApplicationId tid, IN uint8_t * path, guint path_size, OUT shared_ptr& contentFs) { + LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenFileSystem"); + contentFs = buildInterface(nn::fssrv::sf::IFileSystem, ""); + return 0; +} +#endif + uint32_t nn::fssrv::sf::IFileSystemProxy::OpenDataFileSystemByCurrentProcess(OUT shared_ptr& _0) { LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenDataFileSystemByCurrentProcess"); _0 = buildInterface(nn::fssrv::sf::IFileSystem, ""); return 0; } -uint32_t nn::fssrv::sf::IFileSystemProxy::MountContent7(IN nn::ApplicationId tid, IN uint32_t ncaType, OUT shared_ptr& _2) { - LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::MountContent7"); +#if TARGET_VERSION >= VERSION_2_0_0 +uint32_t nn::fssrv::sf::IFileSystemProxy::OpenFileSystemWithPatch(IN nn::fssrv::sf::FileSystemType filesystem_type, IN nn::ApplicationId tid, OUT shared_ptr& _2) { + LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenFileSystemWithPatch"); _2 = buildInterface(nn::fssrv::sf::IFileSystem, ""); return 0; } +#endif -uint32_t nn::fssrv::sf::IFileSystemProxy::MountContent(IN nn::ApplicationId tid, IN uint32_t flag, IN int8_t * path, guint path_size, OUT shared_ptr& contentFs) { - LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::MountContent"); +#if TARGET_VERSION >= VERSION_2_0_0 +uint32_t nn::fssrv::sf::IFileSystemProxy::OpenFileSystemWithId(IN nn::fssrv::sf::FileSystemType filesystem_type, IN nn::ApplicationId tid, IN uint8_t * path, guint path_size, OUT shared_ptr& contentFs) { + LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenFileSystemWithId"); contentFs = buildInterface(nn::fssrv::sf::IFileSystem, ""); return 0; } +#endif +#if TARGET_VERSION >= VERSION_3_0_0 uint32_t nn::fssrv::sf::IFileSystemProxy::OpenDataFileSystemByApplicationId(IN nn::ApplicationId tid, OUT shared_ptr& dataFiles) { LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenDataFileSystemByApplicationId"); dataFiles = buildInterface(nn::fssrv::sf::IFileSystem, ""); return 0; } +#endif -uint32_t nn::fssrv::sf::IFileSystemProxy::MountBis(IN nn::fssrv::sf::Partition partitionID, IN int8_t * path, guint path_size, OUT shared_ptr& Bis) { - LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::MountBis"); +uint32_t nn::fssrv::sf::IFileSystemProxy::OpenBisFileSystem(IN nn::fssrv::sf::Partition partitionID, IN uint8_t * path, guint path_size, OUT shared_ptr& Bis) { + LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenBisFileSystem"); Bis = buildInterface(nn::fssrv::sf::IFileSystem, string("BIS/") + to_string(partitionID)); return 0; } -uint32_t nn::fssrv::sf::IFileSystemProxy::OpenHostFileSystemImpl(IN int8_t * path, guint path_size, OUT shared_ptr& _1) { - LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenHostFileSystemImpl"); +uint32_t nn::fssrv::sf::IFileSystemProxy::OpenHostFileSystem(IN uint8_t * path, guint path_size, OUT shared_ptr& _1) { + LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenHostFileSystem"); _1 = buildInterface(nn::fssrv::sf::IFileSystem, ""); return 0; } -uint32_t nn::fssrv::sf::IFileSystemProxy::MountSdCard(OUT shared_ptr& sdCard) { - LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::MountSdCard"); +uint32_t nn::fssrv::sf::IFileSystemProxy::OpenSdCardFileSystem(OUT shared_ptr& sdCard) { + LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenSdCardFileSystem"); sdCard = buildInterface(nn::fssrv::sf::IFileSystem, "SDCard"); return 0; } -uint32_t nn::fssrv::sf::IFileSystemProxy::MountGameCardPartition(IN uint32_t _0, IN uint32_t _1, OUT shared_ptr& gameCardPartitionFs) { - LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::MountGameCardPartition"); +uint32_t nn::fssrv::sf::IFileSystemProxy::OpenGameCardFileSystem(IN uint32_t _0, IN uint32_t _1, OUT shared_ptr& gameCardPartitionFs) { + LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenGameCardFileSystem"); gameCardPartitionFs = buildInterface(nn::fssrv::sf::IFileSystem, "GameCard"); return 0; } -uint32_t nn::fssrv::sf::IFileSystemProxy::MountSaveData(IN uint8_t input, IN nn::fssrv::sf::SaveStruct saveStruct, OUT shared_ptr& saveDataFs) { +uint32_t nn::fssrv::sf::IFileSystemProxy::OpenSaveDataFileSystem(IN uint8_t input, IN nn::fssrv::sf::SaveStruct saveStruct, OUT shared_ptr& saveDataFs) { uint64_t tid = *(uint64_t *)(&saveStruct[0x18]); - LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::MountSaveData 0x" ADDRFMT, tid); + LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenSaveDataFileSystem 0x" ADDRFMT, tid); std::stringstream ss; ss << "save_" << hex << tid; saveDataFs = buildInterface(nn::fssrv::sf::IFileSystem, ss.str()); return 0; } -uint32_t nn::fssrv::sf::IFileSystemProxy::MountSystemSaveData(IN uint8_t input, IN nn::fssrv::sf::SaveStruct saveStruct, OUT shared_ptr& systemSaveDataFs) { +uint32_t nn::fssrv::sf::IFileSystemProxy::OpenSaveDataFileSystemBySystemSaveDataId(IN uint8_t input, IN nn::fssrv::sf::SaveStruct saveStruct, OUT shared_ptr& systemSaveDataFs) { uint64_t tid = *(uint64_t *)(&saveStruct[0x18]); - LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::MountSystemSaveData 0x" ADDRFMT, tid); + LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenSaveDataFileSystemBySystemSaveDataId 0x" ADDRFMT, tid); std::stringstream ss; ss << "syssave_" << hex << tid; systemSaveDataFs = buildInterface(nn::fssrv::sf::IFileSystem, ss.str()); return 0; } -uint32_t nn::fssrv::sf::IFileSystemProxy::MountSaveDataReadOnly(IN uint8_t input, IN nn::fssrv::sf::SaveStruct saveStruct, OUT shared_ptr& saveDataFs) { +#if TARGET_VERSION >= VERSION_2_0_0 +uint32_t nn::fssrv::sf::IFileSystemProxy::OpenReadOnlySaveDataFileSystem(IN uint8_t input, IN nn::fssrv::sf::SaveStruct saveStruct, OUT shared_ptr& saveDataFs) { uint64_t tid = *(uint64_t *)(&saveStruct[0x18]); - LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::MountSaveDataReadOnly 0x" ADDRFMT, tid); + LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenReadOnlySaveDataFileSystem 0x" ADDRFMT, tid); std::stringstream ss; ss << "save_" << hex << tid; saveDataFs = buildInterface(nn::fssrv::sf::IFileSystem, ss.str()); return 0; } +#endif -uint32_t nn::fssrv::sf::IFileSystemProxy::MountImageDirectory(IN uint32_t _0, OUT shared_ptr& imageFs) { - LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::MountImageDirectory"); +uint32_t nn::fssrv::sf::IFileSystemProxy::OpenImageDirectoryFileSystem(IN uint32_t _0, OUT shared_ptr& imageFs) { + LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenImageDirectoryFileSystem"); imageFs = buildInterface(nn::fssrv::sf::IFileSystem, string("Image_") + to_string(_0)); return 0; } -uint32_t nn::fssrv::sf::IFileSystemProxy::MountContentStorage(IN uint32_t contentStorageID, OUT shared_ptr& contentFs) { - LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::MountContentStorage"); +uint32_t nn::fssrv::sf::IFileSystemProxy::OpenContentStorageFileSystem(IN uint32_t contentStorageID, OUT shared_ptr& contentFs) { + LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenContentStorageFileSystem"); contentFs = buildInterface(nn::fssrv::sf::IFileSystem, string("CS_") + to_string(contentStorageID)); return 0; } -uint32_t nn::fssrv::sf::IFileSystemProxyForLoader::MountCode(IN nn::ApplicationId TID, IN int8_t * contentPath, guint contentPath_size, OUT shared_ptr& contentFs) { - LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxyForLoader::MountCode"); +uint32_t nn::fssrv::sf::IFileSystemProxyForLoader::OpenCodeFileSystem(IN nn::ApplicationId TID, IN uint8_t * contentPath, guint contentPath_size, OUT shared_ptr& contentFs) { + LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxyForLoader::OpenCodeFileSystem"); contentFs = buildInterface(nn::fssrv::sf::IFileSystem, ""); return 0; } @@ -302,20 +321,10 @@ nn::fssrv::sf::IDirectory::IDirectory(Ctu *_ctu, string _fn, uint32_t _filter) } } -struct DirectoryEntry { - char path[0x300]; - uint32_t unk1; - uint8_t entry_type; - uint8_t pad[3]; - uint64_t filesize; -}; -static_assert(sizeof(DirectoryEntry) == 0x310); - -uint32_t nn::fssrv::sf::IDirectory::Read(OUT uint64_t& entries_read, OUT uint8_t * entries_buf, guint entries_buf_len) { - uint64_t entries_count = entries_buf_len / sizeof(DirectoryEntry); +uint32_t nn::fssrv::sf::IDirectory::Read(OUT uint64_t& entries_read, OUT nn::fssrv::sf::IDirectoryEntry * entries, guint entries_buf_len) { + uint64_t entries_count = entries_buf_len / sizeof(nn::fssrv::sf::IDirectoryEntry); LOG_DEBUG(Fsp, "IDirectory::Read: Attempting to read " LONGFMT " entries (from " LONGFMT ")", entries_count, entries_buf_len); - struct DirectoryEntry *entries = (struct DirectoryEntry*)entries_buf; struct dirent *curdir; struct stat curdir_stat; uint64_t i; @@ -324,9 +333,9 @@ uint32_t nn::fssrv::sf::IDirectory::Read(OUT uint64_t& entries_read, OUT uint8_t curdir = readdir((DIR*)fp); if (curdir == nullptr) break; - strcpy(entries[i].path, curdir->d_name); + strcpy((char*)entries[i].path, (char*)curdir->d_name); entries[i].unk1 = 0; - entries[i].entry_type = curdir->d_type == DT_DIR ? 0 : 1; + entries[i].directory_entry_type = curdir->d_type == DT_DIR ? Directory : File; if (stat((fn + std::string("/") + std::string(curdir->d_name)).c_str(), &curdir_stat) == -1) { LOG_DEBUG(Fsp, "We got an error getting size of %s", curdir->d_name); perror("stat"); @@ -374,7 +383,7 @@ uint32_t nn::fssrv::sf::IFile::GetSize(OUT uint64_t& fileSize) { return 0; } -uint32_t nn::fssrv::sf::IFile::Read(IN uint32_t _0, IN uint64_t offset, IN uint64_t size, OUT uint64_t& out_size, OUT int8_t * out_buf, guint out_buf_size) { +uint32_t nn::fssrv::sf::IFile::Read(IN uint32_t _0, IN uint64_t offset, IN uint64_t size, OUT uint64_t& out_size, OUT uint8_t * out_buf, guint out_buf_size) { LOG_DEBUG(Fsp, "IFile::Read from %s from " LONGFMT, fn.c_str(), offset); if(isOpen && fp != nullptr) { uint64_t s = ((uint64_t)out_buf_size < size ? (uint64_t)out_buf_size : size); @@ -389,7 +398,7 @@ uint32_t nn::fssrv::sf::IFile::Read(IN uint32_t _0, IN uint64_t offset, IN uint6 return 0x0; } -uint32_t nn::fssrv::sf::IFile::Write(IN uint32_t _0, IN uint64_t offset, IN uint64_t size, IN int8_t * buf, guint buf_size) { +uint32_t nn::fssrv::sf::IFile::Write(IN uint32_t _0, IN uint64_t offset, IN uint64_t size, IN uint8_t * buf, guint buf_size) { LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFile::Write"); if(isOpen && fp != nullptr) { bufferOffset = offset; @@ -433,7 +442,7 @@ uint32_t nn::fssrv::sf::IFile::SetSize(IN uint64_t size) { } // Funcs -uint32_t nn::fssrv::sf::IFileSystem::OpenFile(IN uint32_t mode, IN int8_t * path, guint path_size, OUT shared_ptr& file) { +uint32_t nn::fssrv::sf::IFileSystem::OpenFile(IN uint32_t mode, IN uint8_t * path, guint path_size, OUT shared_ptr& file) { LOG_DEBUG(Fsp, "OpenFile %s", path); auto tempi = buildInterface(nn::fssrv::sf::IFile, fnPath + "/" + string((char*)path), mode); if(tempi->isOpen) { @@ -443,7 +452,7 @@ uint32_t nn::fssrv::sf::IFileSystem::OpenFile(IN uint32_t mode, IN int8_t * path return 0x7d402; } -uint32_t nn::fssrv::sf::IFileSystem::OpenDirectory(IN uint32_t filter, IN int8_t * path, guint path_size, OUT shared_ptr& dir) { +uint32_t nn::fssrv::sf::IFileSystem::OpenDirectory(IN uint32_t filter, IN uint8_t * path, guint path_size, OUT shared_ptr& dir) { LOG_DEBUG(Fsp, "OpenDirectory %s", path); auto tempi = buildInterface(nn::fssrv::sf::IDirectory, fnPath + "/" + string((char*)path), filter); if(tempi->isOpen) { @@ -453,9 +462,9 @@ uint32_t nn::fssrv::sf::IFileSystem::OpenDirectory(IN uint32_t filter, IN int8_t return 0x7d402; } -uint32_t nn::fssrv::sf::IFileSystemProxy::OpenSaveDataThumbnailFile(IN uint8_t _0, IN uint8_t * _1, IN uint32_t _2, OUT shared_ptr& thumbnail) { - LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenSaveDataThumbnailFile"); - thumbnail = buildInterface(nn::fssrv::sf::IFile, string((char*)_1), _0); +uint32_t nn::fssrv::sf::IFileSystemProxy::OpenSaveDataMetaFile(IN uint8_t _0, IN uint32_t _1, IN uint8_t * _2, OUT shared_ptr& imageFs) { + LOG_DEBUG(Fsp, "Stub implementation for nn::fssrv::sf::IFileSystemProxy::OpenSaveDataMetaFile"); + imageFs = buildInterface(nn::fssrv::sf::IFileSystem, string((char*)_2)); return 0; } @@ -463,8 +472,8 @@ uint32_t nn::fssrv::sf::IFileSystemProxy::OpenSaveDataThumbnailFile(IN uint8_t _ /* ---------------------------------------- End of IFile ---------------------------------------- */ -uint32_t nn::fssrv::sf::IEventNotifier::Unknown0(OUT shared_ptr& _0) { - LOG_DEBUG(IpcStubs, "Stub implementation for nn::fssrv::sf::IEventNotifier::Unknown0"); +uint32_t nn::fssrv::sf::IEventNotifier::GetEventHandle(OUT shared_ptr& _0) { + LOG_DEBUG(IpcStubs, "Stub implementation for nn::fssrv::sf::IEventNotifier::GetEventHandle"); _0 = make_shared(); return 0; } diff --git a/ipcimpl/lm.cpp b/ipcimpl/lm.cpp index f200ee9..10b3db0 100644 --- a/ipcimpl/lm.cpp +++ b/ipcimpl/lm.cpp @@ -78,7 +78,7 @@ void dumpstring(uint8_t *data, guint size) { } } -uint32_t nn::lm::ILogger::Unknown0(IN uint8_t *message, guint messageSize) { +uint32_t nn::lm::ILogger::Initialize(IN uint8_t *message, guint messageSize) { auto packet = (InLogPacket *) message; dumpstring(message, messageSize); diff --git a/ipcimpl/nim.cpp b/ipcimpl/nim.cpp index 2d041b4..aea78ac 100644 --- a/ipcimpl/nim.cpp +++ b/ipcimpl/nim.cpp @@ -1,8 +1,10 @@ #include "Ctu.h" -uint32_t nn::nim::detail::INetworkInstallManager::Unknown40(OUT uint32_t& _0, OUT uint8_t * _1, guint _1_size) { +#if TARGET_VERSION >= VERSION_2_0_0 +uint32_t nn::nim::detail::INetworkInstallManager::ListApplyDeltaTask2(OUT uint32_t& _0, OUT uint8_t * _1, guint _1_size) { LOG_DEBUG(IpcStubs, "Stub implementation for nn::nim::detail::INetworkInstallManager::Unknown40"); memset(_1, 0xDE, _1_size); _0 = 0; return 0; } +#endif diff --git a/ipcimpl/pm.cpp b/ipcimpl/pm.cpp index ce05b6c..467d05a 100644 --- a/ipcimpl/pm.cpp +++ b/ipcimpl/pm.cpp @@ -1,7 +1,7 @@ #include "Ctu.h" -uint32_t nn::pm::detail::IShellInterface::LaunchTitle(IN uint64_t _0, IN nn::ApplicationId tid) { - LOG_DEBUG(Pm::Shell, "Attempted to launch title " ADDRFMT, tid); +uint32_t nn::pm::detail::IShellInterface::LaunchProcess(/*IN uint64_t _0, IN nn::ApplicationId tid*/) { + //LOG_DEBUG(Pm::Shell, "Attempted to launch title " ADDRFMT, tid); return 0; }