diff --git a/Include/dxwnd.h b/Include/dxwnd.h
index b141e9a..18c8458 100644
--- a/Include/dxwnd.h
+++ b/Include/dxwnd.h
@@ -132,6 +132,7 @@
#define STRETCHTIMERS 0x00010000 // Enables timers stretching when TIMESTRETCH is on
#define NOFLIPEMULATION 0x00020000 // Compensate the effect of Flip-ping through Blt operations
#define NOTEXTURES 0x00040000 // Disabled (whitened) textures
+#define RETURNNULLREF 0x00080000 // IDirectDraw::Release and IDDrawSurface::Release will always return 0 ref. counter
// logging Tflags DWORD:
#define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general
@@ -154,7 +155,7 @@
// DxWnd host app data to be passed to the hook callback
typedef struct TARGETMAP
{
- char path[MAX_PATH];
+ char path[MAX_PATH+1];
char module[60+1];
char OpenGLLib[20+1];
int dxversion;
diff --git a/build/dxwnd.dll b/build/dxwnd.dll
index c4cc231..d8ecca9 100644
--- a/build/dxwnd.dll
+++ b/build/dxwnd.dll
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:61f2f3aab11ece5bb74593c0728de708356a37ad7b7bc1e45b03ae361c87419c
+oid sha256:f848ba14637f8a11e413b5263df2c0eb3de7c1bba21f2db3602e9971c0f85804
size 464896
diff --git a/build/dxwnd.exe b/build/dxwnd.exe
index 2b44df2..9a01ae1 100644
--- a/build/dxwnd.exe
+++ b/build/dxwnd.exe
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:7fb261f28e57f5293398249aa0f1f27910f581d0cd30c6fb2108160f5da36f01
+oid sha256:ad2a6e8e0b8119551bfb5352ba7c18e3c892b6dbae0a1e6d1be32b2d5bc9c094
size 535552
diff --git a/build/exports/25 to Life.dxw b/build/exports/25 to Life.dxw
new file mode 100644
index 0000000..5b31329
--- /dev/null
+++ b/build/exports/25 to Life.dxw
@@ -0,0 +1,26 @@
+[target]
+title0=25 to Life
+path0=D:\Games\25 to life\game\25 TO LIFE.exe
+module0=
+opengllib0=
+ver0=0
+coord0=0
+flag0=134234624
+flagg0=2013265920
+flagh0=20
+flagi0=4
+tflag0=6147
+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/exports/Abomination.dxw b/build/exports/Abomination.dxw
new file mode 100644
index 0000000..1f8215f
--- /dev/null
+++ b/build/exports/Abomination.dxw
@@ -0,0 +1,26 @@
+[target]
+title0=Abomination
+path0=D:\Games\Abomination\Abomb.exe
+module0=
+opengllib0=
+ver0=0
+coord0=0
+flag0=134218272
+flagg0=134217728
+flagh0=20
+flagi0=4
+tflag0=0
+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/exports/Black & White.dxw b/build/exports/Black & White.dxw
index 5d0aee6..7f54bff 100644
--- a/build/exports/Black & White.dxw
+++ b/build/exports/Black & White.dxw
@@ -4,7 +4,7 @@ path0=D:\Games\Black & White\runblack.exe
module0=
opengllib0=
ver0=0
-coord0=1
+coord0=0
flag0=679477280
flagg0=1207959568
flagh0=20
@@ -22,3 +22,5 @@ sizx0=800
sizy0=600
maxfps0=0
initts0=0
+winver0=0
+maxres0=0
diff --git a/build/exports/Darius Gaiden.dxw b/build/exports/Darius Gaiden.dxw
new file mode 100644
index 0000000..e971208
--- /dev/null
+++ b/build/exports/Darius Gaiden.dxw
@@ -0,0 +1,26 @@
+[target]
+title0=Darius Gaiden
+path0=D:\Games\Darius_gaiden\DARIUS.EXE
+module0=
+opengllib0=
+ver0=0
+coord0=0
+flag0=671089184
+flagg0=1207959552
+flagh0=20
+flagi0=4
+tflag0=0
+initx0=0
+inity0=0
+minx0=0
+miny0=0
+maxx0=0
+maxy0=0
+posx0=50
+posy0=50
+sizx0=800
+sizy0=600
+maxfps0=0
+initts0=2
+winver0=0
+maxres0=-1
diff --git a/build/exports/Dark Colony.dxw b/build/exports/Dark Colony.dxw
new file mode 100644
index 0000000..30b3ee1
--- /dev/null
+++ b/build/exports/Dark Colony.dxw
@@ -0,0 +1,26 @@
+[target]
+title0=Dark Colony
+path0=D:\Games\DarkColony\DCOLONY\DC.EXE
+module0=
+opengllib0=
+ver0=0
+coord0=0
+flag0=136315424
+flagg0=1207959552
+flagh0=20
+flagi0=4
+tflag0=0
+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/exports/Dark Planet Battle for Natrolis.dxw b/build/exports/Dark Planet Battle for Natrolis.dxw
new file mode 100644
index 0000000..9324fda
--- /dev/null
+++ b/build/exports/Dark Planet Battle for Natrolis.dxw
@@ -0,0 +1,26 @@
+[target]
+title0=Dark Planet: Battle for Natrolis
+path0=D:\Games\DarkPlanet\Dark.exe
+module0=
+opengllib0=
+ver0=0
+coord0=0
+flag0=671088673
+flagg0=1208025088
+flagh0=20
+flagi0=12
+tflag0=0
+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/exports/Dead Rising 2 Off The Record.dxw b/build/exports/Dead Rising 2 Off The Record.dxw
new file mode 100644
index 0000000..13efef2
--- /dev/null
+++ b/build/exports/Dead Rising 2 Off The Record.dxw
@@ -0,0 +1,26 @@
+[target]
+title0=Dead Rising 2 Off The Record
+path0=C:\Program Files (x86)\Capcom\Dead Rising 2 Off The Record\deadrising2otr.exe
+module0=
+opengllib0=
+ver0=0
+coord0=0
+flag0=0
+flagg0=134217728
+flagh0=16
+flagi0=0
+tflag0=3
+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=0
diff --git a/build/exports/JetMoto.dxw b/build/exports/Duckman.dxw
similarity index 63%
rename from build/exports/JetMoto.dxw
rename to build/exports/Duckman.dxw
index 65069a9..eb209b0 100644
--- a/build/exports/JetMoto.dxw
+++ b/build/exports/Duckman.dxw
@@ -1,15 +1,15 @@
[target]
-title0=JetMoto
-path0=D:\Games\Jet_Moto\JETMOTO.EXE
+title0=Duckman
+path0=D:\Games\Duckman\DUCKMAN.EXE
module0=
opengllib0=
ver0=0
coord0=0
-flag0=671088674
+flag0=134218272
flagg0=1207959552
flagh0=20
-flagi0=0
-tflag0=64
+flagi0=4
+tflag0=0
initx0=0
inity0=0
minx0=0
@@ -22,3 +22,5 @@ sizx0=800
sizy0=600
maxfps0=0
initts0=0
+winver0=0
+maxres0=-1
diff --git a/build/exports/Empire Earth.dxw b/build/exports/Empire Earth.dxw
new file mode 100644
index 0000000..ef00b0e
--- /dev/null
+++ b/build/exports/Empire Earth.dxw
@@ -0,0 +1,26 @@
+[target]
+title0=Empire Earth
+path0=D:\Games\Empire Earth\Empire Earth.exe
+module0=
+opengllib0=
+ver0=0
+coord0=0
+flag0=671088673
+flagg0=1207959552
+flagh0=20
+flagi0=131076
+tflag0=6147
+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/exports/Grand Prix Legends.dxw b/build/exports/Grand Prix Legends.dxw
index 999ae13..153dc55 100644
Binary files a/build/exports/Grand Prix Legends.dxw and b/build/exports/Grand Prix Legends.dxw differ
diff --git a/build/exports/Nascar Racing 3 (3DFX).dxw b/build/exports/Nascar Racing 3 (3DFX).dxw
new file mode 100644
index 0000000..21b3955
--- /dev/null
+++ b/build/exports/Nascar Racing 3 (3DFX).dxw
@@ -0,0 +1,26 @@
+[target]
+title0=Nascar Racing 3 (3DFX)
+path0=D:\Games\Nascar Racing 3\NASCAR Racing 3.exe
+module0=
+opengllib0=
+ver0=9
+coord0=0
+flag0=671105056
+flagg0=1207959552
+flagh0=20
+flagi0=4
+tflag0=6162
+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=0
diff --git a/build/exports/Panzer General 3D Assault.dxw b/build/exports/Panzer General 3D Assault.dxw
new file mode 100644
index 0000000..072af26
--- /dev/null
+++ b/build/exports/Panzer General 3D Assault.dxw
@@ -0,0 +1,26 @@
+[target]
+title0=Panzer General 3D Assault
+path0=D:\Games\Panzer General 3D\PG3.icd
+module0=PG3Draw
+opengllib0=
+ver0=0
+coord0=0
+flag0=696254496
+flagg0=1207959568
+flagh0=65556
+flagi0=4
+tflag0=6210
+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/exports/dxwnd.ini b/build/exports/dxwnd.ini
new file mode 100644
index 0000000..b98db4d
--- /dev/null
+++ b/build/exports/dxwnd.ini
@@ -0,0 +1,5 @@
+[window]
+posx=1007
+posy=65
+sizx=769
+sizy=832
diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt
index 576e5da..24da705 100644
--- a/build/readme-relnotes.txt
+++ b/build/readme-relnotes.txt
@@ -417,4 +417,19 @@ fixed d3d hooking for Reset and GetDirect3D methods: now Jumpgate works at any a
fixed "Compensate Flip emulation" option for non emulated surface mode: fixes mouse artifacts for "Rogue Spear Black Thorn"
added preliminary handling for "Disable Textures" option
+v2.02.64
+GUI: implemented multiple file import
+DLL:
+fixed a ddraw session reference count error that prevented "Jet Moto" to start
+fixed "Compensate Flip emulation" for ddraw7 games: now "Empire Earth" supports this flag.
+fixed CloseWindow hook: now games that minimize/restore the main window on task switch can possibly recover (e.g. Hundred Swords)
+fixed process hook: now it should be a little more robust and efficient. Hopefully should fix some Macromedia Flash problems.
+fixed IDDrawSurface::Lock() prototype. Not gameplay improvements, though...
+added DirectX "Return 0 ref counter" option as quick & dirty solution to many reference counter problems!
+fixed DirectDrawCreateEx failing to register the main ddraw session handle
+fixed palette problem in emulated mode: palette must be applied to backbuffer surface as well. Now "Duckman" and "Total Soccer 2000" show perfect colors.
+
+
+
+
diff --git a/dll/ddproxy.cpp b/dll/ddproxy.cpp
index 018e671..8092a84 100644
--- a/dll/ddproxy.cpp
+++ b/dll/ddproxy.cpp
@@ -1512,7 +1512,7 @@ HRESULT WINAPI extSetPaletteProxy(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE
return res;
}
-HRESULT WINAPI extLockProxy(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDIRECTDRAWSURFACE lpdds2, DWORD flags, HANDLE hEvent)
+HRESULT WINAPI extLockProxy(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACEDESC lpdds2, DWORD flags, HANDLE hEvent)
{
HRESULT res;
OutTraceP("Lock(S): PROXED lpdds=%x flags=%x(%s) lpdds2=%x", lpdds, flags, ExplainLockFlags(flags), lpdds2);
diff --git a/dll/ddproxy.h b/dll/ddproxy.h
index 893ded1..f24bc84 100644
--- a/dll/ddproxy.h
+++ b/dll/ddproxy.h
@@ -19,7 +19,7 @@ extern HRESULT WINAPI extGetClipperProxy(LPDIRECTDRAWSURFACE, LPDIRECTDRAWCLIPPE
extern HRESULT WINAPI extGetFlipStatusProxy(LPDIRECTDRAWSURFACE, DWORD);
extern HRESULT WINAPI extGetOverlayPositionProxy(LPDIRECTDRAWSURFACE, LPLONG, LPLONG);
extern HRESULT WINAPI extIsLostProxy(LPDIRECTDRAWSURFACE);
-extern HRESULT WINAPI extLockProxy(LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, DWORD, HANDLE);
+extern HRESULT WINAPI extLockProxy(LPDIRECTDRAWSURFACE, LPRECT, LPDDSURFACEDESC, DWORD, HANDLE);
extern HRESULT WINAPI extRestoreProxy(LPDIRECTDRAWSURFACE);
extern HRESULT WINAPI extSetOverlayPositionProxy(LPDIRECTDRAWSURFACE, LONG, LONG);
extern HRESULT WINAPI extUnlock1Proxy(LPDIRECTDRAWSURFACE, LPVOID);
diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp
index 7b3ccf9..66e9cba 100644
--- a/dll/ddraw.cpp
+++ b/dll/ddraw.cpp
@@ -81,8 +81,8 @@ HRESULT WINAPI extGetSurfaceDesc1(LPDIRECTDRAWSURFACE lpdds, LPDDSURFACEDESC lpd
HRESULT WINAPI extGetSurfaceDesc2(LPDIRECTDRAWSURFACE2 lpdds, LPDDSURFACEDESC2 lpddsd);
HRESULT WINAPI extGetSurfaceDesc7(LPDIRECTDRAWSURFACE2 lpdds, LPDDSURFACEDESC2 lpddsd);
// STDMETHOD(Initialize)(THIS_ LPDIRECTDRAW, LPDDSURFACEDESC2) PURE;
-HRESULT WINAPI extLock(LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, DWORD, HANDLE);
-HRESULT WINAPI extLockDir(LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, DWORD, HANDLE);
+HRESULT WINAPI extLock(LPDIRECTDRAWSURFACE, LPRECT, LPDDSURFACEDESC, DWORD, HANDLE);
+HRESULT WINAPI extLockDir(LPDIRECTDRAWSURFACE, LPRECT, LPDDSURFACEDESC, DWORD, HANDLE);
HRESULT WINAPI extReleaseDC(LPDIRECTDRAWSURFACE, HDC);
HRESULT WINAPI extSetClipper(LPDIRECTDRAWSURFACE, LPDIRECTDRAWCLIPPER);
HRESULT WINAPI extSetColorKey(LPDIRECTDRAWSURFACE, DWORD, LPDDCOLORKEY);
@@ -731,9 +731,9 @@ CreateSurface2_Type pCreateSurfaceMethod(LPDIRECTDRAWSURFACE lpdds)
void * extUnlock;
extUnlock=(void *)*(DWORD *)(*(DWORD *)lpdds + 128);
if(extUnlock==(void *)extUnlock1) return (CreateSurface2_Type)pCreateSurface1;
- if(extUnlock==(void *)extUnlock4) return (CreateSurface2_Type)pCreateSurface4;
+ if(extUnlock==(void *)extUnlock4) return pCreateSurface7 ? (CreateSurface2_Type)pCreateSurface7 : (CreateSurface2_Type)pCreateSurface4;
if(extUnlock==(void *)extUnlockDir1) return (CreateSurface2_Type)pCreateSurface1;
- if(extUnlock==(void *)extUnlockDir4) return (CreateSurface2_Type)pCreateSurface4;
+ if(extUnlock==(void *)extUnlockDir4) return pCreateSurface7 ? (CreateSurface2_Type)pCreateSurface7 : (CreateSurface2_Type)pCreateSurface4;
sprintf_s(sMsg, 80, "pCreateSurfaceMethod: pUnlock(%x) can't match %x\n", lpdds, extUnlock);
OutTraceDW(sMsg);
if (IsAssertEnabled) MessageBox(0, sMsg, "pCreateSurfaceMethod", MB_OK | MB_ICONEXCLAMATION);
@@ -1481,7 +1481,10 @@ HRESULT WINAPI extDirectDrawCreate(GUID FAR *lpguid, LPDIRECTDRAW FAR *lplpdd, I
// did not destroy the object.... but why? when (I mean, in which situations? Maybe not always...)
// and for which releases? The fix here assumes that this fact is true and holds always for ddraw 1
// sessions.
- if(dxw.dwDDVersion==1) (*lplpdd)->AddRef(); // seems to fix problems in "Warhammer 40K Rites Of War"
+ // update: this is no good for "Jet Moto" that created a ddraw session and expects to Release it
+ // with a refcount zero.
+
+ //if(dxw.dwDDVersion==1) (*lplpdd)->AddRef(); // seems to fix problems in "Warhammer 40K Rites Of War"
if(IsDebug && (dxw.dwTFlags & OUTPROXYTRACE)){
DDCAPS DriverCaps, EmulCaps;
@@ -1555,6 +1558,7 @@ HRESULT WINAPI extDirectDrawCreateEx(GUID FAR *lpguid,
OutTraceDDRAW("DirectDrawCreateEx: lpdd=%x guid=%s DDVersion=%d\n", *lplpdd, mode, dxw.dwDDVersion);
HookDDSession(lplpdd, dxw.dwDDVersion);
+ lpPrimaryDD=*lplpdd;
return 0;
}
@@ -2733,6 +2737,11 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate
// rebuild the clipper area
if(dxw.dwFlags1 & CLIPCURSOR) dxw.SetClipCursor();
+
+ // v2.2.64: added extra ref needed to preserve ddraw session for later use. Is it a ddraw1 legacy?
+ // seems to fix problems in "Warhammer 40K Rites Of War" that uses a ddraw session after reaching 0 refcount.
+ if(dxw.dwDDVersion==1) lpdd->AddRef();
+
return DD_OK;
}
@@ -3474,6 +3483,13 @@ HRESULT WINAPI extSetPalette(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE lpdd
if(res2) OutTraceE("SetPalette: GetEntries ERROR res=%x(%s)\n", res2, ExplainDDError(res2));
//mySetPalette(0, 256, lpentries);
}
+ // Apply palette to backbuffer surface. This is necessary on some games: "Duckman private dick", "Total Soccer 2000", ...
+ if (lpDDSBack) {
+ res=(*pSetPalette)(lpDDSBack, lpddp);
+ if(res) OutTraceE("SetPalette: ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
+ }
+ // add a reference to simulate what would happen in reality....
+ lpdds->AddRef();
res=0;
}
@@ -3540,7 +3556,7 @@ HRESULT WINAPI extSetClipper(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWCLIPPER lpdd
return res;
}
-HRESULT WINAPI extLock(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDIRECTDRAWSURFACE lpdds2, DWORD flags, HANDLE hEvent)
+HRESULT WINAPI extLock(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACEDESC lpDDSurfaceDesc, DWORD flags, HANDLE hEvent)
{
HRESULT res;
BOOL IsPrim;
@@ -3549,22 +3565,22 @@ HRESULT WINAPI extLock(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDIRECTDRAWSUR
CleanRect(&lprect, __LINE__);
if(IsTraceDDRAW){
- OutTrace("Lock: lpdds=%x%s flags=%x(%s) lpdds2=%x",
- lpdds, (IsPrim ? "(PRIM)":""), flags, ExplainLockFlags(flags), lpdds2);
+ OutTrace("Lock: lpdds=%x%s flags=%x(%s) lpDDSurfaceDesc=%x",
+ lpdds, (IsPrim ? "(PRIM)":""), flags, ExplainLockFlags(flags), lpDDSurfaceDesc);
if (lprect)
OutTrace(" rect=(%d,%d)-(%d,%d)\n", lprect->left, lprect->top, lprect->right, lprect->bottom);
else
OutTrace(" rect=(NULL)\n");
}
- res=(*pLock)(lpdds, lprect, lpdds2, flags, hEvent);
+ res=(*pLock)(lpdds, lprect, lpDDSurfaceDesc, flags, hEvent);
if(res==DDERR_SURFACEBUSY){ // v70: fix for "Ancient Evil"
(*pUnlockMethod(lpdds))(lpdds, NULL);
- res = (*pLock)(lpdds, lprect, lpdds2, flags, hEvent);
+ res = (*pLock)(lpdds, lprect, lpDDSurfaceDesc, flags, hEvent);
OutTraceDW("Lock RETRY: ret=%x(%s)\n", res, ExplainDDError(res));
}
if(res) OutTraceE("Lock ERROR: ret=%x(%s)\n", res, ExplainDDError(res));
- DumpSurfaceAttributes((LPDDSURFACEDESC)lpdds2, "[Locked]" , __LINE__);
+ DumpSurfaceAttributes(lpDDSurfaceDesc, "[Locked]" , __LINE__);
if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK;
// shouldn't happen.... if hooked to non primary surface, just call regular method.
@@ -3574,7 +3590,7 @@ HRESULT WINAPI extLock(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDIRECTDRAWSUR
LPDIRECTDRAWSURFACE2 lpDDSBuffer = NULL;
-HRESULT WINAPI extLockDir(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDIRECTDRAWSURFACE lpdds2, DWORD flags, HANDLE hEvent)
+HRESULT WINAPI extLockDir(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACEDESC lpDDSurfaceDesc, DWORD flags, HANDLE hEvent)
{
HRESULT res, res2;
static RECT client;
@@ -3586,8 +3602,8 @@ HRESULT WINAPI extLockDir(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDIRECTDRAW
// to find out whether it is the primary or not, using lpdds==lpPrimaryDD->GetGDISurface(&lpDDSPrim);
if(IsTraceDDRAW){
- OutTrace("Lock: lpdds=%x flags=%x(%s) lpdds2=%x",
- lpdds, flags, ExplainLockFlags(flags), lpdds2);
+ OutTrace("Lock: lpdds=%x flags=%x(%s) lpDDSurfaceDesc=%x",
+ lpdds, flags, ExplainLockFlags(flags), lpDDSurfaceDesc);
if (lprect)
OutTrace(" rect=(%d,%d)-(%d,%d)\n", lprect->left, lprect->top, lprect->right, lprect->bottom);
else
@@ -3643,10 +3659,10 @@ HRESULT WINAPI extLockDir(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDIRECTDRAW
}
}
- res=(*pLock)(lpdds, lprect, lpdds2, flags, hEvent);
+ res=(*pLock)(lpdds, lprect, lpDDSurfaceDesc, flags, hEvent);
if(res) OutTraceE("Lock ERROR: ret=%x(%s)\n", res, ExplainDDError(res));
- DumpSurfaceAttributes((LPDDSURFACEDESC)lpdds2, "[Locked]" , __LINE__);
+ DumpSurfaceAttributes((LPDDSURFACEDESC)lpDDSurfaceDesc, "[Locked]" , __LINE__);
if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK;
return res;
@@ -4109,6 +4125,8 @@ HRESULT WINAPI extReleaseS(LPDIRECTDRAWSURFACE lpdds)
lpDDSBack = NULL;
}
}
+
+ if(dxw.dwFlags4 & RETURNNULLREF) return 0;
return res;
}
@@ -4373,6 +4391,8 @@ ULONG WINAPI extReleaseD(LPDIRECTDRAW lpdd)
//if((ActualRef==0) && (dxw.dwFlags3 & FORCE16BPP)) SwitchTo16BPP();
OutTraceDDRAW("Release(D): lpdd=%x ref=%x\n", lpdd, VirtualRef);
+
+ if(dxw.dwFlags4 & RETURNNULLREF) return 0;
return (ULONG)VirtualRef;
}
diff --git a/dll/dxemublt.cpp b/dll/dxemublt.cpp
index f90b534..67d47c1 100644
--- a/dll/dxemublt.cpp
+++ b/dll/dxemublt.cpp
@@ -5,7 +5,7 @@
#include "dxwcore.hpp"
#include "hddraw.h"
-typedef HRESULT (WINAPI *Lock_Type)(LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, DWORD, HANDLE);
+typedef HRESULT (WINAPI *Lock_Type)(LPDIRECTDRAWSURFACE, LPRECT, LPDDSURFACEDESC, DWORD, HANDLE);
typedef HRESULT (WINAPI *Unlock4_Type)(LPDIRECTDRAWSURFACE, LPRECT);
typedef HRESULT (WINAPI *Unlock1_Type)(LPDIRECTDRAWSURFACE, LPVOID);
@@ -79,7 +79,7 @@ static HRESULT WINAPI EmuBlt_8_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdest
memset(&ddsd_dst,0,sizeof(DDSURFACEDESC2));
ddsd_dst.dwSize = Set_dwSize_From_Surface(lpddsdst);
ddsd_dst.dwFlags = DDSD_LPSURFACE | DDSD_PITCH;
- if(res=(*pLock)(lpddsdst, 0, (LPDIRECTDRAWSURFACE)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){
+ if(res=(*pLock)(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){
OutTraceE("EmuBlt8_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
return res;
}
@@ -96,7 +96,7 @@ static HRESULT WINAPI EmuBlt_8_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdest
}
}
else {
- if(res=(*pLock)(lpddssrc, 0, (LPDIRECTDRAWSURFACE)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0)) {
+ if(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0)) {
(*pUnlockMethod(lpddsdst))(lpddsdst,0);
OutTraceE("EmuBlt8_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
return 0;
@@ -175,7 +175,7 @@ static HRESULT WINAPI EmuBlt_16_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdes
memset(&ddsd_dst,0,sizeof(DDSURFACEDESC2));
ddsd_dst.dwSize = Set_dwSize_From_Surface(lpddsdst);
ddsd_dst.dwFlags = DDSD_LPSURFACE | DDSD_PITCH;
- if(res=(*pLock)(lpddsdst, 0, (LPDIRECTDRAWSURFACE)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){
+ if(res=(*pLock)(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){
OutTraceE("EmuBlt16_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
return res;
}
@@ -192,7 +192,7 @@ static HRESULT WINAPI EmuBlt_16_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdes
}
}
else {
- if(res=(*pLock)(lpddssrc, 0, (LPDIRECTDRAWSURFACE)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY|DDLOCK_WAIT, 0)) {
+ if(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY|DDLOCK_WAIT, 0)) {
(*pUnlockMethod(lpddsdst))(lpddsdst,0);
OutTraceE("EmuBlt16_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
return res;
@@ -283,7 +283,7 @@ static HRESULT WINAPI EmuBlt_24_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdes
memset(&ddsd_dst,0,sizeof(DDSURFACEDESC2));
ddsd_dst.dwSize = Set_dwSize_From_Surface(lpddsdst);
ddsd_dst.dwFlags = DDSD_LPSURFACE | DDSD_PITCH;
- if(res=(*pLock)(lpddsdst, 0, (LPDIRECTDRAWSURFACE)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){
+ if(res=(*pLock)(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){
OutTraceE("EmuBlt24_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
return res;
}
@@ -300,7 +300,7 @@ static HRESULT WINAPI EmuBlt_24_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdes
}
}
else {
- if(res=(*pLock)(lpddssrc, 0, (LPDIRECTDRAWSURFACE)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0)) {
+ if(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0)) {
(*pUnlockMethod(lpddsdst))(lpddsdst,0);
OutTraceE("EmuBlt24_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
return res;
@@ -361,7 +361,7 @@ static HRESULT WINAPI EmuBlt_32_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdes
memset(&ddsd_dst,0,sizeof(DDSURFACEDESC2));
ddsd_dst.dwSize = Set_dwSize_From_Surface(lpddsdst);
ddsd_dst.dwFlags = DDSD_LPSURFACE | DDSD_PITCH;
- if(res=(*pLock)(lpddsdst, 0, (LPDIRECTDRAWSURFACE)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){
+ if(res=(*pLock)(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){
OutTraceE("EmuBlt32_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
return res;
}
@@ -378,7 +378,7 @@ static HRESULT WINAPI EmuBlt_32_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdes
}
}
else {
- if(res=(*pLock)(lpddssrc, 0, (LPDIRECTDRAWSURFACE)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0)) {
+ if(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0)) {
(*pUnlockMethod(lpddsdst))(lpddsdst,0);
OutTraceE("EmuBlt32_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
return res;
@@ -433,7 +433,7 @@ static HRESULT WINAPI EmuBlt_8_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdest
memset(&ddsd_dst,0,sizeof(DDSURFACEDESC2));
ddsd_dst.dwSize = Set_dwSize_From_Surface(lpddsdst);
ddsd_dst.dwFlags = DDSD_LPSURFACE | DDSD_PITCH;
- if(res=(*pLock)(lpddsdst, 0, (LPDIRECTDRAWSURFACE)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){
+ if(res=(*pLock)(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){
OutTraceE("EmuBlt8_16: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
return res;
}
@@ -450,7 +450,7 @@ static HRESULT WINAPI EmuBlt_8_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdest
}
}
else {
- if(res=(*pLock)(lpddssrc, 0, (LPDIRECTDRAWSURFACE)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0)) {
+ if(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0)) {
(*pUnlockMethod(lpddsdst))(lpddsdst,0);
OutTraceE("EmuBlt8_16: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
return 0;
@@ -516,7 +516,7 @@ static HRESULT WINAPI EmuBlt_24_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdes
memset(&ddsd_dst,0,sizeof(DDSURFACEDESC2));
ddsd_dst.dwSize = Set_dwSize_From_Surface(lpddsdst);
ddsd_dst.dwFlags = DDSD_LPSURFACE | DDSD_PITCH;
- if(res=(*pLock)(lpddsdst, 0, (LPDIRECTDRAWSURFACE)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){
+ if(res=(*pLock)(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){
OutTraceE("EmuBlt24_16: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
return res;
}
@@ -533,7 +533,7 @@ static HRESULT WINAPI EmuBlt_24_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdes
}
}
else {
- if(res=(*pLock)(lpddssrc, 0, (LPDIRECTDRAWSURFACE)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0)) {
+ if(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0)) {
(*pUnlockMethod(lpddsdst))(lpddsdst,0);
OutTraceE("EmuBlt24_16: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
return 0;
@@ -710,7 +710,7 @@ static HRESULT WINAPI RevBlt_32_to_8(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdest
memset(&ddsd_dst,0,sizeof(DDSURFACEDESC2));
ddsd_dst.dwSize = Set_dwSize_From_Surface(lpddsdst);
ddsd_dst.dwFlags = DDSD_LPSURFACE | DDSD_PITCH;
- if(res=(*pLock)(lpddsdst, 0, (LPDIRECTDRAWSURFACE)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){
+ if(res=(*pLock)(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){
OutTraceE("RevBlt32_8: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
return res;
}
@@ -718,7 +718,7 @@ static HRESULT WINAPI RevBlt_32_to_8(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdest
memset(&ddsd_src,0,sizeof(DDSURFACEDESC2));
ddsd_src.dwSize = Set_dwSize_From_Surface(lpddssrc);
ddsd_src.dwFlags = DDSD_LPSURFACE | DDSD_PITCH;
- if(res=(*pLock)(lpddssrc, 0, (LPDIRECTDRAWSURFACE)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){
+ if(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){
OutTraceE("RevBlt32_8: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
return res;
}
@@ -788,7 +788,7 @@ static HRESULT WINAPI RevBlt_32_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdes
memset(&ddsd_dst,0,sizeof(DDSURFACEDESC2));
ddsd_dst.dwSize = Set_dwSize_From_Surface(lpddsdst);
ddsd_dst.dwFlags = DDSD_LPSURFACE | DDSD_PITCH;
- if(res=(*pLock)(lpddsdst, 0, (LPDIRECTDRAWSURFACE)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){
+ if(res=(*pLock)(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){
OutTraceE("RevBlt32_16: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
return res;
}
@@ -796,7 +796,7 @@ static HRESULT WINAPI RevBlt_32_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdes
memset(&ddsd_src,0,sizeof(DDSURFACEDESC2));
ddsd_src.dwSize = Set_dwSize_From_Surface(lpddssrc);
ddsd_src.dwFlags = DDSD_LPSURFACE | DDSD_PITCH;
- if(res=(*pLock)(lpddssrc, 0, (LPDIRECTDRAWSURFACE)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){
+ if(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){
OutTraceE("RevBlt32_16: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
return res;
}
@@ -848,7 +848,7 @@ static HRESULT WINAPI RevBlt_16_to_8(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdest
memset(&ddsd_dst,0,sizeof(DDSURFACEDESC2));
ddsd_dst.dwSize = Set_dwSize_From_Surface(lpddsdst);
ddsd_dst.dwFlags = DDSD_LPSURFACE | DDSD_PITCH;
- if(res=(*pLock)(lpddsdst, 0, (LPDIRECTDRAWSURFACE)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){
+ if(res=(*pLock)(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){
OutTraceE("RevBlt16_8: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
return res;
}
@@ -856,7 +856,7 @@ static HRESULT WINAPI RevBlt_16_to_8(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdest
memset(&ddsd_src,0,sizeof(DDSURFACEDESC2));
ddsd_src.dwSize = Set_dwSize_From_Surface(lpddssrc);
ddsd_src.dwFlags = DDSD_LPSURFACE | DDSD_PITCH;
- if(res=(*pLock)(lpddssrc, 0, (LPDIRECTDRAWSURFACE)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){
+ if(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){
OutTraceE("RevBlt16_8: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
return res;
}
diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp
index cc93ef6..f6e03aa 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.63"
+#define VERSION "2.02.64"
#define DDTHREADLOCK 1
@@ -146,17 +146,21 @@ void SetFPS(int fps)
LRESULT CALLBACK HookProc(int ncode, WPARAM wparam, LPARAM lparam)
{
- char name[MAX_PATH];
+ char name[MAX_PATH+1];
HWND hwnd;
int i;
static int DoOnce = FALSE;
+ // don't do more than once per process
+ if(DoOnce) return CallNextHookEx(hHook, ncode, wparam, lparam);
+
// take care here: if anything stops or delays the execution logic, the whole
// operating system hangs, since it can't activate new windows!
// could use WM_NCCREATE instead of WM_CREATE. Are there differences?
hwnd = ((CWPSTRUCT *)lparam)->hwnd;
if(((CWPSTRUCT *)lparam)->message == WM_CREATE){
+ name[MAX_PATH]=0; // string terminator
GetModuleFileName(0, name, MAX_PATH);
for(i = 0; name[i]; i ++) name[i] = tolower(name[i]);
WaitForSingleObject(hMutex, INFINITE);
@@ -168,7 +172,6 @@ LRESULT CALLBACK HookProc(int ncode, WPARAM wparam, LPARAM lparam)
// check for locking thread (and hook) just once per process.
// This callback is invoked per each process' thread.
- if(DoOnce) break;
DoOnce = TRUE;
// V.68: concurrency check. One game at a time, or exiting.
diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo
index 5d5fb8c..1faf035 100644
Binary files a/dll/dxwnd.vs2008.suo and b/dll/dxwnd.vs2008.suo differ
diff --git a/dll/hddraw.h b/dll/hddraw.h
index 177adf2..021a437 100644
--- a/dll/hddraw.h
+++ b/dll/hddraw.h
@@ -83,7 +83,7 @@ typedef HRESULT (WINAPI *GetSurfaceDesc_Type)(LPDIRECTDRAWSURFACE, LPDDSURFACEDE
typedef HRESULT (WINAPI *GetSurfaceDesc2_Type)(LPDIRECTDRAWSURFACE2, LPDDSURFACEDESC2);
typedef HRESULT (WINAPI *InitializeC_Type)(LPDIRECTDRAWCLIPPER, LPDIRECTDRAW, DWORD);
typedef HRESULT (WINAPI *IsLost_Type)(LPDIRECTDRAWSURFACE);
-typedef HRESULT (WINAPI *Lock_Type)(LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, DWORD, HANDLE);
+typedef HRESULT (WINAPI *Lock_Type)(LPDIRECTDRAWSURFACE, LPRECT, LPDDSURFACEDESC, DWORD, HANDLE);
typedef HRESULT (WINAPI *ReleaseDC_Type)(LPDIRECTDRAWSURFACE, HDC);
typedef HRESULT (WINAPI *Restore_Type)(LPDIRECTDRAWSURFACE);
typedef HRESULT (WINAPI *SetClipper_Type)(LPDIRECTDRAWSURFACE, LPDIRECTDRAWCLIPPER);
diff --git a/dll/user32.cpp b/dll/user32.cpp
index 7e0ae39..cdedbf2 100644
--- a/dll/user32.cpp
+++ b/dll/user32.cpp
@@ -2092,11 +2092,12 @@ BOOL WINAPI extDestroyWindow(HWND hWnd)
BOOL WINAPI extCloseWindow(HWND hWnd)
{
+ // from MSDN: Minimizes (but does not destroy) the specified window.
BOOL res;
OutTraceB("CloseWindow: hwnd=%x\n", hWnd);
if (hWnd == dxw.GethWnd()) {
OutTraceDW("CloseWindow: close main hwnd=%x\n", hWnd);
- dxw.SethWnd(NULL);
+ // do not delete the reference to main hWnd.
}
res=(*pCloseWindow)(hWnd);
if(!res)OutTraceE("CloseWindow: ERROR err=%d\n", GetLastError());
diff --git a/host/Resource.h b/host/Resource.h
index 8db5baa..11dd3a2 100644
--- a/host/Resource.h
+++ b/host/Resource.h
@@ -185,8 +185,7 @@
#define IDC_NOALPHACHANNEL 1143
#define IDC_SUPPRESSCHILD 1144
#define IDC_FIXREFCOUNTER 1145
-#define IDC_LIMITSCREENRES 1145
-#define IDC_SHOWTIMESTRETCH 1146
+#define IDC_RETURNNULLREF 1146
#define IDC_ZBUFFERALWAYS 1147
#define IDC_ZBUFFER0CLEAN 1148
#define IDC_NOPOWER2FIX 1149
@@ -206,6 +205,9 @@
#define IDC_STRETCHTIMERS 1164
#define IDC_NOFLIPEMULATION 1165
#define IDC_NOTEXTURES 1166
+#define IDC_LIMITSCREENRES 1167
+#define IDC_SHOWTIMESTRETCH 1168
+
#define ID_MODIFY 32771
#define ID_DELETE 32772
#define ID_ADD 32773
diff --git a/host/TabDirectX.cpp b/host/TabDirectX.cpp
index 9a5a42a..5337694 100644
--- a/host/TabDirectX.cpp
+++ b/host/TabDirectX.cpp
@@ -43,6 +43,7 @@ void CTabDirectX::DoDataExchange(CDataExchange* pDX)
DDX_Check(pDX, IDC_NOPIXELFORMAT, cTarget->m_NoPixelFormat);
DDX_Check(pDX, IDC_NOALPHACHANNEL, cTarget->m_NoAlphaChannel);
DDX_Check(pDX, IDC_FIXREFCOUNTER, cTarget->m_FixRefCounter);
+ DDX_Check(pDX, IDC_RETURNNULLREF, cTarget->m_ReturnNullRef);
DDX_Check(pDX, IDC_NOFLIPEMULATION, cTarget->m_NoFlipEmulation);
}
diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp
index 26aab00..5fe6a6b 100644
--- a/host/TargetDlg.cpp
+++ b/host/TargetDlg.cpp
@@ -45,6 +45,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
m_NoPixelFormat = FALSE;
m_NoAlphaChannel = FALSE;
m_FixRefCounter = TRUE;
+ m_ReturnNullRef = FALSE;
m_SuppressChild = FALSE;
m_HideDesktop = FALSE;
m_LockSysColors = FALSE;
diff --git a/host/TargetDlg.h b/host/TargetDlg.h
index 3fb5ac6..f9c9186 100644
--- a/host/TargetDlg.h
+++ b/host/TargetDlg.h
@@ -137,6 +137,7 @@ public:
BOOL m_NoPixelFormat;
BOOL m_NoAlphaChannel;
BOOL m_FixRefCounter;
+ BOOL m_ReturnNullRef;
BOOL m_SuppressChild;
BOOL m_HideDesktop;
BOOL m_LockSysColors;
diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps
index 4bb1ec9..4925763 100644
Binary files a/host/dxwndhost.aps and b/host/dxwndhost.aps differ
diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc
index df4e299..3ad9b2f 100644
--- a/host/dxwndhost.rc
+++ b/host/dxwndhost.rc
@@ -349,6 +349,7 @@ BEGIN
CONTROL "Fix ddraw ref counter",IDC_FIXREFCOUNTER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,172,123,12
CONTROL "Add proxy libs",IDC_ADDPROXYLIBS,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_DISABLED | WS_TABSTOP,15,200,123,12
CONTROL "Compensate Flip emulation",IDC_NOFLIPEMULATION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,76,119,10
+ CONTROL "Return 0 ref counter",IDC_RETURNNULLREF,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,184,123,12
END
IDD_TAB_INPUT DIALOGEX 0, 0, 300, 240
diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo
index 51282d2..764520a 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 39cb968..7647592 100644
--- a/host/dxwndhostView.cpp
+++ b/host/dxwndhostView.cpp
@@ -176,6 +176,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
if(dlg->m_NoPixelFormat) t->flags3 |= NOPIXELFORMAT;
if(dlg->m_NoAlphaChannel) t->flags4 |= NOALPHACHANNEL;
if(dlg->m_FixRefCounter) t->flags4 |= FIXREFCOUNTER;
+ if(dlg->m_ReturnNullRef) t->flags4 |= RETURNNULLREF;
if(dlg->m_SuppressChild) t->flags4 |= SUPPRESSCHILD;
if(dlg->m_HideDesktop) t->flags4 |= HIDEDESKTOP;
if(dlg->m_LockSysColors) t->flags3 |= LOCKSYSCOLORS;
@@ -323,6 +324,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
dlg->m_NoPixelFormat = t->flags3 & NOPIXELFORMAT ? 1 : 0;
dlg->m_NoAlphaChannel = t->flags4 & NOALPHACHANNEL ? 1 : 0;
dlg->m_FixRefCounter = t->flags4 & FIXREFCOUNTER ? 1 : 0;
+ dlg->m_ReturnNullRef = t->flags4 & RETURNNULLREF ? 1 : 0;
dlg->m_SuppressChild = t->flags4 & SUPPRESSCHILD ? 1 : 0;
dlg->m_HideDesktop = t->flags4 & HIDEDESKTOP ? 1 : 0;
dlg->m_LockSysColors = t->flags3 & LOCKSYSCOLORS ? 1 : 0;
@@ -812,35 +814,59 @@ void CDxwndhostView::OnExport()
void CDxwndhostView::OnImport()
{
+ LV_ITEM listitem;
int i;
char path[MAX_PATH];
for (i=0; strlen(TargetMaps[i].path) && iisUpdated=TRUE;