From d47c4cfab1e767b2847ba08be343549c3299813a Mon Sep 17 00:00:00 2001 From: gho tik Date: Fri, 21 Mar 2014 12:38:57 -0400 Subject: [PATCH] v2_02_64_src Former-commit-id: 132040391504367d2f12b030314ecc9603c5e917 --- Include/dxwnd.h | 3 +- build/dxwnd.dll | 2 +- build/dxwnd.exe | 2 +- build/exports/25 to Life.dxw | 26 +++++++ build/exports/Abomination.dxw | 26 +++++++ build/exports/Black & White.dxw | 4 +- build/exports/Darius Gaiden.dxw | 26 +++++++ build/exports/Dark Colony.dxw | 26 +++++++ .../Dark Planet Battle for Natrolis.dxw | 26 +++++++ .../exports/Dead Rising 2 Off The Record.dxw | 26 +++++++ build/exports/{JetMoto.dxw => Duckman.dxw} | 12 ++-- build/exports/Empire Earth.dxw | 26 +++++++ build/exports/Grand Prix Legends.dxw | Bin 295 -> 289 bytes build/exports/Nascar Racing 3 (3DFX).dxw | 26 +++++++ build/exports/Panzer General 3D Assault.dxw | 26 +++++++ build/exports/dxwnd.ini | 5 ++ build/readme-relnotes.txt | 15 ++++ dll/ddproxy.cpp | 2 +- dll/ddproxy.h | 2 +- dll/ddraw.cpp | 52 +++++++++----- dll/dxemublt.cpp | 38 +++++----- dll/dxwnd.cpp | 9 ++- dll/dxwnd.vs2008.suo | Bin 190464 -> 195584 bytes dll/hddraw.h | 2 +- dll/user32.cpp | 3 +- host/Resource.h | 6 +- host/TabDirectX.cpp | 1 + host/TargetDlg.cpp | 1 + host/TargetDlg.h | 1 + host/dxwndhost.aps | Bin 171092 -> 171232 bytes host/dxwndhost.rc | 1 + host/dxwndhost.vs2008.suo | Bin 110080 -> 123392 bytes host/dxwndhostView.cpp | 68 ++++++++++++------ 33 files changed, 389 insertions(+), 74 deletions(-) create mode 100644 build/exports/25 to Life.dxw create mode 100644 build/exports/Abomination.dxw create mode 100644 build/exports/Darius Gaiden.dxw create mode 100644 build/exports/Dark Colony.dxw create mode 100644 build/exports/Dark Planet Battle for Natrolis.dxw create mode 100644 build/exports/Dead Rising 2 Off The Record.dxw rename build/exports/{JetMoto.dxw => Duckman.dxw} (63%) create mode 100644 build/exports/Empire Earth.dxw create mode 100644 build/exports/Nascar Racing 3 (3DFX).dxw create mode 100644 build/exports/Panzer General 3D Assault.dxw create mode 100644 build/exports/dxwnd.ini 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 999ae13fd69e900ec38a7f66b60f3fe7cc7734a9..153dc558e1e1621914cb1bca761126210ed110cf 100644 GIT binary patch literal 289 zcmXwz!A`^=5QgtOMW4WoP1&|4+)R4egLl^h+F6{00s&O?=^bGAK<4{Dm|7Dr-BPb9b z-p9Sd)oKIkG_TVlr+I9d#p4L`Dpx7H;V;JimOxD+_bw3RD3>~>!f%CxToYV-)}?1% mS`I#OmLM2dFeLh8vp^$OC#FM}Ye@IOxzP`~+wy!HvAKV3j9J$J literal 295 NcmZQz7zIRx0003e00961 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 5d5fb8ce08b5e7afca186caadcc7cfb4f9e709cb..1faf03506966da327e14fb674a691e61846228dc 100644 GIT binary patch delta 12733 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 WQLsnSgPFdFU`d3}%{^=Og#RC>@2A25 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 4bb1ec926b95d385fc742484ae532d46f875371c..492576383e06decae67612acb315990505aa45f0 100644 GIT binary patch delta 2472 zcmZuxdr(yO6+XY;!h*oi#qKV!A`hV>I!UuEuU%tR(p`kQVOLn5LKag>&D1Ka#2V@Z ztj0W~NI1el;!J{=*3PuGc3U7!Cz&SG%w#4r(pDQK7)dn77tQ*>S4{1>cP}Q*bpP1% zo$q|-eCPh|$2^cyifPE%vAgr;Tn&TZA3n(DXO{8pR4AP+N|5=HaT)+gt8eBWQ@ z@wsYzmF2Dq$jK=vfC+$7r~h$}v$VJta&3i$Iq-Lta=P3upG&1|@DG(Layr#K7yhZ{ zt{Sh~Qy$jj!Eu!XX6y>o;e{skS1m-lOC4)`Ff`pV62g_B`Uv$N;GsW9<1 zKf4VkRkEtoRqghyRy^&6@S)22iYnIl*Oa>5D(iqLl`SrH^zw0x~OUu8)Xk)WrZqs zz$KM;))aZYepgMYvY$Q23YS&7qNvKn7pD$p@(P9yE-=q%9o1z{UR%}M;NQ4pI7NKU z0wdN9$5}$(w98e6`EV6GhfT@X)UvucKQEP!haDVn9cN65@&@3s;iOfws>sXt#-pB_ z-DZQEVNSaRc3Upo`pU^$#1EGGWZ7-`a2ua6FA{ffhdEQ+<^M$di#bkwp`vL<_Y@Ro zf6VJuR?D@*muN^dNu9u_cBYC5EKW=pk@(}pG^rQ(o6ZFyDtIVy)ym-6s!Aye&{6xM zP+x%HWUZ88h&R>^Y3O(LM>N#da9Kk?d!kcA-}0AeXtRI0hTieN7e>KDjZNCX;q)I0 zkr&KpdPyUK?=-*5jPl~)(1tIyhLNW-rJ>aMKkr~Sp8Uy@a9zBGmW@j_{I_7kMz=OX ze28!V^t@J>3I27{>bZg*Gg?+?1tV^2DGp=(n=%XT-^Z2DniBs1*MO~B7l*}BMLI>C zgFChx(cNGOvpCfni@$DNsAVaE7(Cyas%7f}vA8&pqGkIzYYr?3XQB=V1K-i`Iz0IR z*Q0sM9N&PxIgH1)#NvT1bKQQNn5&4!V0_!tdi`zzkOkD;D^u}sdpe)F) zWQy~_*E{wbg0($$QOV^l{;ZXiRl42fu44YUUO2|gzHJd02uD%u} zz4nKl6cp3t*3DUueJ8mxwTJLO) zVIw-M6C>DlJ(|kQBAPZuh~*gnSqyp2LQmrnqJ@gh!a&O+MYf7Y1CgRdgvo1q;l-&t z+%;e51df4PX|ENAn1Sln1MB|$m^`lc!qE6t*#dvbg6U8bRm?v!1JYU3f-x2P6 zG~9P?o~To4a>odDznU1aR54KoQBREc6;+vpA?j^tgc#_ioM@5wd{e9#ZHkp+yG1iC z?3IgUdNp3EO4S!+0JPQOirUmj>C?jOVX&OP9DzBWz?$Z_uF(;1GEXp)le+K{ak%g@L znEDgt?~`fbHLBzwOU~k@Pb}1jfQa6v_I-aR8kGvJh)ZI%pY3 zov%mGk-bXM0FW|7?MgBGk2J_pgy;?8@ndvK2@`aOgN(jRmI3ZG-V?O>3y~bDbRMAE z0hS!5XE^8%WlFlgNQQ?#w1mc4FYU`{Qi(0A=&lmCuO-WVp5uH{(yQw=aoiTFV^VJO zQM(eC2WU`o}l9uo@{(x(&pVf z1attaUZ8fa$;Lf2sKlf$8t16n*CpxmJv{UmJZIltPP)0{1%6uXJ!Cn+is_dnJ^Hdt F{x4J>|Ahbm delta 2534 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 GVEi9#HtL@M delta 2936 zcmb7`e^6A{702J%Um)PRt{bv!DS6L5i41c z#3VHWd*~iDW5G;{C^TJt${V#aE{16{)&{h3rZY8hZSB;l8EYNdj`;(6?q)+tJ8kTp z`OG=@`|huI?z#6p&q##lhRI)NFn2n(4eV4#K`%*?vRiF7JkXh5VZR)(A!1oh5lGU+ z69=18IiALnHfkkcpR*NCx z@5WF|9DaY5nkQe@qu*Ia={LcO&$}$D)mf=qVv=S^z^@U{Ez?7-CF$1#S=PTy+?y2o z3T6ZI3_qK$XL3DPQkNuWgQL^ghtH25#!D9;AvO(jBH+02G8>%b}dg-gBkCGVUYW(Z)PrvG}f?J zIu$=-9akmw;lf|)P?>K}Y}84->`=+s))k&ylH|IO&vkrgn2YgCQle_Pk=TpLNnZ!J zOsQOT+*O;GyaBTcr5(~1-qLhQOg2ahTpZ_v&9SOG*Ka~gt^p1CW!QdO#J{v-VM>^_OewRDDP!80A>6d8Bl;qHuQ48w zu)N?n1&hI|T8r|)*2=0FXCK>krh`FS;Zsj_vEvmLrknW@<70?9#2jXhFz+&0SLj@E zlAS*0IMdIZV8qA+Y=0W|KVbVa#?PE$PBSWVhB?c8hSv*|4WgI#dnH}fwkLnb;tl3g zM#wkW2ANyT@59<{VY@c&Ab%VV)m1_xVZ&jrc-T9FisSM%|F52ndN|06W*7z8#J||P}8c0`5 zcU{tBdo^#>u6R^lv8#b*=j_l3!CQ8<{=fshdZsf~PbC{T2N$`b)HB_Av+>f^Bz3GW z(oB{4kf~OlU7d_01u`D|n_12HG;0pp*2`4660+6!zqUkT_njp5%onZ*96yIa$ zuzJ^9v^NaUZXD7<2Fw$o7~@p{q<(r{tn2r{6&^puyy{+=${uw*ET>p-S>foEY&d4 zmkMU|WGLi53yS8+0goP)b+P2!1UK-_V^(~1L_t%ng{o@6hV7S=u=7?7)jtPOsN~y8 z-U@krOTb8hsZ!sjNc*$RiyeJBZQ z|6$d#wnG*Sxgnr)aF9g#&qJ-Fd*>lpgEcV81D)W7Dr+HN!b{iftkG6VKc-7dCEAp^7ld3VQ$)!G;;`&!Z(&o!OqMBH^EU@N=j`g0*+7~jWvNkncof!75e|{?G{k(Zn#J_1c%5y z2ke^t2*dz>@&`VP??NSxy>8~Cp~)XW4WK-lfWZ?Miu8lo*8(4LIKKKQYU3?%MTe(0 zDno6s+-T%QNam@h)VLoG=%gmH^utTxjde~* zOMVxm((Au~??Mr^9)RzNWY^q31V8vjASLd<qX4$X*%}a zc7{IVZrpfoF7=K=Ce@#TVcK*YX3?Mf!H28wa>^V42Ts(PaP@2AbjIV@7qNzps>44) z*=(cj6=0*lxA_W_kA~WrDKY^pDIAH=glwdj7(NoAQW>_jZ27XC^c{r&wH*fQ%!cmh zP$QvAc&a51Ez2T@eheQ1erQ-g<2_JplB&4d=4mO|3!^63!eZT&Xxz)gRMPHaPz>=? zsy2QM3XQcJOkXZV<}M}di?TDUi65|ru+|jT=Ck%{Slc^IYYA)nrfKbA?Jc&UzZv_# z=1&cUa(aktm|-@Ee@_{m`#8$|5S+?Jk=`8Y7}~xI5@_3bC<_lw7f(Vf29HMJXQe~F k9uf6Hm@DFAJkM`kN?li=AWB5=%MwcI-Yby(&06L^0a<2=rT_o{ 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;