Fix stale removal comments (persistent, not destroy) + add deterministic install test
- The remove_* comments still described the superseded "disable -> drain -> destroy" flow; the code keeps hooks alive (persistent) and re-enables on re-install. Updated the comments to match, and corrected the XInput note (its detours return synthesized state and never call the trampoline, so destroying its vector is safe -- unlike the trampoline-calling present/MKB/focus-cursor hooks). - hook_install_test: a fast, single-threaded contract test for hook_install.hpp -- install_inline creates the hook once and reuses the SAME trampoline across 50 install/remove cycles (never freed -> no stale-detour UAF), toggling enable/disable cleanly. Fills the guard the removed (flaky, concurrency-bound) reproducer left, with no threads so it can't flake on SafetyHook's enable/disable atomicity. x64 23/23, x86 3/3. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -995,12 +995,12 @@ bool install_present_hooks(IpcClient& ipc)
|
||||
|
||||
void remove_present_hooks()
|
||||
{
|
||||
// DISABLE (not destroy) the hooks first: this restores the Present/Present1/ECL bytes under
|
||||
// thread suspension so no NEW detour starts, but KEEPS the trampolines alive -- an in-flight
|
||||
// detour about to call g_hk_present.stdcall() (the trampoline) must not have it freed under it.
|
||||
// Destroying here (= {}) frees the trampoline immediately; at a few hundred presents/s that race
|
||||
// was rarely hit, but the uncapped mock-game storm (thousands/s) hits it reliably (0xC0000005).
|
||||
// So: disable -> drain (in-flight detours finish on the live trampoline) -> only THEN destroy.
|
||||
// DISABLE (persistent model -- never destroy during the session): this restores the
|
||||
// Present/Present1/ECL bytes under thread suspension so no NEW detour starts, while KEEPING the
|
||||
// trampolines alive -- an in-flight detour about to call g_hk_present.stdcall() (the trampoline)
|
||||
// must never have it freed under it (destroying = {} would, an AV the thousands/s storm hits
|
||||
// reliably). So: disable -> drain (in-flight detours finish on the live trampoline) -> leave the
|
||||
// hooks alive (re-install re-enables them; see hook_install.hpp).
|
||||
disable_for_removal(g_hk_present);
|
||||
disable_for_removal(g_hk_present1);
|
||||
disable_for_removal(g_hk_ecl);
|
||||
|
||||
Reference in New Issue
Block a user