Initial re-upload of spice2x-24-08-24
This commit is contained in:
112
hooks/input/dinput8/fake_backend.cpp
Normal file
112
hooks/input/dinput8/fake_backend.cpp
Normal file
@@ -0,0 +1,112 @@
|
||||
#include <initguid.h>
|
||||
|
||||
#include "fake_backend.h"
|
||||
|
||||
#include <dinput.h>
|
||||
|
||||
#include "util/logging.h"
|
||||
|
||||
#include "fake_device.h"
|
||||
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInput8W::QueryInterface(
|
||||
REFIID riid,
|
||||
void **ppvObj)
|
||||
{
|
||||
if (ppvObj == nullptr) {
|
||||
return E_POINTER;
|
||||
}
|
||||
|
||||
if (riid == IID_IDirectInput8A ||
|
||||
riid == IID_IDirectInput8W)
|
||||
{
|
||||
this->AddRef();
|
||||
*ppvObj = this;
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
ULONG STDMETHODCALLTYPE FakeIDirectInput8W::AddRef() {
|
||||
return ++this->ref_count;
|
||||
}
|
||||
ULONG STDMETHODCALLTYPE FakeIDirectInput8W::Release() {
|
||||
ULONG refs = --this->ref_count;
|
||||
|
||||
if (refs == 0) {
|
||||
delete this;
|
||||
}
|
||||
|
||||
return refs;
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInput8W::CreateDevice(
|
||||
REFGUID rguid,
|
||||
LPDIRECTINPUTDEVICE8W *lplpDirectInputDevice,
|
||||
LPUNKNOWN pUnkOuter)
|
||||
{
|
||||
log_misc("input::dinput8", "IDirectInput8::CreateDevice hook hit");
|
||||
|
||||
if (lplpDirectInputDevice == nullptr) {
|
||||
return DIERR_INVALIDPARAM;
|
||||
}
|
||||
|
||||
if (rguid == GUID_SysKeyboard ||
|
||||
rguid == GUID_SysMouse)
|
||||
{
|
||||
log_misc("input::dinput8", "returning stub device");
|
||||
|
||||
*lplpDirectInputDevice = new FakeIDirectInputDevice8W();
|
||||
|
||||
return DI_OK;
|
||||
}
|
||||
|
||||
return DIERR_NOINTERFACE;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInput8W::EnumDevices(
|
||||
DWORD dwDevType,
|
||||
LPDIENUMDEVICESCALLBACKW lpCallback,
|
||||
LPVOID pvRef,
|
||||
DWORD dwFlags)
|
||||
{
|
||||
log_misc("input::dinput8", "IDirectInput8::EnumDevices hook hit");
|
||||
|
||||
return DI_OK;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInput8W::GetDeviceStatus(REFGUID rguidInstance) {
|
||||
return DIERR_GENERIC;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInput8W::RunControlPanel(HWND hwndOwner, DWORD dwFlags) {
|
||||
return DIERR_GENERIC;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInput8W::Initialize(HINSTANCE hinst, DWORD dwVersion) {
|
||||
log_misc("input::dinput8", "IDirectInput8::Initialize({}, 0x{:x})",
|
||||
fmt::ptr(hinst),
|
||||
dwVersion);
|
||||
|
||||
return DI_OK;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInput8W::FindDevice(
|
||||
REFGUID rguid,
|
||||
LPCWSTR pszName,
|
||||
LPGUID pguidInstance)
|
||||
{
|
||||
return DIERR_GENERIC;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInput8W::EnumDevicesBySemantics(
|
||||
LPCWSTR ptszUserName,
|
||||
LPDIACTIONFORMATW lpdiActionFormat,
|
||||
LPDIENUMDEVICESBYSEMANTICSCBW lpCallback,
|
||||
LPVOID pvRef,
|
||||
DWORD dwFlags)
|
||||
{
|
||||
return DIERR_GENERIC;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInput8W::ConfigureDevices(
|
||||
LPDICONFIGUREDEVICESCALLBACK lpdiCallback,
|
||||
LPDICONFIGUREDEVICESPARAMSW lpdiCDParams,
|
||||
DWORD dwFlags,
|
||||
LPVOID pvRefData)
|
||||
{
|
||||
return DIERR_GENERIC;
|
||||
}
|
||||
35
hooks/input/dinput8/fake_backend.h
Normal file
35
hooks/input/dinput8/fake_backend.h
Normal file
@@ -0,0 +1,35 @@
|
||||
#pragma once
|
||||
|
||||
#include <atomic>
|
||||
|
||||
#include <dinput.h>
|
||||
|
||||
struct FakeIDirectInput8W : IDirectInput8W {
|
||||
explicit FakeIDirectInput8W() {
|
||||
}
|
||||
|
||||
FakeIDirectInput8W(const FakeIDirectInput8W &) = delete;
|
||||
FakeIDirectInput8W &operator=(const FakeIDirectInput8W &) = delete;
|
||||
|
||||
virtual ~FakeIDirectInput8W() = default;
|
||||
|
||||
#pragma region IUnknown
|
||||
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObj) override;
|
||||
virtual ULONG STDMETHODCALLTYPE AddRef() override;
|
||||
virtual ULONG STDMETHODCALLTYPE Release() override;
|
||||
#pragma endregion
|
||||
|
||||
#pragma region IDirectInput8W
|
||||
virtual HRESULT STDMETHODCALLTYPE CreateDevice(REFGUID rguid, LPDIRECTINPUTDEVICE8W *lplpDirectInputDevice, LPUNKNOWN pUnkOuter) override;
|
||||
virtual HRESULT STDMETHODCALLTYPE EnumDevices(DWORD dwDevType, LPDIENUMDEVICESCALLBACKW lpCallback, LPVOID pvRef, DWORD dwFlags) override;
|
||||
virtual HRESULT STDMETHODCALLTYPE GetDeviceStatus(REFGUID rguidInstance) override;
|
||||
virtual HRESULT STDMETHODCALLTYPE RunControlPanel(HWND hwndOwner, DWORD dwFlags) override;
|
||||
virtual HRESULT STDMETHODCALLTYPE Initialize(HINSTANCE hinst, DWORD dwVersion) override;
|
||||
virtual HRESULT STDMETHODCALLTYPE FindDevice(REFGUID rguid, LPCWSTR pszName, LPGUID pguidInstance) override;
|
||||
virtual HRESULT STDMETHODCALLTYPE EnumDevicesBySemantics(LPCWSTR ptszUserName, LPDIACTIONFORMATW lpdiActionFormat, LPDIENUMDEVICESBYSEMANTICSCBW lpCallback, LPVOID pvRef, DWORD dwFlags) override;
|
||||
virtual HRESULT STDMETHODCALLTYPE ConfigureDevices(LPDICONFIGUREDEVICESCALLBACK lpdiCallback, LPDICONFIGUREDEVICESPARAMSW lpdiCDParams, DWORD dwFlags, LPVOID pvRefData) override;
|
||||
#pragma endregion
|
||||
|
||||
private:
|
||||
std::atomic<ULONG> ref_count = 1;
|
||||
};
|
||||
207
hooks/input/dinput8/fake_device.cpp
Normal file
207
hooks/input/dinput8/fake_device.cpp
Normal file
@@ -0,0 +1,207 @@
|
||||
#include <initguid.h>
|
||||
|
||||
#include "fake_device.h"
|
||||
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInputDevice8W::QueryInterface(
|
||||
REFIID riid,
|
||||
void **ppvObj)
|
||||
{
|
||||
if (ppvObj == nullptr) {
|
||||
return E_POINTER;
|
||||
}
|
||||
|
||||
if (riid == IID_IDirectInputDeviceA ||
|
||||
riid == IID_IDirectInputDeviceW ||
|
||||
riid == IID_IDirectInputDevice2A ||
|
||||
riid == IID_IDirectInputDevice2W ||
|
||||
riid == IID_IDirectInputDevice7A ||
|
||||
riid == IID_IDirectInputDevice7W ||
|
||||
riid == IID_IDirectInputDevice8A ||
|
||||
riid == IID_IDirectInputDevice8W)
|
||||
{
|
||||
this->AddRef();
|
||||
*ppvObj = this;
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
ULONG STDMETHODCALLTYPE FakeIDirectInputDevice8W::AddRef() {
|
||||
return ++this->ref_count;
|
||||
}
|
||||
ULONG STDMETHODCALLTYPE FakeIDirectInputDevice8W::Release() {
|
||||
ULONG refs = --this->ref_count;
|
||||
|
||||
if (refs == 0) {
|
||||
delete this;
|
||||
}
|
||||
|
||||
return refs;
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInputDevice8W::GetCapabilities(LPDIDEVCAPS lpDIDevCaps) {
|
||||
return DIERR_INVALIDPARAM;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInputDevice8W::EnumObjects(
|
||||
LPDIENUMDEVICEOBJECTSCALLBACKW lpCallback,
|
||||
LPVOID pvRef,
|
||||
DWORD dwFlags)
|
||||
{
|
||||
return DIERR_INVALIDPARAM;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInputDevice8W::GetProperty(
|
||||
REFGUID rguidProp,
|
||||
LPDIPROPHEADER pdiph)
|
||||
{
|
||||
return DIERR_INVALIDPARAM;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInputDevice8W::SetProperty(
|
||||
REFGUID rguidProp,
|
||||
LPCDIPROPHEADER pdiph)
|
||||
{
|
||||
return DI_OK;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInputDevice8W::Acquire() {
|
||||
return DIERR_INVALIDPARAM;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInputDevice8W::Unacquire() {
|
||||
return DIERR_INVALIDPARAM;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInputDevice8W::GetDeviceState(
|
||||
DWORD cbData,
|
||||
LPVOID lpvData)
|
||||
{
|
||||
return DIERR_INVALIDPARAM;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInputDevice8W::GetDeviceData(
|
||||
DWORD cbObjectData,
|
||||
LPDIDEVICEOBJECTDATA rgdod,
|
||||
LPDWORD pdwInOut,
|
||||
DWORD dwFlags)
|
||||
{
|
||||
return DIERR_INVALIDPARAM;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInputDevice8W::SetDataFormat(LPCDIDATAFORMAT lpdf) {
|
||||
return DI_OK;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInputDevice8W::SetEventNotification(HANDLE hEvent) {
|
||||
return DIERR_INVALIDPARAM;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInputDevice8W::SetCooperativeLevel(
|
||||
HWND hWnd,
|
||||
DWORD dwFlags)
|
||||
{
|
||||
return DI_OK;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInputDevice8W::GetObjectInfo(
|
||||
LPDIDEVICEOBJECTINSTANCEW pdidoi,
|
||||
DWORD dwObj,
|
||||
DWORD dwHow)
|
||||
{
|
||||
return DIERR_INVALIDPARAM;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInputDevice8W::GetDeviceInfo(
|
||||
LPDIDEVICEINSTANCEW pdidi)
|
||||
{
|
||||
return DIERR_INVALIDPARAM;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInputDevice8W::RunControlPanel(
|
||||
HWND hwndOwner,
|
||||
DWORD dwFlags)
|
||||
{
|
||||
return DIERR_INVALIDPARAM;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInputDevice8W::Initialize(
|
||||
HINSTANCE hinst,
|
||||
DWORD dwVersion,
|
||||
REFGUID rguid)
|
||||
{
|
||||
return DIERR_INVALIDPARAM;
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInputDevice8W::CreateEffect(
|
||||
REFGUID rguid,
|
||||
LPCDIEFFECT lpeff,
|
||||
LPDIRECTINPUTEFFECT *ppdeff,
|
||||
LPUNKNOWN punkOuter)
|
||||
{
|
||||
return DIERR_INVALIDPARAM;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInputDevice8W::EnumEffects(
|
||||
LPDIENUMEFFECTSCALLBACKW lpCallback,
|
||||
LPVOID pvRef,
|
||||
DWORD dwEffType)
|
||||
{
|
||||
return DIERR_INVALIDPARAM;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInputDevice8W::GetEffectInfo(
|
||||
LPDIEFFECTINFOW pdei,
|
||||
REFGUID rguid)
|
||||
{
|
||||
return DIERR_INVALIDPARAM;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInputDevice8W::GetForceFeedbackState(LPDWORD pdwOut) {
|
||||
return DIERR_INVALIDPARAM;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInputDevice8W::SendForceFeedbackCommand(DWORD dwFlags) {
|
||||
return DIERR_INVALIDPARAM;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInputDevice8W::EnumCreatedEffectObjects(
|
||||
LPDIENUMCREATEDEFFECTOBJECTSCALLBACK lpCallback,
|
||||
LPVOID pvRef,
|
||||
DWORD fl)
|
||||
{
|
||||
return DIERR_INVALIDPARAM;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInputDevice8W::Escape(LPDIEFFESCAPE pesc) {
|
||||
return DIERR_INVALIDPARAM;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInputDevice8W::Poll() {
|
||||
return DIERR_INVALIDPARAM;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInputDevice8W::SendDeviceData(
|
||||
DWORD cbObjectData,
|
||||
LPCDIDEVICEOBJECTDATA rgdod,
|
||||
LPDWORD pdwInOut,
|
||||
DWORD fl)
|
||||
{
|
||||
return DIERR_INVALIDPARAM;
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInputDevice8W::EnumEffectsInFile(
|
||||
LPCWSTR lpszFileName,
|
||||
LPDIENUMEFFECTSINFILECALLBACK pec,
|
||||
LPVOID pvRef,
|
||||
DWORD dwFlags)
|
||||
{
|
||||
return DIERR_INVALIDPARAM;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInputDevice8W::WriteEffectToFile(
|
||||
LPCWSTR lpszFileName,
|
||||
DWORD dwEntries,
|
||||
LPDIFILEEFFECT rgDiFileEft,
|
||||
DWORD dwFlags)
|
||||
{
|
||||
return DIERR_INVALIDPARAM;
|
||||
}
|
||||
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInputDevice8W::BuildActionMap(
|
||||
LPDIACTIONFORMATW lpdiaf,
|
||||
LPCWSTR lpszUserName,
|
||||
DWORD dwFlags)
|
||||
{
|
||||
return DIERR_INVALIDPARAM;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInputDevice8W::SetActionMap(
|
||||
LPDIACTIONFORMATW lpdiaf,
|
||||
LPCWSTR lpszUserName,
|
||||
DWORD dwFlags)
|
||||
{
|
||||
return DIERR_INVALIDPARAM;
|
||||
}
|
||||
HRESULT STDMETHODCALLTYPE FakeIDirectInputDevice8W::GetImageInfo(
|
||||
LPDIDEVICEIMAGEINFOHEADERW lpdiDevImageInfoHeader)
|
||||
{
|
||||
return DIERR_INVALIDPARAM;
|
||||
}
|
||||
65
hooks/input/dinput8/fake_device.h
Normal file
65
hooks/input/dinput8/fake_device.h
Normal file
@@ -0,0 +1,65 @@
|
||||
#pragma once
|
||||
|
||||
#include <atomic>
|
||||
|
||||
#include <dinput.h>
|
||||
|
||||
struct FakeIDirectInputDevice8W : IDirectInputDevice8W {
|
||||
explicit FakeIDirectInputDevice8W() {
|
||||
}
|
||||
|
||||
FakeIDirectInputDevice8W(const FakeIDirectInputDevice8W &) = delete;
|
||||
FakeIDirectInputDevice8W &operator=(const FakeIDirectInputDevice8W &) = delete;
|
||||
|
||||
virtual ~FakeIDirectInputDevice8W() = default;
|
||||
|
||||
#pragma region IUnknown
|
||||
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObj) override;
|
||||
virtual ULONG STDMETHODCALLTYPE AddRef() override;
|
||||
virtual ULONG STDMETHODCALLTYPE Release() override;
|
||||
#pragma endregion
|
||||
|
||||
#pragma region IDirectInputDeviceW
|
||||
virtual HRESULT STDMETHODCALLTYPE GetCapabilities(LPDIDEVCAPS lpDIDevCaps) override;
|
||||
virtual HRESULT STDMETHODCALLTYPE EnumObjects(LPDIENUMDEVICEOBJECTSCALLBACKW lpCallback, LPVOID pvRef, DWORD dwFlags) override;
|
||||
virtual HRESULT STDMETHODCALLTYPE GetProperty(REFGUID rguidProp, LPDIPROPHEADER pdiph) override;
|
||||
virtual HRESULT STDMETHODCALLTYPE SetProperty(REFGUID rguidProp, LPCDIPROPHEADER pdiph) override;
|
||||
virtual HRESULT STDMETHODCALLTYPE Acquire() override;
|
||||
virtual HRESULT STDMETHODCALLTYPE Unacquire() override;
|
||||
virtual HRESULT STDMETHODCALLTYPE GetDeviceState(DWORD cbData, LPVOID lpvData) override;
|
||||
virtual HRESULT STDMETHODCALLTYPE GetDeviceData(DWORD cbObjectData, LPDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD dwFlags) override;
|
||||
virtual HRESULT STDMETHODCALLTYPE SetDataFormat(LPCDIDATAFORMAT lpdf) override;
|
||||
virtual HRESULT STDMETHODCALLTYPE SetEventNotification(HANDLE hEvent) override;
|
||||
virtual HRESULT STDMETHODCALLTYPE SetCooperativeLevel(HWND hWnd, DWORD dwFlags) override;
|
||||
virtual HRESULT STDMETHODCALLTYPE GetObjectInfo(LPDIDEVICEOBJECTINSTANCEW pdidoi, DWORD dwObj, DWORD dwHow) override;
|
||||
virtual HRESULT STDMETHODCALLTYPE GetDeviceInfo(LPDIDEVICEINSTANCEW pdidi) override;
|
||||
virtual HRESULT STDMETHODCALLTYPE RunControlPanel(HWND hwndOwner, DWORD dwFlags) override;
|
||||
virtual HRESULT STDMETHODCALLTYPE Initialize(HINSTANCE hinst, DWORD dwVersion, REFGUID rguid) override;
|
||||
#pragma endregion
|
||||
|
||||
#pragma region IDirectInputDevice2W
|
||||
virtual HRESULT STDMETHODCALLTYPE CreateEffect(REFGUID rguid, LPCDIEFFECT lpeff, LPDIRECTINPUTEFFECT *ppdeff, LPUNKNOWN punkOuter) override;
|
||||
virtual HRESULT STDMETHODCALLTYPE EnumEffects(LPDIENUMEFFECTSCALLBACKW lpCallback, LPVOID pvRef, DWORD dwEffType) override;
|
||||
virtual HRESULT STDMETHODCALLTYPE GetEffectInfo(LPDIEFFECTINFOW pdei, REFGUID rguid) override;
|
||||
virtual HRESULT STDMETHODCALLTYPE GetForceFeedbackState(LPDWORD pdwOut) override;
|
||||
virtual HRESULT STDMETHODCALLTYPE SendForceFeedbackCommand(DWORD dwFlags) override;
|
||||
virtual HRESULT STDMETHODCALLTYPE EnumCreatedEffectObjects(LPDIENUMCREATEDEFFECTOBJECTSCALLBACK lpCallback, LPVOID pvRef, DWORD fl) override;
|
||||
virtual HRESULT STDMETHODCALLTYPE Escape(LPDIEFFESCAPE pesc) override;
|
||||
virtual HRESULT STDMETHODCALLTYPE Poll() override;
|
||||
virtual HRESULT STDMETHODCALLTYPE SendDeviceData(DWORD cbObjectData, LPCDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD fl) override;
|
||||
#pragma endregion
|
||||
|
||||
#pragma region IDirectInputDevice7W
|
||||
virtual HRESULT STDMETHODCALLTYPE EnumEffectsInFile(LPCWSTR lpszFileName, LPDIENUMEFFECTSINFILECALLBACK pec, LPVOID pvRef, DWORD dwFlags) override;
|
||||
virtual HRESULT STDMETHODCALLTYPE WriteEffectToFile(LPCWSTR lpszFileName, DWORD dwEntries, LPDIFILEEFFECT rgDiFileEft, DWORD dwFlags) override;
|
||||
#pragma endregion
|
||||
|
||||
#pragma region IDirectInputDevice8W
|
||||
virtual HRESULT STDMETHODCALLTYPE BuildActionMap(LPDIACTIONFORMATW lpdiaf, LPCWSTR lpszUserName, DWORD dwFlags) override;
|
||||
virtual HRESULT STDMETHODCALLTYPE SetActionMap(LPDIACTIONFORMATW lpdiaf, LPCWSTR lpszUserName, DWORD dwFlags) override;
|
||||
virtual HRESULT STDMETHODCALLTYPE GetImageInfo(LPDIDEVICEIMAGEINFOHEADERW lpdiDevImageInfoHeader) override;
|
||||
#pragma endregion
|
||||
|
||||
private:
|
||||
std::atomic<ULONG> ref_count = 1;
|
||||
};
|
||||
51
hooks/input/dinput8/hook.cpp
Normal file
51
hooks/input/dinput8/hook.cpp
Normal file
@@ -0,0 +1,51 @@
|
||||
#include "hook.h"
|
||||
|
||||
#include <windows.h>
|
||||
#include <dinput.h>
|
||||
|
||||
#include "util/detour.h"
|
||||
#include "util/logging.h"
|
||||
|
||||
#include "fake_backend.h"
|
||||
|
||||
//static decltype(DirectInput8Create) *DirectInput8Create_orig = nullptr;
|
||||
|
||||
static HRESULT WINAPI DirectInput8Create_hook(
|
||||
HINSTANCE hinst,
|
||||
DWORD dwVersion,
|
||||
REFIID riidltf,
|
||||
LPVOID *ppvOut,
|
||||
LPUNKNOWN punkOuter)
|
||||
{
|
||||
log_misc("input::dinput8", "DirectInput8Create hook hit");
|
||||
|
||||
if (ppvOut == nullptr) {
|
||||
return E_POINTER;
|
||||
}
|
||||
|
||||
*ppvOut = new FakeIDirectInput8W();
|
||||
|
||||
return DI_OK;
|
||||
}
|
||||
|
||||
void hooks::input::dinput8::init(HMODULE module) {
|
||||
|
||||
/*
|
||||
* This is for the games using DirectInput for keyboard/gamepad controls themselves,
|
||||
* for things such as debug controls. We don't want that, neither do we want the game to
|
||||
* interfere with our RawInput stuff.
|
||||
*/
|
||||
|
||||
log_info("input::dinput8", "attaching...");
|
||||
|
||||
// patch IAT
|
||||
detour::iat_try("DirectInput8Create", DirectInput8Create_hook, module, "dinput8.dll");
|
||||
|
||||
/*
|
||||
if (DirectInput8Create_orig == nullptr) {
|
||||
DirectInput8Create_orig = orig;
|
||||
}
|
||||
*/
|
||||
|
||||
log_info("input::dinput8", "attached");
|
||||
}
|
||||
7
hooks/input/dinput8/hook.h
Normal file
7
hooks/input/dinput8/hook.h
Normal file
@@ -0,0 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
namespace hooks::input::dinput8 {
|
||||
void init(HMODULE module = nullptr);
|
||||
}
|
||||
Reference in New Issue
Block a user