Drive a nested Win32 sub-build (CMake ExternalProject, re-entrant via COOP_X86_HELPER_BUILD) from the normal x64 build to produce coop_hook_x86.dll and a 32-bit coop_inject_x86.exe, staged next to the x64 binaries. The host detects a WOW64 target with IsWow64Process2 and spawns the helper to load the x86 DLL, since a 64-bit process can't cleanly inject a 32-bit one. The shared-memory IPC is fixed-width / bitness-stable, so the x64 host and x86 hook interoperate. Validated end-to-end against Slaps and Beans (32-bit D3D11): all 15 hooks installed, heartbeat advancing, the Present hook engaged (shared a 1920x1080 backbuffer -- the real-game video-hook proof Phantom Brave's D3D9 couldn't give), and status/audio/video/log IPC all crossed the x64<->x86 boundary. coop_audio_probe now also delegates to the helper for WOW64 targets. All 5 tests pass. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
36 lines
1.1 KiB
CMake
36 lines
1.1 KiB
CMake
add_library(coop_hook SHARED
|
|
src/dllmain.cpp
|
|
src/xinput_hook.cpp
|
|
src/focus_spoof.cpp
|
|
src/audio_hook.cpp
|
|
src/present_hook.cpp
|
|
src/debug_log.cpp
|
|
src/hook_registry.cpp)
|
|
|
|
target_include_directories(coop_hook PRIVATE src)
|
|
|
|
# The audio render-hook uses IAudioClient3 / process-audio interfaces, which need
|
|
# the Windows 10 20H1 (NTDDI_WIN10_CO) headers.
|
|
target_compile_definitions(coop_hook PRIVATE NTDDI_VERSION=0x0A00000B)
|
|
|
|
target_link_libraries(coop_hook PRIVATE
|
|
coop_common
|
|
safetyhook::safetyhook
|
|
user32
|
|
ole32
|
|
mmdevapi
|
|
d3d11
|
|
dxgi)
|
|
|
|
# The x86 sub-build (COOP_X86_HELPER_BUILD) stages alongside the x64 DLL in the
|
|
# same bin/<config> dir, so give it a distinct name the host loads for 32-bit games.
|
|
if(COOP_X86_HELPER_BUILD)
|
|
set_target_properties(coop_hook PROPERTIES OUTPUT_NAME "coop_hook_x86")
|
|
else()
|
|
set_target_properties(coop_hook PROPERTIES OUTPUT_NAME "coop_hook")
|
|
endif()
|
|
|
|
# TODO(dist): statically link the VC runtime (/MT) so the DLL loads in games on
|
|
# machines without the matching VC redist. Deferred until SafetyHook + Zydis are
|
|
# also forced to a static CRT to avoid a /MT-vs-/MD mismatch.
|