Phase 1a: input forwarding via DLL injection + XInput hook
The host can now inject coop_hook.dll into a running game and forward controller state to it over shared memory, so the game reads the host's (eventually the guest's) input and nothing else. - hook/: coop_hook.dll. DllMain spawns a worker that opens the shared-memory channel (named by the game's pid) and installs SafetyHook inline hooks on XInputGetState/GetStateEx/GetCapabilities/SetState. Detours synthesize state from shared memory; unmanaged slots report disconnected, hiding physical pads. - host/: process picker (Toolhelp32), CreateRemoteThread(LoadLibraryW) injector with an IsWow64Process2 bitness guard, IPC server publishing pads each frame, and an ImGui Injection panel wiring it together. - tests/: hook_selftest exercises the IPC seqlock + hook detours in-process (no game/controller needed); passes. Build: SafetyHook wired in (COOP_BUILD_HOOK=ON), Zydis via FetchContent. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
41
host/src/ipc/ipc_server.hpp
Normal file
41
host/src/ipc/ipc_server.hpp
Normal file
@@ -0,0 +1,41 @@
|
||||
// Host side of the IPC channel: creates the shared-memory section (named by the
|
||||
// target game's pid) and publishes the forwarded controller state each frame.
|
||||
#pragma once
|
||||
|
||||
#include <array>
|
||||
|
||||
#include "coop/protocol.hpp"
|
||||
#include "coop/shared_memory.hpp"
|
||||
#include "input/input_source.hpp"
|
||||
|
||||
namespace coop
|
||||
{
|
||||
|
||||
class IpcServer
|
||||
{
|
||||
public:
|
||||
// Creates and initializes the section for `target_pid`. The injected hook
|
||||
// derives the same name from its own pid and opens it.
|
||||
bool start(unsigned long target_pid);
|
||||
|
||||
// Pushes the current pad snapshot to the hook. No-op if not started.
|
||||
void publish(const std::array<PadInfo, kMaxPads>& pads);
|
||||
|
||||
void stop();
|
||||
|
||||
[[nodiscard]] bool running() const
|
||||
{
|
||||
return block_ != nullptr;
|
||||
}
|
||||
[[nodiscard]] unsigned long target_pid() const
|
||||
{
|
||||
return target_pid_;
|
||||
}
|
||||
|
||||
private:
|
||||
SharedMemory shm_;
|
||||
SharedBlock* block_ = nullptr;
|
||||
unsigned long target_pid_ = 0;
|
||||
};
|
||||
|
||||
} // namespace coop
|
||||
Reference in New Issue
Block a user