Files
KytyPS5/src/libs/libSysmodule.cpp
T

100 lines
2.5 KiB
C++

#include "common/abi.h"
#include "common/assert.h"
#include "common/common.h"
#include "common/logging/log.h"
#include "common/stringUtils.h"
#include "libs/libs.h"
#include "loader/symbolDatabase.h"
#include <mutex>
#include <unordered_map>
namespace Libs {
LIB_VERSION("Sysmodule", 1, "Sysmodule", 1, 1);
namespace LibKernel {
struct ModuleInfoForUnwind;
int KYTY_SYSV_ABI KernelGetModuleInfoForUnwind(uint64_t addr, int flags, ModuleInfoForUnwind* info);
} // namespace LibKernel
namespace Sysmodule {
constexpr int SYSMODULE_ERROR_UNLOADED = static_cast<int>(0x805a1001u);
static std::mutex g_module_mutex;
static std::unordered_map<uint16_t, uint32_t> g_module_refs;
static void LoadModule(uint16_t id) {
std::scoped_lock lock(g_module_mutex);
++g_module_refs[id];
}
static KYTY_SYSV_ABI int SysmoduleGetModuleInfoForUnwind(uint64_t addr, int flags,
LibKernel::ModuleInfoForUnwind* info) {
return LibKernel::KernelGetModuleInfoForUnwind(addr, flags, info);
}
static KYTY_SYSV_ABI int SysmoduleLoadModule(uint16_t id) {
PRINT_NAME();
LOGF("\t id = %d\n", static_cast<int>(id));
LoadModule(id);
return 0;
}
static KYTY_SYSV_ABI int SysmoduleUnloadModule(uint16_t id) {
PRINT_NAME();
LOGF("\t id = %d\n", static_cast<int>(id));
std::scoped_lock lock(g_module_mutex);
const auto module = g_module_refs.find(id);
if (module == g_module_refs.end()) {
return SYSMODULE_ERROR_UNLOADED;
}
if (--module->second == 0) {
g_module_refs.erase(module);
}
return 0;
}
static KYTY_SYSV_ABI int SysmoduleLoadModuleInternalWithArg(uint16_t id, int arg1, int arg2,
int arg3, int* ret) {
PRINT_NAME();
LOGF("\t id = %d\n", static_cast<int>(id));
EXIT_IF(arg1 != 0);
EXIT_IF(arg2 != 0);
EXIT_IF(arg3 != 0);
EXIT_IF(ret == nullptr);
LoadModule(id);
*ret = 0;
return 0;
}
static KYTY_SYSV_ABI int SysmoduleIsLoaded(uint16_t id) {
PRINT_NAME();
LOGF("\t id = %d\n", static_cast<int>(id));
std::scoped_lock lock(g_module_mutex);
return g_module_refs.contains(id) ? 0 : SYSMODULE_ERROR_UNLOADED;
}
} // namespace Sysmodule
LIB_DEFINE(InitSysmodule_1) {
LIB_FUNC("4fU5yvOkVG4", Sysmodule::SysmoduleGetModuleInfoForUnwind);
LIB_FUNC("eR2bZFAAU0Q", Sysmodule::SysmoduleUnloadModule);
LIB_FUNC("hHrGoGoNf+s", Sysmodule::SysmoduleLoadModuleInternalWithArg);
LIB_FUNC("g8cM39EUZ6o", Sysmodule::SysmoduleLoadModule);
LIB_FUNC("fMP5NHUOaMk", Sysmodule::SysmoduleIsLoaded);
}
} // namespace Libs