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;