1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-25 01:57:47 +01:00

dinput.dll proxy with CoCreateInstance hook

This commit is contained in:
FunkyFr3sh 2021-08-02 17:27:19 +02:00
parent d31ffbade5
commit a25e4d35f8
6 changed files with 38 additions and 1 deletions

View File

@ -13,5 +13,6 @@ EXPORTS
DirectDrawEnumerateExW @13 DirectDrawEnumerateExW @13
DirectDrawEnumerateW @14 DirectDrawEnumerateW @14
ReleaseDDThreadLock @21 ReleaseDDThreadLock @21
DirectInputCreateEx = fake_DirectInputCreateEx @22
GameHandlesClose DATA GameHandlesClose DATA
pvBmpBits = FakePrimarySurface DATA pvBmpBits = FakePrimarySurface DATA

View File

@ -36,6 +36,7 @@ typedef HMODULE(WINAPI* LOADLIBRARYAPROC)(LPCSTR);
typedef HMODULE(WINAPI* LOADLIBRARYWPROC)(LPCWSTR); typedef HMODULE(WINAPI* LOADLIBRARYWPROC)(LPCWSTR);
typedef HMODULE(WINAPI* LOADLIBRARYEXAPROC)(LPCSTR, HANDLE, DWORD); typedef HMODULE(WINAPI* LOADLIBRARYEXAPROC)(LPCSTR, HANDLE, DWORD);
typedef HMODULE(WINAPI* LOADLIBRARYEXWPROC)(LPCWSTR, HANDLE, DWORD); typedef HMODULE(WINAPI* LOADLIBRARYEXWPROC)(LPCWSTR, HANDLE, DWORD);
typedef HRESULT(WINAPI* COCREATEINSTANCEPROC)(REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID*);
extern GETCURSORPOSPROC real_GetCursorPos; extern GETCURSORPOSPROC real_GetCursorPos;
extern CLIPCURSORPROC real_ClipCursor; extern CLIPCURSORPROC real_ClipCursor;
@ -65,6 +66,7 @@ extern LOADLIBRARYAPROC real_LoadLibraryA;
extern LOADLIBRARYWPROC real_LoadLibraryW; extern LOADLIBRARYWPROC real_LoadLibraryW;
extern LOADLIBRARYEXAPROC real_LoadLibraryExA; extern LOADLIBRARYEXAPROC real_LoadLibraryExA;
extern LOADLIBRARYEXWPROC real_LoadLibraryExW; extern LOADLIBRARYEXWPROC real_LoadLibraryExW;
extern COCREATEINSTANCEPROC real_CoCreateInstance;
extern int g_hook_method; extern int g_hook_method;
extern BOOL g_hook_active; extern BOOL g_hook_active;

View File

@ -35,5 +35,7 @@ HMODULE WINAPI fake_LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dw
HWND WINAPI fake_CreateWindowExA( HWND WINAPI fake_CreateWindowExA(
DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y, DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y,
int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam); int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam);
HRESULT WINAPI fake_CoCreateInstance(
REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID* ppv);
#endif #endif

View File

@ -236,7 +236,7 @@ HRESULT WINAPI fake_DirectInputCreateEx(
if (!real_DirectInputCreateEx) if (!real_DirectInputCreateEx)
{ {
real_DirectInputCreateEx = real_DirectInputCreateEx =
(DIRECTINPUTCREATEEXPROC)GetProcAddress(GetModuleHandle("dinput.dll"), "DirectInputCreateEx"); (DIRECTINPUTCREATEEXPROC)GetProcAddress(LoadLibraryA("system32\\dinput.dll"), "DirectInputCreateEx");
} }
if (!real_DirectInputCreateEx) if (!real_DirectInputCreateEx)

View File

@ -44,6 +44,7 @@ LOADLIBRARYAPROC real_LoadLibraryA = LoadLibraryA;
LOADLIBRARYWPROC real_LoadLibraryW = LoadLibraryW; LOADLIBRARYWPROC real_LoadLibraryW = LoadLibraryW;
LOADLIBRARYEXAPROC real_LoadLibraryExA = LoadLibraryExA; LOADLIBRARYEXAPROC real_LoadLibraryExA = LoadLibraryExA;
LOADLIBRARYEXWPROC real_LoadLibraryExW = LoadLibraryExW; LOADLIBRARYEXWPROC real_LoadLibraryExW = LoadLibraryExW;
COCREATEINSTANCEPROC real_CoCreateInstance = CoCreateInstance;
static HOOKLIST g_hooks[] = static HOOKLIST g_hooks[] =
{ {
@ -440,6 +441,15 @@ void hook_init()
void hook_early_init() void hook_early_init()
{ {
/*
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach((PVOID*)&real_CoCreateInstance, (PVOID)fake_CoCreateInstance);
DetourTransactionCommit();
*/
hook_patch_iat(GetModuleHandle(NULL), FALSE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance);
hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput.dll", "DirectInputCreateA", (PROC)fake_DirectInputCreateA); hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput.dll", "DirectInputCreateA", (PROC)fake_DirectInputCreateA);
hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput.dll", "DirectInputCreateW", (PROC)fake_DirectInputCreateW); hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput.dll", "DirectInputCreateW", (PROC)fake_DirectInputCreateW);
hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput.dll", "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx); hook_patch_iat(GetModuleHandle(NULL), FALSE, "dinput.dll", "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx);
@ -493,6 +503,8 @@ void hook_exit()
hook_revert((HOOKLIST*)&g_hooks); hook_revert((HOOKLIST*)&g_hooks);
} }
hook_patch_iat(GetModuleHandle(NULL), TRUE, "ole32.dll", "CoCreateInstance", (PROC)fake_CoCreateInstance);
hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateA", (PROC)fake_DirectInputCreateA); hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateA", (PROC)fake_DirectInputCreateA);
hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateW", (PROC)fake_DirectInputCreateW); hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateW", (PROC)fake_DirectInputCreateW);
hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx); hook_patch_iat(GetModuleHandle(NULL), TRUE, "dinput.dll", "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx);

View File

@ -3,6 +3,7 @@
#include <math.h> #include <math.h>
#include "debug.h" #include "debug.h"
#include "dd.h" #include "dd.h"
#include "ddraw.h"
#include "hook.h" #include "hook.h"
#include "config.h" #include "config.h"
#include "utils.h" #include "utils.h"
@ -630,3 +631,22 @@ HWND WINAPI fake_CreateWindowExA(
hInstance, hInstance,
lpParam); lpParam);
} }
HRESULT WINAPI fake_CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID* ppv)
{
if (rclsid && riid && (IsEqualGUID(&CLSID_DirectDraw, rclsid) || IsEqualGUID(&CLSID_DirectDraw7, rclsid)))
{
if (IsEqualGUID(&IID_IDirectDraw2, riid) ||
IsEqualGUID(&IID_IDirectDraw4, riid) ||
IsEqualGUID(&IID_IDirectDraw7, riid))
{
return dd_CreateEx(NULL, ppv, NULL, NULL);
}
else
{
return dd_CreateEx(NULL, ppv, &IID_IDirectDraw, NULL);
}
}
return real_CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, ppv);
}