Implemented syscall _sys_process_exit

This commit is contained in:
Nekotekina 2017-09-16 20:43:02 +03:00
parent e789b969b0
commit b9b71ccbc1
6 changed files with 48 additions and 28 deletions

View file

@ -2,7 +2,7 @@
#include "Emu/System.h"
#include "Emu/Cell/PPUModule.h"
#include "Emu/Cell/lv2/sys_process.h"
#include "sysPrxForUser.h"
#include "Emu/IdManager.h"
#include "Crypto/unedat.h"
#include "Crypto/unself.h"
@ -44,7 +44,15 @@ s32 sceNpTerm()
s32 npDrmIsAvailable(vm::cptr<u8> k_licensee_addr, vm::cptr<char> drm_path)
{
const std::string& enc_drm_path = drm_path.get_ptr();
std::array<u8, 0x10> k_licensee{};
if (k_licensee_addr)
{
std::copy_n(k_licensee_addr.get_ptr(), k_licensee.size(), k_licensee.begin());
sceNp.notice("npDrmIsAvailable(): KLicense key %s", *reinterpret_cast<be_t<v128, 1>*>(k_licensee.data()));
}
const std::string enc_drm_path = drm_path.get_ptr();
if (!fs::is_file(vfs::get(enc_drm_path)))
{
@ -52,20 +60,6 @@ s32 npDrmIsAvailable(vm::cptr<u8> k_licensee_addr, vm::cptr<char> drm_path)
return CELL_ENOENT;
}
std::string k_licensee_str = "";
std::array<u8, 0x10> k_licensee{0};
if (k_licensee_addr)
{
for (s8 i = 0; i < 0x10; i++)
{
k_licensee[i] = *(k_licensee_addr + i);
k_licensee_str += fmt::format("%02x", k_licensee[i]);
}
sceNp.notice("npDrmIsAvailable(): KLicense key %s", k_licensee_str);
}
auto npdrmkeys = fxm::get_always<LoadedNpdrmKeys_t>();
npdrmkeys->devKlic.fill(0);
@ -187,25 +181,29 @@ s32 sceNpDrmGetTimelimit(vm::cptr<char> path, vm::ptr<u64> time_remain)
s32 sceNpDrmProcessExitSpawn(vm::cptr<u8> klicensee, vm::cptr<char> path, u32 argv_addr, u32 envp_addr, u32 data_addr, u32 data_size, u32 prio, u64 flags)
{
sceNp.warning("sceNpDrmProcessExitSpawn() -> sys_game_process_exitspawn");
sceNp.warning("sceNpDrmProcessExitSpawn(klicensee=*0x%x, path=%s, argv=*0x%x, envp=*0x%x, data=*0x%x, data_size=0x%x, prio=%u, flags=0x%x)",
klicensee, path, argv_addr, envp_addr, data_addr, data_size, prio, flags);
sceNp.warning("klicensee: 0x%x", klicensee);
npDrmIsAvailable(klicensee, path);
if (s32 error = npDrmIsAvailable(klicensee, path))
{
return error;
}
sys_game_process_exitspawn(path, argv_addr, envp_addr, data_addr, data_size, prio, flags);
return CELL_OK;
}
s32 sceNpDrmProcessExitSpawn2(vm::cptr<u8> klicensee, vm::cptr<char> path, u32 argv_addr, u32 envp_addr, u32 data_addr, u32 data_size, u32 prio, u64 flags)
{
sceNp.warning("sceNpDrmProcessExitSpawn2() -> sys_game_process_exitspawn2");
sceNp.warning("sceNpDrmProcessExitSpawn2(klicensee=*0x%x, path=%s, argv=*0x%x, envp=*0x%x, data=*0x%x, data_size=0x%x, prio=%u, flags=0x%x)",
klicensee, path, argv_addr, envp_addr, data_addr, data_size, prio, flags);
sceNp.warning("klicensee: 0x%x", klicensee);
npDrmIsAvailable(klicensee, path);
if (s32 error = npDrmIsAvailable(klicensee, path))
{
return error;
}
sys_game_process_exitspawn2(path, argv_addr, envp_addr, data_addr, data_size, prio, flags);
return CELL_OK;
}