diff --git a/Include/dxwnd.h b/Include/dxwnd.h
index 6885161..4314890 100644
--- a/Include/dxwnd.h
+++ b/Include/dxwnd.h
@@ -66,6 +66,7 @@
#define SHOWHWCURSOR 0x00080000 // mouse events are discarded (good for screensaver-like)
#define HOOKGDI 0x00100000 // Hook GDI functions
#define SHOWFPSOVERLAY 0x00200000 // shows FPS value to status win / log / screen overlay
+#define FAKEVERSION 0x00400000 // pretends the platvorm is a given window version / subversion
// logging Tflags DWORD:
#define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general
@@ -103,6 +104,7 @@ typedef struct TARGETMAP
short sizy;
short MaxFPS;
short InitTS;
+ short FakeVersionId;
}TARGETMAP;
typedef struct
diff --git a/build/dxwnd.dll b/build/dxwnd.dll
index 9c149ac..715d1f8 100644
--- a/build/dxwnd.dll
+++ b/build/dxwnd.dll
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:b0ffe0f3143b439d28c1b4d7f195991b383f36ed919ba89aab0abf2de7c9481e
-size 271360
+oid sha256:42bf1dd1c3802f28d8bf51d0612a2a5df8e070e0218e2c15912e038ece52c5aa
+size 272384
diff --git a/build/dxwnd.exe b/build/dxwnd.exe
index 537cac2..68baad2 100644
--- a/build/dxwnd.exe
+++ b/build/dxwnd.exe
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:3d43f746689ac5abcadcfbbb0dbd302cc3d4186ce2df7aa8bd9c24eb1b8694d4
+oid sha256:cb6552a857a81cef451a0851137395257ef958b967bc307ded9978abeb09b517
size 488960
diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt
index 4a6d2b2..4e43665 100644
--- a/build/readme-relnotes.txt
+++ b/build/readme-relnotes.txt
@@ -25,4 +25,8 @@ fixed buf on time stretch logging (and possible game crash).
revised GetDC handling with 8BPP paletized surfaces: avoided need to emulate reverse-blitting and got an impressive speed improvement for games such as Age of Empires I & II and Hyperblade.
v2.02.07:
-many fixes on the FPS and time control features.
\ No newline at end of file
+many fixes on the FPS and time control features.
+
+v2.02.08:
+fixed some errors in the main directdraw palette descriptor. That gives better compatibility and less complicated source code.
+added Fake Version feature: now Dungeon Keeper II (original version, not GOG hack) can detect a fake Win2000 / WinXP environment on Win7 and newer. Tested and working on Win7. Many thanks to Maxim for pushing me hard to win my lazyness and implement this new feature.
diff --git a/debug/dxwnd.ini b/debug/dxwnd.ini
index abdbcd2..744202e 100644
--- a/debug/dxwnd.ini
+++ b/debug/dxwnd.ini
@@ -277,7 +277,7 @@ module16=
ver16=0
flag16=142606370
flagg16=1048576
-tflag16=3
+tflag16=259
initx16=0
inity16=0
minx16=0
@@ -1007,7 +1007,7 @@ path59=D:\Games\Dungeon Keeper 2 GOG release\DKII.EXE
module59=
ver59=0
flag59=134217762
-flagg59=81920
+flagg59=4276224
tflag59=0
initx59=0
inity59=0
@@ -2945,8 +2945,8 @@ path173=D:\Games\TR2 Golden Mask\T2GOLD.EXE
module173=
ver173=0
flag173=570688034
-flagg173=0
-tflag173=258
+flagg173=2179072
+tflag173=387
initx173=0
inity173=0
minx173=0
@@ -3063,9 +3063,9 @@ title180=Urban Assault
path180=D:\Games\Urban Assault\UA.EXE
module180=
ver180=0
-flag180=-1610465246
+flag180=671236130
flagg180=256
-tflag180=3
+tflag180=259
initx180=0
inity180=0
minx180=0
@@ -3745,9 +3745,9 @@ initts170=0
opengllib171=
initts171=0
opengllib172=
-initts172=0
+initts172=8
opengllib173=
-initts173=0
+initts173=8
opengllib174=
initts174=0
opengllib175=
@@ -3960,3 +3960,23 @@ sizx197=800
sizy197=600
maxfps197=0
initts197=0
+title198=Doom 95
+path198=D:\Games\Doom95\DOOM95.EXE
+module198=
+opengllib198=
+ver198=0
+flag198=134217762
+flagg198=65536
+tflag198=3
+initx198=0
+inity198=0
+minx198=0
+miny198=0
+maxx198=0
+maxy198=0
+posx198=50
+posy198=50
+sizx198=800
+sizy198=600
+maxfps198=0
+initts198=-9
diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp
index 2b96283..aeb2a7b 100644
--- a/dll/dxhook.cpp
+++ b/dll/dxhook.cpp
@@ -39,7 +39,7 @@ static char *Flag2Names[32]={
"KEEPCURSORFIXED", "DISABLEGAMMARAMP", "DIFFERENTIALMOUSE", "FIXNCHITTEST",
"LIMITFPS", "SKIPFPS", "SHOWFPS", "HIDEMULTIMONITOR",
"TIMESTRETCH", "HOOKOPENGL", "WALLPAPERMODE", "SHOWHWCURSOR",
- "HOOKGDI", "", "", "",
+ "HOOKGDI", "SHOWFPSOVERLAY", "FAKEVERSION", "",
"", "", "", "",
"", "", "", "",
};
@@ -1035,6 +1035,14 @@ void HookSysLibs(char *module)
tmp = HookAPI(module, "winmm.dll", NULL, "timeGetTime", exttimeGetTime);
if(tmp) ptimeGetTime = (timeGetTime_Type)tmp;
}
+
+ if(dxw.dwFlags2 & FAKEVERSION){
+ tmp = HookAPI(module, "kernel32.dll", GetVersion, "GetVersion", extGetVersion);
+ if(tmp) pGetVersion = (GetVersion_Type)tmp;
+ tmp = HookAPI(module, "kernel32.dll", GetVersionEx, "GetVersionEx", extGetVersionEx);
+ if(tmp) pGetVersionEx = (GetVersionEx_Type)tmp;
+ }
+
return;
}
diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp
index 2cda394..1847209 100644
--- a/dll/dxwcore.cpp
+++ b/dll/dxwcore.cpp
@@ -54,6 +54,7 @@ void dxwCore::InitTarget(TARGETMAP *target)
TimeShift = target->InitTS;
if(TimeShift < -8) TimeShift = -8;
if(TimeShift > 8) TimeShift = 8;
+ FakeVersionId = target->FakeVersionId;
}
/* ------------------------------------------------------------------ */
diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp
index 1e31358..b53882f 100644
--- a/dll/dxwcore.hpp
+++ b/dll/dxwcore.hpp
@@ -77,6 +77,7 @@ public: // simple data variables
WORD palVersion;
WORD palNumEntries;
PALETTEENTRY palPalEntry[256];
+ short FakeVersionId;
// Implementation
protected:
diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp
index 13d227a..1028aa2 100644
--- a/dll/dxwnd.cpp
+++ b/dll/dxwnd.cpp
@@ -23,7 +23,7 @@ along with this program. If not, see .
#include
#include "dxwnd.h"
-#define VERSION "2.02.06"
+#define VERSION "2.02.08"
LRESULT CALLBACK HookProc(int ncode, WPARAM wparam, LPARAM lparam);
diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo
index d0414af..a03763a 100644
Binary files a/dll/dxwnd.vs2008.suo and b/dll/dxwnd.vs2008.suo differ
diff --git a/dll/hddraw.cpp b/dll/hddraw.cpp
index 83331ed..bea0acb 100644
--- a/dll/hddraw.cpp
+++ b/dll/hddraw.cpp
@@ -3598,11 +3598,11 @@ ULONG WINAPI extReleaseD(LPDIRECTDRAW lpdd)
while(lpDDSEmu_Back->Release());
lpDDSEmu_Back=NULL;
}
- //if (lpDDSHDC) {
- // OutTraceD("Release(D): released lpDDSHDC=%x\n", lpDDSHDC);
- // while(lpDDSHDC->Release());
- // lpDDSHDC=NULL;
- //}
+ if (lpDDP) {
+ OutTraceD("Release(D): released lpDDP=%x\n", lpDDP);
+ while(lpDDP->Release());
+ lpDDP=NULL;
+ }
lpServiceDD = NULL; // v2.1.87
ref=0; // it should be ....
}
@@ -3613,9 +3613,9 @@ ULONG WINAPI extReleaseD(LPDIRECTDRAW lpdd)
OutTraceD("Release(D): RefCount=0 - service object RESET condition\n");
lpDDSEmu_Prim=NULL;
lpDDSEmu_Back=NULL;
- //lpDDSHDC=NULL;
lpDDC=NULL;
lpDDSBack=NULL;
+ lpDDP=NULL;
}
}
}
@@ -3756,15 +3756,14 @@ HRESULT WINAPI extReleaseP(LPDIRECTDRAWPALETTE lpddPalette)
// current palette (ref=0!) causing a game crash. The fix pretends that the palette
// was released when attempting the operation to the last object reference (LastRefCount==1)
// returning a ref 0 without actually releasing the object.
+ //v2.02.08: Better fix: to avoid the problem, just remember to NULL-ify the global main
+ // palette pointer lpDDP
ULONG ref;
- static int LastRefCount=-1;
- OutTraceD("Release(P): lpddPalette=%x\n", lpddPalette);
- if(LastRefCount==1) {
- OutTraceD("Release(P): ASSERT lpddPalette=%x Release FIX returning 0\n", lpddPalette);
- return 0;
- }
ref=(*pReleaseP)(lpddPalette);
- LastRefCount=ref;
OutTraceD("Release(P): lpddPalette=%x ref=%x\n", lpddPalette, ref);
+ if(lpddPalette==lpDDP && ref==0){
+ OutTraceD("Release(P): clearing lpDDP=%x->NULL\n", lpDDP);
+ lpDDP=NULL;
+ }
return ref;
}
diff --git a/dll/syslibs.cpp b/dll/syslibs.cpp
index e3f130c..e1001d6 100644
--- a/dll/syslibs.cpp
+++ b/dll/syslibs.cpp
@@ -2594,4 +2594,89 @@ int WINAPI extShowCursor(BOOL bShow)
ret=(*pShowCursor)(bShow);
OutTraceD("ShowCursor: ret=%x\n", ret);
return ret;
+}
+
+/*
+From MSDN:
+Operating system Version number dwMajorVersion dwMinorVersion Other
+Windows 8 6.2 6 2 OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
+Windows Server 2012 6.2 6 2 OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
+Windows 7 6.1 6 1 OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
+Windows Server 2008 R2 6.1 6 1 OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
+Windows Server 2008 6.0 6 0 OSVERSIONINFOEX.wProductType != VER_NT_WORKSTATION
+Windows Vista 6.0 6 0 OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION
+Windows Server 2003 R2 5.2 5 2 GetSystemMetrics(SM_SERVERR2) != 0
+Windows Home Server 5.2 5 2 OSVERSIONINFOEX.wSuiteMask & VER_SUITE_WH_SERVER
+Windows Server 2003 5.2 5 2 GetSystemMetrics(SM_SERVERR2) == 0
+Windows XP Pro x64 Ed. 5.2 5 2 (OSVERSIONINFOEX.wProductType == VER_NT_WORKSTATION) && (SYSTEM_INFO.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64)
+Windows XP 5.1 5 1 Not applicable
+Windows 2000 5.0 5 0 Not applicable
+*/
+
+static struct {char bMajor; char bMinor; char *sName;} WinVersions[6]=
+{
+ {5, 0, "Windows 2000"},
+ {5, 1, "Windows XP"},
+ {5, 2, "Windows Server 2003"},
+ {6, 0, "Windows Vista"},
+ {6, 1, "Windows 7"},
+ {6, 2, "Windows 8"}
+};
+
+BOOL WINAPI extGetVersionEx(LPOSVERSIONINFO lpVersionInfo)
+{
+ BOOL ret;
+
+ ret=(*pGetVersionEx)(lpVersionInfo);
+ if(!ret) {
+ OutTraceE("GetVersionEx: ERROR err=%d\n", GetLastError());
+ return ret;
+ }
+
+ OutTraceD("GetVersionEx: version=%d.%d build=(%d)\n",
+ lpVersionInfo->dwMajorVersion, lpVersionInfo->dwMinorVersion, lpVersionInfo->dwBuildNumber);
+
+ if(dxw.dwFlags2 & FAKEVERSION) {
+ // fake Win XP build 0
+ lpVersionInfo->dwMajorVersion = WinVersions[dxw.FakeVersionId].bMajor;
+ lpVersionInfo->dwMinorVersion = WinVersions[dxw.FakeVersionId].bMinor;
+ lpVersionInfo->dwBuildNumber = 0;
+ OutTraceD("GetVersionEx: FIXED version=%d.%d build=(%d) os=\"%s\"\n",
+ lpVersionInfo->dwMajorVersion, lpVersionInfo->dwMinorVersion, lpVersionInfo->dwBuildNumber,
+ WinVersions[dxw.FakeVersionId].sName);
+ }
+ return TRUE;
+}
+
+DWORD WINAPI extGetVersion(void)
+{
+ DWORD dwVersion;
+ DWORD dwMajorVersion;
+ DWORD dwMinorVersion;
+ DWORD dwBuild = 0;
+
+ dwVersion = (*pGetVersion)();
+
+ // Get the Windows version.
+
+ dwMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
+ dwMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion)));
+
+ // Get the build number.
+
+ if (dwVersion < 0x80000000)
+ dwBuild = (DWORD)(HIWORD(dwVersion));
+
+ OutTraceD("GetVersion: version=%d.%d build=(%d)\n", dwMajorVersion, dwMinorVersion, dwBuild);
+
+ if(dxw.dwFlags2 & FAKEVERSION) {
+ dwVersion = WinVersions[dxw.FakeVersionId].bMajor | (WinVersions[dxw.FakeVersionId].bMinor << 8);
+ dwMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
+ dwMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion)));
+ dwBuild = (DWORD)(HIWORD(dwVersion));
+ OutTraceD("GetVersion: FIXED version=%d.%d build=(%d) os=\"%s\"\n",
+ dwMajorVersion, dwMinorVersion, dwBuild, WinVersions[dxw.FakeVersionId].sName);
+ }
+
+ return dwVersion;
}
\ No newline at end of file
diff --git a/dll/syslibs.h b/dll/syslibs.h
index 64efc04..c81dd3a 100644
--- a/dll/syslibs.h
+++ b/dll/syslibs.h
@@ -45,6 +45,8 @@ typedef FARPROC (WINAPI *GetProcAddress_Type)(HMODULE, LPCSTR);
typedef void (WINAPI *GetSystemTime_Type)(LPSYSTEMTIME);
typedef void (WINAPI *GetSystemTimeAsFileTime_Type)(LPFILETIME);
typedef DWORD (WINAPI *GetTickCount_Type)(void);
+typedef DWORD (WINAPI *GetVersion_Type)(void);
+typedef BOOL (WINAPI *GetVersionEx_Type)(LPOSVERSIONINFO);
typedef HMODULE (WINAPI *LoadLibraryA_Type)(LPCTSTR);
typedef HMODULE (WINAPI *LoadLibraryExA_Type)(LPCTSTR, HANDLE, DWORD);
typedef LPTOP_LEVEL_EXCEPTION_FILTER
@@ -145,6 +147,8 @@ DXWEXTERN GetProcAddress_Type pGetProcAddress DXWINITIALIZED;
DXWEXTERN GetSystemTime_Type pGetSystemTime DXWINITIALIZED;
DXWEXTERN GetSystemTimeAsFileTime_Type pGetSystemTimeAsFileTime DXWINITIALIZED;
DXWEXTERN GetTickCount_Type pGetTickCount DXWINITIALIZED;
+DXWEXTERN GetVersion_Type pGetVersion DXWINITIALIZED;
+DXWEXTERN GetVersionEx_Type pGetVersionEx DXWINITIALIZED;
DXWEXTERN LoadLibraryA_Type pLoadLibraryA DXWINITIALIZED;
DXWEXTERN LoadLibraryExA_Type pLoadLibraryExA DXWINITIALIZED;
DXWEXTERN SetUnhandledExceptionFilter_Type pSetUnhandledExceptionFilter DXWINITIALIZED;
@@ -238,6 +242,8 @@ extern FARPROC WINAPI extGetProcAddress(HMODULE, LPCSTR);
extern void WINAPI extGetSystemTime(LPSYSTEMTIME);
extern void WINAPI extGetSystemTimeAsFileTime(LPFILETIME);
extern DWORD WINAPI extGetTickCount(void);
+extern DWORD WINAPI extGetVersion(void);
+extern BOOL WINAPI extGetVersionEx(LPOSVERSIONINFO);
extern HMODULE WINAPI extLoadLibraryA(LPCTSTR);
extern HMODULE WINAPI extLoadLibraryExA(LPCTSTR, HANDLE, DWORD);
extern LPTOP_LEVEL_EXCEPTION_FILTER WINAPI extSetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER);
diff --git a/host/Resource.h b/host/Resource.h
index 4199552..039bc38 100644
--- a/host/Resource.h
+++ b/host/Resource.h
@@ -120,9 +120,11 @@
#define IDC_WALLPAPERMODE 1081
#define IDC_HOOKGDI 1082
#define IDC_SHOWFPSOVERLAY 1083
+#define IDC_FAKEVERSION 1084
#define IDC_COMBOTS 1085
#define IDC_LIST2 1088
#define IDC_LISTTS 1088
+#define IDC_LISTFAKE 1089
#define ID_MODIFY 32771
#define ID_DELETE 32772
#define ID_ADD 32773
diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp
index d0e25d7..50133be 100644
--- a/host/TargetDlg.cpp
+++ b/host/TargetDlg.cpp
@@ -82,6 +82,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
m_ShowFPSOverlay = FALSE;
m_TimeStretch = FALSE;
m_HookOpenGL = FALSE;
+ m_FakeVersion = FALSE;
m_InitX = 0;
m_InitY = 0;
m_MaxX = 0;
@@ -114,18 +115,31 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
// pEdit->SetReadOnly(!bEnable);
//}
+static struct {char bMajor; char bMinor; char *sName;} WinVersions[6]=
+{
+ {5, 0, "Windows 2000"},
+ {5, 1, "Windows XP"},
+ {5, 2, "Windows Server 2003"},
+ {6, 0, "Windows Vista"},
+ {6, 1, "Windows 7"},
+ {6, 2, "Windows 8"}
+};
+
BOOL CTargetDlg::OnInitDialog()
{
- CListBox *TSList;
+ CListBox *List;
CDialog::OnInitDialog();
int i;
extern char *GetTSCaption(int);
- //MessageBoxEx(0, "Init Dialog", "Warning", MB_OK | MB_ICONEXCLAMATION, NULL);
- TSList=(CListBox *)this->GetDlgItem(IDC_LISTTS);
- TSList->ResetContent();
- for(i=-8; i<=8; i++) TSList->AddString(GetTSCaption(i));
- TSList->SetCurSel(m_InitTS);
+ List=(CListBox *)this->GetDlgItem(IDC_LISTTS);
+ List->ResetContent();
+ for(i=-8; i<=8; i++) List->AddString(GetTSCaption(i));
+ List->SetCurSel(m_InitTS);
+ List=(CListBox *)this->GetDlgItem(IDC_LISTFAKE);
+ List->ResetContent();
+ for(i=0; i<6; i++) List->AddString(WinVersions[i].sName);
+ List->SetCurSel(m_FakeVersion);
return TRUE;
}
@@ -199,6 +213,7 @@ void CTargetDlg::DoDataExchange(CDataExchange* pDX)
DDX_Check(pDX, IDC_SHOWFPSOVERLAY, m_ShowFPSOverlay);
DDX_Check(pDX, IDC_TIMESTRETCH, m_TimeStretch);
DDX_Check(pDX, IDC_HOOKOPENGL, m_HookOpenGL);
+ DDX_Check(pDX, IDC_FAKEVERSION, m_FakeVersion);
DDX_Text(pDX, IDC_INITX, m_InitX);
DDX_Text(pDX, IDC_INITY, m_InitY);
DDX_Text(pDX, IDC_MAXX, m_MaxX);
@@ -212,6 +227,7 @@ void CTargetDlg::DoDataExchange(CDataExchange* pDX)
DDX_Text(pDX, IDC_MAXFPS, m_MaxFPS);
//DDX_Text(pDX, IDC_INITTS, m_InitTS);
DDX_LBIndex(pDX, IDC_LISTTS, m_InitTS);
+ DDX_LBIndex(pDX, IDC_LISTFAKE, m_FakeVersionId);
//}}AFX_DATA_MAP
}
diff --git a/host/TargetDlg.h b/host/TargetDlg.h
index c027c2d..5a9a234 100644
--- a/host/TargetDlg.h
+++ b/host/TargetDlg.h
@@ -87,6 +87,7 @@ public:
BOOL m_ShowFPSOverlay;
BOOL m_TimeStretch;
BOOL m_HookOpenGL;
+ BOOL m_FakeVersion;
int m_InitX;
int m_InitY;
int m_MaxX;
@@ -99,6 +100,7 @@ public:
int m_SizY;
int m_MaxFPS;
int m_InitTS;
+ int m_FakeVersionId;
//}}AFX_DATA
diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps
index 8b1afcf..7a15f23 100644
Binary files a/host/dxwndhost.aps and b/host/dxwndhost.aps differ
diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc
index 35460fc..2f17f3b 100644
--- a/host/dxwndhost.rc
+++ b/host/dxwndhost.rc
@@ -298,15 +298,15 @@ BEGIN
CONTROL "Limit available resources",IDC_LIMITRESOURCES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,306,184,93,10
CONTROL "Force win resize",IDC_FORCEWINRESIZE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,433,134,98,9
CONTROL "fix WM_NCHITTEST",IDC_FIXNCHITTEST,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,306,94,98,9
- CONTROL "Limit",IDC_LIMITFPS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,557,98,28,9
- EDITTEXT IDC_MAXFPS,635,101,26,12,ES_AUTOHSCROLL | ES_NUMBER,WS_EX_RIGHT
- CONTROL "Skip",IDC_SKIPFPS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,557,108,27,9
- LTEXT "delay (msec)",IDC_STATIC,591,103,43,8
- GROUPBOX "Frame per Second",IDC_STATIC,549,84,120,86
- CONTROL "Show FPS on title",IDC_SHOWFPS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,557,120,72,9
- GROUPBOX "",IDC_STATIC,555,94,110,24
+ CONTROL "Limit",IDC_LIMITFPS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,557,112,28,9
+ EDITTEXT IDC_MAXFPS,635,115,26,12,ES_AUTOHSCROLL | ES_NUMBER,WS_EX_RIGHT
+ CONTROL "Skip",IDC_SKIPFPS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,557,122,27,9
+ LTEXT "delay (msec)",IDC_STATIC,591,117,43,8
+ GROUPBOX "Frame per Second",IDC_STATIC,549,102,120,68
+ CONTROL "Show FPS on title",IDC_SHOWFPS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,557,134,72,9
+ GROUPBOX "",IDC_STATIC,555,108,110,24
CONTROL "Hide multi-monitor config.",IDC_HIDEMULTIMONITOR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,433,144,98,9
- CONTROL "Time Stretch - initial:",IDC_TIMESTRETCH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,557,140,75,9
+ CONTROL "Time Stretch - initial:",IDC_TIMESTRETCH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,557,154,75,9
GROUPBOX "OpenGL",IDC_STATIC,549,3,120,50
CONTROL "Hook OpenGL",IDC_HOOKOPENGL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,557,14,98,9
EDITTEXT IDC_OPENGLLIB,554,36,108,12,ES_AUTOHSCROLL
@@ -316,8 +316,11 @@ BEGIN
GROUPBOX "GDI Handling",IDC_STATIC,172,144,120,62
CONTROL "Hook GDI",IDC_HOOKGDI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,180,154,102,9
CONTROL "Disable setting gamma ramp",IDC_DISABLEGAMMARAMP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,180,174,102,9
- CONTROL "Show FPS overlay",IDC_SHOWFPSOVERLAY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,557,130,72,9
- LISTBOX IDC_LISTTS,635,131,26,27,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
+ CONTROL "Show FPS overlay",IDC_SHOWFPSOVERLAY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,557,144,72,9
+ LISTBOX IDC_LISTTS,635,135,26,27,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
+ GROUPBOX "Fake Version",IDC_STATIC,551,55,118,44
+ CONTROL "",IDC_FAKEVERSION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,558,74,10,9
+ LISTBOX IDC_LISTFAKE,577,67,84,27,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
END
IDD_STATUS DIALOGEX 0, 0, 186, 95
diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo
index 9d72990..37ce158 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 ad53e2e..d089510 100644
--- a/host/dxwndhostView.cpp
+++ b/host/dxwndhostView.cpp
@@ -432,6 +432,7 @@ void CDxwndhostView::OnModify()
dlg.m_ShowFPSOverlay = TargetMaps[i].flags2 & SHOWFPSOVERLAY ? 1 : 0;
dlg.m_TimeStretch = TargetMaps[i].flags2 & TIMESTRETCH ? 1 : 0;
dlg.m_HookOpenGL = TargetMaps[i].flags2 & HOOKOPENGL ? 1 : 0;
+ dlg.m_FakeVersion = TargetMaps[i].flags2 & FAKEVERSION ? 1 : 0;
dlg.m_InitX = TargetMaps[i].initx;
dlg.m_InitY = TargetMaps[i].inity;
dlg.m_MinX = TargetMaps[i].minx;
@@ -444,6 +445,7 @@ void CDxwndhostView::OnModify()
dlg.m_SizY = TargetMaps[i].sizy;
dlg.m_MaxFPS = TargetMaps[i].MaxFPS;
dlg.m_InitTS = TargetMaps[i].InitTS+8;
+ dlg.m_FakeVersionId = TargetMaps[i].FakeVersionId;
if(dlg.DoModal() == IDOK && dlg.m_FilePath.GetLength()){
strcpy_s(TargetMaps[i].path, sizeof(TargetMaps[i].path), dlg.m_FilePath);
strcpy_s(TargetMaps[i].module, sizeof(TargetMaps[i].module), dlg.m_Module);
@@ -529,6 +531,7 @@ void CDxwndhostView::OnModify()
if(dlg.m_ShowFPSOverlay) TargetMaps[i].flags2 |= SHOWFPSOVERLAY;
if(dlg.m_TimeStretch) TargetMaps[i].flags2 |= TIMESTRETCH;
if(dlg.m_HookOpenGL) TargetMaps[i].flags2 |= HOOKOPENGL;
+ if(dlg.m_FakeVersion) TargetMaps[i].flags2 |= FAKEVERSION;
TargetMaps[i].initx = dlg.m_InitX;
TargetMaps[i].inity = dlg.m_InitY;
TargetMaps[i].minx = dlg.m_MinX;
@@ -541,6 +544,7 @@ void CDxwndhostView::OnModify()
TargetMaps[i].sizy = dlg.m_SizY;
TargetMaps[i].MaxFPS = dlg.m_MaxFPS;
TargetMaps[i].InitTS = dlg.m_InitTS-8;
+ TargetMaps[i].FakeVersionId = dlg.m_FakeVersionId;
strcpy_s(TargetMaps[i].module, sizeof(TargetMaps[i].module), dlg.m_Module);
strcpy_s(TargetMaps[i].OpenGLLib, sizeof(TargetMaps[i].OpenGLLib), dlg.m_OpenGLLib);
strcpy_s(TitleMaps[i].title, sizeof(TitleMaps[i].title), dlg.m_Title);
@@ -819,6 +823,7 @@ void CDxwndhostView::OnAdd()
if(dlg.m_ShowFPSOverlay) TargetMaps[i].flags2 |= SHOWFPSOVERLAY;
if(dlg.m_TimeStretch) TargetMaps[i].flags2 |= TIMESTRETCH;
if(dlg.m_HookOpenGL) TargetMaps[i].flags2 |= HOOKOPENGL;
+ if(dlg.m_FakeVersion) TargetMaps[i].flags2 |= FAKEVERSION;
TargetMaps[i].initx = dlg.m_InitX;
TargetMaps[i].inity = dlg.m_InitY;
TargetMaps[i].minx = dlg.m_MinX;
@@ -830,6 +835,7 @@ void CDxwndhostView::OnAdd()
TargetMaps[i].sizx = dlg.m_SizX;
TargetMaps[i].sizy = dlg.m_SizY;
TargetMaps[i].MaxFPS = dlg.m_MaxFPS;
+ TargetMaps[i].FakeVersionId = dlg.m_FakeVersionId;
if (dlg.m_InitTS>=-8 && dlg.m_InitTS<=8)
TargetMaps[i].InitTS = dlg.m_InitTS-8;
else