feat(patches): add relaunch and com err stub
This commit is contained in:
parent
4a1556a04f
commit
b491b03dfc
79
src/client/component/patches.cpp
Normal file
79
src/client/component/patches.cpp
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
#include <std_include.hpp>
|
||||||
|
#include "loader/component_loader.hpp"
|
||||||
|
|
||||||
|
#include "game/game.hpp"
|
||||||
|
|
||||||
|
#include <utils/hook.hpp>
|
||||||
|
#include <utils/string.hpp>
|
||||||
|
|
||||||
|
namespace patches
|
||||||
|
{
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
std::string GetExecutableName()
|
||||||
|
{
|
||||||
|
char path[MAX_PATH];
|
||||||
|
if (GetModuleFileNameA(NULL, path, MAX_PATH) > 0)
|
||||||
|
{
|
||||||
|
std::string fullPath(path);
|
||||||
|
size_t pos = fullPath.find_last_of("\\/");
|
||||||
|
return (pos == std::string::npos) ? fullPath : fullPath.substr(pos + 1);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
utils::hook::detour relaunch_hook;
|
||||||
|
void relaunch_stub(const char* filename, const char* params)
|
||||||
|
{
|
||||||
|
if (filename == "s2_sp64_ship.exe"s || filename == "s2_mp64_ship.exe"s)
|
||||||
|
{
|
||||||
|
static char buf[MAX_PATH];
|
||||||
|
memset(buf, 0, sizeof(buf));
|
||||||
|
|
||||||
|
auto exe_name = GetExecutableName();
|
||||||
|
assert(exe_name.size() < MAX_PATH);
|
||||||
|
memcpy(buf, exe_name.data(), exe_name.size());
|
||||||
|
|
||||||
|
filename = buf;
|
||||||
|
|
||||||
|
params = utils::string::va("%s -%s", params, game::environment::is_sp() ? "multiplayer" : "singleplayer");
|
||||||
|
|
||||||
|
relaunch_hook.invoke<void>(filename, params);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
relaunch_hook.invoke<void>(filename, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
utils::hook::detour com_error_hook;
|
||||||
|
void com_error_stub(const int error, const char* msg, ...)
|
||||||
|
{
|
||||||
|
char buffer[2048]{};
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, msg);
|
||||||
|
vsnprintf_s(buffer, _TRUNCATE, msg, ap);
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
printf("Error: %s\n", buffer);
|
||||||
|
|
||||||
|
com_error_hook.invoke<void>(error, "%s", buffer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class component final : public component_interface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void post_load() override
|
||||||
|
{
|
||||||
|
relaunch_hook.create(SELECT_VALUE(0x1404B5170, 0x140715B10), relaunch_stub);
|
||||||
|
}
|
||||||
|
|
||||||
|
void post_unpack() override
|
||||||
|
{
|
||||||
|
com_error_hook.create(SELECT_VALUE(0x14043CA00, 0x140073AA0), com_error_stub);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
REGISTER_COMPONENT(patches::component)
|
Loading…
x
Reference in New Issue
Block a user