1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-14 22:03:27 +01:00

experimental dinput hook

This commit is contained in:
FunkyFr3sh 2018-11-18 03:37:45 +01:00
parent 7ec7f853d2
commit 6a2674e372
5 changed files with 78 additions and 2 deletions

View File

@ -15,6 +15,7 @@ FILES = src/debug.c \
src/screenshot.c \
src/settings.c \
src/lodepng.c \
src/dinput.c \
src/opengl.c
all:

View File

@ -13,6 +13,7 @@
<ItemGroup>
<ClCompile Include="src\clipper.c" />
<ClCompile Include="src\debug.c" />
<ClCompile Include="src\dinput.c" />
<ClCompile Include="src\lodepng.c" />
<ClCompile Include="src\main.c" />
<ClCompile Include="src\mouse.c" />

View File

@ -54,6 +54,9 @@
<ClCompile Include="src\lodepng.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\dinput.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="inc\clipper.h">

71
src/dinput.c Normal file
View File

@ -0,0 +1,71 @@
#include <windows.h>
#include <dinput.h>
void HookIAT(HMODULE hMod, char *moduleName, char *functionName, PROC newFunction);
typedef HRESULT (WINAPI *DInputCreateA)(HINSTANCE, DWORD, LPDIRECTINPUTA*, LPUNKNOWN);
typedef HRESULT (WINAPI *DICreateDevice)(IDirectInputA*, REFGUID, LPDIRECTINPUTDEVICEA *, LPUNKNOWN);
typedef HRESULT (WINAPI *DIDSetCooperativeLevel)(IDirectInputDeviceA *, HWND, DWORD);
static DInputCreateA DInputCreateA_;
static DICreateDevice DICreateDevice_;
static DIDSetCooperativeLevel DIDSetCooperativeLevel_;
static PROC HookFunc(PROC *orgFunc, PROC newFunc)
{
PROC org = *orgFunc;
DWORD oldProtect;
MEMORY_BASIC_INFORMATION mbi;
if (VirtualQuery(orgFunc, &mbi, sizeof(MEMORY_BASIC_INFORMATION)))
{
if (VirtualProtect(mbi.BaseAddress, mbi.RegionSize, PAGE_READWRITE, &oldProtect))
{
*orgFunc = newFunc;
VirtualProtect(mbi.BaseAddress, mbi.RegionSize, oldProtect, &oldProtect);
return org;
}
}
return 0;
}
static HRESULT WINAPI fake_DIDSetCooperativeLevel(IDirectInputDeviceA *This, HWND hwnd, DWORD dwFlags)
{
return DIDSetCooperativeLevel_(This, hwnd, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE);
}
static HRESULT WINAPI fake_DICreateDevice(IDirectInputA *This, REFGUID rguid, LPDIRECTINPUTDEVICEA * lplpDIDevice, LPUNKNOWN pUnkOuter)
{
HRESULT result = DICreateDevice_(This, rguid, lplpDIDevice, pUnkOuter);
if (SUCCEEDED(result) && !DIDSetCooperativeLevel_)
{
DIDSetCooperativeLevel_ =
(DIDSetCooperativeLevel)HookFunc(
(PROC *)&(*lplpDIDevice)->lpVtbl->SetCooperativeLevel, (PROC)fake_DIDSetCooperativeLevel);
}
return result;
}
static HRESULT WINAPI fake_DirectInputCreateA(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPUTA* lplpDirectInput, LPUNKNOWN punkOuter)
{
DInputCreateA_ = (DInputCreateA)GetProcAddress(GetModuleHandle("dinput.dll"), "DirectInputCreateA");
if (!DInputCreateA_)
return DIERR_GENERIC;
HRESULT result = DInputCreateA_(hinst, dwVersion, lplpDirectInput, punkOuter);
if (SUCCEEDED(result) && !DICreateDevice_)
{
DICreateDevice_ =
(DICreateDevice)HookFunc((PROC *)&(*lplpDirectInput)->lpVtbl->CreateDevice, (PROC)fake_DICreateDevice);
}
return result;
}
void dinput_init()
{
HookIAT(GetModuleHandle(NULL), "dinput.dll", "DirectInputCreateA", (PROC)fake_DirectInputCreateA);
}

View File

@ -30,16 +30,15 @@
#define IDR_MYMENU 93
/* from mouse.c */
BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint);
void mouse_init();
void mouse_lock();
void mouse_unlock();
/* from screenshot.c */
BOOL screenshot(struct IDirectDrawSurfaceImpl *);
void Settings_Load();
void Settings_Save(RECT *lpRect, int windowState);
void dinput_init();
IDirectDrawImpl *ddraw = NULL;
@ -89,6 +88,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved)
}
timeBeginPeriod(1);
dinput_init();
break;
}
case DLL_PROCESS_DETACH: