s32 sys_prx_load_module_list(s32 count, vm::cpptr<char> path_list, u64 flags, vm::ptr<sys_prx_load_module_option_t> pOpt, vm::ptr<u32> id_list) { sys_prx.warning("sys_prx_load_module_list(count=%d, path_list=*0x%x, flags=0x%llx, pOpt=*0x%x, id_list=*0x%x)", count, path_list, flags, pOpt, id_list); for (s32 i = 0; i < count; ++i) { auto path = path_list[i]; std::string name = path.get_ptr(); s32 result = prx_load_module(name, flags, pOpt); if (result < 0) return result; id_list[i] = result; } return CELL_OK; }
int sys_prx_load_vsh_plugin(unsigned int slot, char *path, void *arg, uint32_t arg_size) { #ifdef MAMBA_LOADER if (mamba_loaded == 1) return ECANCELED; //USE MAMBA INSTEAD TO LOAD THEM ! #endif if (!vsh_process) vsh_process = get_vsh_process(); if (!vsh_process) return ESRCH; void *kbuf, *vbuf; sys_prx_id_t prx; int ret; path = get_secure_user_ptr(path); arg = get_secure_user_ptr(arg); if (slot >= MAX_VSH_PLUGINS || (arg != NULL && arg_size > KB(64))) return EINVAL; if (vsh_plugins[slot] != 0) return EKRESOURCE; prx = prx_load_module(vsh_process, 0, 0, path); if (prx < 0) return prx; if (arg && arg_size > 0) { page_allocate_auto(vsh_process, KB(64), 0x2F, &kbuf); page_export_to_proc(vsh_process, kbuf, 0x40000, &vbuf); copy_from_user(arg, kbuf, arg_size); } else vbuf = NULL; ret = prx_start_module_with_thread(prx, vsh_process, 0, (uint64_t)vbuf); if (vbuf) { page_unexport_from_proc(vsh_process, vbuf); page_free(vsh_process, kbuf, 0x2F); } if (ret == 0) vsh_plugins[slot] = prx; else { prx_stop_module_with_thread(prx, vsh_process, 0, 0); prx_unload_module(prx, vsh_process); } return ret; }
s32 sys_prx_load_module(vm::cptr<char> path, u64 flags, vm::ptr<sys_prx_load_module_option_t> pOpt) { sys_prx.warning("sys_prx_load_module(path=*0x%x, flags=0x%llx, pOpt=*0x%x)", path, flags, pOpt); return prx_load_module(path.get_ptr(), flags, pOpt); }