mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-20 19:07:01 +02:00
sysmodule: track shared module load references and unloaded status
This commit is contained in:
@@ -6,6 +6,9 @@
|
||||
#include "libs/libs.h"
|
||||
#include "loader/symbolDatabase.h"
|
||||
|
||||
#include <mutex>
|
||||
#include <unordered_map>
|
||||
|
||||
namespace Libs {
|
||||
|
||||
LIB_VERSION("Sysmodule", 1, "Sysmodule", 1, 1);
|
||||
@@ -17,6 +20,16 @@ int KYTY_SYSV_ABI KernelGetModuleInfoForUnwind(uint64_t addr, int flags, ModuleI
|
||||
|
||||
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);
|
||||
@@ -27,6 +40,7 @@ static KYTY_SYSV_ABI int SysmoduleLoadModule(uint16_t id) {
|
||||
|
||||
LOGF("\t id = %d\n", static_cast<int>(id));
|
||||
|
||||
LoadModule(id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -35,6 +49,14 @@ static KYTY_SYSV_ABI int SysmoduleUnloadModule(uint16_t id) {
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -49,6 +71,7 @@ static KYTY_SYSV_ABI int SysmoduleLoadModuleInternalWithArg(uint16_t id, int arg
|
||||
EXIT_IF(arg3 != 0);
|
||||
EXIT_IF(ret == nullptr);
|
||||
|
||||
LoadModule(id);
|
||||
*ret = 0;
|
||||
|
||||
return 0;
|
||||
@@ -59,7 +82,8 @@ static KYTY_SYSV_ABI int SysmoduleIsLoaded(uint16_t id) {
|
||||
|
||||
LOGF("\t id = %d\n", static_cast<int>(id));
|
||||
|
||||
return 0;
|
||||
std::scoped_lock lock(g_module_mutex);
|
||||
return g_module_refs.contains(id) ? 0 : SYSMODULE_ERROR_UNLOADED;
|
||||
}
|
||||
|
||||
} // namespace Sysmodule
|
||||
|
||||
Reference in New Issue
Block a user