diff --git a/src/dinput.c b/src/dinput.c index 6859120..c78f2f5 100644 --- a/src/dinput.c +++ b/src/dinput.c @@ -1,14 +1,17 @@ #include #include #include "hook.h" +#include "main.h" typedef HRESULT (WINAPI *DIRECTINPUTCREATEAPROC)(HINSTANCE, DWORD, LPDIRECTINPUTA*, LPUNKNOWN); typedef HRESULT (WINAPI *DICREATEDEVICEPROC)(IDirectInputA*, REFGUID, LPDIRECTINPUTDEVICEA *, LPUNKNOWN); typedef HRESULT (WINAPI *DIDSETCOOPERATIVELEVELPROC)(IDirectInputDeviceA *, HWND, DWORD); +typedef HRESULT (WINAPI *DIDGETDEVICEDATAPROC)(IDirectInputDeviceA*, DWORD, LPDIDEVICEOBJECTDATA, LPDWORD, DWORD); static DIRECTINPUTCREATEAPROC DInputCreateA; static DICREATEDEVICEPROC DICreateDevice; static DIDSETCOOPERATIVELEVELPROC DIDSetCooperativeLevel; +static DIDGETDEVICEDATAPROC DIDGetDeviceData; static PROC HookFunc(PROC *orgFunc, PROC newFunc) { @@ -30,6 +33,18 @@ static HRESULT WINAPI fake_DIDSetCooperativeLevel(IDirectInputDeviceA *This, HWN return DIDSetCooperativeLevel(This, hwnd, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE); } +static HRESULT WINAPI fake_DIDGetDeviceData(IDirectInputDeviceA *This, DWORD cbObjectData, LPDIDEVICEOBJECTDATA rgdod, LPDWORD pdwInOut, DWORD dwFlags) +{ + HRESULT result = DIDGetDeviceData(This, cbObjectData, rgdod, pdwInOut, dwFlags); + + if (SUCCEEDED(result) && ddraw && !ddraw->locked) + { + *pdwInOut = 0; + } + + return result; +} + static HRESULT WINAPI fake_DICreateDevice(IDirectInputA *This, REFGUID rguid, LPDIRECTINPUTDEVICEA * lplpDIDevice, LPUNKNOWN pUnkOuter) { HRESULT result = DICreateDevice(This, rguid, lplpDIDevice, pUnkOuter); @@ -39,6 +54,10 @@ static HRESULT WINAPI fake_DICreateDevice(IDirectInputA *This, REFGUID rguid, LP DIDSetCooperativeLevel = (DIDSETCOOPERATIVELEVELPROC)HookFunc( (PROC *)&(*lplpDIDevice)->lpVtbl->SetCooperativeLevel, (PROC)fake_DIDSetCooperativeLevel); + + DIDGetDeviceData = + (DIDGETDEVICEDATAPROC)HookFunc( + (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceData, (PROC)fake_DIDGetDeviceData); } return result;