Deduplicate the hook DLL and scrub history from its comments
Consolidate four copies of the keyed-mutex shared-texture setup (present/opengl/d3d9/vk_capture) into one RAII SharedVideoTexture, two copies of find_main_window into find_window.hpp, audio_hook's hand-rolled detour guard into the shared DetourGate, the duplicated vtable_method into vtable_hook.hpp, and the near-identical Present/Present1 and SwapBuffers/wglSwapBuffers detour pairs into one shared body each. The vk_layer and vk_capture_perf_test targets now compile debug_log.cpp since the shared texture code logs. Comments no longer narrate the past: drop stress-test/game anecdotes, "used to"/"the old model" phrasing, plan-step labels, and pointers to docs that do not exist; fix present_hook.hpp/opengl_hook.hpp claims that predate the D3D12/D3D9/Vulkan backends. Net -266 lines, no behavior change (full x64 + x86 suites pass, including the mock-game hook/unhook storm).
This commit is contained in:
@@ -6,6 +6,7 @@
|
||||
|
||||
#include <safetyhook.hpp>
|
||||
|
||||
#include "find_window.hpp"
|
||||
#include "hook_guard.hpp"
|
||||
#include "hook_install.hpp"
|
||||
#include "hook_registry.hpp"
|
||||
@@ -35,46 +36,6 @@ int g_id_setcursorpos = -1;
|
||||
safetyhook::InlineHook g_hk_clipcursor;
|
||||
safetyhook::InlineHook g_hk_setcursorpos;
|
||||
|
||||
struct EnumContext
|
||||
{
|
||||
DWORD pid;
|
||||
HWND best;
|
||||
long best_area;
|
||||
};
|
||||
|
||||
BOOL CALLBACK enum_proc(HWND hwnd, LPARAM lparam)
|
||||
{
|
||||
auto* ctx = reinterpret_cast<EnumContext*>(lparam);
|
||||
|
||||
DWORD pid = 0;
|
||||
GetWindowThreadProcessId(hwnd, &pid);
|
||||
if (pid != ctx->pid || !IsWindowVisible(hwnd) || GetWindow(hwnd, GW_OWNER) != nullptr)
|
||||
{
|
||||
return TRUE; // not ours, hidden, or an owned dialog -- keep looking
|
||||
}
|
||||
|
||||
RECT rect = {};
|
||||
if (!GetWindowRect(hwnd, &rect))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
const long area = (rect.right - rect.left) * (rect.bottom - rect.top);
|
||||
if (area > ctx->best_area)
|
||||
{
|
||||
ctx->best_area = area;
|
||||
ctx->best = hwnd;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// The game's main window = the largest visible, unowned top-level window it owns.
|
||||
HWND find_main_window(DWORD pid)
|
||||
{
|
||||
EnumContext ctx{pid, nullptr, 0};
|
||||
EnumWindows(&enum_proc, reinterpret_cast<LPARAM>(&ctx));
|
||||
return ctx.best;
|
||||
}
|
||||
|
||||
// Replacement window procedure: convince the game it is never deactivated.
|
||||
LRESULT CALLBACK subclass_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
|
||||
{
|
||||
@@ -313,7 +274,7 @@ void remove_focus_spoof()
|
||||
// GetForegroundWindow is still hooked -- its detour returns g_game_hwnd and never reaches the
|
||||
// patched bytes. The reverse of the enable order (GFW first) keeps the invariant "GetActiveWindow
|
||||
// hooked => GetForegroundWindow hooked" across the whole install/remove cycle, so a call never
|
||||
// lands in a half-patched shared region (the intermittent storm crash: GetActiveWindow+0x8).
|
||||
// lands in a half-patched shared region.
|
||||
for (auto it = g_focus_hooks.rbegin(); it != g_focus_hooks.rend(); ++it)
|
||||
{
|
||||
disable_for_removal(*it);
|
||||
|
||||
Reference in New Issue
Block a user