Skip to content

Commit dc14d4c

Browse files
committed
Implement handler removing when no hooks are active
1 parent 315bf46 commit dc14d4c

File tree

3 files changed

+20
-5
lines changed

3 files changed

+20
-5
lines changed

loader/src/loader/HookImpl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ Result<> Hook::Impl::enable() {
8282
Result<> Hook::Impl::disable() {
8383
if (!m_enabled)
8484
return Ok();
85-
GEODE_UNWRAP_INTO(auto handler, LoaderImpl::get()->getHandler(m_address));
85+
GEODE_UNWRAP_INTO(auto handler, LoaderImpl::get()->getOrRemoveHandler(m_address));
8686
tulip::hook::removeHook(handler, m_handle);
8787
m_enabled = false;
8888
log::debug("Disabled {} hook", m_displayName);

loader/src/loader/LoaderImpl.cpp

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -948,15 +948,29 @@ Result<tulip::hook::HandlerHandle> Loader::Impl::getHandler(void* address) {
948948
if (!m_handlerHandles.count(address)) {
949949
return Err("Handler does not exist at address");
950950
}
951-
return Ok(m_handlerHandles[address]);
951+
return Ok(m_handlerHandles[address].first);
952952
}
953953

954954
Result<tulip::hook::HandlerHandle> Loader::Impl::getOrCreateHandler(void* address, tulip::hook::HandlerMetadata const& metadata) {
955955
if (m_handlerHandles.count(address)) {
956-
return Ok(m_handlerHandles[address]);
956+
m_handlerHandles[address].second++;
957+
return Ok(m_handlerHandles[address].first);
957958
}
958959
GEODE_UNWRAP_INTO(auto handle, tulip::hook::createHandler(address, metadata));
959-
m_handlerHandles[address] = handle;
960+
m_handlerHandles[address].first = handle;
961+
m_handlerHandles[address].second = 1;
962+
return Ok(handle);
963+
}
964+
965+
Result<tulip::hook::HandlerHandle> Loader::Impl::getOrRemoveHandler(void* address) {
966+
if (!m_handlerHandles.count(address)) {
967+
return Err("Handler does not exist at address");
968+
}
969+
auto handle = m_handlerHandles[address].first;
970+
if (m_handlerHandles[address].second == 1) {
971+
GEODE_UNWRAP(tulip::hook::removeHandler(handle));
972+
}
973+
m_handlerHandles[address].second--;
960974
return Ok(handle);
961975
}
962976

loader/src/loader/LoaderImpl.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,11 @@ namespace geode {
6868
Mod* takeNextMod();
6969
void releaseNextMod();
7070

71-
std::unordered_map<void*, tulip::hook::HandlerHandle> m_handlerHandles;
71+
std::unordered_map<void*, std::pair<tulip::hook::HandlerHandle, size_t>> m_handlerHandles;
7272

7373
Result<tulip::hook::HandlerHandle> getHandler(void* address);
7474
Result<tulip::hook::HandlerHandle> getOrCreateHandler(void* address, tulip::hook::HandlerMetadata const& metadata);
75+
Result<tulip::hook::HandlerHandle> getOrRemoveHandler(void* address);
7576

7677
bool loadHooks();
7778

0 commit comments

Comments
 (0)