mirror of
https://github.com/Detanup01/gbe_fork.git
synced 2025-03-28 14:56:24 +01:00
loadlib for linux
This commit is contained in:
parent
958368e7a1
commit
3896029c91
1 changed files with 67 additions and 19 deletions
86
dll/base.cpp
86
dll/base.cpp
|
@ -279,6 +279,58 @@ unsigned int file_size_(const std::string &full_path)
|
||||||
|
|
||||||
|
|
||||||
#ifdef EMU_EXPERIMENTAL_BUILD
|
#ifdef EMU_EXPERIMENTAL_BUILD
|
||||||
|
|
||||||
|
static std::vector<void*> loaded_libs{};
|
||||||
|
|
||||||
|
static void load_dlls()
|
||||||
|
{
|
||||||
|
constexpr static const char LIB_EXTENSION[] =
|
||||||
|
#ifdef __WINDOWS__
|
||||||
|
".dll"
|
||||||
|
#else
|
||||||
|
".so"
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
|
std::string path(Local_Storage::get_game_settings_path() + "load_dlls" + PATH_SEPARATOR);
|
||||||
|
|
||||||
|
std::vector<std::string> paths(Local_Storage::get_filenames_path(path));
|
||||||
|
for (auto & p: paths) {
|
||||||
|
std::string full_path(path + p);
|
||||||
|
if (!common_helpers::ends_with_i(full_path, LIB_EXTENSION)) continue;
|
||||||
|
|
||||||
|
PRINT_DEBUG("loading '%s'", full_path.c_str());
|
||||||
|
auto lib_handle =
|
||||||
|
#ifdef __WINDOWS__
|
||||||
|
LoadLibraryW(utf8_decode(full_path).c_str());
|
||||||
|
#else
|
||||||
|
dlopen(full_path.c_str(), RTLD_NOW | RTLD_LOCAL);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (lib_handle != nullptr) {
|
||||||
|
loaded_libs.push_back(reinterpret_cast<void *>(lib_handle));
|
||||||
|
PRINT_DEBUG(" LOADED");
|
||||||
|
} else {
|
||||||
|
#ifdef __WINDOWS__
|
||||||
|
PRINT_DEBUG(" FAILED, error code 0x%X", GetLastError());
|
||||||
|
#else
|
||||||
|
PRINT_DEBUG(" FAILED, error string '%s'", dlerror());
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void unload_dlls()
|
||||||
|
{
|
||||||
|
for (auto lib_handle : loaded_libs) {
|
||||||
|
#ifdef __WINDOWS__
|
||||||
|
FreeLibrary(reinterpret_cast<HMODULE>(lib_handle));
|
||||||
|
#else
|
||||||
|
dlclose(lib_handle);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef __WINDOWS__
|
#ifdef __WINDOWS__
|
||||||
|
|
||||||
struct ips_test {
|
struct ips_test {
|
||||||
|
@ -463,23 +515,6 @@ static void load_crack_dll()
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "dll/local_storage.h"
|
#include "dll/local_storage.h"
|
||||||
static void load_dlls()
|
|
||||||
{
|
|
||||||
std::string path(Local_Storage::get_game_settings_path() + "load_dlls" + PATH_SEPARATOR);
|
|
||||||
|
|
||||||
std::vector<std::string> paths(Local_Storage::get_filenames_path(path));
|
|
||||||
for (auto & p: paths) {
|
|
||||||
std::string full_path(path + p);
|
|
||||||
if (!common_helpers::ends_with_i(full_path, ".dll")) continue;
|
|
||||||
|
|
||||||
PRINT_DEBUG("loading '%s'", full_path.c_str());
|
|
||||||
if (LoadLibraryW(utf8_decode(full_path).c_str())) {
|
|
||||||
PRINT_DEBUG(" LOADED");
|
|
||||||
} else {
|
|
||||||
PRINT_DEBUG(" FAILED, error 0x%X", GetLastError());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//For some reason when this function is optimized it breaks the shogun 2 prophet (reloaded) crack.
|
//For some reason when this function is optimized it breaks the shogun 2 prophet (reloaded) crack.
|
||||||
#pragma optimize( "", off )
|
#pragma optimize( "", off )
|
||||||
|
@ -613,6 +648,8 @@ BOOL WINAPI DllMain( HINSTANCE, DWORD dwReason, LPVOID )
|
||||||
}
|
}
|
||||||
DetourTransactionCommit();
|
DetourTransactionCommit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unload_dlls();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -621,12 +658,23 @@ BOOL WINAPI DllMain( HINSTANCE, DWORD dwReason, LPVOID )
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
__attribute__((__constructor__)) static void lib_base_entry()
|
||||||
|
{
|
||||||
|
load_dlls();
|
||||||
|
}
|
||||||
|
|
||||||
|
__attribute__((__destructor__)) static void lib_base_exit()
|
||||||
|
{
|
||||||
|
unload_dlls();
|
||||||
|
}
|
||||||
|
|
||||||
void set_whitelist_ips(uint32_t *from, uint32_t *to, unsigned num_ips)
|
void set_whitelist_ips(uint32_t *from, uint32_t *to, unsigned num_ips)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif // __WINDOWS__
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
void set_whitelist_ips(uint32_t *from, uint32_t *to, unsigned num_ips)
|
void set_whitelist_ips(uint32_t *from, uint32_t *to, unsigned num_ips)
|
||||||
|
@ -634,5 +682,5 @@ void set_whitelist_ips(uint32_t *from, uint32_t *to, unsigned num_ips)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif // EMU_EXPERIMENTAL_BUILD
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue