From db7a0071b30f07edb84efcf5e97ab7a5bea963fb Mon Sep 17 00:00:00 2001 From: John Chadwick Date: Sat, 14 Sep 2024 21:30:54 -0400 Subject: [PATCH] C++ compatibility --- Makefile | 13 +++-- README.md | 4 +- flake.nix | 2 +- src/common-fnptr.h | 10 ++-- src/common.c | 38 +++++++++----- src/common.h | 19 +++++-- src/dll/rugburn/main.c | 4 ++ src/exdispport.h | 2 +- src/exe/test/main.c | 12 +++-- src/hex.c | 8 +-- src/hex.h | 2 +- src/hooks/comctl32/dynamic_patch.c | 10 ++-- src/hooks/kernel32/inject.c | 8 +-- src/hooks/msvcr100/msvcr100.c | 12 ++--- src/hooks/ole32/web_browser.c | 38 +++++++------- src/hooks/user32/window.c | 3 +- src/hooks/wininet/netredir.c | 83 +++++++++++++++++------------- src/hooks/ws2_32/redir.c | 2 +- src/ijl15.c | 8 +++ src/patch.c | 30 +++++------ src/patch.h | 12 ++--- src/regex.c | 2 +- 22 files changed, 191 insertions(+), 131 deletions(-) diff --git a/Makefile b/Makefile index db18b9c..25b65eb 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -CC := i686-w64-mingw32-gcc +CXX := i686-w64-mingw32-g++ RM := rm SRCDIR := src/ OBJDIR := obj/ @@ -56,16 +56,19 @@ all: $(OUT) $(TESTOUT) # Rugburn $(OBJDIR)%.o: $(SRCDIR)%.c @mkdir -p "$(dir $@)" - $(CC) -c $(CFLAGS) "$<" -o "$@" + $(CXX) -c $(CFLAGS) "$<" -o "$@" +$(OBJDIR)%.o: $(SRCDIR)%.cpp + @mkdir -p "$(dir $@)" + $(CXX) -c $(CFLAGS) "$<" -o "$@" $(OBJDIR)%.o: $(SRCDIR)%.S @mkdir -p "$(dir $@)" - $(CC) -c $(CFLAGS) "$<" -o "$@" + $(CXX) -c $(CFLAGS) "$<" -o "$@" $(OUT): $(OBJS) @mkdir -p "$(dir $@)" - $(CC) $(OBJS) $(LDFLAGS) -shared -o "$@" export.def -Wl,-e_DllMain + $(CXX) $(OBJS) $(LDFLAGS) -shared -o "$@" export.def -Wl,-e_DllMain $(TESTOUT): $(TESTOBJS) @mkdir -p "$(dir $@)" - $(CC) $(TESTOBJS) $(LDFLAGS) -o "$@" -Wl,-e_start + $(CXX) $(TESTOBJS) $(LDFLAGS) -o "$@" -Wl,-e_start check: out/test.exe $(EXECWIN) out/test.exe | tappy clean: diff --git a/README.md b/README.md index cedcfe4..74fe942 100644 --- a/README.md +++ b/README.md @@ -151,10 +151,10 @@ make And you should find an `ijl15.dll` in your `out/` directory. -By default, the Makefile will assume that `i686-w64-mingw32-gcc` is the appropriate compiler. You can override this by passing in the `CC` variable: +By default, the Makefile will assume that `i686-w64-mingw32-g++` is the appropriate compiler. You can override this by passing in the `CXX` variable: ``` -make CC=gcc +make CXX=g++ ``` ## Install diff --git a/flake.nix b/flake.nix index 36f82c3..cdd0600 100644 --- a/flake.nix +++ b/flake.nix @@ -55,7 +55,7 @@ make -j (printf -- "-nostdlib\n-nostdinc\n-nostdinc++\n--target=i686-pc-windows-gnu\n-D_WIN32\n-D__MINGW32__\n-DSTRSAFE_NO_DEPRECATE" \ - && &1 \ + && &1 \ | grep ^COLLECT_GCC_OPTIONS= \ | tail -1 \ | cut -d= -f2- \ diff --git a/src/common-fnptr.h b/src/common-fnptr.h index da9fe41..0b0f9f9 100644 --- a/src/common-fnptr.h +++ b/src/common-fnptr.h @@ -57,17 +57,17 @@ typedef struct tagINITCOMMONCONTROLSEX { typedef BOOL(STDCALL *PFNINITCOMMONCONTROLSEXPROC)(const INITCOMMONCONTROLSEX *picce); // ole32.dll -typedef HRESULT(STDCALL *PFNCOGETCLASSOBJECTPROC)(REFCLSID rclsid, DWORD dwClsContext, - LPVOID pvReserved, REFIID riid, LPVOID *ppv); -typedef HRESULT(STDCALL *PFNCOCREATEINSTANCEPROC)(REFCLSID rclsid, LPUNKNOWN pUnkOuter, - DWORD dwClsContext, REFIID riid, LPVOID *ppv); +typedef HRESULT(STDCALL *PFNCOGETCLASSOBJECTPROC)(const IID *rclsid, DWORD dwClsContext, + LPVOID pvReserved, const IID *riid, LPVOID *ppv); +typedef HRESULT(STDCALL *PFNCOCREATEINSTANCEPROC)(const IID *rclsid, LPUNKNOWN pUnkOuter, + DWORD dwClsContext, const IID *riid, LPVOID *ppv); // oleaut32.dll typedef BSTR(STDCALL *PFNSYSALLOCSTRINGLENPROC)(const OLECHAR *strIn, UINT ui); typedef void(STDCALL *PFNSYSFREESTRINGPROC)(BSTR bstrString); // ieframe.dll -typedef HRESULT(STDCALL *PFNINVOKEPROC)(IDispatch *This, DISPID dispIdMember, REFIID riid, +typedef HRESULT(STDCALL *PFNINVOKEPROC)(IDispatch *This, DISPID dispIdMember, const IID *riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr); typedef HRESULT(STDCALL *PFNNAVIGATEPROC)(IWebBrowser2 *This, BSTR URL, VARIANT *Flags, diff --git a/src/common.c b/src/common.c index 5a83b77..94fe350 100644 --- a/src/common.c +++ b/src/common.c @@ -28,8 +28,18 @@ static PSTR pszLogPrefix = NULL; #pragma function(memcpy) #pragma function(memset) #else + +#ifdef __cplusplus +extern "C" { +#endif + void __chkstk_ms(void) { return; } unsigned long long __stdcall _aullshr(unsigned long long a, long b) { return a >> b; } + +#ifdef __cplusplus +} +#endif + #endif // String formatting @@ -58,7 +68,7 @@ LPSTR DupStr(LPCSTR src) { while (src[len]) len++; - str = AllocMem(len + 1); + str = (LPSTR)AllocMem(len + 1); p = str; while (*src) *p++ = *src++; @@ -72,7 +82,7 @@ PSTR GetSelfPath() { return pszSelfPath; } - pszSelfPath = AllocMem(4096); + pszSelfPath = (PSTR)AllocMem(4096); GetModuleFileNameA(GetModuleHandleA("ijl15"), pszSelfPath, 4096); @@ -95,7 +105,7 @@ LPSTR ReadEntireFile(LPCSTR szPath, LPDWORD dwFileSize) { } dwBytesToRead = GetFileSize(hFile, NULL); - buffer = AllocMem(dwBytesToRead + 1); + buffer = (LPSTR)AllocMem(dwBytesToRead + 1); memset(buffer, 0, dwBytesToRead + 1); data = buffer; @@ -145,11 +155,11 @@ VOID WriteEntireFile(LPCSTR szPath, LPCSTR data, DWORD dwBytesToWrite) { CloseHandle(hFile); } -VOID FatalError(PCHAR fmt, ...) { +VOID FatalError(LPCSTR fmt, ...) { va_list args; PCHAR buffer; - buffer = AllocMem(4096); + buffer = (PCHAR)AllocMem(4096); if (!buffer) { MessageBoxA(HWND_DESKTOP, "Out of memory.", "rugburn", MB_OK | MB_ICONERROR); @@ -165,9 +175,9 @@ VOID FatalError(PCHAR fmt, ...) { ExitProcess(1); } -VOID Warning(PCHAR fmt, ...) { +VOID Warning(LPCSTR fmt, ...) { va_list args; - PCHAR buffer = AllocMem(4096); + PCHAR buffer = (PCHAR)AllocMem(4096); va_start(args, fmt); VSPrintfZ(buffer, fmt, args); @@ -177,11 +187,11 @@ VOID Warning(PCHAR fmt, ...) { FreeMem(buffer); } -VOID Log(PCHAR fmt, ...) { +VOID Log(LPCSTR fmt, ...) { va_list args; HANDLE hAppend; - PCHAR buffer = AllocMem(4096); - PCHAR pfxbuffer = AllocMem(128); + PCHAR buffer = (PCHAR)AllocMem(4096); + PCHAR pfxbuffer = (PCHAR)AllocMem(128); PCHAR logmsg = buffer; DWORD cb = 0; @@ -212,8 +222,8 @@ VOID Log(PCHAR fmt, ...) { } VOID InitLog() { - PCHAR szPfxBuf = AllocMem(4096); - PCHAR szFileName = AllocMem(4096); + PCHAR szPfxBuf = (PCHAR)AllocMem(4096); + PCHAR szFileName = (PCHAR)AllocMem(4096); PCHAR szBaseName; DWORD cbFileName; @@ -233,10 +243,10 @@ VOID InitLog() { pszLogPrefix = szPfxBuf; } -VOID ConsoleLog(PCHAR fmt, ...) { +VOID ConsoleLog(LPCSTR fmt, ...) { va_list args; HANDLE hConsole; - PCHAR buffer = AllocMem(4096); + PCHAR buffer = (PCHAR)AllocMem(4096); DWORD cb = 0; va_start(args, fmt); cb += VSPrintfZ(buffer, fmt, args); diff --git a/src/common.h b/src/common.h index e614f2d..db682e7 100644 --- a/src/common.h +++ b/src/common.h @@ -16,6 +16,17 @@ #pragma once +#ifdef __cplusplus +// We must use COM CINTERFACE even in C++ +#define CINTERFACE +// Temporary: make REF parameters pointers even in C++ +// Otherwise, making our code compatible with both C and C++ is hard. +#define _REFCLSID_DEFINED +#define REFCLSID const IID * +#define _REFIID_DEFINED +#define REFIID const IID * +#endif + #define STDCALL __stdcall #define EXPORT __export @@ -62,10 +73,10 @@ LPSTR DupStr(LPCSTR src); BOOL FileExists(LPCSTR szPath); LPSTR ReadEntireFile(LPCSTR szPath, LPDWORD dwFileSize); VOID WriteEntireFile(LPCSTR szPath, LPCSTR data, DWORD dwBytesToWrite); -VOID FatalError(PCHAR fmt, ...); -VOID Warning(PCHAR fmt, ...); -VOID Log(PCHAR fmt, ...); -VOID ConsoleLog(PCHAR fmt, ...); +VOID FatalError(LPCSTR fmt, ...); +VOID Warning(LPCSTR fmt, ...); +VOID Log(LPCSTR fmt, ...); +VOID ConsoleLog(LPCSTR fmt, ...); VOID InitLog(); HMODULE LoadLib(LPCSTR szName); PVOID GetProc(HMODULE hModule, LPCSTR szName); diff --git a/src/dll/rugburn/main.c b/src/dll/rugburn/main.c index 2c969a3..3230328 100644 --- a/src/dll/rugburn/main.c +++ b/src/dll/rugburn/main.c @@ -50,6 +50,10 @@ static VOID InitEnvironment() { FreeMem(szPangyaArg); } +#ifdef __cplusplus +extern "C" BOOL STDCALL DllMain(HANDLE hInstance, DWORD dwReason, LPVOID reserved); +#endif + extern BOOL STDCALL DllMain(HANDLE hInstance, DWORD dwReason, LPVOID reserved) { if (dwReason != DLL_PROCESS_ATTACH) { return TRUE; diff --git a/src/exdispport.h b/src/exdispport.h index 071a819..a0c1367 100644 --- a/src/exdispport.h +++ b/src/exdispport.h @@ -432,4 +432,4 @@ struct IWebBrowser2 { }; #else #include -#endif \ No newline at end of file +#endif diff --git a/src/exe/test/main.c b/src/exe/test/main.c index 517da61..a38b8bd 100644 --- a/src/exe/test/main.c +++ b/src/exe/test/main.c @@ -83,8 +83,8 @@ static void STDCALL DispatchTest(const DISPATCH_TESTCASE *_this, DWORD testnum) } static void STDCALL DispatchThroughThiscallTest(const DISPATCH_TESTCASE *_this, DWORD testnum) { - PFNDISPATCHTESTPROC pfnDispatchProc = - (PFNDISPATCHTESTPROC)BuildStdcallToThiscallThunk(BuildThiscallToStdcallThunk(DispatchTest)); + PFNDISPATCHTESTPROC pfnDispatchProc = (PFNDISPATCHTESTPROC)BuildStdcallToThiscallThunk( + BuildThiscallToStdcallThunk((LPCVOID)DispatchTest)); pfnDispatchProc(_this, testnum); } @@ -116,7 +116,7 @@ static BOOL ijl15_crash_test() { // Parse JPEG header jcp.JPGFile = 0; - jcp.JPGBytes = pJPGBytes; + jcp.JPGBytes = (PBYTE)pJPGBytes; jcp.JPGSizeBytes = dwJPGSizeBytes; ijlRead(&jcp, IJL_JBUFF_READPARAMS); if (jerr < 0) { @@ -131,7 +131,7 @@ static BOOL ijl15_crash_test() { jcp.DIBWidth = jcp.JPGWidth; jcp.DIBHeight = jcp.JPGHeight; jcp.DIBPadBytes = 0; - jcp.DIBBytes = buffer; + jcp.DIBBytes = (PBYTE)buffer; jerr = ijlRead(&jcp, IJL_JBUFF_READWHOLEIMAGE); FreeMem(buffer); @@ -147,6 +147,10 @@ const UNIT_TEST unit_tests[] = { #define COUNT_OF(x) ((sizeof(x) / sizeof(0 [x])) / ((size_t)(!(sizeof(x) % sizeof(0 [x]))))) +#ifdef __cplusplus +extern "C" void __cdecl start(void); +#endif + extern void __cdecl start(void) { int i, result = 0, testnum = 0, totaltests = 0; diff --git a/src/hex.c b/src/hex.c index 7c12779..1520161 100644 --- a/src/hex.c +++ b/src/hex.c @@ -38,10 +38,10 @@ static CHAR ToHexChar(BYTE bValue) { return 0; } -LPSTR ToHex(PVOID pData, DWORD dwLen) { +LPSTR ToHex(LPCVOID pData, DWORD dwLen) { LPSTR pHexData, pHexPtr; - PCHAR pcData = (PCHAR)pData; - pHexData = pHexPtr = AllocMem(dwLen * 2 + 1); + LPCSTR pcData = (LPCSTR)pData; + pHexData = pHexPtr = (LPSTR)AllocMem(dwLen * 2 + 1); while (dwLen--) { *pHexPtr++ = ToHexChar((*pcData & 0xF0) >> 4); *pHexPtr++ = ToHexChar((*pcData & 0x0F) >> 0); @@ -142,7 +142,7 @@ void ParsePatch(LPCSTR lpszText, LPSTR *pDataOut, DWORD *pSizeOut) { } // Allocate memory - *pDataOut = AllocMem(*pSizeOut); + *pDataOut = (LPSTR)AllocMem(*pSizeOut); // Parse inPos = lpszText; diff --git a/src/hex.h b/src/hex.h index ea2a324..945d95f 100644 --- a/src/hex.h +++ b/src/hex.h @@ -18,7 +18,7 @@ #include "common.h" -LPSTR ToHex(PVOID pData, DWORD dwLen); +LPSTR ToHex(LPCVOID pData, DWORD dwLen); DWORD FromHex(LPCSTR pHex, PVOID pData); DWORD ParseAddress(LPCSTR lpszText); diff --git a/src/hooks/comctl32/dynamic_patch.c b/src/hooks/comctl32/dynamic_patch.c index 170d6fd..fc1b929 100644 --- a/src/hooks/comctl32/dynamic_patch.c +++ b/src/hooks/comctl32/dynamic_patch.c @@ -378,8 +378,10 @@ static VOID STDCALL GetStartupInfoWHook(LPSTARTUPINFOW lpStartupInfo) { VOID InitComCtl32Hook() { hComCtl32Module = LoadLib("comctl32"); hKernel32Module = LoadLib("kernel32"); - pInitCommonControlsEx = - HookProc(hComCtl32Module, "InitCommonControlsEx", InitCommonControlsExHook); - pGetStartupInfoA = HookProc(hKernel32Module, "GetStartupInfoA", GetStartupInfoAHook); - pGetStartupInfoW = HookProc(hKernel32Module, "GetStartupInfoW", GetStartupInfoWHook); + pInitCommonControlsEx = (PFNINITCOMMONCONTROLSEXPROC)HookProc( + hComCtl32Module, "InitCommonControlsEx", (PVOID)InitCommonControlsExHook); + pGetStartupInfoA = (PFNGETSTARTUPINFOAPROC)HookProc(hKernel32Module, "GetStartupInfoA", + (PVOID)GetStartupInfoAHook); + pGetStartupInfoW = (PFNGETSTARTUPINFOWPROC)HookProc(hKernel32Module, "GetStartupInfoW", + (PVOID)GetStartupInfoWHook); } diff --git a/src/hooks/kernel32/inject.c b/src/hooks/kernel32/inject.c index b239b3f..fb4763e 100644 --- a/src/hooks/kernel32/inject.c +++ b/src/hooks/kernel32/inject.c @@ -83,8 +83,10 @@ static BOOL STDCALL GetExitCodeProcessHook(HANDLE hProcess, LPDWORD lpExitCode) VOID InitInjectHook() { hKernel32Module = LoadLib("kernel32"); - pCreateMutexA = GetProc(hKernel32Module, "CreateMutexA"); + pCreateMutexA = (PFNCREATEMUTEXAPROC)GetProc(hKernel32Module, "CreateMutexA"); hGameguardFakeHandle = pCreateMutexA(NULL, FALSE, NULL); - pCreateProcessA = HookProc(hKernel32Module, "CreateProcessA", CreateProcessAHook); - pGetExitCodeProcess = HookProc(hKernel32Module, "GetExitCodeProcess", GetExitCodeProcessHook); + pCreateProcessA = (PFNCREATEPROCESSAPROC)HookProc(hKernel32Module, "CreateProcessA", + (PVOID)CreateProcessAHook); + pGetExitCodeProcess = (PFNGETEXITCODEPROCESSPROC)HookProc(hKernel32Module, "GetExitCodeProcess", + (PVOID)GetExitCodeProcessHook); } diff --git a/src/hooks/msvcr100/msvcr100.c b/src/hooks/msvcr100/msvcr100.c index c963d09..5c93676 100644 --- a/src/hooks/msvcr100/msvcr100.c +++ b/src/hooks/msvcr100/msvcr100.c @@ -49,8 +49,8 @@ static VOID InitMsvcr100Hook() { return; } - pStricmp = GetProc(hMsvcrModule, "_stricmp"); - pSetLocale = GetProc(hMsvcrModule, "setlocale"); + pStricmp = (STRICMPFNPTR)GetProc(hMsvcrModule, "_stricmp"); + pSetLocale = (SETLOCALEFNPTR)GetProc(hMsvcrModule, "setlocale"); oldlocale = pSetLocale(2, NULL); if (!pStricmp || !pSetLocale) { Log("Not checking for Wine _stricmp bug: msvcr100 functions not found.\n"); @@ -66,7 +66,7 @@ static VOID InitMsvcr100Hook() { if (result == 0) { Log("Wine _stricmp bug detected; mitigating.\n"); - pStricmp = HookProc(hMsvcrModule, "_stricmp", StricmpHook); + pStricmp = (STRICMPFNPTR)HookProc(hMsvcrModule, "_stricmp", (PVOID)StricmpHook); } else { Log("Wine _stricmp bug not detected.\n"); } @@ -82,8 +82,8 @@ static VOID InitMsvcr71Hook() { return; } - pStricmp = GetProc(hMsvcrModule, "_stricmp"); - pSetLocale = GetProc(hMsvcrModule, "setlocale"); + pStricmp = (STRICMPFNPTR)GetProc(hMsvcrModule, "_stricmp"); + pSetLocale = (SETLOCALEFNPTR)GetProc(hMsvcrModule, "setlocale"); oldlocale = pSetLocale(2, NULL); if (!pStricmp || !pSetLocale) { Log("Not checking for Wine _stricmp bug: msvcr71 functions not found.\n"); @@ -99,7 +99,7 @@ static VOID InitMsvcr71Hook() { if (result == 0) { Log("Wine _stricmp bug detected; mitigating.\n"); - pStricmp = HookProc(hMsvcrModule, "_stricmp", StricmpHook); + pStricmp = (STRICMPFNPTR)HookProc(hMsvcrModule, "_stricmp", (PVOID)StricmpHook); } else { Log("Wine _stricmp bug not detected.\n"); } diff --git a/src/hooks/ole32/web_browser.c b/src/hooks/ole32/web_browser.c index 30febbd..f000845 100644 --- a/src/hooks/ole32/web_browser.c +++ b/src/hooks/ole32/web_browser.c @@ -29,7 +29,7 @@ static BSTR RewriteURLW(BSTR urlw) { int len_urlw = lstrlenW(urlw); int len = WideCharToMultiByte(CP_ACP, 0, urlw, len_urlw, NULL, 0, NULL, NULL); - PCHAR url = AllocMem(len + 1); + PCHAR url = (PCHAR)AllocMem(len + 1); WideCharToMultiByte(CP_ACP, 0, urlw, len_urlw, url, len, NULL, NULL); @@ -57,9 +57,9 @@ static BSTR RewriteURLW(BSTR urlw) { return NULL; } -static HRESULT InvokeHook(IDispatch *This, DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, - DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, - UINT *puArgErr) { +static HRESULT InvokeHook(IDispatch *This, DISPID dispIdMember, const IID *riid, LCID lcid, + WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, + EXCEPINFO *pExcepInfo, UINT *puArgErr) { BSTR newURL = NULL; @@ -104,8 +104,8 @@ static HRESULT STDCALL NavigateHook(IWebBrowser2 *This, BSTR URL, VARIANT *Flags return hResult; } -static HRESULT STDCALL CoGetClassObjectHook(REFCLSID rclsid, DWORD dwClsContext, LPVOID pvReserved, - REFIID riid, LPVOID *ppv) { +static HRESULT STDCALL CoGetClassObjectHook(const IID *rclsid, DWORD dwClsContext, + LPVOID pvReserved, const IID *riid, LPVOID *ppv) { static void *g_pInvoke = NULL; @@ -113,7 +113,7 @@ static HRESULT STDCALL CoGetClassObjectHook(REFCLSID rclsid, DWORD dwClsContext, if (ret >= 0) { - if (memcmp(rclsid, &kIID_MicrosoftWebBrowser, sizeof(IID)) == 0) { + if (memcmp((LPCVOID)rclsid, &kIID_MicrosoftWebBrowser, sizeof(IID)) == 0) { IClassFactory *obj = (IClassFactory *)*ppv; @@ -137,8 +137,8 @@ static HRESULT STDCALL CoGetClassObjectHook(REFCLSID rclsid, DWORD dwClsContext, } if (g_pInvoke != iDispatch2->lpVtbl->Invoke) { - g_pInvoke = iDispatch2->lpVtbl->Invoke; - pInvoke = HookFunc(g_pInvoke, InvokeHook); + g_pInvoke = (PVOID)iDispatch2->lpVtbl->Invoke; + pInvoke = (PFNINVOKEPROC)HookFunc(g_pInvoke, (PVOID)InvokeHook); Log("Install InvokeHook(0x%08p): 0x%08p -> 0x%08p\r\n", g_pInvoke, InvokeHook, pInvoke); } @@ -148,8 +148,8 @@ static HRESULT STDCALL CoGetClassObjectHook(REFCLSID rclsid, DWORD dwClsContext, return ret; } -static HRESULT STDCALL CoCreateInstanceHook(REFCLSID rclsid, LPUNKNOWN pUnkOuter, - DWORD dwClsContext, REFIID riid, LPVOID *ppv) { +static HRESULT STDCALL CoCreateInstanceHook(const IID *rclsid, LPUNKNOWN pUnkOuter, + DWORD dwClsContext, const IID *riid, LPVOID *ppv) { static void *g_pNavigate = NULL; @@ -159,7 +159,7 @@ static HRESULT STDCALL CoCreateInstanceHook(REFCLSID rclsid, LPUNKNOWN pUnkOuter if (memcmp(rclsid, &kIID_MicrosoftWebBrowser, sizeof(IID)) == 0) { - IUnknown *obj = *ppv; + IUnknown *obj = (IUnknown *)*ppv; IWebBrowser2 *webbrowser2 = NULL; HRESULT ret2 = @@ -170,8 +170,8 @@ static HRESULT STDCALL CoCreateInstanceHook(REFCLSID rclsid, LPUNKNOWN pUnkOuter } if (g_pNavigate != webbrowser2->lpVtbl->Navigate) { - g_pNavigate = webbrowser2->lpVtbl->Navigate; - pNavigate = HookFunc(g_pNavigate, NavigateHook); + g_pNavigate = (PVOID)webbrowser2->lpVtbl->Navigate; + pNavigate = (PFNNAVIGATEPROC)HookFunc(g_pNavigate, (PVOID)NavigateHook); Log("Install NavigateHook(0x%08p): 0x%08p -> 0x%08p\r\n", g_pNavigate, NavigateHook, pNavigate); } @@ -184,8 +184,10 @@ static HRESULT STDCALL CoCreateInstanceHook(REFCLSID rclsid, LPUNKNOWN pUnkOuter void InitWebBrowserHook() { hOle32Module = LoadLib("ole32"); hOleAut32Module = LoadLib("oleaut32"); - pSysAllocStringLen = GetProc(hOleAut32Module, "SysAllocStringLen"); - pSysFreeString = GetProc(hOleAut32Module, "SysFreeString"); - pCoGetClassObject = HookProc(hOle32Module, "CoGetClassObject", CoGetClassObjectHook); - pCoCreateInstance = HookProc(hOle32Module, "CoCreateInstance", CoCreateInstanceHook); + pSysAllocStringLen = (PFNSYSALLOCSTRINGLENPROC)GetProc(hOleAut32Module, "SysAllocStringLen"); + pSysFreeString = (PFNSYSFREESTRINGPROC)GetProc(hOleAut32Module, "SysFreeString"); + pCoGetClassObject = (PFNCOGETCLASSOBJECTPROC)HookProc(hOle32Module, "CoGetClassObject", + (PVOID)CoGetClassObjectHook); + pCoCreateInstance = (PFNCOCREATEINSTANCEPROC)HookProc(hOle32Module, "CoCreateInstance", + (PVOID)CoCreateInstanceHook); } diff --git a/src/hooks/user32/window.c b/src/hooks/user32/window.c index 8a7b5dc..9658607 100644 --- a/src/hooks/user32/window.c +++ b/src/hooks/user32/window.c @@ -35,5 +35,6 @@ static HWND STDCALL CreateWindowExAHook(DWORD dwExStyle, LPCSTR lpClassName, LPC VOID InitWindowHook() { hUser32Module = LoadLib("user32"); - pCreateWindowExA = HookProc(hUser32Module, "CreateWindowExA", CreateWindowExAHook); + pCreateWindowExA = (PFNCREATEWINDOWEXAPROC)HookProc(hUser32Module, "CreateWindowExA", + (PVOID)CreateWindowExAHook); } diff --git a/src/hooks/wininet/netredir.c b/src/hooks/wininet/netredir.c index f2fd9b5..62adc8d 100644 --- a/src/hooks/wininet/netredir.c +++ b/src/hooks/wininet/netredir.c @@ -96,7 +96,7 @@ static void createInetCtx(HINTERNET hOpen, HINTERNET hConnect, LPCSTR lpszServer DWORD dwService, DWORD dwFlags, DWORD_PTR dwContext, HINTERNET hRequest, HINTERNET hNewConnect) { - internet_ctx *ctx = AllocMem(sizeof(internet_ctx)); + internet_ctx *ctx = (internet_ctx *)AllocMem(sizeof(internet_ctx)); memset(ctx, 0, sizeof(*ctx)); @@ -119,7 +119,7 @@ static void createInetCtx(HINTERNET hOpen, HINTERNET hConnect, LPCSTR lpszServer if (lpszServerName != NULL) { int len = lstrlenA(lpszServerName); - ctx->lpszServerName = AllocMem(len + 1); + ctx->lpszServerName = (LPSTR)AllocMem(len + 1); memcpy(ctx->lpszServerName, lpszServerName, len); ctx->lpszServerName[len] = '\0'; } @@ -127,7 +127,7 @@ static void createInetCtx(HINTERNET hOpen, HINTERNET hConnect, LPCSTR lpszServer if (lpszUserName != NULL) { int len = lstrlenA(lpszUserName); - ctx->lpszUserName = AllocMem(len + 1); + ctx->lpszUserName = (LPSTR)AllocMem(len + 1); memcpy(ctx->lpszUserName, lpszUserName, len); ctx->lpszUserName[len] = '\0'; } @@ -135,7 +135,7 @@ static void createInetCtx(HINTERNET hOpen, HINTERNET hConnect, LPCSTR lpszServer if (lpszPassword != NULL) { int len = lstrlenA(lpszPassword); - ctx->lpszPassword = AllocMem(len + 1); + ctx->lpszPassword = (LPSTR)AllocMem(len + 1); memcpy(ctx->lpszPassword, lpszPassword, len); ctx->lpszPassword[len] = '\0'; } @@ -271,7 +271,7 @@ static HINTERNET STDCALL InternetOpenUrlABypasSelfSignedCertificate( } LPSTR lpszHostName = - (url_cpsa.dwHostNameLength == 0u ? NULL : AllocMem(url_cpsa.dwHostNameLength + 1)); + (url_cpsa.dwHostNameLength == 0u ? NULL : (LPSTR)AllocMem(url_cpsa.dwHostNameLength + 1)); if (lpszHostName != NULL) { memcpy(lpszHostName, url_cpsa.lpszHostName, url_cpsa.dwHostNameLength); @@ -384,7 +384,7 @@ static HINTERNET STDCALL InternetOpenUrlABypasSelfSignedCertificate( return NULL; } - LPSTR buff = AllocMem(dwBuffLength + 1); + LPSTR buff = (LPSTR)AllocMem(dwBuffLength + 1); ret2 = pHttpQueryInfoA(hReq, HTTP_QUERY_LOCATION, buff, &dwBuffLength, NULL); if (ret2 == FALSE) { @@ -475,7 +475,7 @@ static HINTERNET STDCALL InternetOpenUrlAHook(HINTERNET hInternet, LPCSTR lpszUr return hResult; } - LPSTR buff = AllocMem(dwBuffLength + 1); + LPSTR buff = (LPSTR)AllocMem(dwBuffLength + 1); ret2 = pHttpQueryInfoA(hResult, HTTP_QUERY_LOCATION, buff, &dwBuffLength, NULL); if (ret2 == FALSE) { @@ -541,7 +541,7 @@ static HINTERNET STDCALL HttpOpenRequestAHook(HINTERNET hConnect, LPCSTR lpszVer LastErr()); return hReq; } - LPSTR url = AllocMem(len); + LPSTR url = (LPSTR)AllocMem(len); ret2 = pInternetQueryOptionA(hReq, INTERNET_OPTION_URL, url, &len); if (ret2 == FALSE) { FreeMem((HLOCAL)url); @@ -577,11 +577,14 @@ static HINTERNET STDCALL HttpOpenRequestAHook(HINTERNET hConnect, LPCSTR lpszVer } LPSTR lpszHostName = - (url_cpsa.dwHostNameLength == 0u ? NULL : AllocMem(url_cpsa.dwHostNameLength + 1)); + (url_cpsa.dwHostNameLength == 0u ? NULL + : (LPSTR)AllocMem(url_cpsa.dwHostNameLength + 1)); LPSTR lpszUserName = - (url_cpsa.dwUserNameLength == 0u ? NULL : AllocMem(url_cpsa.dwUserNameLength + 1)); + (url_cpsa.dwUserNameLength == 0u ? NULL + : (LPSTR)AllocMem(url_cpsa.dwUserNameLength + 1)); LPSTR lpszPassword = - (url_cpsa.dwPasswordLength == 0u ? NULL : AllocMem(url_cpsa.dwPasswordLength + 1)); + (url_cpsa.dwPasswordLength == 0u ? NULL + : (LPSTR)AllocMem(url_cpsa.dwPasswordLength + 1)); if (lpszHostName != NULL) { memcpy(lpszHostName, url_cpsa.lpszHostName, url_cpsa.dwHostNameLength); @@ -676,7 +679,7 @@ static HINTERNET STDCALL HttpOpenRequestAHook(HINTERNET hConnect, LPCSTR lpszVer if (lpszVerb != NULL) { int len = lstrlenA(lpszVerb); - inet_ctx->lpszMethod = AllocMem(len + 1); + inet_ctx->lpszMethod = (LPSTR)AllocMem(len + 1); memcpy(inet_ctx->lpszMethod, lpszVerb, len); inet_ctx->lpszMethod[len] = '\0'; } @@ -721,7 +724,7 @@ static BOOL STDCALL HttpSendRequestACertificateInvalidRedirect(HINTERNET hReques return FALSE; } - url = AllocMem(dwBuffLength + 1); + url = (LPSTR)AllocMem(dwBuffLength + 1); ret2 = pHttpQueryInfoA((inet_ctx->hNewRequest != NULL ? inet_ctx->hNewRequest : hRequest), HTTP_QUERY_LOCATION, url, &dwBuffLength, NULL); @@ -746,7 +749,7 @@ static BOOL STDCALL HttpSendRequestACertificateInvalidRedirect(HINTERNET hReques LastErr()); return FALSE; } - url = AllocMem(len); + url = (LPSTR)AllocMem(len); ret2 = pInternetQueryOptionA( (inet_ctx->hNewRequest != NULL ? inet_ctx->hNewRequest : hRequest), INTERNET_OPTION_URL, url, &len); @@ -773,7 +776,7 @@ static BOOL STDCALL HttpSendRequestACertificateInvalidRedirect(HINTERNET hReques } LPSTR lpszHostName = - (url_cpsa.dwHostNameLength == 0u ? NULL : AllocMem(url_cpsa.dwHostNameLength + 1)); + (url_cpsa.dwHostNameLength == 0u ? NULL : (LPSTR)AllocMem(url_cpsa.dwHostNameLength + 1)); if (lpszHostName != NULL) { memcpy(lpszHostName, url_cpsa.lpszHostName, url_cpsa.dwHostNameLength); @@ -997,7 +1000,7 @@ static BOOL STDCALL HttpEndRequestACertificateInvalidRedirect(HINTERNET hRequest return FALSE; } - url = AllocMem(dwBuffLength + 1); + url = (LPSTR)AllocMem(dwBuffLength + 1); ret2 = pHttpQueryInfoA((inet_ctx->hNewRequest != NULL ? inet_ctx->hNewRequest : hRequest), HTTP_QUERY_LOCATION, url, &dwBuffLength, NULL); @@ -1022,7 +1025,7 @@ static BOOL STDCALL HttpEndRequestACertificateInvalidRedirect(HINTERNET hRequest LastErr()); return FALSE; } - url = AllocMem(len); + url = (LPSTR)AllocMem(len); ret2 = pInternetQueryOptionA( (inet_ctx->hNewRequest != NULL ? inet_ctx->hNewRequest : hRequest), INTERNET_OPTION_URL, url, &len); @@ -1049,7 +1052,7 @@ static BOOL STDCALL HttpEndRequestACertificateInvalidRedirect(HINTERNET hRequest } LPSTR lpszHostName = - (url_cpsa.dwHostNameLength == 0u ? NULL : AllocMem(url_cpsa.dwHostNameLength + 1)); + (url_cpsa.dwHostNameLength == 0u ? NULL : (LPSTR)AllocMem(url_cpsa.dwHostNameLength + 1)); if (lpszHostName != NULL) { memcpy(lpszHostName, url_cpsa.lpszHostName, url_cpsa.dwHostNameLength); @@ -1363,21 +1366,31 @@ VOID InitNetRedirHook() { memset(&g_inet_ctx, 0, sizeof(g_inet_ctx)); hWinINet = LoadLib("wininet"); - pInternetQueryOptionA = GetProc(hWinINet, "InternetQueryOptionA"); - pInternetSetOptionA = GetProc(hWinINet, "InternetSetOptionA"); - pInternetCrackUrlA = GetProc(hWinINet, "InternetCrackUrlA"); - pInternetOpenUrlA = HookProc(hWinINet, "InternetOpenUrlA", InternetOpenUrlAHook); - pInternetConnectA = HookProc(hWinINet, "InternetConnectA", InternetConnectAHook); - pHttpOpenRequestA = HookProc(hWinINet, "HttpOpenRequestA", HttpOpenRequestAHook); - pHttpSendRequestA = HookProc(hWinINet, "HttpSendRequestA", HttpSendRequestAHook); - pHttpEndRequestA = HookProc(hWinINet, "HttpEndRequestA", HttpEndRequestAHook); - pHttpAddRequestHeadersA = - HookProc(hWinINet, "HttpAddRequestHeadersA", HttpAddRequestHeadersAHook); - pHttpQueryInfoA = HookProc(hWinINet, "HttpQueryInfoA", HttpQueryInfoAHook); - pHttpSendRequestExA = HookProc(hWinINet, "HttpSendRequestExA", HttpSendRequestExAHook); - pInternetCloseHandle = HookProc(hWinINet, "InternetCloseHandle", InternetCloseHandleHook); - pInternetQueryDataAvailable = - HookProc(hWinINet, "InternetQueryDataAvailable", InternetQueryDataAvailableHook); - pInternetWriteFile = HookProc(hWinINet, "InternetWriteFile", InternetWriteFileHook); - pInternetReadFile = HookProc(hWinINet, "InternetReadFile", InternetReadFileHook); + pInternetQueryOptionA = (PFNINTERNETQUERYOPTIONAPROC)GetProc(hWinINet, "InternetQueryOptionA"); + pInternetSetOptionA = (PFNINTERNETSETOPTIONAPROC)GetProc(hWinINet, "InternetSetOptionA"); + pInternetCrackUrlA = (PFNINTERNETCRACKURLAPROC)GetProc(hWinINet, "InternetCrackUrlA"); + pInternetOpenUrlA = (PFNINTERNETOPENURLAPROC)HookProc(hWinINet, "InternetOpenUrlA", + (PVOID)InternetOpenUrlAHook); + pInternetConnectA = (PFNINTERNETCONNECTAPROC)HookProc(hWinINet, "InternetConnectA", + (PVOID)InternetConnectAHook); + pHttpOpenRequestA = (PFNHTTPOPENREQUESTAPROC)HookProc(hWinINet, "HttpOpenRequestA", + (PVOID)HttpOpenRequestAHook); + pHttpSendRequestA = (PFNHTTPSENDREQUESTAPROC)HookProc(hWinINet, "HttpSendRequestA", + (PVOID)HttpSendRequestAHook); + pHttpEndRequestA = + (PFNHTTPENDREQUESTAPROC)HookProc(hWinINet, "HttpEndRequestA", (PVOID)HttpEndRequestAHook); + pHttpAddRequestHeadersA = (PFNHTTPADDREQUESTHEADERSAPROC)HookProc( + hWinINet, "HttpAddRequestHeadersA", (PVOID)HttpAddRequestHeadersAHook); + pHttpQueryInfoA = + (PFNHTTPQUERYINFOAPROC)HookProc(hWinINet, "HttpQueryInfoA", (PVOID)HttpQueryInfoAHook); + pHttpSendRequestExA = (PFNHTTPSENDREQUESTEXAPROC)HookProc(hWinINet, "HttpSendRequestExA", + (PVOID)HttpSendRequestExAHook); + pInternetCloseHandle = (PFNINTERNETCLOSEHANDLEPROC)HookProc(hWinINet, "InternetCloseHandle", + (PVOID)InternetCloseHandleHook); + pInternetQueryDataAvailable = (PFNINTERNETQUERYDATAAVAILABLEPROC)HookProc( + hWinINet, "InternetQueryDataAvailable", (PVOID)InternetQueryDataAvailableHook); + pInternetWriteFile = (PFNINTERNETWRITEFILEPROC)HookProc(hWinINet, "InternetWriteFile", + (PVOID)InternetWriteFileHook); + pInternetReadFile = (PFNINTERNETREADFILEPROC)HookProc(hWinINet, "InternetReadFile", + (PVOID)InternetReadFileHook); } diff --git a/src/hooks/ws2_32/redir.c b/src/hooks/ws2_32/redir.c index f8ca3d3..c98719f 100644 --- a/src/hooks/ws2_32/redir.c +++ b/src/hooks/ws2_32/redir.c @@ -47,5 +47,5 @@ static int STDCALL ConnectHook(SOCKET s, const struct sockaddr *name, int namele VOID InitRedirHook() { hWinsockModule = LoadLib("ws2_32"); - pConnect = HookProc(hWinsockModule, "connect", ConnectHook); + pConnect = (PFNCONNECTPROC)HookProc(hWinsockModule, "connect", (PVOID)ConnectHook); } diff --git a/src/ijl15.c b/src/ijl15.c index 1199a40..33fe7b6 100644 --- a/src/ijl15.c +++ b/src/ijl15.c @@ -18,6 +18,10 @@ #include "../third_party/ijl/ijl.h" +#ifdef __cplusplus +extern "C" { +#endif + const IJLibVersion *__stdcall ijlGetLibVersionWrapper() { return ijlGetLibVersion(); } IJLERR __stdcall ijlInitWrapper(JPEG_CORE_PROPERTIES *jcprops) { return ijlInit(jcprops); } @@ -33,3 +37,7 @@ IJLERR __stdcall ijlWriteWrapper(JPEG_CORE_PROPERTIES *jcprops, IJLIOTYPE iotype } const char *__stdcall ijlErrorStrWrapper(IJLERR code) { return ijlErrorStr(code); } + +#ifdef __cplusplus +} +#endif diff --git a/src/patch.c b/src/patch.c index c0ac822..f7fb0ef 100644 --- a/src/patch.c +++ b/src/patch.c @@ -20,7 +20,7 @@ /** * Patch is a small routine for patching arbitrary memory. */ -VOID Patch(LPVOID dst, LPVOID src, DWORD size) { +VOID Patch(LPVOID dst, LPCVOID src, DWORD size) { DWORD OldProtection; VirtualProtect(dst, size, PAGE_EXECUTE_READWRITE, &OldProtection); memcpy(dst, src, size); @@ -33,10 +33,10 @@ VOID Patch(LPVOID dst, LPVOID src, DWORD size) { * so you will need to build a trampoline before installing the hook if you * want to be able to call the original function again. */ -VOID InstallHook(PVOID pfnProc, PVOID pfnTargetProc) { +VOID InstallHook(PVOID pfnProc, LPCVOID pfnTargetProc) { DWORD dwOldProtect; DWORD dwRelAddr; - CHAR pbHook[6] = {0xE9, 0x00, 0x00, 0x00, 0x00, 0xC3}; + BYTE pbHook[6] = {0xE9, 0x00, 0x00, 0x00, 0x00, 0xC3}; // Unprotect function. if (VirtualProtect(pfnProc, 6, PAGE_EXECUTE_READWRITE, &dwOldProtect) == 0) { @@ -66,7 +66,7 @@ VOID InstallHook(PVOID pfnProc, PVOID pfnTargetProc) { * Counts at least minBytes bytes worth of instructions, ending at an * instruction boundary. */ -DWORD CountOpcodeBytes(FARPROC fn, DWORD minBytes) { +DWORD CountOpcodeBytes(LPCVOID fn, DWORD minBytes) { PBYTE fndata = (PBYTE)fn; DWORD count = 0; @@ -86,17 +86,17 @@ DWORD CountOpcodeBytes(FARPROC fn, DWORD minBytes) { * naive and won't always work well, though for most functions the prefix will * be in the prologue and should be safe. */ -PCHAR BuildTrampoline(DWORD fn, DWORD prefixLen) { +PBYTE BuildTrampoline(DWORD fn, DWORD prefixLen) { DWORD trampolineLen; DWORD oldProtect; DWORD relAddr; - PCHAR codeblock; + PBYTE codeblock; // Allocate a block of memory. We need to fit the prefix + a jump. // Extra byte is for a return so that the instruction after the jump will // be valid. I'm not sure if this is strictly necessary. trampolineLen = prefixLen + 6; - codeblock = AllocMem(trampolineLen); + codeblock = (PBYTE)AllocMem(trampolineLen); // Copy the prefix into our newly minted codeblock. memcpy(codeblock, (void *)fn, prefixLen); @@ -153,14 +153,14 @@ PVOID HookProc(HMODULE hModule, LPCSTR szName, PVOID pfnTargetProc) { * convention. The returned function pointer can be used in MSVC ABI vtables. * The this pointer will be passed in to pfnProc as the first parameter. */ -PVOID BuildThiscallToStdcallThunk(PVOID pfnProc) { +PVOID BuildThiscallToStdcallThunk(LPCVOID pfnProc) { DWORD thunkLen = 9; DWORD oldProtect; DWORD relAddr; - PCHAR codeblock; + PBYTE codeblock; // Allocate data for thunk. - codeblock = AllocMem(thunkLen); + codeblock = (PBYTE)AllocMem(thunkLen); // Calculate the jump address. relAddr = (DWORD)pfnProc - (DWORD)&codeblock[8]; @@ -191,14 +191,14 @@ PVOID BuildThiscallToStdcallThunk(PVOID pfnProc) { * convention. The returned function pointer can be called using stdcall. * The first parameter will be used as the this pointer. */ -PVOID BuildStdcallToThiscallThunk(PVOID pfnProc) { +PVOID BuildStdcallToThiscallThunk(LPCVOID pfnProc) { DWORD thunkLen = 9; DWORD oldProtect; DWORD relAddr; - PCHAR codeblock; + PBYTE codeblock; // Allocate data for thunk. - codeblock = AllocMem(thunkLen); + codeblock = (PBYTE)AllocMem(thunkLen); // Calculate the jump address. relAddr = (DWORD)pfnProc - (DWORD)&codeblock[8]; @@ -232,10 +232,10 @@ PVOID BuildStdcallToThiscallThunk(PVOID pfnProc) { PVOID BuildStdcallToVirtualThiscallThunk(DWORD dwVtblOffset) { DWORD thunkLen = 12; DWORD oldProtect; - PCHAR codeblock; + PBYTE codeblock; // Allocate data for thunk. - codeblock = AllocMem(thunkLen); + codeblock = (PBYTE)AllocMem(thunkLen); // First, set up the stack as above. So, pop off return address into eax, // pop off this pointer into ecx, then push return address back to stack. diff --git a/src/patch.h b/src/patch.h index f594c70..4ebc74d 100644 --- a/src/patch.h +++ b/src/patch.h @@ -18,12 +18,12 @@ #include "common.h" -VOID Patch(LPVOID dst, LPVOID src, DWORD size); -VOID InstallHook(PVOID pfnProc, PVOID pfnTargetProc); -DWORD CountOpcodeBytes(FARPROC fn, DWORD minBytes); -PCHAR BuildTrampoline(DWORD fn, DWORD prefixLen); +VOID Patch(LPVOID dst, LPCVOID src, DWORD size); +VOID InstallHook(PVOID pfnProc, LPCVOID pfnTargetProc); +DWORD CountOpcodeBytes(LPCVOID fn, DWORD minBytes); +PBYTE BuildTrampoline(DWORD fn, DWORD prefixLen); PVOID HookFunc(PVOID pfnProc, PVOID pvTargetProc); PVOID HookProc(HMODULE hModule, LPCSTR szName, PVOID pfnTargetProc); -PVOID BuildThiscallToStdcallThunk(PVOID pfnProc); -PVOID BuildStdcallToThiscallThunk(PVOID pfnProc); +PVOID BuildThiscallToStdcallThunk(LPCVOID pfnProc); +PVOID BuildStdcallToThiscallThunk(LPCVOID pfnProc); PVOID BuildStdcallToVirtualThiscallThunk(DWORD dwVtblOffset); diff --git a/src/regex.c b/src/regex.c index cbdffa2..4eb2f33 100644 --- a/src/regex.c +++ b/src/regex.c @@ -105,7 +105,7 @@ LPSTR ReReplace(REGEX *pattern, LPCSTR replace, LPCSTR text) { outLen++; // Substitution - result = AllocMem(outLen); + result = (LPSTR)AllocMem(outLen); ptr = replace; ptrout = result; while (*ptr != 0) {