diff --git a/Makefile b/Makefile index 8d7aa61..4d80e6b 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ WINDRES ?= windres LDFLAGS = -Iinc -Wall -Wl,--enable-stdcall-fixup -s CFLAGS = -std=c99 -LIBS = -lgdi32 -lwinmm +LIBS = -lgdi32 -lwinmm -lpsapi -ldbghelp FILES = src/IDirect3D/IDirect3D.c \ src/IDirect3D/IDirect3D2.c \ diff --git a/src/config.c b/src/config.c index af8eee4..24d5180 100644 --- a/src/config.c +++ b/src/config.c @@ -61,9 +61,7 @@ void cfg_load() g_config.save_settings = cfg_get_int("savesettings", 1); -#ifdef _MSC_VER g_hook_method = cfg_get_int("hook", 4); -#endif g_ddraw->render.maxfps = cfg_get_int("maxfps", -1); g_ddraw->render.minfps = cfg_get_int("minfps", 0); diff --git a/src/dd.c b/src/dd.c index 60687fb..1fcb1bf 100644 --- a/src/dd.c +++ b/src/dd.c @@ -898,7 +898,7 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute } else { - dprintf(" GUID = %08X (IID_IDirectDrawX), ddraw = %p\n", iid ? ((GUID*)iid)->Data1 : NULL, dd); + dprintf(" GUID = %08X (IID_IDirectDrawX), ddraw = %p\n", iid ? ((GUID*)iid)->Data1 : 0, dd); dd->lpVtbl = &g_dd_vtblx; } diff --git a/src/ddsurface.c b/src/ddsurface.c index 2fbe230..ac5d513 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -748,10 +748,10 @@ HRESULT dds_GetCaps(IDirectDrawSurfaceImpl *This, LPDDSCAPS lpDDSCaps) return DD_OK; } -HRESULT dds_GetClipper(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWCLIPPER FAR* a) +HRESULT dds_GetClipper(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWCLIPPER FAR* lpClipper) { - if (a) - *a = This->clipper; + if (lpClipper) + *lpClipper = (LPDIRECTDRAWCLIPPER)This->clipper; return DD_OK; } @@ -993,7 +993,7 @@ void* dds_GetBuffer(IDirectDrawSurfaceImpl* This) return NULL; if (This->backbuffer || (This->caps & DDSCAPS_BACKBUFFER)) - return (void*)InterlockedExchangeAdd(&This->surface, 0); + return (void*)InterlockedExchangeAdd((LONG*)&This->surface, 0); return This->surface; } @@ -1004,7 +1004,7 @@ HDC dds_GetHDC(IDirectDrawSurfaceImpl* This) return NULL; if (This->backbuffer || (This->caps & DDSCAPS_BACKBUFFER)) - return (HDC)InterlockedExchangeAdd(&This->hdc, 0); + return (HDC)InterlockedExchangeAdd((LONG*)&This->hdc, 0); return This->hdc; } @@ -1127,7 +1127,7 @@ HRESULT dd_CreateSurface(LPDDSURFACEDESC lpDDSurfaceDesc, LPDIRECTDRAWSURFACE FA desc.dwWidth = dst_surface->width; desc.dwHeight = dst_surface->height; - dd_CreateSurface(&desc, &dst_surface->backbuffer, unkOuter); + dd_CreateSurface(&desc, (LPDIRECTDRAWSURFACE*)&dst_surface->backbuffer, unkOuter); } } diff --git a/src/directinput.c b/src/directinput.c index 683fa0d..22a9201 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -6,7 +6,7 @@ #include "dd.h" typedef HRESULT (WINAPI *DIRECTINPUTCREATEAPROC)(HINSTANCE, DWORD, LPDIRECTINPUTA*, LPUNKNOWN); -typedef HRESULT (WINAPI *DIRECTINPUT8CREATEPROC)(HINSTANCE, DWORD, REFIID, LPVOID*, LPUNKNOWN); +typedef HRESULT (WINAPI *DIRECTINPUT8CREATEPROC)(HINSTANCE, DWORD, REFIID, LPDIRECTINPUT8*, 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); diff --git a/src/hook.c b/src/hook.c index 8082eb1..bddab51 100644 --- a/src/hook.c +++ b/src/hook.c @@ -1,6 +1,7 @@ #define WIN32_LEAN_AND_MEAN #include #include +#include #include "dd.h" #include "winapi_hooks.h" #include "hook.h" @@ -231,6 +232,7 @@ void hook_create(hook_list* hooks) } } } +#endif if (g_hook_method == 3 || g_hook_method == 4) { @@ -245,8 +247,17 @@ void hook_create(hook_list* hooks) char mod_dir[MAX_PATH] = { 0 }; char mod_filename[MAX_PATH] = { 0 }; HMODULE hmod = NULL; + HANDLE process = NULL; +#ifndef _MSC_VER + HMODULE mods[512]; + memset(mods, 0, sizeof(mods)); + process = GetCurrentProcess(); + EnumProcessModules(process, mods, sizeof(mods) - sizeof(mods[0]), NULL); + for (int i = 0; i < sizeof(mods) / sizeof(mods[0]) && (hmod = mods[i]); i++) +#else while (hmod = DetourEnumerateModules(hmod)) +#endif { if (hmod == g_ddraw_module) continue; @@ -267,9 +278,11 @@ void hook_create(hook_list* hooks) } } } + + if (process) + CloseHandle(process); } } -#endif if (g_hook_method == 1) { @@ -296,6 +309,7 @@ void hook_revert(hook_list* hooks) } } } +#endif if (g_hook_method == 3 || g_hook_method == 4) { @@ -309,8 +323,17 @@ void hook_revert(hook_list* hooks) char mod_path[MAX_PATH] = { 0 }; char mod_dir[MAX_PATH] = { 0 }; HMODULE hmod = NULL; + HANDLE process = NULL; +#ifndef _MSC_VER + HMODULE mods[512]; + memset(mods, 0, sizeof(mods)); + process = GetCurrentProcess(); + EnumProcessModules(process, mods, sizeof(mods) - sizeof(mods[0]), NULL); + for (int i = 0; i < sizeof(mods) / sizeof(mods[0]) && (hmod = mods[i]); i++) +#else while (hmod = DetourEnumerateModules(hmod)) +#endif { if (hmod == g_ddraw_module) continue; @@ -325,9 +348,11 @@ void hook_revert(hook_list* hooks) } } } + + if (process) + CloseHandle(process); } } -#endif if (g_hook_method == 1) {