From 5af1d18a8f467be28125fe360dc4c2304dd53f6b Mon Sep 17 00:00:00 2001 From: Nemirtingas Date: Mon, 2 Sep 2019 10:50:46 +0200 Subject: [PATCH] Fixed overlay thread joining on himself --- overlay_experimental/Renderer_Detector.cpp | 107 ++++++++------------ overlay_experimental/linux/Linux_Detour.cpp | 2 +- 2 files changed, 45 insertions(+), 64 deletions(-) diff --git a/overlay_experimental/Renderer_Detector.cpp b/overlay_experimental/Renderer_Detector.cpp index 30a6ff2..85e4548 100644 --- a/overlay_experimental/Renderer_Detector.cpp +++ b/overlay_experimental/Renderer_Detector.cpp @@ -532,28 +532,10 @@ void Renderer_Detector::find_renderer_proc(Renderer_Detector* _this) std::this_thread::sleep_for(std::chrono::milliseconds(500)); } -} -void Renderer_Detector::renderer_found(Base_Hook* hook) -{ - Hook_Manager& hm = Hook_Manager::Inst(); + _this->destroy_hwnd(); - _renderer_found = true; - game_renderer = hook; - - if (hook == nullptr) - PRINT_DEBUG("We found a renderer but couldn't hook it, aborting overlay hook.\n"); - else - PRINT_DEBUG("Hooked renderer in %d/%d tries\n", _hook_retries, max_hook_retries); - - _hook_thread->join(); - delete _hook_thread; - _hook_thread = nullptr; - - hm.RemoveHook(rendererdetect_hook); - destroy_hwnd(); - - if (hook == nullptr) // Couldn't hook renderer + if (_this->game_renderer == nullptr) // Couldn't hook renderer { hm.RemoveHook(Windows_Hook::Inst()); } @@ -561,51 +543,54 @@ void Renderer_Detector::renderer_found(Base_Hook* hook) { hm.AddHook(Windows_Hook::Inst()); } - if (_ogl_hooked) + if (_this->_ogl_hooked) { auto h = OpenGL_Hook::Inst(); - if (h != hook) + if (h != _this->game_renderer) { - _ogl_hooked = false; + _this->_ogl_hooked = false; hm.RemoveHook(h); } } - if (_dx9_hooked) + if (_this->_dx9_hooked) { auto h = DX9_Hook::Inst(); - if (h != hook) + if (h != _this->game_renderer) { - _dx9_hooked = false; + _this->_dx9_hooked = false; hm.RemoveHook(h); } } - if (_dx10_hooked) + if (_this->_dx10_hooked) { auto h = DX10_Hook::Inst(); - if (h != hook) + if (h != _this->game_renderer) { - _dx10_hooked = false; + _this->_dx10_hooked = false; hm.RemoveHook(h); } } - if (_dx11_hooked) + if (_this->_dx11_hooked) { auto h = DX11_Hook::Inst(); - if (h != hook) + if (h != _this->game_renderer) { - _dx11_hooked = false; + _this->_dx11_hooked = false; hm.RemoveHook(h); } } - if (_dx12_hooked) + if (_this->_dx12_hooked) { auto h = DX12_Hook::Inst(); - if (h != hook) + if (h != _this->game_renderer) { - _dx12_hooked = false; + _this->_dx12_hooked = false; hm.RemoveHook(h); } } + + delete _this->_hook_thread; + _this->_hook_thread = nullptr; } Renderer_Detector::Renderer_Detector(): @@ -715,6 +700,27 @@ void Renderer_Detector::find_renderer_proc(Renderer_Detector* _this) std::this_thread::sleep_for(std::chrono::milliseconds(500)); } + + if (_this->game_renderer == nullptr) // Couldn't hook renderer + { + hm.RemoveHook(X11_Hook::Inst()); + } + else + { + hm.AddHook(X11_Hook::Inst()); + } + if (_this->_oglx_hooked) + { + auto h = OpenGLX_Hook::Inst(); + if (h != _this->game_renderer) + { + _this->_oglx_hooked = false; + hm.RemoveHook(h); + } + } + + delete _this->_hook_thread; + _this->_hook_thread = nullptr; } Renderer_Detector::Renderer_Detector(): @@ -726,6 +732,8 @@ Renderer_Detector::Renderer_Detector(): game_renderer(nullptr) {} +#endif + void Renderer_Detector::renderer_found(Base_Hook* hook) { Hook_Manager& hm = Hook_Manager::Inst(); @@ -738,42 +746,16 @@ void Renderer_Detector::renderer_found(Base_Hook* hook) else PRINT_DEBUG("Hooked renderer in %d/%d tries\n", _hook_retries, max_hook_retries); - _hook_thread->join(); - delete _hook_thread; - _hook_thread = nullptr; - hm.RemoveHook(rendererdetect_hook); - - if (hook == nullptr) // Couldn't hook renderer - { - hm.RemoveHook(X11_Hook::Inst()); - } - else - { - hm.AddHook(X11_Hook::Inst()); - } - if (_oglx_hooked) - { - auto h = OpenGLX_Hook::Inst(); - if (h != hook) - { - _oglx_hooked = false; - hm.RemoveHook(h); - } - } } -#endif - bool Renderer_Detector::stop_retry() { // Retry or not bool stop = ++_hook_retries >= max_hook_retries; if (stop) - { renderer_found(nullptr); - } return stop; } @@ -783,6 +765,7 @@ void Renderer_Detector::find_renderer() if (_hook_thread == nullptr) { _hook_thread = new std::thread(&Renderer_Detector::find_renderer_proc, this); + _hook_thread->detach(); } } @@ -802,7 +785,5 @@ Renderer_Detector::~Renderer_Detector() if (_hook_thread != nullptr) { _hook_retries = max_hook_retries; - _hook_thread->join(); - delete _hook_thread; } } diff --git a/overlay_experimental/linux/Linux_Detour.cpp b/overlay_experimental/linux/Linux_Detour.cpp index 33cbdae..8fd8f56 100644 --- a/overlay_experimental/linux/Linux_Detour.cpp +++ b/overlay_experimental/linux/Linux_Detour.cpp @@ -208,7 +208,7 @@ int find_space_for_trampoline(uint8_t* func, int bytes_needed) if( func == nullptr ) return -1; - int code_len = -1; + int code_len = 0; bool search = true; uint8_t *startCode = reinterpret_cast(func); uint8_t *pCode = startCode;