diff --git a/Include/dxwnd.h b/Include/dxwnd.h index a1ccce9..0b1519f 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -138,7 +138,7 @@ #define SUPPORTSVGA 0x00400000 // Supports SVGA standard resolutions #define SUPPORTHDTV 0x00800000 // Supports HDTV standard resolutions #define RELEASEMOUSE 0x01000000 // GetCursorPos returns centered coordinates when the mouse cursor is moved outside the window -//#define FRAMECOMPENSATION 0x02000000 // Compensate for frame border adding x,y displacement of (x) left border and (y) window title bar +#define ENABLETIMEFREEZE 0x02000000 // Enable Time Freeze functionality and toggle key #define HOTPATCH 0x04000000 // Use hot patching technique to handle obfuscated IAT #define ENABLEHOTKEYS 0x08000000 // Enables hot keys #define HOTPATCHALWAYS 0x10000000 // Force hot patching to every call @@ -210,6 +210,8 @@ #define SYNCPALETTE 0x04000000 // Syncronize GDI to DDRAW palette #define VIRTUALJOYSTICK 0x08000000 // Enables the DxWnd virtual joystick #define UNACQUIRE 0x10000000 // Unacquire DirectInput devices when losing focus and acquire back when gaining focus +#define HOOKGOGLIBS 0x20000000 +#define BYPASSGOGLIBS 0x40000000 // logging Tflags DWORD: #define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general diff --git a/build/dxwnd.0.ini b/build/dxwnd.0.ini index 138b216..be2c649 100644 --- a/build/dxwnd.0.ini +++ b/build/dxwnd.0.ini @@ -26,5 +26,6 @@ plocktoggle= fpstoggle= printscreen=0x7B corner=0x7A +freezetime=0x79 diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 37c8401..6ec58cd 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:35b41771cbc6227fe2b767905fbd42e75f893b1bedc8f5ccbcf26d42dffc802f -size 619008 +oid sha256:58d53ae35a2c6ed0abd1628c80eebf170d591eb9b2a840f79b3a0507813048c9 +size 619520 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 9152118..aef5581 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a1616682f67e2e527cec0060d101ab43de06f3cbe2ff7cd4e03394c7de2c0027 +oid sha256:bfcf831bd510bb48aaef99c2469d1627a11d73ea4c4c50c765e257ab30b38f7e size 546304 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 7f334df..3fa406b 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -968,3 +968,9 @@ add: option "Unacquire input devices on focus lost". Needed for Star wars "Tie F fix: set dinput SetCooperativeLevel flags to DISCL_NONEXCLUSIVE | DISCL_FOREGROUND fix: fixed CreateIC hooker call method (WINAPI) fix: emulated Unacquire on virtual joystick. Needed for Star wars "Tie Fighter 95". + +v2.03.46 +add: added compatibility options "Hook GOG libs" and "Byass GOG libs" to manage GOG games +add: added "Enable Time Freeze" timing option and the virtual key "freezetime" +add: command line option /E to terminate exixting DxWnd session +fix: relocation of WS_POPUP windows. Fixes "Riven" menu window. diff --git a/build/redist/dpwsock.dll b/build/redist/dpwsock.dll new file mode 100644 index 0000000..086de94 --- /dev/null +++ b/build/redist/dpwsock.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7fe37bba5475b66375d286ee92bc10cfcdeff6e9fa1ef112eb2813b86d4d4065 +size 42768 diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index 86f3a8d..5754549 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -629,6 +629,22 @@ static void ddSetCompatibility() FreeLibrary(hinst); } +static void BypassGOGDDrawRedirector() +{ + // this procedure bypasses the GOG proxy ddraw.dll that sometimes is found in the GOG game folders. + // This way, there will be no more the need to rename or delete this file. + char sSysLibraryPath[MAX_PATH+10]; + HMODULE hinst; + + GetSystemDirectory(sSysLibraryPath, MAX_PATH); + strcat(sSysLibraryPath, "\\ddraw.dll"); + hinst = LoadLibrary(sSysLibraryPath); + pDirectDrawEnumerate = (DirectDrawEnumerate_Type)GetProcAddress(hinst, "DirectDrawEnumerateA"); + pDirectDrawEnumerateEx = (DirectDrawEnumerateEx_Type)GetProcAddress(hinst, "DirectDrawEnumerateExA"); + pDirectDrawCreate = (DirectDrawCreate_Type)GetProcAddress(hinst, "DirectDrawCreate"); + pDirectDrawCreateEx = (DirectDrawCreateEx_Type)GetProcAddress(hinst, "DirectDrawCreateEx"); +} + int HookDirectDraw(HMODULE module, int version) { if ((dxw.dwFlags2 & SETCOMPATIBILITY) || @@ -640,6 +656,11 @@ int HookDirectDraw(HMODULE module, int version) } } + if(dxw.dwFlags6 & BYPASSGOGLIBS) { + BypassGOGDDrawRedirector(); + return TRUE; + } + if(dxw.dwFlags4 & HOTPATCH) { // hot-patch all APIs and that's all folks! HookLibrary(module, ddHooks, "ddraw.dll"); diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 13126a4..b79f877 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -92,7 +92,7 @@ static char *Flag4Names[32]={ "LIMITSCREENRES", "NOFILLRECT", "HOOKGLIDE", "HIDEDESKTOP", "STRETCHTIMERS", "NOFLIPEMULATION", "NOTEXTURES", "RETURNNULLREF", "FINETIMING", "NATIVERES", "SUPPORTSVGA", "SUPPORTHDTV", - "RELEASEMOUSE", "--FRAMECOMPENSATION--", "HOTPATCH", "ENABLEHOTKEYS", + "RELEASEMOUSE", "ENABLETIMEFREEZE", "HOTPATCH", "ENABLEHOTKEYS", "HOTPATCHALWAYS", "NOD3DRESET", "OVERRIDEREGISTRY", "HIDECDROMEMPTY", }; @@ -114,8 +114,8 @@ static char *Flag6Names[32]={ "NOSYSMEMPRIMARY", "NOSYSMEMBACKBUF", "CONFIRMONCLOSE", "TERMINATEONCLOSE", "FLIPEMULATION", "SETZBUFFERBITDEPTHS", "SHAREDDC", "WOW32REGISTRY", "STRETCHMOVIES", "BYPASSMCI", "FIXPIXELZOOM", "REUSEEMULATEDDC", - "CREATEDESKTOP", "NOWINDOWHOOKS", "SYNCPALETTE", "", - "", "", "", "", + "CREATEDESKTOP", "NOWINDOWHOOKS", "SYNCPALETTE", "VIRTUALJOYSTICK", + "UNACQUIRE", "HOOKGOGLIBS", "BYPASSGOGLIBS", "", }; static char *TFlagNames[32]={ @@ -848,7 +848,8 @@ void HookModule(HMODULE base, int dxversion) HookKernel32(base); HookUser32(base); HookOle32(base); - HookWinMM(base); + HookWinMM(base, "winmm.dll"); + if(dxw.dwFlags6 & HOOKGOGLIBS) HookWinMM(base, "win32.dll"); //if(dxw.dwFlags2 & SUPPRESSIME) HookImeLib(module); HookGDI32(base); if(dxw.dwFlags1 & HOOKDI) HookDirectInput(base, dxversion); @@ -1104,6 +1105,19 @@ DWORD WINAPI MessagePoller(LPVOID lpParameter) return 0; } +DWORD WINAPI TimeFreezePoller(LPVOID lpParameter) +{ + #define DXWREFRESHINTERVAL 20 + extern UINT VKeyConfig[]; + UINT FreezeToggleKey; + FreezeToggleKey = VKeyConfig[DXVK_FREEZETIME]; + while(TRUE){ + Sleep(DXWREFRESHINTERVAL); + if(GetAsyncKeyState(FreezeToggleKey) & 0xF000) dxw.ToggleFreezedTime(); + } + return 0; +} + static void MemoryReserve() { VirtualAlloc((LPVOID)0x4000000, 0x04000000, MEM_RESERVE, PAGE_READWRITE); @@ -1339,6 +1353,9 @@ void HookInit(TARGETMAP *target, HWND hwnd) if (dxw.dwFlags1 & AUTOREFRESH) CreateThread(NULL, 0, MessagePoller, NULL, 0, NULL); + + if (dxw.dwFlags4 & ENABLETIMEFREEZE) + CreateThread(NULL, 0, TimeFreezePoller, NULL, 0, NULL); } LPCSTR ProcToString(LPCSTR proc) diff --git a/dll/dxhook.h b/dll/dxhook.h index 9e24862..773467c 100644 --- a/dll/dxhook.h +++ b/dll/dxhook.h @@ -10,7 +10,7 @@ extern void HookDirectSound(HMODULE); extern void HookImeLib(HMODULE); extern void HookKernel32(HMODULE); extern void HookUser32(HMODULE); -extern void HookWinMM(HMODULE); +extern void HookWinMM(HMODULE, char *libname); extern void HookAdvApi32(HMODULE); extern void HookImagehlp(HMODULE); extern void HookSmackW32(HMODULE); diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index 54619ff..1087e13 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -50,6 +50,7 @@ dxwCore::dxwCore() iRefreshDelays[0]=16; iRefreshDelays[1]=17; iRefreshDelayCount=2; + TimeFreeze = FALSE; } dxwCore::~dxwCore() @@ -1056,7 +1057,6 @@ void dxwCore::VSyncWait() static float fMul[17]={2.14F, 1.95F, 1.77F, 1.61F, 1.46F, 1.33F, 1.21F, 1.10F, 1.00F, 0.91F, 0.83F, 0.75F, 0.68F, 0.62F, 0.56F, 0.51F, 0.46F}; -//static float fMul[17]={0.46F, 0.51F, 0.56F, 0.62F, 0.68F, 0.75F, 0.83F, 0.91F, 1.00F, 1.10F, 1.21F, 1.33F, 1.46F, 1.61F, 1.77F, 1.95F, 2.14F}; static DWORD TimeShifterFine(DWORD val, int shift) { @@ -1127,6 +1127,7 @@ DWORD dxwCore::GetTickCount(void) dwTick=(dwNextRealTick-dwLastRealTick); TimeShift=GetHookInfo()->TimeShift; dwTick = (*pTimeShifter)(dwTick, TimeShift); + if(TimeFreeze) dwTick=0; dwLastFakeTick += dwTick; dwLastRealTick = dwNextRealTick; return dwLastFakeTick; @@ -1143,18 +1144,19 @@ DWORD dxwCore::StretchCounter(DWORD dwTimer) { TimeShift=GetHookInfo()->TimeShift; dwTimer = (*pTimeShifter)(dwTimer, TimeShift); - return dwTimer; + return (dxw.TimeFreeze) ? 0 : dwTimer; } LARGE_INTEGER dxwCore::StretchCounter(LARGE_INTEGER dwTimer) { static int Reminder = 0; LARGE_INTEGER ret; + LARGE_INTEGER zero = {0,0}; TimeShift=GetHookInfo()->TimeShift; dwTimer.QuadPart += Reminder; ret = (*pTimeShifter64)(dwTimer, TimeShift); Reminder = (ret.QuadPart==0) ? dwTimer.LowPart : 0; - return ret; + return (dxw.TimeFreeze) ? zero : ret; } void dxwCore::GetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime) @@ -1163,9 +1165,7 @@ void dxwCore::GetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime) DWORD dwCurrentTick; FILETIME CurrFileTime; static DWORD dwStartTick=0; - static DWORD dwUpdateTick=0; static FILETIME StartFileTime; -// extern DXWNDSTATUS *pStatus; if(dwStartTick==0) { SYSTEMTIME StartingTime; @@ -1180,6 +1180,7 @@ void dxwCore::GetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime) dwTick=(dwCurrentTick-dwStartTick); TimeShift=GetHookInfo()->TimeShift; dwTick = (*pTimeShifter)(dwTick, TimeShift); + if(dxw.TimeFreeze) dwTick=0; // From MSDN: Contains a 64-bit value representing the number of // 100-nanosecond intervals since January 1, 1601 (UTC). // So, since 1mSec = 10.000 * 100nSec, you still have to multiply by 10.000. @@ -1198,9 +1199,7 @@ void dxwCore::GetSystemTime(LPSYSTEMTIME lpSystemTime) DWORD dwCurrentTick; FILETIME CurrFileTime; static DWORD dwStartTick=0; - static DWORD dwUpdateTick=0; static FILETIME StartFileTime; -// extern DXWNDSTATUS *pStatus; if(dwStartTick==0) { SYSTEMTIME StartingTime; @@ -1215,6 +1214,7 @@ void dxwCore::GetSystemTime(LPSYSTEMTIME lpSystemTime) dwTick=(dwCurrentTick-dwStartTick); TimeShift=GetHookInfo()->TimeShift; dwTick = (*pTimeShifter)(dwTick, TimeShift); + if(dxw.TimeFreeze) dwTick=0; // From MSDN: Contains a 64-bit value representing the number of // 100-nanosecond intervals since January 1, 1601 (UTC). // So, since 1mSec = 10.000 * 100nSec, you still have to multiply by 10.000. @@ -1291,13 +1291,6 @@ void dxwCore::ShowFPS(HDC xdc, int w, int h) if(corner==LastCorner) corner = (corner+1) % 4; LastCorner = corner; color=0xFF0000; // blue - //(*pGetClientRect)(hWnd, &rect); - //switch (corner) { - //case 0: x=10; y=10; break; - //case 1: x=rect.right-60; y=10; break; - //case 2: x=rect.right-60; y=rect.bottom-20; break; - //case 3: x=10; y=rect.bottom-20; break; - //} switch (corner) { case 0: x=10; y=10; break; case 1: x=w-60; y=10; break; @@ -1307,7 +1300,6 @@ void dxwCore::ShowFPS(HDC xdc, int w, int h) } SetTextColor(xdc,color); - //SetBkMode(xdc, TRANSPARENT); SetBkMode(xdc, OPAQUE); sprintf_s(sBuf, 80, "FPS: %d", GetHookInfo()->FPSCount); TextOut(xdc, x, y, sBuf, strlen(sBuf)); @@ -1321,21 +1313,16 @@ void dxwCore::ShowTimeStretching(HDC xdc, int w, int h) static int x, y; static DWORD color; static int LastTimeShift = 1000; // any initial number different from -8 .. +8 + static int LastTimeFreeze = 1000; // any initial number different from TRUE, FALSE if((*pGetTickCount)()-dwTimer > 4000){ - if(LastTimeShift==TimeShift) return; // after a while, stop the show + if((LastTimeShift==TimeShift) && (LastTimeFreeze==TimeFreeze)) return; // after a while, stop the show dwTimer = (*pGetTickCount)(); LastTimeShift=TimeShift; corner = dwTimer % 4; if(corner==LastCorner) corner = (corner+1) % 4; LastCorner = corner; color=0x0000FF; // red - //(*pGetClientRect)(hWnd, &rect); - //switch (corner) { - //case 0: x=10; y=10; break; - //case 1: x=rect.right-60; y=10; break; - //case 2: x=rect.right-60; y=rect.bottom-20; break; - //case 3: x=10; y=rect.bottom-20; break; switch (corner) { case 0: x=10; y=10; break; case 1: x=w-60; y=10; break; @@ -1345,7 +1332,6 @@ void dxwCore::ShowTimeStretching(HDC xdc, int w, int h) } SetTextColor(xdc,color); - //SetBkMode(xdc, TRANSPARENT); SetBkMode(xdc, OPAQUE); sprintf_s(sBuf, 80, "t%s", dxw.GetTSCaption()); TextOut(xdc, x, y, sBuf, strlen(sBuf)); @@ -1365,6 +1351,7 @@ char *dxwCore::GetTSCaption(int shift) "x1.00", ":1.10",":1.21",":1.33",":1.46", ":1.61",":1.77",":1.95",":2.14"}; + if(TimeFreeze) return "x0"; if (shift<(-8) || shift>(+8)) return "???"; shift += 8; return (dxw.dwFlags4 & FINETIMING) ? sTSCaptionFine[shift] : sTSCaptionCoarse[shift]; @@ -1848,7 +1835,8 @@ static char *VKeyLabels[DXVK_SIZE]={ "timetoggle", "altf4", "printscreen", - "corner" + "corner", + "freezetime" }; void dxwCore::MapKeysInit() @@ -1879,3 +1867,12 @@ UINT dxwCore::MapKeysConfig(UINT message, LPARAM lparam, WPARAM wparam) } return DXVK_NONE; } + +void dxwCore::ToggleFreezedTime() +{ + static DWORD dwLastTime = 0; + if(((*pGetTickCount)() - dwLastTime) < 100) return; + TimeFreeze = !TimeFreeze; + dwLastTime = (*pGetTickCount)(); + OutTraceDW("DxWnd: time is %s\n", dxw.TimeFreeze ? "freezed" : "unfreezed"); +} \ No newline at end of file diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp index c1afc5d..8fe2003 100644 --- a/dll/dxwcore.hpp +++ b/dll/dxwcore.hpp @@ -129,6 +129,7 @@ public: // methods void SetVSyncDelays(UINT); void VSyncWait(); void DumpDesktopStatus(); + void ToggleFreezedTime(); public: // simple data variables BOOL Windowize; @@ -168,6 +169,7 @@ public: // simple data variables HDC RealHDC; HDC VirtualHDC; int GDIEmulationMode; + BOOL TimeFreeze; // Implementation protected: @@ -346,6 +348,7 @@ typedef enum { DXVK_ALTF4, DXVK_PRINTSCREEN, DXVK_CORNERIZE, + DXVK_FREEZETIME, DXVK_SIZE }; diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 8e61fcf..c3191d5 100644 --- a/dll/dxwnd.cpp +++ b/dll/dxwnd.cpp @@ -27,7 +27,7 @@ along with this program. If not, see . #include "TlHelp32.h" -#define VERSION "2.03.45" +#define VERSION "2.03.46" #define DDTHREADLOCK 1 //#define LOCKTHREADS diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index bab0e9d..a4bbf46 100644 Binary files a/dll/dxwnd.vs2008.suo and b/dll/dxwnd.vs2008.suo differ diff --git a/dll/kernel32.cpp b/dll/kernel32.cpp index 636e06c..4cd2c7a 100644 --- a/dll/kernel32.cpp +++ b/dll/kernel32.cpp @@ -383,13 +383,16 @@ time related APIs DWORD WINAPI extGetTickCount(void) { - return dxw.GetTickCount(); + DWORD ret; + ret=dxw.GetTickCount(); + //OutTraceB("GetTickCount: ret=%x\n", ret); + return ret; } void WINAPI extGetSystemTime(LPSYSTEMTIME lpSystemTime) { dxw.GetSystemTime(lpSystemTime); - if (IsDebug) OutTrace("GetSystemTime: %02d:%02d:%02d.%03d\n", + OutTraceB("GetSystemTime: %02d:%02d:%02d.%03d\n", lpSystemTime->wHour, lpSystemTime->wMinute, lpSystemTime->wSecond, lpSystemTime->wMilliseconds); } @@ -398,7 +401,7 @@ void WINAPI extGetLocalTime(LPSYSTEMTIME lpLocalTime) SYSTEMTIME SystemTime; dxw.GetSystemTime(&SystemTime); SystemTimeToTzSpecificLocalTime(NULL, &SystemTime, lpLocalTime); - if (IsDebug) OutTrace("GetLocalTime: %02d:%02d:%02d.%03d\n", + OutTraceB("GetLocalTime: %02d:%02d:%02d.%03d\n", lpLocalTime->wHour, lpLocalTime->wMinute, lpLocalTime->wSecond, lpLocalTime->wMilliseconds); } @@ -410,25 +413,29 @@ VOID WINAPI extSleep(DWORD dwMilliseconds) dwNewDelay = dxw.StretchTime(dwMilliseconds); if (dwNewDelay==0) dwNewDelay=1; // minimum allowed... } - if (IsDebug) OutTrace("Sleep: msec=%d->%d timeshift=%d\n", dwMilliseconds, dwNewDelay, dxw.TimeShift); + OutTraceB("Sleep: msec=%d->%d timeshift=%d\n", dwMilliseconds, dwNewDelay, dxw.TimeShift); (*pSleep)(dwNewDelay); + while(dxw.TimeFreeze)(*pSleep)(40); } DWORD WINAPI extSleepEx(DWORD dwMilliseconds, BOOL bAlertable) { + DWORD ret; DWORD dwNewDelay; dwNewDelay=dwMilliseconds; if ((dwMilliseconds!=INFINITE) && (dwMilliseconds!=0)){ dwNewDelay = dxw.StretchTime(dwMilliseconds); if (dwNewDelay==0) dwNewDelay=1; // minimum allowed... } - if (IsDebug) OutTrace("SleepEx: msec=%d->%d alertable=%x, timeshift=%d\n", dwMilliseconds, dwNewDelay, bAlertable, dxw.TimeShift); - return (*pSleepEx)(dwNewDelay, bAlertable); + OutTraceB("SleepEx: msec=%d->%d alertable=%x, timeshift=%d\n", dwMilliseconds, dwNewDelay, bAlertable, dxw.TimeShift); + ret = (*pSleepEx)(dwNewDelay, bAlertable); + while(dxw.TimeFreeze)(*pSleep)(40); + return ret; } void WINAPI extGetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime) { - if (IsDebug) OutTrace("GetSystemTimeAsFileTime\n"); + OutTraceB("GetSystemTimeAsFileTime\n"); dxw.GetSystemTimeAsFileTime(lpSystemTimeAsFileTime); } diff --git a/dll/user32.cpp b/dll/user32.cpp index 09b10c5..f836c2d 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -1466,19 +1466,25 @@ static HWND WINAPI extCreateWindowCommon( return hwnd; } - // tested on Gangsters: coordinates must be window-relative!!! - // Age of Empires.... - if (dwStyle & WS_CHILD){ + // from here on, fullscreen is garanteed + + if (dwStyle & WS_CHILD){ + // tested on Gangsters: coordinates must be window-relative!!! + // Age of Empires.... dxw.MapClient(&x, &y, &nWidth, &nHeight); OutTraceDW("%s: fixed WS_CHILD pos=(%d,%d) size=(%d,%d)\n", - ApiName, x, y, nWidth, nHeight); + ApiName, x, y, nWidth, nHeight); } - // needed for Diablo, that creates a new control parent window that must be - // overlapped to the directdraw surface. - else if (dwExStyle & WS_EX_CONTROLPARENT){ - dxw.MapWindow(&x, &y, &nWidth, &nHeight); - OutTraceDW("%s: fixed WS_EX_CONTROLPARENT pos=(%d,%d) size=(%d,%d)\n", + else { + if ((dwExStyle & WS_EX_CONTROLPARENT) || (dwStyle & WS_POPUP)){ + // needed for "Diablo", that creates a new WS_EX_CONTROLPARENT window that must be + // overlapped to the directdraw surface. + // needed for "Riven", that creates a new WS_POPUP window with the menu bar that must be + // overlapped to the directdraw surface. + dxw.MapWindow(&x, &y, &nWidth, &nHeight); + OutTraceDW("%s: fixed pos=(%d,%d) size=(%d,%d)\n", ApiName, x, y, nWidth, nHeight); + } } OutTraceB("%s: fixed pos=(%d,%d) size=(%d,%d) Style=%x(%s) ExStyle=%x(%s)\n", @@ -1578,7 +1584,8 @@ HWND WINAPI extCreateWindowExW( dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle), hWndParent, hWndParent==HWND_MESSAGE?"(HWND_MESSAGE)":"", hMenu); } - if(IsDebug) OutTrace("CreateWindowExW: DEBUG screen=(%d,%d)\n", dxw.GetScreenWidth(), dxw.GetScreenHeight()); + OutTraceB("CreateWindowExW: DEBUG fullscreen=%x mainwin=%x screen=(%d,%d)\n", + dxw.IsFullScreen(), dxw.GethWnd(), dxw.GetScreenWidth(), dxw.GetScreenHeight()); if((dxw.dwFlags6 & STRETCHMOVIES) && !wcscmp(lpWindowName, L"ActiveMovie Window")){ RECT MainWin; @@ -1620,7 +1627,8 @@ HWND WINAPI extCreateWindowExA( dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle), hWndParent, hWndParent==HWND_MESSAGE?"(HWND_MESSAGE)":"", hMenu); } - if(IsDebug) OutTrace("CreateWindowExA: DEBUG screen=(%d,%d)\n", dxw.GetScreenWidth(), dxw.GetScreenHeight()); + OutTraceB("CreateWindowExW: DEBUG fullscreen=%x mainwin=%x screen=(%d,%d)\n", + dxw.IsFullScreen(), dxw.GethWnd(), dxw.GetScreenWidth(), dxw.GetScreenHeight()); if((dxw.dwFlags6 & STRETCHMOVIES) && !strcmp(lpWindowName, "ActiveMovie Window")){ RECT MainWin; diff --git a/dll/winmm.cpp b/dll/winmm.cpp index d3e90fa..a5d7122 100644 --- a/dll/winmm.cpp +++ b/dll/winmm.cpp @@ -61,12 +61,12 @@ static HookEntry_Type JoyHooks[]={ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator }; -void HookWinMM(HMODULE module) +void HookWinMM(HMODULE module, char *libname) { - HookLibrary(module, Hooks, "winmm.dll"); - if(dxw.dwFlags2 & TIMESTRETCH) HookLibrary(module, TimeHooks, "winmm.dll"); - if(dxw.dwFlags5 & REMAPMCI) HookLibrary(module, RemapHooks, "winmm.dll"); - if(dxw.dwFlags6 & VIRTUALJOYSTICK) HookLibrary(module, JoyHooks, "winmm.dll"); + HookLibrary(module, Hooks, libname); + if(dxw.dwFlags2 & TIMESTRETCH) HookLibrary(module, TimeHooks, libname); + if(dxw.dwFlags5 & REMAPMCI) HookLibrary(module, RemapHooks, libname); + if(dxw.dwFlags6 & VIRTUALJOYSTICK) HookLibrary(module, JoyHooks, libname); } FARPROC Remap_WinMM_ProcAddress(LPCSTR proc, HMODULE hModule) @@ -330,7 +330,7 @@ MMRESULT WINAPI extjoyGetDevCapsA(DWORD uJoyID, LPJOYCAPS pjc, UINT cbjc) MMRESULT WINAPI extjoyGetPosEx(DWORD uJoyID, LPJOYINFOEX pji) { - OutTraceDW("joyGetPosEx: joyid=%d\n", uJoyID); + OutTraceC("joyGetPosEx: joyid=%d\n", uJoyID); if(uJoyID != 0) return JOYERR_PARMS; LONG x, y; HWND hwnd; @@ -352,8 +352,10 @@ MMRESULT WINAPI extjoyGetPosEx(DWORD uJoyID, LPJOYINFOEX pji) } } - POINT pt; + x=(XSPAN>>1); + y=(YSPAN>>1); if(hwnd=dxw.GethWnd()){ + POINT pt; RECT client; POINT upleft = {0,0}; (*pGetClientRect)(hwnd, &client); @@ -381,7 +383,7 @@ MMRESULT WINAPI extjoyGetPosEx(DWORD uJoyID, LPJOYINFOEX pji) if(INVERTJOYAXIS) y = ((client.bottom - pt.y) * YSPAN) / client.bottom; // inverted y axis else - pt.y = (pt.y * YSPAN) / dxw.GetScreenHeight(); + y = (pt.y * YSPAN) / client.bottom; } ShowJoystick(pt.x, pt.y, dwButtons); } @@ -399,7 +401,7 @@ MMRESULT WINAPI extjoyGetPosEx(DWORD uJoyID, LPJOYINFOEX pji) pji->dwButtons = dwButtons; pji->dwFlags = JOY_RETURNX|JOY_RETURNY|JOY_RETURNBUTTONS; - OutTraceDW("joyGetPosEx: joyid=%d pos=(%d,%d)\n", uJoyID, pji->dwXpos, pji->dwYpos); + OutTraceC("joyGetPosEx: joyid=%d pos=(%d,%d)\n", uJoyID, pji->dwXpos, pji->dwYpos); return JOYERR_NOERROR; } diff --git a/dll/winproc.cpp b/dll/winproc.cpp index 8e07353..b75e146 100644 --- a/dll/winproc.cpp +++ b/dll/winproc.cpp @@ -512,6 +512,9 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp case DXVK_CORNERIZE: dx_Cornerize(hwnd); break; + //case DXVK_FREEZETIME: + // dxw.ToggleFreezedTime(); + // break; case DXVK_TIMEFAST: case DXVK_TIMESLOW: if (dxw.dwFlags2 & TIMESTRETCH) { diff --git a/host/TabCompat.cpp b/host/TabCompat.cpp index 3d91d1f..5261a4d 100644 --- a/host/TabCompat.cpp +++ b/host/TabCompat.cpp @@ -50,6 +50,10 @@ void CTabCompat::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_OVERRIDEREGISTRY, cTarget->m_OverrideRegistry); DDX_Check(pDX, IDC_WOW64REGISTRY, cTarget->m_Wow64Registry); DDX_Check(pDX, IDC_WOW32REGISTRY, cTarget->m_Wow32Registry); + + // GOG patches + DDX_Check(pDX, IDC_HOOKGOGLIBS, cTarget->m_HookGOGLibs); + DDX_Check(pDX, IDC_BYPASSGOGLIBS, cTarget->m_BypassGOGLibs); } BEGIN_MESSAGE_MAP(CTabCompat, CDialog) diff --git a/host/TabTiming.cpp b/host/TabTiming.cpp index 72112d6..1cac65b 100644 --- a/host/TabTiming.cpp +++ b/host/TabTiming.cpp @@ -39,6 +39,7 @@ void CTabTiming::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_NORMALIZEPERFCOUNT, cTarget->m_NormalizePerfCount); DDX_Check(pDX, IDC_QUARTERBLT, cTarget->m_QuarterBlt); DDX_Check(pDX, IDC_FINETIMING, cTarget->m_FineTiming); + DDX_Check(pDX, IDC_TIMEFREEZE, cTarget->m_EnableTimeFreeze); DDX_Text(pDX, IDC_MAXFPS, cTarget->m_MaxFPS); DDX_LBIndex(pDX, IDC_LISTTS, cTarget->m_InitTS); //{{AFX_DATA_MAP(CTabTiming) diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index 5a9bad8..7bc263f 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -81,6 +81,8 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_LimitResources = FALSE; m_CDROMDriveType = FALSE; m_HideCDROMEmpty = FALSE; + m_HookGOGLibs = FALSE; + m_BypassGOGLibs = FALSE; m_FontBypass = FALSE; m_BufferedIOFix = FALSE; m_ZBufferClean = FALSE; @@ -179,8 +181,8 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_NormalizePerfCount = FALSE; m_QuarterBlt = FALSE; m_FineTiming = FALSE; + m_EnableTimeFreeze = FALSE; m_ReleaseMouse = FALSE; - //m_FrameCompensation = FALSE; m_EnableHotKeys = TRUE; // default true !! m_InterceptRDTSC = FALSE; m_HookOpenGL = FALSE; diff --git a/host/TargetDlg.h b/host/TargetDlg.h index 9d16c58..9a2378e 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -145,8 +145,8 @@ public: BOOL m_NormalizePerfCount; BOOL m_QuarterBlt; BOOL m_FineTiming; + BOOL m_EnableTimeFreeze; BOOL m_ReleaseMouse; -// BOOL m_FrameCompensation; BOOL m_EnableHotKeys; BOOL m_InterceptRDTSC; BOOL m_HookOpenGL; @@ -171,6 +171,8 @@ public: BOOL m_LimitResources; BOOL m_CDROMDriveType; BOOL m_HideCDROMEmpty; + BOOL m_HookGOGLibs; + BOOL m_BypassGOGLibs; BOOL m_FontBypass; BOOL m_BufferedIOFix; BOOL m_ZBufferClean; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index 6202d9a..f8b2f04 100644 Binary files a/host/dxwndhost.aps and b/host/dxwndhost.aps differ diff --git a/host/dxwndhost.cpp b/host/dxwndhost.cpp index 15ca581..30d2006 100644 --- a/host/dxwndhost.cpp +++ b/host/dxwndhost.cpp @@ -81,6 +81,12 @@ void CNewCommandLineInfo::ParseParam(LPCTSTR lpszParam, BOOL bFlag, BOOL bLast) strcpy_s(m_ConfigFileName, sizeof(m_ConfigFileName)-1, sParam.Mid(2,sizeof(m_ConfigFileName)-1)); return; } + if (sParam.MakeLower() == "e"){ + // Exit (kill) existing DxWnd session + extern int KillProcByName(char *, BOOL); + KillProcByName("DxWnd.exe", TRUE); + exit(0); + } } // Call the base class to ensure proper command line processing diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index 6b95828..358eda2 100644 Binary files a/host/dxwndhost.rc and b/host/dxwndhost.rc differ diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index 76f8a0b..beec9fa 100644 Binary files a/host/dxwndhost.vs2008.suo and b/host/dxwndhost.vs2008.suo differ diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index ba61a36..d79e1b5 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -270,6 +270,8 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_LimitResources) t->flags2 |= LIMITRESOURCES; if(dlg->m_CDROMDriveType) t->flags3 |= CDROMDRIVETYPE; if(dlg->m_HideCDROMEmpty) t->flags4 |= HIDECDROMEMPTY; + if(dlg->m_HookGOGLibs) t->flags6 |= HOOKGOGLIBS; + if(dlg->m_BypassGOGLibs) t->flags6 |= BYPASSGOGLIBS; if(dlg->m_FontBypass) t->flags3 |= FONTBYPASS; if(dlg->m_BufferedIOFix) t->flags3 |= BUFFEREDIOFIX; if(dlg->m_ZBufferClean) t->flags4 |= ZBUFFERCLEAN; @@ -380,7 +382,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_QuarterBlt) t->flags5 |= QUARTERBLT; if(dlg->m_FineTiming) t->flags4 |= FINETIMING; if(dlg->m_ReleaseMouse) t->flags4 |= RELEASEMOUSE; -// if(dlg->m_FrameCompensation) t->flags4 |= FRAMECOMPENSATION; + if(dlg->m_EnableTimeFreeze) t->flags4 |= ENABLETIMEFREEZE; if(dlg->m_EnableHotKeys) t->flags4 |= ENABLEHOTKEYS; if(dlg->m_InterceptRDTSC) t->flags4 |= INTERCEPTRDTSC; if(dlg->m_HookOpenGL) t->flags2 |= HOOKOPENGL; @@ -542,6 +544,8 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_LimitResources = t->flags2 & LIMITRESOURCES ? 1 : 0; dlg->m_CDROMDriveType = t->flags3 & CDROMDRIVETYPE ? 1 : 0; dlg->m_HideCDROMEmpty = t->flags4 & HIDECDROMEMPTY ? 1 : 0; + dlg->m_HookGOGLibs = t->flags6 & HOOKGOGLIBS ? 1 : 0; + dlg->m_BypassGOGLibs = t->flags6 & BYPASSGOGLIBS ? 1 : 0; dlg->m_FontBypass = t->flags3 & FONTBYPASS ? 1 : 0; dlg->m_BufferedIOFix = t->flags3 & BUFFEREDIOFIX ? 1 : 0; dlg->m_ZBufferClean = t->flags4 & ZBUFFERCLEAN ? 1 : 0; @@ -623,7 +627,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_QuarterBlt = t->flags5 & QUARTERBLT ? 1 : 0; dlg->m_FineTiming = t->flags4 & FINETIMING ? 1 : 0; dlg->m_ReleaseMouse = t->flags4 & RELEASEMOUSE ? 1 : 0; -// dlg->m_FrameCompensation = t->flags4 & FRAMECOMPENSATION ? 1 : 0; + dlg->m_EnableTimeFreeze = t->flags4 & ENABLETIMEFREEZE ? 1 : 0; dlg->m_EnableHotKeys = t->flags4 & ENABLEHOTKEYS ? 1 : 0; dlg->m_InterceptRDTSC = t->flags4 & INTERCEPTRDTSC ? 1 : 0; dlg->m_HookOpenGL = t->flags2 & HOOKOPENGL ? 1 : 0; diff --git a/host/host.aps b/host/host.aps index e615e8b..9c58adf 100644 Binary files a/host/host.aps and b/host/host.aps differ diff --git a/host/resource b/host/resource index 434f71b..fefdb32 100644 Binary files a/host/resource and b/host/resource differ