mirror of
https://gitlab.com/Mr_Goldberg/goldberg_emulator.git
synced 2024-11-23 20:38:07 +01:00
Fixed overlay thread joining on himself
This commit is contained in:
parent
aeeb85da55
commit
5af1d18a8f
2 changed files with 45 additions and 64 deletions
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<uint8_t*>(func);
|
||||
uint8_t *pCode = startCode;
|
||||
|
|
Loading…
Reference in a new issue