mirror of
https://gitlab.com/Mr_Goldberg/goldberg_emulator.git
synced 2024-11-27 14:08:39 +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));
|
std::this_thread::sleep_for(std::chrono::milliseconds(500));
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void Renderer_Detector::renderer_found(Base_Hook* hook)
|
_this->destroy_hwnd();
|
||||||
{
|
|
||||||
Hook_Manager& hm = Hook_Manager::Inst();
|
|
||||||
|
|
||||||
_renderer_found = true;
|
if (_this->game_renderer == nullptr) // Couldn't hook renderer
|
||||||
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
|
|
||||||
{
|
{
|
||||||
hm.RemoveHook(Windows_Hook::Inst());
|
hm.RemoveHook(Windows_Hook::Inst());
|
||||||
}
|
}
|
||||||
|
@ -561,51 +543,54 @@ void Renderer_Detector::renderer_found(Base_Hook* hook)
|
||||||
{
|
{
|
||||||
hm.AddHook(Windows_Hook::Inst());
|
hm.AddHook(Windows_Hook::Inst());
|
||||||
}
|
}
|
||||||
if (_ogl_hooked)
|
if (_this->_ogl_hooked)
|
||||||
{
|
{
|
||||||
auto h = OpenGL_Hook::Inst();
|
auto h = OpenGL_Hook::Inst();
|
||||||
if (h != hook)
|
if (h != _this->game_renderer)
|
||||||
{
|
{
|
||||||
_ogl_hooked = false;
|
_this->_ogl_hooked = false;
|
||||||
hm.RemoveHook(h);
|
hm.RemoveHook(h);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (_dx9_hooked)
|
if (_this->_dx9_hooked)
|
||||||
{
|
{
|
||||||
auto h = DX9_Hook::Inst();
|
auto h = DX9_Hook::Inst();
|
||||||
if (h != hook)
|
if (h != _this->game_renderer)
|
||||||
{
|
{
|
||||||
_dx9_hooked = false;
|
_this->_dx9_hooked = false;
|
||||||
hm.RemoveHook(h);
|
hm.RemoveHook(h);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (_dx10_hooked)
|
if (_this->_dx10_hooked)
|
||||||
{
|
{
|
||||||
auto h = DX10_Hook::Inst();
|
auto h = DX10_Hook::Inst();
|
||||||
if (h != hook)
|
if (h != _this->game_renderer)
|
||||||
{
|
{
|
||||||
_dx10_hooked = false;
|
_this->_dx10_hooked = false;
|
||||||
hm.RemoveHook(h);
|
hm.RemoveHook(h);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (_dx11_hooked)
|
if (_this->_dx11_hooked)
|
||||||
{
|
{
|
||||||
auto h = DX11_Hook::Inst();
|
auto h = DX11_Hook::Inst();
|
||||||
if (h != hook)
|
if (h != _this->game_renderer)
|
||||||
{
|
{
|
||||||
_dx11_hooked = false;
|
_this->_dx11_hooked = false;
|
||||||
hm.RemoveHook(h);
|
hm.RemoveHook(h);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (_dx12_hooked)
|
if (_this->_dx12_hooked)
|
||||||
{
|
{
|
||||||
auto h = DX12_Hook::Inst();
|
auto h = DX12_Hook::Inst();
|
||||||
if (h != hook)
|
if (h != _this->game_renderer)
|
||||||
{
|
{
|
||||||
_dx12_hooked = false;
|
_this->_dx12_hooked = false;
|
||||||
hm.RemoveHook(h);
|
hm.RemoveHook(h);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
delete _this->_hook_thread;
|
||||||
|
_this->_hook_thread = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
Renderer_Detector::Renderer_Detector():
|
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));
|
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():
|
Renderer_Detector::Renderer_Detector():
|
||||||
|
@ -726,6 +732,8 @@ Renderer_Detector::Renderer_Detector():
|
||||||
game_renderer(nullptr)
|
game_renderer(nullptr)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
void Renderer_Detector::renderer_found(Base_Hook* hook)
|
void Renderer_Detector::renderer_found(Base_Hook* hook)
|
||||||
{
|
{
|
||||||
Hook_Manager& hm = Hook_Manager::Inst();
|
Hook_Manager& hm = Hook_Manager::Inst();
|
||||||
|
@ -738,42 +746,16 @@ void Renderer_Detector::renderer_found(Base_Hook* hook)
|
||||||
else
|
else
|
||||||
PRINT_DEBUG("Hooked renderer in %d/%d tries\n", _hook_retries, max_hook_retries);
|
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);
|
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()
|
bool Renderer_Detector::stop_retry()
|
||||||
{
|
{
|
||||||
// Retry or not
|
// Retry or not
|
||||||
bool stop = ++_hook_retries >= max_hook_retries;
|
bool stop = ++_hook_retries >= max_hook_retries;
|
||||||
|
|
||||||
if (stop)
|
if (stop)
|
||||||
{
|
|
||||||
renderer_found(nullptr);
|
renderer_found(nullptr);
|
||||||
}
|
|
||||||
|
|
||||||
return stop;
|
return stop;
|
||||||
}
|
}
|
||||||
|
@ -783,6 +765,7 @@ void Renderer_Detector::find_renderer()
|
||||||
if (_hook_thread == nullptr)
|
if (_hook_thread == nullptr)
|
||||||
{
|
{
|
||||||
_hook_thread = new std::thread(&Renderer_Detector::find_renderer_proc, this);
|
_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)
|
if (_hook_thread != nullptr)
|
||||||
{
|
{
|
||||||
_hook_retries = max_hook_retries;
|
_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 )
|
if( func == nullptr )
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
int code_len = -1;
|
int code_len = 0;
|
||||||
bool search = true;
|
bool search = true;
|
||||||
uint8_t *startCode = reinterpret_cast<uint8_t*>(func);
|
uint8_t *startCode = reinterpret_cast<uint8_t*>(func);
|
||||||
uint8_t *pCode = startCode;
|
uint8_t *pCode = startCode;
|
||||||
|
|
Loading…
Reference in a new issue