From 7d0eeb7810d94d1146e8349464e05c4108d5f3cc Mon Sep 17 00:00:00 2001
From: FunkyFr3sh <cc.red.alert.1@googlemail.com>
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 <windows.h>
 
 
@@ -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 <windows.h>
 
 
@@ -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 <windows.h>
 #include <initguid.h>
 #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 <windows.h>
 #include <stdio.h>
 #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)
 {