1
0
mirror of https://github.com/DxWnd/DxWnd.reloaded synced 2024-12-30 09:25:35 +01:00

v2_03_46_src

Former-commit-id: a29ee258050b59c37e33287a7c26e77d41ef796e
This commit is contained in:
gho tik 2015-11-19 11:42:28 -05:00 committed by Refael ACkermann
parent 2c9572fa77
commit 06026c6ab2
28 changed files with 154 additions and 65 deletions

View File

@ -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

View File

@ -26,5 +26,6 @@ plocktoggle=
fpstoggle=
printscreen=0x7B
corner=0x7A
freezetime=0x79

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:35b41771cbc6227fe2b767905fbd42e75f893b1bedc8f5ccbcf26d42dffc802f
size 619008
oid sha256:58d53ae35a2c6ed0abd1628c80eebf170d591eb9b2a840f79b3a0507813048c9
size 619520

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:a1616682f67e2e527cec0060d101ab43de06f3cbe2ff7cd4e03394c7de2c0027
oid sha256:bfcf831bd510bb48aaef99c2469d1627a11d73ea4c4c50c765e257ab30b38f7e
size 546304

View File

@ -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.

3
build/redist/dpwsock.dll Normal file
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7fe37bba5475b66375d286ee92bc10cfcdeff6e9fa1ef112eb2813b86d4d4065
size 42768

View File

@ -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");

View File

@ -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)

View File

@ -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);

View File

@ -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");
}

View File

@ -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
};

View File

@ -27,7 +27,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "TlHelp32.h"
#define VERSION "2.03.45"
#define VERSION "2.03.46"
#define DDTHREADLOCK 1
//#define LOCKTHREADS

Binary file not shown.

View File

@ -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);
}

View File

@ -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;

View File

@ -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;
}

View File

@ -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) {

View File

@ -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)

View File

@ -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)

View File

@ -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;

View File

@ -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;

Binary file not shown.

View File

@ -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

Binary file not shown.

Binary file not shown.

View File

@ -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;

Binary file not shown.

Binary file not shown.