Merge branch 'master' of https://github.com/project-bo4/shield-development
This commit is contained in:
commit
5f5f4c436f
116
source/proxy-dll/component/plugins.cpp
Normal file
116
source/proxy-dll/component/plugins.cpp
Normal file
@ -0,0 +1,116 @@
|
||||
#include <std_include.hpp>
|
||||
#include <utilities/nt.hpp>
|
||||
#include "loader/component_loader.hpp"
|
||||
|
||||
|
||||
|
||||
namespace plugins
|
||||
{
|
||||
std::filesystem::path plugins_dir = "project-bo4/plugins";
|
||||
namespace
|
||||
{
|
||||
using plugin_handler = void(*)();
|
||||
class plugin_info
|
||||
{
|
||||
public:
|
||||
plugin_info(const std::filesystem::path& _lib) : lib{ utilities::nt::library::load(_lib) }
|
||||
{
|
||||
if (!lib) return;
|
||||
|
||||
const char* (*PBO4_GetPluginName)() = lib.get_proc<const char* (*)()>("PBO4_GetPluginName");
|
||||
|
||||
if (PBO4_GetPluginName)
|
||||
{
|
||||
name = PBO4_GetPluginName();
|
||||
}
|
||||
}
|
||||
|
||||
plugin_info(const plugin_info& a) : lib(a.lib), name(a.name)
|
||||
{
|
||||
}
|
||||
|
||||
operator bool() const
|
||||
{
|
||||
return lib;
|
||||
}
|
||||
|
||||
constexpr const char* get_name() const
|
||||
{
|
||||
return name;
|
||||
}
|
||||
|
||||
void pre_start() const
|
||||
{
|
||||
plugin_handler pre_start_handler = lib.get_proc<plugin_handler>("PBO4_PreStart");
|
||||
if (pre_start_handler) pre_start_handler();
|
||||
}
|
||||
|
||||
void post_unpack() const
|
||||
{
|
||||
plugin_handler post_unpack_handler = lib.get_proc<plugin_handler>("PBO4_PostUnpack");
|
||||
if (post_unpack_handler) post_unpack_handler();
|
||||
}
|
||||
|
||||
void pre_destroy() const
|
||||
{
|
||||
plugin_handler pre_destroy_handler = lib.get_proc<plugin_handler>("PBO4_PreDestroy");
|
||||
if (pre_destroy_handler) pre_destroy_handler();
|
||||
}
|
||||
|
||||
private:
|
||||
utilities::nt::library lib;
|
||||
const char* name{ "unknown" };
|
||||
};
|
||||
std::vector<plugin_info> loaded_plugins{};
|
||||
}
|
||||
|
||||
class component final : public component_interface
|
||||
{
|
||||
public:
|
||||
|
||||
void pre_start() override
|
||||
{
|
||||
std::filesystem::create_directories(plugins_dir);
|
||||
|
||||
for (const std::filesystem::directory_entry& sub : std::filesystem::directory_iterator{ plugins_dir })
|
||||
{
|
||||
const std::filesystem::path& p{ sub };
|
||||
|
||||
if (p.has_extension() && p.extension() != ".dll") continue;
|
||||
|
||||
plugin_info plugin{ p };
|
||||
|
||||
if (!plugin)
|
||||
{
|
||||
logger::write(logger::LOG_TYPE_ERROR, std::format("Can't load {}", p.string()));
|
||||
continue;
|
||||
}
|
||||
|
||||
plugin.pre_start();
|
||||
|
||||
logger::write(logger::LOG_TYPE_INFO, std::format("Loaded plugin '{}'", plugin.get_name()));
|
||||
|
||||
loaded_plugins.emplace_back(plugin);
|
||||
}
|
||||
}
|
||||
|
||||
void pre_destroy() override
|
||||
{
|
||||
for (const plugin_info& plugin : loaded_plugins)
|
||||
{
|
||||
plugin.pre_destroy();
|
||||
}
|
||||
}
|
||||
|
||||
void post_unpack() override
|
||||
{
|
||||
for (const plugin_info& plugin : loaded_plugins)
|
||||
{
|
||||
plugin.post_unpack();
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
REGISTER_COMPONENT(plugins::component)
|
@ -54,7 +54,7 @@ namespace
|
||||
{
|
||||
patch_import("user32.dll", "GetSystemMetrics", get_system_metrics);
|
||||
|
||||
//utilities::hook::set(utilities::nt::library{}.get_iat_entry("kernel32.dll", "ExitProcess"), exit_hook);
|
||||
utilities::hook::set(utilities::nt::library{}.get_iat_entry("kernel32.dll", "ExitProcess"), exit_hook);
|
||||
}
|
||||
|
||||
void remove_crash_file()
|
||||
|
Loading…
x
Reference in New Issue
Block a user