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:
parent
2c9572fa77
commit
06026c6ab2
@ -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
|
||||
|
@ -26,5 +26,6 @@ plocktoggle=
|
||||
fpstoggle=
|
||||
printscreen=0x7B
|
||||
corner=0x7A
|
||||
freezetime=0x79
|
||||
|
||||
|
||||
|
@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:35b41771cbc6227fe2b767905fbd42e75f893b1bedc8f5ccbcf26d42dffc802f
|
||||
size 619008
|
||||
oid sha256:58d53ae35a2c6ed0abd1628c80eebf170d591eb9b2a840f79b3a0507813048c9
|
||||
size 619520
|
||||
|
@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:a1616682f67e2e527cec0060d101ab43de06f3cbe2ff7cd4e03394c7de2c0027
|
||||
oid sha256:bfcf831bd510bb48aaef99c2469d1627a11d73ea4c4c50c765e257ab30b38f7e
|
||||
size 546304
|
||||
|
@ -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
3
build/redist/dpwsock.dll
Normal file
@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:7fe37bba5475b66375d286ee92bc10cfcdeff6e9fa1ef112eb2813b86d4d4065
|
||||
size 42768
|
@ -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");
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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");
|
||||
}
|
@ -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
|
||||
};
|
||||
|
||||
|
@ -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.
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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.
@ -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.
@ -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;
|
||||
|
BIN
host/host.aps
BIN
host/host.aps
Binary file not shown.
BIN
host/resource
BIN
host/resource
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user