Reconnect to an already-injected DLL (reuse it, survive a tool restart)
Disconnect -> reconnect now reuses the DLL already in the game instead of injecting again, including across a tool restart or crash: a connected DLL keeps its per-pid shared section (and worker) alive after the host goes away, so a fresh host can find it and re-attach to the same section. - hook_dll_alive(pid) (host/src/inject/dll_probe.cpp): detect a live DLL by opening the per-pid section and polling its heartbeat (returns as soon as a beat lands; a missing section or stalled worker reads as not-alive). It does not check magic -- a graceful disconnect zeroes magic but the DLL keeps beating and the worker never re-checks magic post-connect. - InjectionPanel: the Inject and Connect button branches to reconnect_selected() when a live DLL is detected -- IpcServer::start() re-attaches to the SAME section the DLL still holds and re-publishes the subsystem state; no re-injection. Factored the shared post-connect setup (publish_subsystem_state / begin_liveness_tracking). The DLL needed no change -- it just resumes reading the re-attached section. - A false not-alive is benign: the inject path still re-attaches an already-injected DLL (LoadLibrary no-ops), so the timeout only needs to clear the worker's ~250ms beat period with margin. Test (mock_game_test test_reconnect): inject -> hooked -> graceful disconnect -> drop the host handle (simulating a restart while the DLL keeps the section alive) -> detect via heartbeat -> re-attach to the same section -> hooks re-install without re-injecting -> and hook_dll_alive goes false once the game is gone. Roadmap: both current tasks (graceful disconnect, reconnect) done -> removed. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -221,7 +221,8 @@ add_test(NAME dx12_present_hook_test COMMAND dx12_present_hook_test)
|
||||
# stresses hook/unhook cycles. Reuses the shipping shared-texture reader. Skips without D3D11.
|
||||
add_executable(mock_game_test
|
||||
mock_game_test.cpp
|
||||
${CMAKE_SOURCE_DIR}/host/src/capture/shared_texture.cpp)
|
||||
${CMAKE_SOURCE_DIR}/host/src/capture/shared_texture.cpp
|
||||
${CMAKE_SOURCE_DIR}/host/src/inject/dll_probe.cpp)
|
||||
target_include_directories(mock_game_test PRIVATE
|
||||
${CMAKE_SOURCE_DIR}/host/src
|
||||
${CMAKE_SOURCE_DIR}/tools/mock_game)
|
||||
|
||||
Reference in New Issue
Block a user