From 7d0eeb7810d94d1146e8349464e05c4108d5f3cc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 1 Jun 2024 23:04:06 +0200 Subject: [PATCH] make sure quarts and msvfw are hooked --- inc/hook.h | 3 ++- inc/winapi_hooks.h | 3 ++- src/IDirectDraw/IDirectDraw.c | 1 + src/hook.c | 9 ++++++++- src/winapi_hooks.c | 17 +++++++++++++++++ 5 files changed, 30 insertions(+), 3 deletions(-) diff --git a/inc/hook.h b/inc/hook.h index 15b49df..e2a5b87 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -1,7 +1,6 @@ #ifndef HOOK_H #define HOOK_H -#define WIN32_LEAN_AND_MEAN #include @@ -71,6 +70,7 @@ typedef HMODULE(WINAPI* LOADLIBRARYEXWPROC)(LPCWSTR, HANDLE, DWORD); typedef FARPROC(WINAPI* GETPROCADDRESSPROC)(HMODULE, LPCSTR); typedef BOOL(WINAPI* GETDISKFREESPACEAPROC)(LPCSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD); typedef HRESULT(WINAPI* COCREATEINSTANCEPROC)(REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID*); +typedef MCIERROR(WINAPI* MCISENDCOMMANDAPROC)(MCIDEVICEID, UINT, DWORD_PTR, DWORD_PTR); typedef LPTOP_LEVEL_EXCEPTION_FILTER(WINAPI* SETUNHANDLEDEXCEPTIONFILTERPROC)(LPTOP_LEVEL_EXCEPTION_FILTER); extern GETCURSORPOSPROC real_GetCursorPos; @@ -119,6 +119,7 @@ extern LOADLIBRARYEXWPROC real_LoadLibraryExW; extern GETPROCADDRESSPROC real_GetProcAddress; extern GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA; extern COCREATEINSTANCEPROC real_CoCreateInstance; +extern MCISENDCOMMANDAPROC real_mciSendCommandA; extern SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter; extern BOOL g_hook_active; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 89a948c..3ce0ba3 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -1,7 +1,6 @@ #ifndef WINAPI_HOOKS_H #define WINAPI_HOOKS_H -#define WIN32_LEAN_AND_MEAN #include @@ -79,6 +78,8 @@ HWND WINAPI fake_CreateWindowExA( HRESULT WINAPI fake_CoCreateInstance( REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID* ppv); +MCIERROR WINAPI fake_mciSendCommandA(MCIDEVICEID IDDevice, UINT uMsg, DWORD_PTR fdwCommand, DWORD_PTR dwParam); + LPTOP_LEVEL_EXCEPTION_FILTER WINAPI fake_SetUnhandledExceptionFilter( LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter); diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 3de9572..f0ee793 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -1,3 +1,4 @@ +#include #include #include "IDirectDraw.h" #include "IDirect3D.h" diff --git a/src/hook.c b/src/hook.c index 372d891..f65d714 100644 --- a/src/hook.c +++ b/src/hook.c @@ -1,4 +1,3 @@ -#define WIN32_LEAN_AND_MEAN #include #include #include "directinput.h" @@ -63,6 +62,7 @@ LOADLIBRARYEXWPROC real_LoadLibraryExW = LoadLibraryExW; GETPROCADDRESSPROC real_GetProcAddress = GetProcAddress; GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA = GetDiskFreeSpaceA; COCREATEINSTANCEPROC real_CoCreateInstance = CoCreateInstance; +MCISENDCOMMANDAPROC real_mciSendCommandA = mciSendCommandA; SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter = SetUnhandledExceptionFilter; HOOKLIST g_hook_hooklist[] = @@ -112,6 +112,13 @@ HOOKLIST g_hook_hooklist[] = { "", NULL, NULL, 0 } } }, + { + "winmm.dll", + { + { "mciSendCommandA", (PROC)fake_mciSendCommandA, (PROC*)&real_mciSendCommandA, HOOK_SKIP_2 }, + { "", NULL, NULL, 0 } + } + }, { "dinput.dll", { diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 652436c..98d5126 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1656,6 +1656,23 @@ HRESULT WINAPI fake_CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD return result; } +MCIERROR WINAPI fake_mciSendCommandA(MCIDEVICEID IDDevice, UINT uMsg, DWORD_PTR fdwCommand, DWORD_PTR dwParam) +{ + /* These dlls must be hooked for cutscene uscaling and windowed mode */ + HMODULE quartz_dll = GetModuleHandleA("quartz"); + HMODULE msvfw32_dll = GetModuleHandleA("msvfw32"); + + MCIERROR result = real_mciSendCommandA(IDDevice, uMsg, fdwCommand, dwParam); + + if ((!quartz_dll && GetModuleHandleA("quartz")) || + (!msvfw32_dll && GetModuleHandleA("msvfw32"))) + { + hook_init(FALSE); + } + + return result; +} + LPTOP_LEVEL_EXCEPTION_FILTER WINAPI fake_SetUnhandledExceptionFilter( LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter) {