diff --git a/src/core/libraries/kernel/file_system.cpp b/src/core/libraries/kernel/file_system.cpp index a2dfcbc1..5708f150 100644 --- a/src/core/libraries/kernel/file_system.cpp +++ b/src/core/libraries/kernel/file_system.cpp @@ -203,6 +203,34 @@ int PS4_SYSV_ABI posix_stat(const char* path, OrbisKernelStat* sb) { return ORBIS_OK; } +s64 PS4_SYSV_ABI sceKernelPread(int d, void* buf, size_t nbytes, s64 offset) { + if (d < 3) { + return ORBIS_KERNEL_ERROR_EPERM; + } + + if (buf == nullptr) { + return ORBIS_KERNEL_ERROR_EFAULT; + } + + if (offset < 0) { + return ORBIS_KERNEL_ERROR_EINVAL; + } + + auto* h = Common::Singleton::Instance(); + auto* file = h->GetFile(d); + + if (file == nullptr) { + return ORBIS_KERNEL_ERROR_EBADF; + } + file->m_mutex.lock(); + if (file->f.Tell() != offset) { + file->f.Seek(offset); + } + u32 bytes_read = file->f.ReadRaw(buf, static_cast(nbytes)); + file->m_mutex.unlock(); + return bytes_read; +} + void fileSystemSymbolsRegister(Core::Loader::SymbolsResolver* sym) { LIB_FUNCTION("1G3lF1Gg1k8", "libkernel", 1, "libkernel", 1, 1, sceKernelOpen); LIB_FUNCTION("wuCroIGjt2g", "libScePosix", 1, "libkernel", 1, 1, posix_open); @@ -216,6 +244,7 @@ void fileSystemSymbolsRegister(Core::Loader::SymbolsResolver* sym) { LIB_FUNCTION("1-LFLmRFxxM", "libkernel", 1, "libkernel", 1, 1, sceKernelMkdir); LIB_FUNCTION("eV9wAD2riIA", "libkernel", 1, "libkernel", 1, 1, sceKernelStat); LIB_FUNCTION("E6ao34wPw+U", "libScePosix", 1, "libkernel", 1, 1, posix_stat); + LIB_FUNCTION("+r3rMFwItV4", "libkernel", 1, "libkernel", 1, 1, sceKernelPread); // openOrbis (to check if it is valid out of OpenOrbis LIB_FUNCTION("6c3rCVE-fTU", "libkernel", 1, "libkernel", 1, 1,