Properly release steam pipe and global user

This commit is contained in:
momo5502 2019-01-08 20:25:55 +01:00
parent 9d23999da7
commit 14247d36d6

View File

@ -25,7 +25,14 @@ public:
try try
{ {
this->start_mod(game::is_mp() ? "LUUUUUL" : "LEEEEL", 480); if (game::is_sp())
{
this->start_mod("Open-IW5 Singleplayer", 42680);
}
else if (game::is_mp())
{
this->start_mod("Open-IW5 Multiplayer", 42690);
}
} }
catch (std::exception& e) catch (std::exception& e)
{ {
@ -35,6 +42,18 @@ public:
void pre_destroy() override void pre_destroy() override
{ {
if (this->steam_client_)
{
if (this->steam_pipe_)
{
if (this->global_user_)
{
this->steam_client_.invoke<void>(4, this->steam_pipe_, this->global_user_); // ReleaseUser
}
this->steam_client_.invoke<bool>(1, this->steam_pipe_); // ReleaseSteamPipe
}
}
} }
private: private:
@ -48,7 +67,7 @@ private:
void* steam_pipe_ = nullptr; void* steam_pipe_ = nullptr;
void* global_user_ = nullptr; void* global_user_ = nullptr;
void run_mod() void run_mod() const
{ {
const char* command = "-proc "; const char* command = "-proc ";
const char* parent_proc = strstr(GetCommandLineA(), command); const char* parent_proc = strstr(GetCommandLineA(), command);
@ -68,14 +87,15 @@ private:
} }
} }
void* load_client_engine() void* load_client_engine() const
{ {
if (!this->steam_client_module_.is_valid()) return nullptr; if (!this->steam_client_module_) return nullptr;
for (int i = 1; i > 0; ++i) for (auto i = 1; i > 0; ++i)
{ {
std::string name = utils::string::va("CLIENTENGINE_INTERFACE_VERSION%03i", i); std::string name = utils::string::va("CLIENTENGINE_INTERFACE_VERSION%03i", i);
void* client_engine = this->steam_client_module_.invoke<void*>("CreateInterface", name.data(), nullptr); const auto client_engine = this->steam_client_module_
.invoke<void*>("CreateInterface", name.data(), nullptr);
if (client_engine) return client_engine; if (client_engine) return client_engine;
} }
@ -106,19 +126,24 @@ private:
"CLIENTUTILS_INTERFACE_VERSION001"); // GetIClientUtils "CLIENTUTILS_INTERFACE_VERSION001"); // GetIClientUtils
} }
void start_mod(const std::string& title, const size_t app_id) void start_mod(const std::string& title, size_t app_id)
{ {
if (!this->client_utils_ || !this->client_user_) return; if (!this->client_utils_ || !this->client_user_) return;
if (!this->client_user_.invoke<bool>("BIsSubscribedApp", app_id))
{
app_id = 480; // Spacewar
}
this->client_utils_.invoke<void>("SetAppIDForCurrentPipe", app_id, false); this->client_utils_.invoke<void>("SetAppIDForCurrentPipe", app_id, false);
utils::nt::module self; utils::nt::module self;
std::string path = self.get_path(); const auto path = self.get_path();
char our_directory[MAX_PATH] = {0}; char our_directory[MAX_PATH] = {0};
GetCurrentDirectoryA(sizeof(our_directory), our_directory); GetCurrentDirectoryA(sizeof(our_directory), our_directory);
std::string cmdline = utils::string::va("\"%s\" -proc %d", path.data(), GetCurrentProcessId()); const std::string cmdline = utils::string::va("\"%s\" -proc %d", path.data(), GetCurrentProcessId());
game_id game_id; game_id game_id;
game_id.raw.type = 1; // k_EGameIDTypeGameMod game_id.raw.type = 1; // k_EGameIDTypeGameMod