mirror of
https://github.com/hyblocker/OpenVR-SpaceCalibrator.git
synced 2026-10-07 06:00:23 +02:00
62 lines
2.0 KiB
C++
62 lines
2.0 KiB
C++
#include "Logging.h"
|
|
#include "Hooking.h"
|
|
#include "InterfaceHookInjector.h"
|
|
#include "ServerTrackedDeviceProvider.h"
|
|
|
|
static ServerTrackedDeviceProvider *Driver = nullptr;
|
|
|
|
static Hook<void*(*)(vr::IVRDriverContext *, const char *, vr::EVRInitError *)>
|
|
GetGenericInterfaceHook("IVRDriverContext::GetGenericInterface");
|
|
|
|
static Hook<void(*)(vr::IVRServerDriverHost *, uint32_t, const vr::DriverPose_t &, uint32_t)>
|
|
TrackedDevicePoseUpdatedHook("IVRServerDriverHost005::TrackedDevicePoseUpdated");
|
|
|
|
static void DetourTrackedDevicePoseUpdated(vr::IVRServerDriverHost *_this, uint32_t unWhichDevice, const vr::DriverPose_t &newPose, uint32_t unPoseStructSize)
|
|
{
|
|
//TRACE("ServerTrackedDeviceProvider::DetourTrackedDevicePoseUpdated(%d)", unWhichDevice);
|
|
auto pose = newPose;
|
|
if (Driver->HandleDevicePoseUpdated(unWhichDevice, pose))
|
|
{
|
|
TrackedDevicePoseUpdatedHook.originalFunc(_this, unWhichDevice, pose, unPoseStructSize);
|
|
}
|
|
}
|
|
|
|
static void *DetourGetGenericInterface(vr::IVRDriverContext *_this, const char *pchInterfaceVersion, vr::EVRInitError *peError)
|
|
{
|
|
TRACE("ServerTrackedDeviceProvider::DetourGetGenericInterface(%s)", pchInterfaceVersion);
|
|
auto originalInterface = GetGenericInterfaceHook.originalFunc(_this, pchInterfaceVersion, peError);
|
|
|
|
std::string iface(pchInterfaceVersion);
|
|
if (iface == "IVRServerDriverHost_005")
|
|
{
|
|
if (!IHook::Exists(TrackedDevicePoseUpdatedHook.name))
|
|
{
|
|
TrackedDevicePoseUpdatedHook.CreateHookInObjectVTable(originalInterface, 1, &DetourTrackedDevicePoseUpdated);
|
|
IHook::Register(&TrackedDevicePoseUpdatedHook);
|
|
}
|
|
}
|
|
|
|
return originalInterface;
|
|
}
|
|
|
|
void InjectHooks(ServerTrackedDeviceProvider *driver, vr::IVRDriverContext *pDriverContext)
|
|
{
|
|
Driver = driver;
|
|
|
|
auto err = MH_Initialize();
|
|
if (err == MH_OK)
|
|
{
|
|
GetGenericInterfaceHook.CreateHookInObjectVTable(pDriverContext, 0, &DetourGetGenericInterface);
|
|
IHook::Register(&GetGenericInterfaceHook);
|
|
}
|
|
else
|
|
{
|
|
LOG("MH_Initialize error: %s", MH_StatusToString(err));
|
|
}
|
|
}
|
|
|
|
void DisableHooks()
|
|
{
|
|
IHook::DestroyAll();
|
|
MH_Uninitialize();
|
|
} |