diff --git a/Include/dxwnd.h b/Include/dxwnd.h
index 5b35bf2..32d12bf 100644
--- a/Include/dxwnd.h
+++ b/Include/dxwnd.h
@@ -143,6 +143,7 @@
#define ENABLEHOTKEYS 0x08000000 // Enables hot keys
#define HOTPATCHALWAYS 0x10000000 // Force hot patching to every call
#define NOD3DRESET 0x20000000 // Disables D3D8/9 D3DDevice::Reset method
+#define OVERRIDEREGISTRY 0x40000000 // same as EMULATEREGISTRY, but fake keys takeprecedence
// logging Tflags DWORD:
#define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general
diff --git a/build/dxwnd.dll b/build/dxwnd.dll
index ef61201..33179d4 100644
--- a/build/dxwnd.dll
+++ b/build/dxwnd.dll
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:0abd5d664eea54b2046da9cf7c3b556569a5bbd8c65eb87e1b088dff67641ef1
+oid sha256:cb95d0f4d937aa39bf29f2fdcc106f4999dff564dbb4b323be38fd9e106184fd
size 483840
diff --git a/build/dxwnd.exe b/build/dxwnd.exe
index b44d478..259f680 100644
--- a/build/dxwnd.exe
+++ b/build/dxwnd.exe
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:11f3d90b87b33ec400bd96219a0786300f2dbd21935e72a2b859317f887696e0
+oid sha256:14c815ffe23493c0f2ea72905d50b6972fcf35e78b827e243865b327d2ce7ac8
size 540160
diff --git a/build/dxwnd.reg b/build/dxwnd.reg
new file mode 100644
index 0000000..71b12c0
--- /dev/null
+++ b/build/dxwnd.reg
@@ -0,0 +1,10 @@
+# Requiem Avenging Angel: DirectX version patch
+
+[HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\DirectX]
+"Version"="4.07.00.0704"
+
+[HKEY_LOCAL_MACHINE\Software\Microsoft\DirectX]
+"Version"="4.07.00.0704"
+
+[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DirectX]
+"Version"="4.07.00.0704"
diff --git a/build/exports/Requiem Avenging Angel (software).dxw b/build/exports/Requiem Avenging Angel (software).dxw
new file mode 100644
index 0000000..0b0b99a
--- /dev/null
+++ b/build/exports/Requiem Avenging Angel (software).dxw
@@ -0,0 +1,27 @@
+[target]
+title0=Requiem Avenging Angel (software)
+path0=D:\Games\Requiem Avenging Angel\Software.exe
+launchpath0=
+module0=
+opengllib0=
+ver0=0
+coord0=0
+flag0=-1199570906
+flagg0=1207959552
+flagh0=20
+flagi0=1212153860
+tflag0=6914
+initx0=0
+inity0=0
+minx0=0
+miny0=0
+maxx0=0
+maxy0=0
+posx0=50
+posy0=50
+sizx0=800
+sizy0=600
+maxfps0=0
+initts0=0
+winver0=0
+maxres0=-1
diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt
index a107f21..e52629a 100644
--- a/build/readme-relnotes.txt
+++ b/build/readme-relnotes.txt
@@ -500,3 +500,7 @@ added: "Suppress D3D8/9 Reset" flag
fix: improved show FPS and Time Stretch overlay so that the two overlays won't overlap each other
fix: bug in ddraw "Locked surface" mode preventing output on screen
fix: fixed bug in critical common portion of the code that was crashing even unhooked programs (namely, Flash Player, ...)
+
+v2.02.76
+fixed and enhanced several features about registry emulation: added flags "Emulate registry" (to add missing entries) and "Override registry" (to fake existing entries with different values). Fixed "Requiem Avenging Angel" DirectX bogus check bug.
+fixed bug in emulate surface palette handling affecting "Requiem Avenging Angel" colors
\ No newline at end of file
diff --git a/dll/advapi.cpp b/dll/advapi.cpp
index 4937dec..66c7656 100644
--- a/dll/advapi.cpp
+++ b/dll/advapi.cpp
@@ -49,8 +49,56 @@ static char *hKey2String(HKEY hKey)
return skey;
}
+static FILE *OpenFakeRegistry()
+{
+ DWORD dwAttrib;
+ char sSourcePath[MAX_PATH+1];
+ char *p;
+ dwAttrib = GetFileAttributes("dxwnd.dll");
+ if (dwAttrib != INVALID_FILE_ATTRIBUTES && !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY)) return NULL;
+ GetModuleFileName(GetModuleHandle("dxwnd"), sSourcePath, MAX_PATH);
+ p=&sSourcePath[strlen(sSourcePath)-strlen("dxwnd.dll")];
+ strcpy(p, "dxwnd.reg");
+ return fopen(sSourcePath,"r");
+}
+
// ---------------------------------------------------------------------------------
+static LONG myRegOpenKeyEx(
+ HKEY hKey,
+ LPCTSTR lpSubKey,
+ PHKEY phkResult)
+{
+ FILE *regf;
+ char sKey[MAX_PATH+1];
+ char RegBuf[MAX_PATH+1];
+
+ sprintf(sKey,"%s\\%s", hKey2String(hKey), lpSubKey);
+ OutTraceDW("RegOpenKeyEx: searching for key=\"%s\"\n", sKey);
+
+ regf=OpenFakeRegistry();
+ if(regf!=NULL){
+ if(phkResult) *phkResult=HKEY_FAKE;
+ fgets(RegBuf, 256, regf);
+ while (!feof(regf)){
+ if(RegBuf[0]=='['){
+ if((!strncmp(&RegBuf[1],sKey,strlen(sKey))) && (RegBuf[strlen(sKey)+1]==']')){
+ OutTrace("RegOpenKeyEx: found fake Key=\"%s\" hkResult=%x\n", sKey, phkResult ? *phkResult : 0);
+ fclose(regf);
+ return ERROR_SUCCESS;
+ }
+ else {
+ if(phkResult) (*phkResult)--;
+ }
+ }
+ fgets(RegBuf, 256, regf);
+ }
+ fclose(regf);
+ }
+ return ERROR_FILE_NOT_FOUND;
+}
+
+
LONG WINAPI extRegOpenKeyEx(
HKEY hKey,
LPCTSTR lpSubKey,
@@ -59,36 +107,21 @@ LONG WINAPI extRegOpenKeyEx(
PHKEY phkResult)
{
LONG res;
- char RegBuf[256+1];
OutTraceR("RegOpenKeyEx: hKey=%x(%s) SubKey=\"%s\" Options=%x\n",
hKey, hKey2String(hKey), lpSubKey, ulOptions);
- res=(*pRegOpenKeyEx)(hKey, lpSubKey, ulOptions, samDesired, phkResult);
- OutTraceR("RegOpenKeyEx: res=%x\n", res);
- if((res==ERROR_SUCCESS) || !(dxw.dwFlags3 & EMULATEREGISTRY)) return res;
-
- if(phkResult) *phkResult=HKEY_FAKE;
- FILE *regf;
- char sKey[256+1];
- sprintf(sKey,"%s\\%s", hKey2String(hKey), lpSubKey);
- OutTraceDW("RegOpenKeyEx: searching for key=\"%s\"\n", sKey);
- regf=fopen("dxwnd.reg","r");
- if(regf==NULL) return ERROR_FILE_NOT_FOUND;
- fgets(RegBuf, 256, regf);
- while (!feof(regf)){
- if(RegBuf[0]=='['){
- if((!strncmp(&RegBuf[1],sKey,strlen(sKey))) && (RegBuf[strlen(sKey)+1]==']')){
- OutTrace("RegOpenKeyEx: found fake Key=\"%s\" hkResult=%x\n", sKey, *phkResult);
- fclose(regf);
- return ERROR_SUCCESS;
- }
- else (*phkResult)--;
- }
- fgets(RegBuf, 256, regf);
+ if(dxw.dwFlags4 & OVERRIDEREGISTRY){
+ res = myRegOpenKeyEx(hKey, lpSubKey, phkResult);
+ if(res == ERROR_SUCCESS) return res;
}
- fclose(regf);
- return ERROR_FILE_NOT_FOUND;
+
+ res=(*pRegOpenKeyEx)(hKey, lpSubKey, ulOptions, samDesired, phkResult);
+ OutTraceR("RegOpenKeyEx: res=%x phkResult=%x\n", res, phkResult ? *phkResult : 0);
+
+ if((res==ERROR_SUCCESS) || !(dxw.dwFlags3 & EMULATEREGISTRY) || (dxw.dwFlags4 & OVERRIDEREGISTRY)) return res;
+
+ return myRegOpenKeyEx(hKey, lpSubKey, phkResult);
}
LONG WINAPI extRegQueryValueEx(
@@ -132,14 +165,12 @@ LONG WINAPI extRegQueryValueEx(
return res;
}
- //if(!(dxw.dwFlags3 & EMULATEREGISTRY)) return res;
-
// try emulated registry
FILE *regf;
- char RegBuf[256+1];
+ char RegBuf[MAX_PATH+1];
char *pData;
HKEY hCurKey=HKEY_FAKE+1;
- regf=fopen("dxwnd.reg","r");
+ regf=OpenFakeRegistry();
if(regf==NULL) return ERROR_FILE_NOT_FOUND;
if(!lpValueName)lpValueName="";
fgets(RegBuf, 256, regf);
@@ -159,17 +190,16 @@ LONG WINAPI extRegQueryValueEx(
res=ERROR_FILE_NOT_FOUND;
pData=&RegBuf[strlen(lpValueName)+3];
if(*pData=='"'){ // string value
- //strcpy((char *)lpData, &RegBuf[strlen(lpValueName)+4]);
- //lpData[strlen((char *)lpData)-2]=0; // eliminates " and \n
- //if(lpType) *lpType=REG_SZ;
- //*lpcbData=strlen((char *)lpData)+1;
+ LPBYTE lpb;
+ lpb = lpData;
*lpcbData=0;
pData++;
while(*pData && (*pData != '"')){
if(*pData=='\\') pData++;
- *lpData++=*pData++;
+ *lpb++=*pData++;
*lpcbData++;
}
+ *lpb = 0; // string terminator
if(lpType) *lpType=REG_SZ;
//
OutTraceDW("RegQueryValueEx: Data=\"%s\" type=REG_SZ\n", lpData);
diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp
index 1f3e0f9..1c2adc5 100644
--- a/dll/ddraw.cpp
+++ b/dll/ddraw.cpp
@@ -3565,7 +3565,7 @@ HRESULT WINAPI extSetPalette(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE lpdd
lpentries = (LPPALETTEENTRY)PaletteEntries;
res2=lpddp->GetEntries(0, 0, 256, lpentries);
if(res2) OutTraceE("SetPalette: GetEntries ERROR res=%x(%s)\n", res2, ExplainDDError(res2));
- //mySetPalette(0, 256, lpentries);
+ mySetPalette(0, 256, lpentries); // v2.02.76: necessary for "Requiem Avenging Angel" in SURFACEEMULATION mode
}
// Apply palette to backbuffer surface. This is necessary on some games: "Duckman private dick", "Total Soccer 2000", ...
if (lpDDSBack) {
diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp
index 0528e20..4e24f68 100644
--- a/dll/dxhook.cpp
+++ b/dll/dxhook.cpp
@@ -87,7 +87,7 @@ static char *Flag4Names[32]={
"STRETCHTIMERS", "NOFLIPEMULATION", "NOTEXTURES", "RETURNNULLREF",
"FINETIMING", "NATIVERES", "SUPPORTSVGA", "SUPPORTHDTV",
"RELEASEMOUSE", "FRAMECOMPENSATION", "HOTPATCH", "ENABLEHOTKEYS",
- "HOTPATCHALWAYS", "", "", "",
+ "HOTPATCHALWAYS", "NOD3DRESET", "OVERRIDEREGISTRY", "",
};
static char *TFlagNames[32]={
@@ -1222,7 +1222,9 @@ void HookModule(HMODULE base, int dxversion)
HookDirect3D7(base, dxversion);
if(dxw.dwFlags2 & HOOKOPENGL) HookOpenGLLibs(base, dxw.CustomOpenGLLib);
if(dxw.dwFlags4 & HOOKGLIDE) HookGlideLibs(base);
- if((dxw.dwFlags3 & EMULATEREGISTRY) || (dxw.dwTFlags & OUTREGISTRY)) HookAdvApi32(base);
+ if( (dxw.dwFlags3 & EMULATEREGISTRY) ||
+ (dxw.dwFlags4 & OVERRIDEREGISTRY) ||
+ (dxw.dwTFlags & OUTREGISTRY)) HookAdvApi32(base);
HookMSV4WLibs(base); // -- used by Aliens & Amazons demo: what for?
}
@@ -1428,6 +1430,7 @@ void HookInit(TARGETMAP *target, HWND hwnd)
dxw.hChildWnd=hwnd;
// v2.02.31: set main win either this one or the parent!
dxw.SethWnd((dxw.dwFlags1 & FIXPARENTWIN) ? GetParent(hwnd) : hwnd);
+ if(dxw.dwFlags4 & ENABLEHOTKEYS) dxw.MapKeysInit();
}
if(IsTraceDW){
diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp
index c7b7d6c..0797684 100644
--- a/dll/dxwcore.cpp
+++ b/dll/dxwcore.cpp
@@ -102,7 +102,6 @@ void dxwCore::InitTarget(TARGETMAP *target)
pTimeShifter = TimeShifterCoarse;
pTimeShifter64 = TimeShifter64Coarse;
}
- if(dwFlags4 & ENABLEHOTKEYS) MapKeysInit();
}
void dxwCore::SetScreenSize(void)
diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp
index 48b4dd7..3656f2c 100644
--- a/dll/dxwcore.hpp
+++ b/dll/dxwcore.hpp
@@ -117,6 +117,7 @@ public: // methods
BOOL CheckScreenResolution(unsigned int, unsigned int);
LARGE_INTEGER StretchLargeCounter(LARGE_INTEGER);
UINT MapKeysConfig(UINT, LPARAM, WPARAM);
+ void MapKeysInit();
public: // simple data variables
BOOL Windowize;
@@ -170,7 +171,6 @@ private:
void ShowFPS(HDC);
void ShowTimeStretching(HDC);
TimerEvent_Type TimerEvent;
- void MapKeysInit();
};
extern dxwCore dxw;
diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp
index 580a036..af8a9e2 100644
--- a/dll/dxwnd.cpp
+++ b/dll/dxwnd.cpp
@@ -24,7 +24,7 @@ along with this program. If not, see .
#include "dxwnd.h"
#include "dxwcore.hpp"
-#define VERSION "2.02.75"
+#define VERSION "2.02.76"
#define DDTHREADLOCK 1
@@ -224,8 +224,9 @@ void InjectHook()
for(i = 0; pMapping[i].path[0]; i ++){
if(!strncmp(name, pMapping[i].path, strlen(name))){
if (pMapping[i].flags2 & STARTDEBUG){
- OutTrace("InjectHook: task[%d]=\"%s\" hooked\n", i, pMapping[i].path);
- HookInit(&pMapping[i],NULL);
+ HookInit(&pMapping[i],NULL);
+ // beware: logging is possible only AFTER HookInit execution
+ OutTrace("InjectHook: task[%d]=\"%s\" hooked\n", i, pMapping[i].path);
}
break;
}
diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo
index 0518d09..06f1b8b 100644
Binary files a/dll/dxwnd.vs2008.suo and b/dll/dxwnd.vs2008.suo differ
diff --git a/dll/dxwnd.vs2008.vcproj.User-PC.User.user b/dll/dxwnd.vs2008.vcproj.User-PC.User.user
new file mode 100644
index 0000000..facf31e
--- /dev/null
+++ b/dll/dxwnd.vs2008.vcproj.User-PC.User.user
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/dll/wndproc.cpp b/dll/wndproc.cpp
index 98a1a86..1da6c7d 100644
--- a/dll/wndproc.cpp
+++ b/dll/wndproc.cpp
@@ -36,7 +36,6 @@ void WhndStackPush(HWND hwnd, WNDPROC wndproc)
if(WhndTOS == WhndSize){
WhndSize += MAXWNDHSTACK;
WhndStack = (wndstack_entry *)realloc(WhndStack, WhndSize * sizeof(wndstack_entry));
- //OutTraceDW("DEBUG: WNDPROC STACK new size=%d\n", WhndSize);
}
// wndproc values of 0xFFFFxxxx type seems to be error codes rather than valid callback addresses ....
// v2.02.36 using CallWindowProc you can pass WinProc handles, so you don't need to eliminate them!
diff --git a/host/Resource.h b/host/Resource.h
index 3febda2..27d4268 100644
--- a/host/Resource.h
+++ b/host/Resource.h
@@ -152,6 +152,7 @@
#define IDC_HOOKDI 1112
#define IDC_EMULATEREGISTRY 1113
#define IDC_CDROMDRIVETYPE 1114
+#define IDC_OVERRIDEREGISTRY 1115
#define IDC_NOWINDOWMOVE 1116
#define IDC_DISABLEHAL 1117
#define IDC_LOCKSYSCOLORS 1118
diff --git a/host/TabCompat.cpp b/host/TabCompat.cpp
index 7515921..759ce05 100644
--- a/host/TabCompat.cpp
+++ b/host/TabCompat.cpp
@@ -46,6 +46,10 @@ void CTabCompat::DoDataExchange(CDataExchange* pDX)
DDX_Check(pDX, IDC_NOTEXTURES, cTarget->m_NoTextures);
DDX_Check(pDX, IDC_WIREFRAME, cTarget->m_WireFrame);
DDX_Check(pDX, IDC_DISABLEFOGGING, cTarget->m_DisableFogging);
+
+ // Registry management
+ DDX_Check(pDX, IDC_EMULATEREGISTRY, cTarget->m_EmulateRegistry);
+ DDX_Check(pDX, IDC_OVERRIDEREGISTRY, cTarget->m_OverrideRegistry);
}
BEGIN_MESSAGE_MAP(CTabCompat, CDialog)
diff --git a/host/TabDebug.cpp b/host/TabDebug.cpp
index 4c6ece2..00036bd 100644
--- a/host/TabDebug.cpp
+++ b/host/TabDebug.cpp
@@ -40,7 +40,6 @@ void CTabDebug::DoDataExchange(CDataExchange* pDX)
DDX_Check(pDX, IDC_NODDRAWFLIP, cTarget->m_NoDDRAWFlip);
DDX_Check(pDX, IDC_NOGDIBLT, cTarget->m_NoGDIBlt);
DDX_Check(pDX, IDC_NOFILLRECT, cTarget->m_NoFillRect);
- DDX_Check(pDX, IDC_EMULATEREGISTRY, cTarget->m_EmulateRegistry);
DDX_Check(pDX, IDC_ZBUFFERALWAYS, cTarget->m_ZBufferAlways);
DDX_Check(pDX, IDC_HOTPATCHALWAYS, cTarget->m_HotPatchAlways);
}
diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp
index 7a08af9..4595f1f 100644
--- a/host/TargetDlg.cpp
+++ b/host/TargetDlg.cpp
@@ -72,6 +72,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
m_HookDLLs = TRUE; // default true !!
m_HookEnabled = TRUE; // default true !!
m_EmulateRegistry = FALSE;
+ m_OverrideRegistry = FALSE;
m_FullScreenOnly = FALSE;
m_FilterMessages = FALSE;
m_PeekAllMessages = FALSE;
diff --git a/host/TargetDlg.h b/host/TargetDlg.h
index 6c3078b..f0e2818 100644
--- a/host/TargetDlg.h
+++ b/host/TargetDlg.h
@@ -49,6 +49,7 @@ public:
BOOL m_HotPatch;
BOOL m_HookDLLs;
BOOL m_EmulateRegistry;
+ BOOL m_OverrideRegistry;
BOOL m_FullScreenOnly;
BOOL m_FilterMessages;
BOOL m_PeekAllMessages;
diff --git a/host/dib.cpp b/host/dib.cpp
index 5b4a13c..a7a9134 100644
--- a/host/dib.cpp
+++ b/host/dib.cpp
@@ -319,7 +319,7 @@ DWORD CDib::Save(CFile& file) const
DWORD CDib::Read(CFile& file, BOOL bFromResource)
{
DWORD dwReadBytes = 0;
- DWORD dwLength = file.GetLength();
+ DWORD dwLength = (DWORD)file.GetLength();
// Ensures no memory leaks will occur
Free();
diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc
index 24a16db..a3d43d1 100644
--- a/host/dxwndhost.rc
+++ b/host/dxwndhost.rc
@@ -466,7 +466,10 @@ IDD_TAB_COMPAT DIALOGEX 0, 0, 300, 240
STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
- GROUPBOX "Fake Version",IDC_STATIC,7,3,139,64
+ GROUPBOX "Fake Version",IDC_STATIC,6,3,140,64
+ GROUPBOX "3D effects",IDC_STATIC,149,3,144,64
+ GROUPBOX "Registry",IDC_STATIC,149,69,144,64
+ GROUPBOX "Tweaks",IDC_STATIC,6,69,140,164
CONTROL "",IDC_FAKEVERSION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,26,12,10
LISTBOX IDC_LISTFAKE,39,15,98,43,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
CONTROL "Handle Exceptions",IDC_HANDLEEXCEPTIONS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,200,109,12
@@ -482,10 +485,11 @@ BEGIN
CONTROL "Clean ZBUFFER @0.0 fix",IDC_ZBUFFER0CLEAN,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,104,109,12
CONTROL "Textures not power of 2 fix",IDC_NOPOWER2FIX,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,92,109,12
CONTROL "Disable performance counter",IDC_NOPERFCOUNTER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,80,109,12
- CONTROL "3D Wireframe",IDC_WIREFRAME,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,159,34,96,10
- GROUPBOX "3D effects",IDC_STATIC,149,3,144,64
- CONTROL "Disable Fogging",IDC_DISABLEFOGGING,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,159,46,96,10
+ CONTROL "3D Wireframe",IDC_WIREFRAME,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,160,34,96,10
+ CONTROL "Disable Fogging",IDC_DISABLEFOGGING,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,160,46,96,10
CONTROL "Disable Textures",IDC_NOTEXTURES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,160,22,96,10
+ CONTROL "Emulate Registry",IDC_EMULATEREGISTRY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,160,84,110,10
+ CONTROL "Override Registry",IDC_OVERRIDEREGISTRY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,160,96,110,10
END
IDD_TAB_SYSLIBS DIALOGEX 0, 0, 300, 240
@@ -526,7 +530,6 @@ BEGIN
CONTROL "Suppress ddraw Flip",IDC_NODDRAWFLIP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,160,36,127,10
CONTROL "Suppress GDI Blt",IDC_NOGDIBLT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,160,48,127,10
GROUPBOX "Visual flags",IDC_STATIC,153,7,140,139
- CONTROL "Emulate Registry",IDC_EMULATEREGISTRY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,17,84,124,10
CONTROL "Force D3DCMP_ALWAYS setting ",IDC_ZBUFFERALWAYS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,159,164,127,10
CONTROL "Suppress FillRect",IDC_NOFILLRECT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,160,60,127,10
CONTROL "Force hot patching",IDC_HOTPATCHALWAYS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,159,176,127,10
diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo
index 2070908..b966f86 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 86fe6f7..39bba94 100644
--- a/host/dxwndhostView.cpp
+++ b/host/dxwndhostView.cpp
@@ -116,6 +116,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
if(dlg->m_Windowize) t->flags2 |= WINDOWIZE;
if(dlg->m_HookDLLs) t->flags3 |= HOOKDLLS;
if(dlg->m_EmulateRegistry) t->flags3 |= EMULATEREGISTRY;
+ if(dlg->m_OverrideRegistry) t->flags4 |= OVERRIDEREGISTRY;
if(dlg->m_HookEnabled) t->flags3 |= HOOKENABLED;
if(dlg->m_NoBanner) t->flags2 |= NOBANNER;
if(dlg->m_StartDebug) t->flags2 |= STARTDEBUG;
@@ -293,6 +294,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
dlg->m_HotPatch = t->flags4 & HOTPATCH ? 1 : 0;
dlg->m_HookDLLs = t->flags3 & HOOKDLLS ? 1 : 0;
dlg->m_EmulateRegistry = t->flags3 & EMULATEREGISTRY ? 1 : 0;
+ dlg->m_OverrideRegistry = t->flags4 & OVERRIDEREGISTRY ? 1 : 0;
dlg->m_HookEnabled = t->flags3 & HOOKENABLED ? 1 : 0;
dlg->m_NoBanner = t->flags2 & NOBANNER ? 1 : 0;
dlg->m_StartDebug = t->flags2 & STARTDEBUG ? 1 : 0;