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>
38 lines
1.1 KiB
C++
38 lines
1.1 KiB
C++
// Loads coop_hook.dll into a target process via the classic
|
|
// CreateRemoteThread(LoadLibraryW) technique.
|
|
#pragma once
|
|
|
|
#include <string>
|
|
|
|
namespace coop
|
|
{
|
|
|
|
enum class InjectStatus
|
|
{
|
|
Ok,
|
|
OpenProcessFailed, // insufficient rights (try running the host as admin)
|
|
BitnessMismatch, // 32-bit target; the x86 hook/helper aren't available
|
|
DllNotFound,
|
|
AllocFailed,
|
|
WriteFailed,
|
|
RemoteThreadFailed,
|
|
RemoteLoadFailed, // LoadLibraryW returned null inside the target
|
|
HelperNotFound, // 32-bit target but coop_inject_x86.exe / coop_hook_x86.dll missing
|
|
HelperFailed, // the x86 injector helper ran but reported failure
|
|
};
|
|
|
|
struct InjectResult
|
|
{
|
|
InjectStatus status = InjectStatus::OpenProcessFailed;
|
|
unsigned long os_error = 0; // GetLastError at the point of failure, if any
|
|
};
|
|
|
|
const char* to_string(InjectStatus status);
|
|
|
|
// Injects `dll_path` (absolute, the x64 coop_hook.dll) into `pid`. For a 32-bit
|
|
// (WOW64) target the x64 host can't inject directly, so it spawns the sibling
|
|
// coop_inject_x86.exe to load coop_hook_x86.dll (both expected next to dll_path).
|
|
InjectResult inject_dll(unsigned long pid, const std::wstring& dll_path);
|
|
|
|
} // namespace coop
|