diff --git a/build/dxwnd.dll b/build/dxwnd.dll
index db09245..be2c990 100644
--- a/build/dxwnd.dll
+++ b/build/dxwnd.dll
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:73c4aac223a633aa820b3761678170f484fb15a016ecd2c41e77d5c820e3dd46
-size 791552
+oid sha256:a6e3eed0ef40c5d67c9179b539a02e0d2044ede982322f019816d85db5694161
+size 793088
diff --git a/build/dxwnd.exe b/build/dxwnd.exe
index 04a9cb5..8e63215 100644
--- a/build/dxwnd.exe
+++ b/build/dxwnd.exe
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:933a86972f0a96e62d8c5f4b656315cf09d656d2a131d1685acdd231b7ac2139
+oid sha256:b65ce7c723d642c6c753ab05c5e3e8eb4d50fc80592f0e333decdf7e77c0b00e
size 677376
diff --git a/build/dxwnd.ini b/build/dxwnd.ini
deleted file mode 100644
index 68a7ef8..0000000
--- a/build/dxwnd.ini
+++ /dev/null
@@ -1,183 +0,0 @@
-[window]
-exportpath=D:\Games\Age of Empires Trial\
-exepath=D:\Games\Sid Meiers Alpha Centauri Demo\
-posx=-666
-posy=95
-sizx=320
-sizy=200
-[target]
-title0=Planet of the Apes
-path0=D:\Games\Planet of the Apes\pota.exe
-startfolder0=
-launchpath0=
-module0=
-opengllib0=
-notes0=
-registry0=
-ver0=0
-monitorid0=0
-coord0=0
-flag0=203423795
-flagg0=1207959552
-flagh0=524308
-flagi0=138412068
-flagj0=67129472
-flagk0=-1879044096
-flagl0=1048576
-flagm0=0
-tflag0=0
-dflag0=0
-posx0=-1050
-posy0=100
-sizx0=800
-sizy0=600
-maxfps0=0
-initts0=0
-winver0=0
-maxres0=-1
-swapeffect0=0
-maxddinterface0=7
-slowratio0=2
-scanline0=1
-initresw0=0
-initresh0=0
-title1=Sid Meiers Alpha Centauri Demo
-path1=D:\Games\Sid Meiers Alpha Centauri Demo\terran.exe
-startfolder1=
-launchpath1=
-module1=
-opengllib1=
-notes1=
-registry1=
-ver1=0
-monitorid1=-1
-coord1=0
-flag1=673185826
-flagg1=1207959616
-flagh1=32788
-flagi1=138420228
-flagj1=4224
-flagk1=65536
-flagl1=0
-flagm1=0
-tflag1=-2147477245
-dflag1=0
-posx1=50
-posy1=50
-sizx1=800
-sizy1=600
-maxfps1=0
-initts1=0
-winver1=0
-maxres1=0
-swapeffect1=0
-maxddinterface1=7
-slowratio1=2
-scanline1=0
-initresw1=800
-initresh1=600
-title2=Diablo
-path2=D:\Games\Diablo\Diablo.exe
-startfolder2=
-launchpath2=
-module2=
-opengllib2=
-notes2=
-registry2=
-ver2=1
-monitorid2=0
-coord2=0
-flag2=138428450
-flagg2=1241514000
-flagh2=8212
-flagi2=4194304
-flagj2=128
-flagk2=262144
-flagl2=0
-flagm2=1024
-tflag2=0
-dflag2=0
-posx2=50
-posy2=50
-sizx2=800
-sizy2=600
-maxfps2=0
-initts2=0
-winver2=0
-maxres2=0
-swapeffect2=0
-maxddinterface2=7
-slowratio2=1
-scanline2=1
-initresw2=0
-initresh2=0
-title3=TOCA Touring Car Championship demo
-path3=D:\Games\tocademo\tourcars.exe
-startfolder3=
-launchpath3=D:\Games\tocademo\setup.exe
-module3=
-opengllib3=
-notes3=
-registry3=\n[HKEY_LOCAL_MACHINE\SOFTWARE\Codemasters]\n\n[HKEY_LOCAL_MACHINE\SOFTWARE\Codemasters\Touring Car]\n"GameDirectory"="F:\\Games\\tourcar\\"\n"CD_Drive"="."\n"Install_Drive"="F:"\n"CardHintIndex"=dword:00000000\n"ShowRunInfo"=dword:00000000\n"S3RunInfo"=dword:00000000\n\n
-ver3=0
-monitorid3=-1
-coord3=0
-flag3=673185834
-flagg3=1073741824
-flagh3=528
-flagi3=136314880
-flagj3=4224
-flagk3=65536
-flagl3=0
-flagm3=33554432
-tflag3=-2147477245
-dflag3=0
-posx3=50
-posy3=50
-sizx3=800
-sizy3=600
-maxfps3=0
-initts3=0
-winver3=0
-maxres3=0
-swapeffect3=0
-maxddinterface3=7
-slowratio3=2
-scanline3=0
-initresw3=800
-initresh3=600
-title4=empires.exe
-path4=D:\Games\Age of Empires Trial\empires.exe
-startfolder4=
-launchpath4=
-module4=
-opengllib4=
-notes4=
-registry4=
-ver4=0
-monitorid4=-1
-coord4=0
-flag4=673710114
-flagg4=1207959552
-flagh4=8212
-flagi4=138412036
-flagj4=4224
-flagk4=65536
-flagl4=0
-flagm4=2097152
-tflag4=0
-dflag4=0
-posx4=50
-posy4=50
-sizx4=800
-sizy4=600
-maxfps4=0
-initts4=0
-winver4=0
-maxres4=0
-swapeffect4=0
-maxddinterface4=7
-slowratio4=2
-scanline4=0
-initresw4=800
-initresh4=600
diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt
index e365471..98d7b8a 100644
--- a/build/readme-relnotes.txt
+++ b/build/readme-relnotes.txt
@@ -1547,3 +1547,15 @@ add: virtual heap (makes some "Wing Commander" games work)
fix: freak help->about...
add: GUI "Tools->Recover system colors" utility
+v2.04.15
+fix: suppress DDERR_EXCLUSIVEMODEALREADYSET error in ddraw::SetCooperativeLevel(). Fixes program termination in "Sid Meier's Alpha centauri".
+fix: exception caught on DirectDrawSurface::Release(): it may fix problems when using ddraw proxies
+fix: added clipper object to ddraw QueryInterface management
+fix: added IID_UNKNOWN object to ddraw QueryInterface management
+fix: better implementation of LIMITRESOURCES flag: now HD virtual space is 100MB free in a 120MB disk.
+fix: SLOWDOWN flag in PeekMessage now uses dxw.DoSlow(1) instead of *pSleep(1), preserves more messages
+add: more cases in mciSendCommand wrapper for BYPASSMCI flag
+fix: in mciSendCommand using ANSI MCI_OVLY_WINDOW_PARMS instead of WIDECHAR version
+fix: DirectDraw:GetCaps wrapper crash when setting SUPPRESSOVERLAY and the hw or sw caps pointer is NULL
+fix: exception when trying to use ddraw SetAppCompatData and LoadLibrary failed
+fix: error messages on LoadLibrary errors
diff --git a/dll/ddcreates.cpp b/dll/ddcreates.cpp
index e75477a..6606481 100644
--- a/dll/ddcreates.cpp
+++ b/dll/ddcreates.cpp
@@ -17,7 +17,7 @@
extern void SetPixFmt(LPDDSURFACEDESC2);
extern void GetPixFmt(LPDDSURFACEDESC2);
-extern CHAR *LogSurfaceAttributes(LPDDSURFACEDESC, char *, int);
+extern CHAR *LogSurfaceAttributes(LPDDSURFACEDESC2, char *, int);
extern void DumpPixFmt(LPDDSURFACEDESC2);
extern void DescribeSurface(LPDIRECTDRAWSURFACE, int, char *, int);
extern void HookDDSurface(LPDIRECTDRAWSURFACE *, int, BOOL);
@@ -95,7 +95,7 @@ static void BuildRealSurfaces(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurfa
// try DDSCAPS_SYSTEMMEMORY first, then suppress it if not supported
// no, DDSCAPS_SYSTEMMEMORY cause screen flickering while moving the window (and other troubles?)
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
- OutTraceDW("BuildRealSurfaces: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[EmuPrim]", __LINE__));
+ OutTraceDW("BuildRealSurfaces: %s\n", LogSurfaceAttributes(&ddsd, "[EmuPrim]", __LINE__));
res=(*pCreateSurface)(lpdd, &ddsd, &lpDDSEmu_Prim, 0);
if(res==DDERR_PRIMARYSURFACEALREADYEXISTS){
OutTraceDW("BuildRealSurfaces: ASSERT DDSEmu_Prim already exists\n");
@@ -146,11 +146,11 @@ static void BuildRealSurfaces(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurfa
ddsd.dwHeight = dxw.GetScreenHeight() << 1;
}
- OutTraceDW("BuildRealSurfaces: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[EmuBack]", __LINE__));
+ OutTraceDW("BuildRealSurfaces: %s\n", LogSurfaceAttributes(&ddsd, "[EmuBack]", __LINE__));
res=(*pCreateSurface)(lpdd, &ddsd, &lpDDSEmu_Back, 0);
if(res) {
ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY;
- OutTraceDW("BuildRealSurfaces: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[EmuBack]", __LINE__));
+ OutTraceDW("BuildRealSurfaces: %s\n", LogSurfaceAttributes(&ddsd, "[EmuBack]", __LINE__));
res=(*pCreateSurface)(lpdd, &ddsd, &lpDDSEmu_Back, 0);
}
if(res){
@@ -213,7 +213,7 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf
ddsd.dwHeight = dxw.GetScreenHeight();
// create Primary surface
- OutTraceDW("BuildPrimaryEmu: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]" , __LINE__));
+ OutTraceDW("BuildPrimaryEmu: %s\n", LogSurfaceAttributes(&ddsd, "[Primary]" , __LINE__));
res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0);
if(res){
OutTraceE("BuildPrimaryEmu: CreateSurface ERROR on DDSPrim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
@@ -293,7 +293,7 @@ static HRESULT BuildPrimaryFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pCrea
ddsd.dwHeight = dxw.GetScreenHeight();
// create Primary surface
- OutTraceDW("BuildPrimaryFlippable: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]" , __LINE__));
+ OutTraceDW("BuildPrimaryFlippable: %s\n", LogSurfaceAttributes(&ddsd, "[Primary]" , __LINE__));
res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0);
if(res){
OutTraceE("BuildPrimaryFlippable: CreateSurface ERROR on DDSPrim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
@@ -346,7 +346,7 @@ static HRESULT BuildPrimaryFullscreen(LPDIRECTDRAW lpdd, CreateSurface_Type pCre
memcpy((void *)&ddsd, lpddsd, lpddsd->dwSize);
// create Primary surface
- OutTraceDW("BuildPrimaryFullscreen: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]", __LINE__));
+ OutTraceDW("BuildPrimaryFullscreen: %s\n", LogSurfaceAttributes(&ddsd, "[Primary]", __LINE__));
res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0);
if(res){
if (res==DDERR_PRIMARYSURFACEALREADYEXISTS){
@@ -398,7 +398,7 @@ static HRESULT BuildPrimaryDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf
}
// create Primary surface
- OutTraceDW("BuildPrimaryDir: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]", __LINE__));
+ OutTraceDW("BuildPrimaryDir: %s\n", LogSurfaceAttributes(&ddsd, "[Primary]", __LINE__));
res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0);
if(res){
if (res==DDERR_PRIMARYSURFACEALREADYEXISTS){
@@ -431,7 +431,7 @@ static HRESULT BuildPrimaryDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf
ddsd.dwHeight = dxw.GetScreenHeight();
ddsd.ddsCaps.dwCaps = 0;
if (dxversion >= 4) ddsd.ddsCaps.dwCaps |= DDSCAPS_OFFSCREENPLAIN;
- OutTraceDW("BuildPrimaryDir: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Dir FixBuf]", __LINE__));
+ OutTraceDW("BuildPrimaryDir: %s\n", LogSurfaceAttributes(&ddsd, "[Dir FixBuf]", __LINE__));
res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0);
if(res){
OutTraceE("BuildPrimaryDir: CreateSurface ERROR on DDSPrim res=%x(%s) at %d\n",res, ExplainDDError(res), __LINE__);
@@ -478,7 +478,7 @@ static HRESULT BuildBackBufferEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateS
ddsd.dwHeight = dxw.GetScreenHeight();
GetPixFmt(&ddsd);
- OutTraceDW("BuildBackBufferEmu: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Backbuf]", __LINE__));
+ OutTraceDW("BuildBackBufferEmu: %s\n", LogSurfaceAttributes(&ddsd, "[Backbuf]", __LINE__));
res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0);
if(res) {
OutTraceE("BuildBackBufferEmu: CreateSurface ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
@@ -537,7 +537,7 @@ static HRESULT BuildBackBufferFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pC
ddsd.dwHeight = dxw.GetScreenHeight();
GetPixFmt(&ddsd);
- OutTraceDW("BuildBackBufferFlippable: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Backbuf]", __LINE__));
+ OutTraceDW("BuildBackBufferFlippable: %s\n", LogSurfaceAttributes(&ddsd, "[Backbuf]", __LINE__));
res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0);
if(res) {
OutTraceE("BuildBackBufferFlippable: CreateSurface ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
@@ -664,7 +664,7 @@ static HRESULT BuildBackBufferDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateS
ddsd.dwHeight = prim.dwHeight;
OutTraceDW("BuildBackBufferDir: BMX FIX res=%x(%s) wxh=(%dx%d)\n", res, ExplainDDError(res),ddsd.dwWidth, ddsd.dwHeight);
}
- OutTraceDW("BuildBackBufferDir: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Backbuf]", __LINE__));
+ OutTraceDW("BuildBackBufferDir: %s\n", LogSurfaceAttributes(&ddsd, "[Backbuf]", __LINE__));
res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0);
if(res) {
if ((dxw.dwFlags1 & SWITCHVIDEOMEMORY) && (res==DDERR_OUTOFVIDEOMEMORY)){
@@ -732,7 +732,7 @@ static HRESULT BuildGenericEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf
}
OutTraceDW("BuildGenericEmu: CREATED lpddsd=%x version=%d %s\n",
- *lplpdds, dxversion, LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Emu Generic]", __LINE__));
+ *lplpdds, dxversion, LogSurfaceAttributes(&ddsd, "[Emu Generic]", __LINE__));
// v2.02.66: if 8BPP paletized surface and a primary palette exixts, apply.
// fixes "Virtua Fighter PC" palette bug
@@ -785,7 +785,7 @@ static HRESULT BuildGenericFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pCrea
}
OutTraceDW("BuildGenericFlippable: CREATED lpddsd=%x version=%d %s\n",
- *lplpdds, dxversion, LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Emu Generic]", __LINE__));
+ *lplpdds, dxversion, LogSurfaceAttributes(&ddsd, "[Emu Generic]", __LINE__));
// v2.02.66: if 8BPP paletized surface and a primary palette exixts, apply.
// fixes "Virtua Fighter PC" palette bug
@@ -810,7 +810,7 @@ static HRESULT BuildGenericDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf
HRESULT res;
OutTraceDW("BuildGenericDir: lpdd=%x pCreateSurface=%x lpddsd=%x version=%d\n", lpdd, pCreateSurface, lpddsd, dxversion);
- OutTraceDW("BuildGenericDir: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)lpddsd, "[Dir Generic]", __LINE__));
+ OutTraceDW("BuildGenericDir: %s\n", LogSurfaceAttributes(lpddsd, "[Dir Generic]", __LINE__));
res = (*pCreateSurface)(lpdd, lpddsd, lplpdds, 0);
if(res){
@@ -828,7 +828,7 @@ static HRESULT BuildGenericDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf
}
OutTraceDW("BuildGenericDir: CREATED lpddsd=%x version=%d %s\n",
- *lplpdds, dxversion, LogSurfaceAttributes((LPDDSURFACEDESC)lpddsd, "[Dir Generic]", __LINE__));
+ *lplpdds, dxversion, LogSurfaceAttributes(lpddsd, "[Dir Generic]", __LINE__));
// hooks ....
HookDDSurface(lplpdds, dxversion, FALSE);
@@ -858,7 +858,7 @@ HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreateSurface
} SurfaceMode;
OutTraceDDRAW("CreateSurface(%d): lpdd=%x %s\n",
- dxversion, lpdd, LogSurfaceAttributes((LPDDSURFACEDESC)lpddsd, "[CreateSurface]", __LINE__));
+ dxversion, lpdd, LogSurfaceAttributes(lpddsd, "[CreateSurface]", __LINE__));
// v2.03.95.fx1 - deleted: some texture handling REQUIRES a proper FourCC codec.
// maybe it could be suppressed by a dedicated config. flag and on primary surfaces only?
diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp
index 79659d4..bb764a6 100644
--- a/dll/ddraw.cpp
+++ b/dll/ddraw.cpp
@@ -190,11 +190,11 @@ HRESULT WINAPI extFlip2(LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE, DWORD);
HRESULT WINAPI extFlip3(LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE, DWORD);
HRESULT WINAPI extFlip4(LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE, DWORD);
HRESULT WINAPI extFlip7(LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE, DWORD);
-HRESULT WINAPI extGetAttachedSurface1(LPDIRECTDRAWSURFACE, DDSCAPS *, LPDIRECTDRAWSURFACE *);
-HRESULT WINAPI extGetAttachedSurface2(LPDIRECTDRAWSURFACE, DDSCAPS *, LPDIRECTDRAWSURFACE *);
-HRESULT WINAPI extGetAttachedSurface3(LPDIRECTDRAWSURFACE, DDSCAPS *, LPDIRECTDRAWSURFACE *);
-HRESULT WINAPI extGetAttachedSurface4(LPDIRECTDRAWSURFACE, DDSCAPS *, LPDIRECTDRAWSURFACE *);
-HRESULT WINAPI extGetAttachedSurface7(LPDIRECTDRAWSURFACE, DDSCAPS *, LPDIRECTDRAWSURFACE *);
+HRESULT WINAPI extGetAttachedSurface1(LPDIRECTDRAWSURFACE, LPDDSCAPS, LPDIRECTDRAWSURFACE *);
+HRESULT WINAPI extGetAttachedSurface2(LPDIRECTDRAWSURFACE, LPDDSCAPS, LPDIRECTDRAWSURFACE *);
+HRESULT WINAPI extGetAttachedSurface3(LPDIRECTDRAWSURFACE, LPDDSCAPS, LPDIRECTDRAWSURFACE *);
+HRESULT WINAPI extGetAttachedSurface4(LPDIRECTDRAWSURFACE, LPDDSCAPS2, LPDIRECTDRAWSURFACE *);
+HRESULT WINAPI extGetAttachedSurface7(LPDIRECTDRAWSURFACE, LPDDSCAPS2, LPDIRECTDRAWSURFACE *);
HRESULT WINAPI extGetCaps1S(LPDIRECTDRAWSURFACE, LPDDSCAPS);
HRESULT WINAPI extGetCaps2S(LPDIRECTDRAWSURFACE, LPDDSCAPS);
HRESULT WINAPI extGetCaps3S(LPDIRECTDRAWSURFACE, LPDDSCAPS);
@@ -581,7 +581,7 @@ char *DumpPixelFormat(LPDDSURFACEDESC2 lpddsd)
return ExplainPixelFormat(&(lpddsd->ddpfPixelFormat));
}
-CHAR *LogSurfaceAttributes(LPDDSURFACEDESC lpddsd, char *label, int line)
+CHAR *LogSurfaceAttributes(LPDDSURFACEDESC2 lpddsd, char *label, int line)
{
static char sInfo[1024];
sprintf(sInfo, "SurfaceDesc: %s Flags=%x(%s)",
@@ -595,9 +595,10 @@ CHAR *LogSurfaceAttributes(LPDDSURFACEDESC lpddsd, char *label, int line)
if (lpddsd->dwFlags & DDSD_CAPS) {
sprintf(sInfo, "%s Caps=%x(%s)", sInfo, lpddsd->ddsCaps.dwCaps, ExplainDDSCaps(lpddsd->ddsCaps.dwCaps));
if(lpddsd->dwSize==sizeof(DDSURFACEDESC2)){
- LPDDSURFACEDESC2 lpddsd2=(LPDDSURFACEDESC2)lpddsd;
+ LPDDSURFACEDESC2 lpddsd2=lpddsd;
sprintf(sInfo, "%s Caps2=%x(%s)", sInfo, lpddsd2->ddsCaps.dwCaps2, ExplainDDSCaps2(lpddsd2->ddsCaps.dwCaps2));
sprintf(sInfo, "%s Caps3=%x(%s)", sInfo, lpddsd2->ddsCaps.dwCaps3, ExplainDDSCaps3(lpddsd2->ddsCaps.dwCaps3));
+ sprintf(sInfo, "%s Caps4=%x(%s)", sInfo, lpddsd2->ddsCaps.dwCaps4, ExplainDDSCaps4(lpddsd2->ddsCaps.dwCaps4));
}
}
if (lpddsd->dwFlags & DDSD_CKDESTBLT ) sprintf(sInfo, "%s CKDestBlt=(%x,%x)", sInfo, lpddsd->ddckCKDestBlt.dwColorSpaceLowValue, lpddsd->ddckCKDestBlt.dwColorSpaceHighValue);
@@ -606,7 +607,7 @@ CHAR *LogSurfaceAttributes(LPDDSURFACEDESC lpddsd, char *label, int line)
if (lpddsd->dwFlags & DDSD_CKSRCOVERLAY ) sprintf(sInfo, "%s CKSrcOverlay=(%x,%x)", sInfo, lpddsd->ddckCKSrcOverlay.dwColorSpaceLowValue, lpddsd->ddckCKSrcOverlay.dwColorSpaceHighValue);
if (lpddsd->dwFlags & DDSD_PIXELFORMAT ) sprintf(sInfo, "%s %s", sInfo, DumpPixelFormat((LPDDSURFACEDESC2)lpddsd));
if (lpddsd->dwFlags & DDSD_LPSURFACE) sprintf(sInfo, "%s Surface=%x", sInfo, lpddsd->lpSurface);
- if (lpddsd->dwFlags & DDSD_ZBUFFERBITDEPTH) sprintf(sInfo, "%s ZBufferBitDepth=%d", sInfo, lpddsd->dwZBufferBitDepth);
+ if ((lpddsd->dwFlags & DDSD_ZBUFFERBITDEPTH) && (lpddsd->dwSize==sizeof(DDSURFACEDESC))) sprintf(sInfo, "%s ZBufferBitDepth=%d", sInfo, ((LPDDSURFACEDESC)lpddsd)->dwZBufferBitDepth);
if (lpddsd->dwFlags & DDSD_ALPHABITDEPTH) sprintf(sInfo, "%s AlphaBitDepth=%d", sInfo, lpddsd->dwAlphaBitDepth);
if (lpddsd->dwReserved) sprintf(sInfo, "%s Reserved=%d", sInfo, lpddsd->dwReserved);
if (lpddsd->dwFlags & DDSD_REFRESHRATE) sprintf(sInfo, "%s RefreshRate=%d", sInfo, lpddsd->dwRefreshRate);
@@ -809,6 +810,9 @@ static void ddSetCompatibility()
HINSTANCE hinst;
hinst=(*pLoadLibraryA)("ddraw.dll");
+ if(!hinst){
+ OutTraceDW("LoadLibrary ddraw.dll ERROR err=%d at %d\n", GetLastError(), __LINE__);
+ }
pSetAppCompatData=(SetAppCompatData_Type)(*pGetProcAddress)(hinst, "SetAppCompatData");
if(pSetAppCompatData) {
if (dxw.dwFlags2 & SETCOMPATIBILITY){
@@ -822,9 +826,10 @@ static void ddSetCompatibility()
OutTraceDW("HookDirectDraw: SetAppCompatData(12,0) ret=%x(%s)\n", res, ExplainDDError(res));
}
}
- else
+ else{
OutTraceDW("HookDirectDraw: missing SetAppCompatData call\n");
- FreeLibrary(hinst);
+ }
+ (*pFreeLibrary)(hinst);
}
static void BypassGOGDDrawRedirector()
@@ -886,6 +891,7 @@ int HookDirectDraw(HMODULE module, int version)
HookLibraryEx(module, ddHooks, "ddraw.dll");
if(!pDirectDrawCreate){ // required for IAT patching
hinst = (*pLoadLibraryA)("ddraw.dll");
+ if(!hinst) OutTraceE("LoadLibrary ddraw.dll ERROR err=%d at %d\n", GetLastError(), __LINE__);
pDirectDrawCreate = (DirectDrawCreate_Type)GetProcAddress(hinst, "DirectDrawCreate");
pDirectDrawEnumerateA = (DirectDrawEnumerateA_Type)GetProcAddress(hinst, "DirectDrawEnumerateA");
}
@@ -901,10 +907,10 @@ int HookDirectDraw(HMODULE module, int version)
}
break;
case 7:
- //hinst = LoadLibrary("ddraw.dll");
HookLibraryEx(module, ddHooks, "ddraw.dll");
if(!pDirectDrawCreate){ // required for IAT patching in "Crimson skies"
hinst = (*pLoadLibraryA)("ddraw.dll");
+ if(!hinst) OutTraceE("LoadLibrary ddraw.dll ERROR err=%d at %d\n", GetLastError(), __LINE__);
pDirectDrawEnumerateA = (DirectDrawEnumerateA_Type)GetProcAddress(hinst, "DirectDrawEnumerateA");
pDirectDrawEnumerateExA = (DirectDrawEnumerateExA_Type)GetProcAddress(hinst, "DirectDrawEnumerateExA");
pDirectDrawCreate = (DirectDrawCreate_Type)GetProcAddress(hinst, "DirectDrawCreate");
@@ -1126,7 +1132,7 @@ void DescribeSurface(LPDIRECTDRAWSURFACE lpdds, int dxversion, char *label, int
res=(*pGetSurfaceDescMethod())((LPDIRECTDRAWSURFACE2)lpdds, &ddsd);
if(res)return;
OutTraceDW("Surface %s: ddsd=%x dxversion=%d %s\n",
- label, lpdds, dxversion, LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, label, line));
+ label, lpdds, dxversion, LogSurfaceAttributes(&ddsd, label, line));
}
void RegisterPixelFormat(int dxversion, LPDIRECTDRAWSURFACE lpdds)
@@ -1325,7 +1331,7 @@ void HookDDSession(LPDIRECTDRAW *lplpdd, int dxversion)
}
}
-static void HookDDClipper(LPDIRECTDRAWCLIPPER FAR* lplpDDClipper)
+void HookDDClipper(LPDIRECTDRAWCLIPPER FAR* lplpDDClipper)
{
OutTraceDW("Hooking directdraw clipper dd=%x\n", *lplpDDClipper);
@@ -1706,20 +1712,25 @@ static HRESULT WINAPI extGetCapsD(int dxversion, GetCapsD_Type pGetCapsD, LPDIRE
if(dxw.dwFlags3 & CAPMASK) MaskCapsD(c1, c2);
- if(dxw.dwFlags7 & SUPPRESSOVERLAY){
#define OVERLAYLAYERCAPS \
(DDCAPS_OVERLAY|DDCAPS_OVERLAYCANTCLIP|\
DDCAPS_OVERLAYFOURCC|DDCAPS_OVERLAYSTRETCH)
- c1->ddsCaps.dwCaps &= ~OVERLAYLAYERCAPS;
- c2->ddsCaps.dwCaps &= ~OVERLAYLAYERCAPS;
#define OVERLAYKEYCAPS \
(DDCKEYCAPS_DESTOVERLAY|DDCKEYCAPS_DESTOVERLAYYUV|\
DDCKEYCAPS_SRCOVERLAY|DDCKEYCAPS_SRCOVERLAYYUV|\
DDCKEYCAPS_SRCOVERLAYCLRSPACE|DDCKEYCAPS_SRCOVERLAYCLRSPACEYUV)
- c1->dwCKeyCaps &= ~OVERLAYKEYCAPS;
- c2->dwCKeyCaps &= ~OVERLAYKEYCAPS;
- c1->dwMaxVisibleOverlays = c1->dwCurrVisibleOverlays = 0;
- c2->dwMaxVisibleOverlays = c2->dwCurrVisibleOverlays = 0;
+
+ if(dxw.dwFlags7 & SUPPRESSOVERLAY){
+ if(c1){
+ c1->ddsCaps.dwCaps &= ~OVERLAYLAYERCAPS;
+ c1->dwCKeyCaps &= ~OVERLAYKEYCAPS;
+ c1->dwMaxVisibleOverlays = c1->dwCurrVisibleOverlays = 0;
+ }
+ if(c2){
+ c2->ddsCaps.dwCaps &= ~OVERLAYLAYERCAPS;
+ c2->dwCKeyCaps &= ~OVERLAYKEYCAPS;
+ c2->dwMaxVisibleOverlays = c2->dwCurrVisibleOverlays = 0;
+ }
}
return res;
@@ -1747,7 +1758,7 @@ HRESULT WINAPI extDirectDrawCreate(GUID FAR *lpguid, LPDIRECTDRAW FAR *lplpdd, I
HINSTANCE hinst;
hinst = (*pLoadLibraryA)("ddraw.dll");
if(!hinst){
- OutTraceE("LoadLibrary ERROR err=%d at %d\n", GetLastError(), __LINE__);
+ OutTraceE("LoadLibrary ddraw.dll ERROR err=%d at %d\n", GetLastError(), __LINE__);
}
pDirectDrawCreate =
(DirectDrawCreate_Type)GetProcAddress(hinst, "DirectDrawCreate");
@@ -1841,7 +1852,7 @@ HRESULT WINAPI extDirectDrawCreateEx(GUID FAR *lpguid,
HINSTANCE hinst;
hinst = (*pLoadLibraryA)("ddraw.dll");
if(!hinst){
- OutTraceE("LoadLibrary ERROR err=%d at %d\n", GetLastError(), __LINE__);
+ OutTraceE("LoadLibrary ddraw.dll ERROR err=%d at %d\n", GetLastError(), __LINE__);
}
pDirectDrawCreateEx =
(DirectDrawCreateEx_Type)GetProcAddress(hinst, "DirectDrawCreateEx");
@@ -2278,14 +2289,22 @@ HRESULT WINAPI extSetCooperativeLevel(int dxversion, SetCooperativeLevel_Type pS
res=(*pSetCooperativeLevel)(lpdd, hwnd, dwflags);
if(res){
- if(res == DDERR_INVALIDPARAMS){
- //hwnd = GetForegroundWindow();
- PostMessage(hwnd, WM_SYSCOMMAND, SC_RESTORE, 0);
- Sleep(1000);
- res=(*pSetCooperativeLevel)(lpdd, hwnd, dwflags);
+ switch(res){
+ case DDERR_EXCLUSIVEMODEALREADYSET: // v2.04.15 - "Sid Meier's Alpha Centauri" in non-windowed mode
+ OutTraceDW("SetCooperativeLevel: bypass DDERR_EXCLUSIVEMODEALREADYSET\n");
+ res = 0;
+ break;
+ case DDERR_INVALIDPARAMS:
+ //hwnd = GetForegroundWindow();
+ PostMessage(hwnd, WM_SYSCOMMAND, SC_RESTORE, 0);
+ Sleep(1000);
+ res=(*pSetCooperativeLevel)(lpdd, hwnd, dwflags);
+ break;
+ }
+ if(res){
+ OutTraceE("SetCooperativeLevel: ERROR lpdd=%x hwnd=%x Flags=%x err=%x(%s) at %d\n",
+ lpdd, hwnd, dwflags, res, ExplainDDError(res), __LINE__);
}
- OutTraceE("SetCooperativeLevel: ERROR lpdd=%x hwnd=%x Flags=%x err=%x(%s) at %d\n",
- lpdd, hwnd, dwflags, res, ExplainDDError(res), __LINE__);
}
if(bFixFrame){
@@ -2431,7 +2450,7 @@ HRESULT WINAPI extCreateSurface7(LPDIRECTDRAW lpdd, DDSURFACEDESC2 *lpddsd, LPDI
HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGetAttachedSurface,
- LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS lpddsc, LPDIRECTDRAWSURFACE *lplpddas)
+ LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS2 lpddsc, LPDIRECTDRAWSURFACE *lplpddas)
{
HRESULT res;
BOOL IsPrim;
@@ -2439,8 +2458,14 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet
IsPrim=dxwss.IsAPrimarySurface(lpdds);
IsBack=dxwss.IsABackBufferSurface(lpdds);
- OutTraceDDRAW("GetAttachedSurface(%d): lpdds=%x%s caps=%x(%s)\n",
- dxversion, lpdds, (IsPrim?"(PRIM)":(IsBack ? "(BACK)":"")), lpddsc->dwCaps, ExplainDDSCaps(lpddsc->dwCaps));
+ if(IsTraceDDRAW){
+ char sCaps2[60];
+ strcpy(sCaps2, "");
+ if(dxversion >= 4) sprintf(sCaps2, " caps2=%x caps3=%x caps4=%x", lpddsc->dwCaps2, lpddsc->dwCaps3, lpddsc->dwCaps4);
+ OutTrace("GetAttachedSurface(%d): lpdds=%x%s caps=%x(%s)%s\n",
+ dxversion, lpdds, (IsPrim?"(PRIM)":(IsBack ? "(BACK)":"")),
+ lpddsc->dwCaps, ExplainDDSCaps(lpddsc->dwCaps), sCaps2);
+ }
if(dxw.dwFlags1 & EMULATESURFACE){
@@ -2499,7 +2524,7 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet
// proxy the call...
- res=(*pGetAttachedSurface)(lpdds, lpddsc, lplpddas);
+ res=(*pGetAttachedSurface)(lpdds, (LPDDSCAPS)lpddsc, lplpddas);
if(res) {
// if possible, simulate a backbuffer attached to primary surface
if (IsPrim && (DDSD_Prim.dwBackBufferCount > 0) && (lpddsc->dwCaps & (DDSCAPS_BACKBUFFER|DDSCAPS_FLIP))){
@@ -2548,7 +2573,9 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet
}
else sMode = "unknown";
}
- else sMode = "known";
+ else {
+ sMode = "known";
+ }
OutTraceDW("GetAttachedSurface(%d): ZBUFFER caps=%x(%s) (%s)\n", dxversion, dwCaps, ExplainDDSCaps(dwCaps), sMode);
}
@@ -2559,14 +2586,14 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet
}
HRESULT WINAPI extGetAttachedSurface1(LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS lpddsc, LPDIRECTDRAWSURFACE *lplpddas)
-{ return extGetAttachedSurface(1, pGetAttachedSurface1, lpdds, lpddsc, lplpddas); }
+{ return extGetAttachedSurface(1, pGetAttachedSurface1, lpdds, (LPDDSCAPS2)lpddsc, lplpddas); }
HRESULT WINAPI extGetAttachedSurface2(LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS lpddsc, LPDIRECTDRAWSURFACE *lplpddas)
-{ return extGetAttachedSurface(2, pGetAttachedSurface2, lpdds, lpddsc, lplpddas); }
+{ return extGetAttachedSurface(2, pGetAttachedSurface2, lpdds, (LPDDSCAPS2)lpddsc, lplpddas); }
HRESULT WINAPI extGetAttachedSurface3(LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS lpddsc, LPDIRECTDRAWSURFACE *lplpddas)
-{ return extGetAttachedSurface(3, pGetAttachedSurface3, lpdds, lpddsc, lplpddas); }
-HRESULT WINAPI extGetAttachedSurface4(LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS lpddsc, LPDIRECTDRAWSURFACE *lplpddas)
+{ return extGetAttachedSurface(3, pGetAttachedSurface3, lpdds, (LPDDSCAPS2)lpddsc, lplpddas); }
+HRESULT WINAPI extGetAttachedSurface4(LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS2 lpddsc, LPDIRECTDRAWSURFACE *lplpddas)
{ return extGetAttachedSurface(4, pGetAttachedSurface4, lpdds, lpddsc, lplpddas); }
-HRESULT WINAPI extGetAttachedSurface7(LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS lpddsc, LPDIRECTDRAWSURFACE *lplpddas)
+HRESULT WINAPI extGetAttachedSurface7(LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS2 lpddsc, LPDIRECTDRAWSURFACE *lplpddas)
{ return extGetAttachedSurface(7, pGetAttachedSurface7, lpdds, lpddsc, lplpddas); }
void BlitError(HRESULT res, LPRECT lps, LPRECT lpd, int line)
@@ -2709,7 +2736,7 @@ HRESULT WINAPI PrimaryStretchBlt(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFA
res=(*pCreateSurface)(lpPrimaryDD, (LPDDSURFACEDESC)&ddsd, &lpddsTmp, NULL);
if(res) {
OutTraceE("PrimaryStretchBlt: CreateSurface ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
- OutTraceB("PrimaryStretchBlt: CreateSurface %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Gateway]", __LINE__));
+ OutTraceB("PrimaryStretchBlt: CreateSurface %s\n", LogSurfaceAttributes(&ddsd, "[Gateway]", __LINE__));
return res;
}
// stretch-blit to target size on OFFSCREENPLAIN temp surface
@@ -3117,7 +3144,7 @@ HRESULT WINAPI extFlip(int dxversion, Flip_Type pFlip, LPDIRECTDRAWSURFACE lpdds
if(res2) {
OutTraceE("CreateSurface: ERROR %x(%s) at %d\n", res2, ExplainDDError(res2), __LINE__);
OutTraceE("Size=%d lpPrimaryDD=%x lpDDSBack=%x %s\n",
- ddsd.dwSize, lpPrimaryDD, lpDDSBack, LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[FlipBuf]", __LINE__));
+ ddsd.dwSize, lpPrimaryDD, lpDDSBack, LogSurfaceAttributes(&ddsd, "[FlipBuf]", __LINE__));
}
//OutTrace("DEBUG: copied surface size=(%dx%d)\n", ddsd.dwWidth, ddsd.dwHeight);
// copy front buffer
@@ -3518,12 +3545,12 @@ HRESULT WINAPI extSetEntries(LPDIRECTDRAWPALETTE lpddp, DWORD dwflags, DWORD dws
return res;
}
-static HRESULT WINAPI extSetClipper(SetClipper_Type pSetClipper, LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWCLIPPER lpddc)
+static HRESULT WINAPI extSetClipper(int dxversion, SetClipper_Type pSetClipper, LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWCLIPPER lpddc)
{
HRESULT res;
BOOL isPrim;
isPrim=dxwss.IsAPrimarySurface(lpdds);
- OutTraceDDRAW("SetClipper: lpdds=%x%s lpddc=%x\n", lpdds, isPrim?"(PRIM)":"", lpddc);
+ OutTraceDDRAW("SetClipper(%d): lpdds=%x%s lpddc=%x\n", dxversion, lpdds, isPrim?"(PRIM)":"", lpddc);
// v2.1.84: SUPPRESSCLIPPING flag - improves "Monopoly Edition 3D" where continuous
// clipping ON & OFF affects blitting on primary surface.
@@ -3562,15 +3589,15 @@ static HRESULT WINAPI extSetClipper(SetClipper_Type pSetClipper, LPDIRECTDRAWSUR
}
HRESULT WINAPI extSetClipper1(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWCLIPPER lpddc)
-{ return extSetClipper(pSetClipper1, lpdds, lpddc); }
+{ return extSetClipper(1, pSetClipper1, lpdds, lpddc); }
HRESULT WINAPI extSetClipper2(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWCLIPPER lpddc)
-{ return extSetClipper(pSetClipper2, lpdds, lpddc); }
+{ return extSetClipper(2, pSetClipper2, lpdds, lpddc); }
HRESULT WINAPI extSetClipper3(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWCLIPPER lpddc)
-{ return extSetClipper(pSetClipper3, lpdds, lpddc); }
+{ return extSetClipper(3, pSetClipper3, lpdds, lpddc); }
HRESULT WINAPI extSetClipper4(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWCLIPPER lpddc)
-{ return extSetClipper(pSetClipper4, lpdds, lpddc); }
+{ return extSetClipper(4, pSetClipper4, lpdds, lpddc); }
HRESULT WINAPI extSetClipper7(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWCLIPPER lpddc)
-{ return extSetClipper(pSetClipper7, lpdds, lpddc); }
+{ return extSetClipper(7, pSetClipper7, lpdds, lpddc); }
DDSURFACEDESC SaveSurfaceDesc;
LPDIRECTDRAWSURFACE SaveSurface = NULL;
@@ -3624,8 +3651,8 @@ static HRESULT WINAPI extLock(int dxversion, Lock_Type pLock, LPDIRECTDRAWSURFAC
OutTraceDW("Lock SURFACELOST RETRY: ret=%x(%s)\n", res, ExplainDDError(res));
}
if(res) OutTraceE("Lock ERROR: ret=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
- OutTraceB("Lock: lPitch=%d lpSurface=%x ZBufferBitDepth=%d %s\n",
- lpDDSurfaceDesc->lPitch, lpDDSurfaceDesc->lpSurface, lpDDSurfaceDesc->dwZBufferBitDepth, LogSurfaceAttributes(lpDDSurfaceDesc, "[Locked]", __LINE__));
+ OutTraceB("Lock: lPitch=%d lpSurface=%x %s\n",
+ lpDDSurfaceDesc->lPitch, lpDDSurfaceDesc->lpSurface, LogSurfaceAttributes((LPDDSURFACEDESC2)lpDDSurfaceDesc, "[Locked]", __LINE__));
// v2.03.60: necessary for "Mech Commander 2"
if(dxw.dwFlags6 & SETZBUFFERBITDEPTHS)
@@ -3699,7 +3726,7 @@ static HRESULT WINAPI extLockDir(int dxversion, Lock_Type pLock, LPDIRECTDRAWSUR
ddsd.dwWidth = dxw.GetScreenWidth();
ddsd.dwHeight = dxw.GetScreenHeight();
ddsd.ddsCaps.dwCaps = 0;
- OutTraceB("Lock: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Dir FixBuf]" , __LINE__));
+ OutTraceB("Lock: %s\n", LogSurfaceAttributes(&ddsd, "[Dir FixBuf]" , __LINE__));
res=(*pCreateSurface1)(lpPrimaryDD, (DDSURFACEDESC *)&ddsd, (LPDIRECTDRAWSURFACE *)&lpDDSBuffer, 0);
if(res){
OutTraceE("CreateSurface: ERROR on DDSBuffer res=%x(%s) at %d\n",res, ExplainDDError(res), __LINE__);
@@ -3743,8 +3770,8 @@ static HRESULT WINAPI extLockDir(int dxversion, Lock_Type pLock, LPDIRECTDRAWSUR
}
if(res) OutTraceE("Lock ERROR: ret=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
- OutTraceB("Lock: lPitch=%d lpSurface=%x ZBufferBitDepth=%d %s\n",
- lpDDSurfaceDesc->lPitch, lpDDSurfaceDesc->lpSurface, lpDDSurfaceDesc->dwZBufferBitDepth, LogSurfaceAttributes(lpDDSurfaceDesc, "[Locked]", __LINE__));
+ OutTraceB("Lock: lPitch=%d lpSurface=%x %s\n",
+ lpDDSurfaceDesc->lPitch, lpDDSurfaceDesc->lpSurface, LogSurfaceAttributes((LPDDSURFACEDESC2)lpDDSurfaceDesc, "[Locked]", __LINE__));
// v2.03.60: necessary for "Mech Commander 2"
if(dxw.dwFlags6 & SETZBUFFERBITDEPTHS)
@@ -4307,7 +4334,7 @@ HRESULT WINAPI extEnumDisplayModes(int dxversion, EnumDisplayModes1_Type pEnumDi
NewContext_Type NewContext;
OutTraceDDRAW("EnumDisplayModes(D%d): lpdd=%x flags=%x lpddsd=%x callback=%x\n", dxversion, lpdd, dwflags, lpddsd, cb);
- if(lpddsd) OutTraceDDRAW("EnumDisplayModes(D): %s\n", LogSurfaceAttributes(lpddsd, "EnumDisplayModes", __LINE__));
+ if(lpddsd) OutTraceDDRAW("EnumDisplayModes(D): %s\n", LogSurfaceAttributes((LPDDSURFACEDESC2)lpddsd, "EnumDisplayModes", __LINE__));
if ((dxw.dwFlags4 & NATIVERES) ||
(!(dxw.dwFlags1 & EMULATESURFACE) && !dxw.Windowize)){ // v2.04.14 - make nonemulated nonwindowed mode work ...
@@ -4470,7 +4497,13 @@ HRESULT WINAPI extReleaseS(ReleaseS_Type pReleaseS, LPDIRECTDRAWSURFACE lpdds)
return 0;
}
- res = (*pReleaseS)(lpdds);
+ __try { // try/except useful when using proxy dll
+ res = (*pReleaseS)(lpdds);
+ }
+ __except(EXCEPTION_EXECUTE_HANDLER){
+ OutTraceE("Release(S): EXCEPTION lpdds=%x%s res=0\n", lpdds, dxwss.ExplainSurfaceRole(lpdds));
+ res = 0;
+ }
OutTraceDDRAW("Release(S): lpdds=%x%s refcount=%d\n", lpdds, dxwss.ExplainSurfaceRole(lpdds), res);
if (res==0) { // common precondition
@@ -4694,13 +4727,16 @@ static HRESULT WINAPI extAddAttachedSurface(AddAttachedSurface_Type pAddAttached
// v2.02.13: emulate ZBUFFER attach to backbuffer/plain surface
if ((sd.ddsCaps.dwCaps & DDSCAPS_ZBUFFER) && (dxw.dwFlags1 & EMULATESURFACE)){
DWORD dwCaps;
- OutTraceDW("AddAttachedSurface: registering ZBUFFER attach on %s surface\n", IsBack ? "BACKBUFFER" : "PLAIN");
- dwCaps = dxwcdb.GetCaps(lpdds);
- if(dwCaps){
- dwCaps &= ~(DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_BACKBUFFER|DDSCAPS_3DDEVICE|DDSCAPS_COMPLEX);
- dwCaps |= DDSCAPS_ZBUFFER;
- //if(dwCaps & DDSCAPS_VIDEOMEMORY) dwCaps|=DDSCAPS_LOCALVIDMEM;
- dxwcdb.PushCaps(lpddsadd, dwCaps);
+ dwCaps = dxwcdb.GetCaps(lpddsadd);
+ if(!dwCaps){
+ OutTraceDW("AddAttachedSurface: registering ZBUFFER attach on %s surface\n", IsBack ? "BACKBUFFER" : "PLAIN");
+ dwCaps = dxwcdb.GetCaps(lpdds);
+ if(dwCaps){
+ dwCaps &= ~(DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_BACKBUFFER|DDSCAPS_3DDEVICE|DDSCAPS_COMPLEX);
+ dwCaps |= DDSCAPS_ZBUFFER;
+ //if(dwCaps & DDSCAPS_VIDEOMEMORY) dwCaps|=DDSCAPS_LOCALVIDMEM;
+ dxwcdb.PushCaps(lpddsadd, dwCaps);
+ }
}
}
}
@@ -4859,7 +4895,7 @@ static HRESULT WINAPI extGetSurfaceDesc(int dxversion, GetSurfaceDesc_Type pGetS
if(IsBack) sLabel="(BACK)";
if(IsZBuf) sLabel="(ZBUFFER)";
- OutTraceDDRAW("GetSurfaceDesc(%d): lpdds=%x%s %s\n", dxversion, lpdds, sLabel, LogSurfaceAttributes(lpddsd, "GetSurfaceDesc", __LINE__));
+ OutTraceDDRAW("GetSurfaceDesc(%d): lpdds=%x%s %s\n", dxversion, lpdds, sLabel, LogSurfaceAttributes((LPDDSURFACEDESC2)lpddsd, "GetSurfaceDesc", __LINE__));
if(!(dxw.IsEmulated || dxw.Windowize)) return res;
@@ -4887,7 +4923,7 @@ static HRESULT WINAPI extGetSurfaceDesc(int dxversion, GetSurfaceDesc_Type pGetS
}
if(IsFixed){
- OutTraceDW("GetSurfaceDesc: FIXED lpdds=%x %s\n", lpdds, LogSurfaceAttributes(lpddsd, sLabel, __LINE__));
+ OutTraceDW("GetSurfaceDesc: FIXED lpdds=%x %s\n", lpdds, LogSurfaceAttributes((LPDDSURFACEDESC2)lpddsd, sLabel, __LINE__));
//if(IsDebug) HexTrace((unsigned char *)lpddsd, sizeof(DDSURFACEDESC));
}
@@ -4969,11 +5005,11 @@ ULONG WINAPI extReleaseD4(LPDIRECTDRAW lpdd)
ULONG WINAPI extReleaseD7(LPDIRECTDRAW lpdd)
{ return extReleaseD(7, pReleaseD7, lpdd); }
-static HRESULT WINAPI extCreateClipper(CreateClipper_Type pCreateClipper, LPDIRECTDRAW lpdd, DWORD dwflags,
+static HRESULT WINAPI extCreateClipper(int dxversion, CreateClipper_Type pCreateClipper, LPDIRECTDRAW lpdd, DWORD dwflags,
LPDIRECTDRAWCLIPPER FAR* lplpDDClipper, IUnknown FAR* pUnkOuter)
{
HRESULT res;
- OutTraceDDRAW("CreateClipper: lpdd=%x flags=%x\n", lpdd, dwflags);
+ OutTraceDDRAW("CreateClipper(%d): lpdd=%x flags=%x\n", dxversion, lpdd, dwflags);
res=(*pCreateClipper)(lpdd, dwflags, lplpDDClipper, pUnkOuter);
if(res) {
OutTraceE("CreateClipper: ERROR res=%x(%s)\n", lpdd, res, ExplainDDError(res));
@@ -4985,15 +5021,15 @@ static HRESULT WINAPI extCreateClipper(CreateClipper_Type pCreateClipper, LPDIRE
}
HRESULT WINAPI extCreateClipper1(LPDIRECTDRAW lpdd, DWORD dwflags, LPDIRECTDRAWCLIPPER FAR* lplpDDClipper, IUnknown FAR* pUnkOuter)
-{ return extCreateClipper(pCreateClipper1, lpdd, dwflags, lplpDDClipper, pUnkOuter); }
+{ return extCreateClipper(1, pCreateClipper1, lpdd, dwflags, lplpDDClipper, pUnkOuter); }
HRESULT WINAPI extCreateClipper2(LPDIRECTDRAW lpdd, DWORD dwflags, LPDIRECTDRAWCLIPPER FAR* lplpDDClipper, IUnknown FAR* pUnkOuter)
-{ return extCreateClipper(pCreateClipper2, lpdd, dwflags, lplpDDClipper, pUnkOuter); }
+{ return extCreateClipper(2, pCreateClipper2, lpdd, dwflags, lplpDDClipper, pUnkOuter); }
HRESULT WINAPI extCreateClipper3(LPDIRECTDRAW lpdd, DWORD dwflags, LPDIRECTDRAWCLIPPER FAR* lplpDDClipper, IUnknown FAR* pUnkOuter)
-{ return extCreateClipper(pCreateClipper3, lpdd, dwflags, lplpDDClipper, pUnkOuter); }
+{ return extCreateClipper(3, pCreateClipper3, lpdd, dwflags, lplpDDClipper, pUnkOuter); }
HRESULT WINAPI extCreateClipper4(LPDIRECTDRAW lpdd, DWORD dwflags, LPDIRECTDRAWCLIPPER FAR* lplpDDClipper, IUnknown FAR* pUnkOuter)
-{ return extCreateClipper(pCreateClipper4, lpdd, dwflags, lplpDDClipper, pUnkOuter); }
+{ return extCreateClipper(4, pCreateClipper4, lpdd, dwflags, lplpDDClipper, pUnkOuter); }
HRESULT WINAPI extCreateClipper7(LPDIRECTDRAW lpdd, DWORD dwflags, LPDIRECTDRAWCLIPPER FAR* lplpDDClipper, IUnknown FAR* pUnkOuter)
-{ return extCreateClipper(pCreateClipper7, lpdd, dwflags, lplpDDClipper, pUnkOuter); }
+{ return extCreateClipper(7, pCreateClipper7, lpdd, dwflags, lplpDDClipper, pUnkOuter); }
HRESULT WINAPI extReleaseC(LPDIRECTDRAWCLIPPER lpddClip)
{
@@ -5292,9 +5328,11 @@ static HRESULT WINAPI extGetAvailableVidMem(int dxversion, GetAvailableVidMem4_T
return res;
}
- if(dxversion == 2){
- OutTraceDW("GetAvailableVidMem(D2): DDSCaps=%x(%s) Total=%x Free=%x\n",
- lpDDSCaps->dwCaps, ExplainDDSCaps(lpDDSCaps->dwCaps), lpdwTotal?*lpdwTotal:0, lpdwFree?*lpdwFree:0);
+ if(dxversion < 4){ // fix: should include also dxversion 3!!!
+ OutTraceDW("GetAvailableVidMem(D%d): DDSCaps=%x(%s) Total=%x Free=%x\n",
+ dxversion,
+ lpDDSCaps->dwCaps, ExplainDDSCaps(lpDDSCaps->dwCaps),
+ lpdwTotal?*lpdwTotal:0, lpdwFree?*lpdwFree:0);
}
else{
OutTraceDW("GetAvailableVidMem(D%d): DDSCaps=%x(%s).%x.%x.%x volumedepth=%d Total=%x Free=%x\n",
diff --git a/dll/dinput.cpp b/dll/dinput.cpp
index b2c0108..a284593 100644
--- a/dll/dinput.cpp
+++ b/dll/dinput.cpp
@@ -171,6 +171,10 @@ void HookDirectInput(HMODULE module)
HookLibraryEx(module, diHooks, "dinput.dll");
if(!pDirectInputCreateA && !pDirectInputCreateW && !pDirectInputCreateEx){
hinst = LoadLibrary("dinput.dll");
+ if(!hinst) {
+ OutTraceE("LoadLibrary dinput.dll ERROR err=%d at %d\n", GetLastError(), __LINE__);
+ return;
+ }
pDirectInputCreateA = (DirectInputCreateA_Type)GetProcAddress(hinst, "DirectInputCreateA");
if(pDirectInputCreateA)
if(!extDirectInputCreateA(GetModuleHandle(0), DIRECTINPUT_VERSION,
@@ -193,6 +197,10 @@ void HookDirectInput8(HMODULE module)
HookLibraryEx(module, di8Hooks, "dinput8.dll");
if(!pDirectInput8Create){
hinst = LoadLibrary("dinput8.dll");
+ if(!hinst) {
+ OutTraceE("LoadLibrary dinput8.dll ERROR err=%d at %d\n", GetLastError(), __LINE__);
+ return;
+ }
pDirectInput8Create = (DirectInput8Create_Type)GetProcAddress(hinst, "DirectInput8Create");
if(pDirectInput8Create)
if(!extDirectInput8Create(GetModuleHandle(0), DIRECTINPUT8_VERSION,
diff --git a/dll/dxhelper.cpp b/dll/dxhelper.cpp
index 5223905..619d3b8 100644
--- a/dll/dxhelper.cpp
+++ b/dll/dxhelper.cpp
@@ -154,6 +154,19 @@ char *ExplainDDSCaps3(DWORD c)
return(eb);
}
+char *ExplainDDSCaps4(DWORD c)
+{
+ static char eb[256];
+ unsigned int l;
+ strcpy(eb,"DDSCAPS4_");
+ // insert here ....
+ // if (c & DDSCAPS4_XXX) strcat(eb, "XXX+");
+ l=strlen(eb);
+ if (l>strlen("DDSCAPS4_")) eb[l-1]=0; // delete last '+' if any
+ else eb[0]=0;
+ return(eb);
+}
+
char *ExplainDDDCaps(DWORD c)
{
static char eb[512];
diff --git a/dll/dxhelper.h b/dll/dxhelper.h
index 3c06ec5..2475073 100644
--- a/dll/dxhelper.h
+++ b/dll/dxhelper.h
@@ -5,6 +5,7 @@ extern char *ExplainFlags(DWORD);
extern char *ExplainDDSCaps(DWORD);
extern char *ExplainDDSCaps2(DWORD);
extern char *ExplainDDSCaps3(DWORD);
+extern char *ExplainDDSCaps4(DWORD);
extern char *ExplainDDDCaps(DWORD);
extern char *ExplainDDDCaps2(DWORD);
extern char *ExplainDDPalCaps(DWORD);
diff --git a/dll/dxhook.h b/dll/dxhook.h
index d44b6a7..ed1becb 100644
--- a/dll/dxhook.h
+++ b/dll/dxhook.h
@@ -74,3 +74,5 @@ extern void HookLibraryEx(HMODULE, HookEntryEx_Type *, char *);
extern void PinLibraryEx(HookEntryEx_Type *, char *);
extern void HookLibInitEx(HookEntryEx_Type *);
extern BOOL IsHotPatchedEx(HookEntryEx_Type *, char *);
+
+#define MISSING ((FARPROC)-1)
\ No newline at end of file
diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp
index a77cf78..c550cc2 100644
--- a/dll/dxwnd.cpp
+++ b/dll/dxwnd.cpp
@@ -27,7 +27,7 @@ along with this program. If not, see .
#include "TlHelp32.h"
-#define VERSION "2.04.14"
+#define VERSION "2.04.15"
#define DDTHREADLOCK 1
diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo
index 8076559..48d23b4 100644
Binary files a/dll/dxwnd.vs2008.suo and b/dll/dxwnd.vs2008.suo differ
diff --git a/dll/kernel32.cpp b/dll/kernel32.cpp
index 731ab39..c1445b8 100644
--- a/dll/kernel32.cpp
+++ b/dll/kernel32.cpp
@@ -56,28 +56,6 @@ HeapCompact_Type pHeapCompact;
GetProcessHeap_Type pGetProcessHeap;
HeapDestroy_Type pHeapDestroy;
-typedef BOOL (WINAPI *FreeLibrary_Type)(HMODULE);
-FreeLibrary_Type pFreeLibrary = NULL;
-BOOL WINAPI extFreeLibrary(HMODULE hModule)
-{
- BOOL ret;
- static HMODULE hLastModule;
- OutTraceB("FreeLibrary: hModule=%x\n", hModule);
- ret = (*pFreeLibrary)(hModule);
- if(ret){
- OutTrace("FreeLibrary: ret=%x\n", ret);
- if((hModule == hLastModule) && (dxw.dwFlags7 & FIXFREELIBRARY)) {
- OutTraceDW("FreeLibrary: FIXFREELIBRARY hack ret=0\n");
- ret = 0;
- }
- hLastModule = hModule;
- }
- else {
- OutTraceE("FreeLibrary ERROR: err=%d\n", GetLastError());
- }
- return ret;
-}
-
// v2.02.96: the GetSystemInfo API is NOT hot patchable on Win7. This can cause problems because it can't be hooked by simply
// enabling hot patch. A solution is making all LoadLibrary* calls hot patchable, so that when loading the module, the call
// can be hooked by the IAT lookup. This fixes a problem after movie playing in Wind Fantasy SP.
@@ -225,8 +203,21 @@ BOOL WINAPI extGetDiskFreeSpaceA(LPCSTR lpRootPathName, LPDWORD lpSectorsPerClus
BOOL ret;
OutTraceDW("GetDiskFreeSpace: RootPathName=\"%s\"\n", lpRootPathName);
ret=(*pGetDiskFreeSpaceA)(lpRootPathName, lpSectorsPerCluster, lpBytesPerSector, lpNumberOfFreeClusters, lpTotalNumberOfClusters);
- if(!ret) OutTraceE("GetDiskFreeSpace: ERROR err=%d at %d\n", GetLastError(), __LINE__);
- *lpNumberOfFreeClusters = 16000;
+ if(ret) {
+ OutTraceDW("GetDiskFreeSpace: SectXCluster=%d BytesXSect=%d FreeClusters=%d TotalClusters=%d\n",
+ *lpSectorsPerCluster, *lpBytesPerSector, *lpNumberOfFreeClusters, *lpTotalNumberOfClusters);
+ }
+ else {
+ OutTraceE("GetDiskFreeSpace: ERROR err=%d at %d\n", GetLastError(), __LINE__);
+ }
+ // try to define 100MB free space in a 120MB hard disk
+ DWORD BytesXCluster = *lpBytesPerSector * *lpSectorsPerCluster;
+ if(BytesXCluster){
+ *lpNumberOfFreeClusters = 100000000 / BytesXCluster;
+ *lpTotalNumberOfClusters = 120000000 / BytesXCluster;
+ OutTraceDW("GetDiskFreeSpace: FIXED SectXCluster=%d BytesXSect=%d FreeClusters=%d TotalClusters=%d\n",
+ *lpSectorsPerCluster, *lpBytesPerSector, *lpNumberOfFreeClusters, *lpTotalNumberOfClusters);
+ }
return ret;
}
@@ -655,6 +646,26 @@ HMODULE WINAPI extLoadLibraryExA(LPCTSTR lpFileName, HANDLE hFile, DWORD dwFlags
HMODULE WINAPI extLoadLibraryExW(LPCWSTR lpFileName, HANDLE hFile, DWORD dwFlags)
{ return LoadLibraryExWrapper((LPVOID)lpFileName, TRUE, hFile, dwFlags, "LoadLibraryExW"); }
+BOOL WINAPI extFreeLibrary(HMODULE hModule)
+{
+ BOOL ret;
+ static HMODULE hLastModule;
+ OutTraceB("FreeLibrary: hModule=%x\n", hModule);
+ ret = (*pFreeLibrary)(hModule);
+ if(ret){
+ OutTrace("FreeLibrary: ret=%x\n", ret);
+ if((hModule == hLastModule) && (dxw.dwFlags7 & FIXFREELIBRARY)) {
+ OutTraceDW("FreeLibrary: FIXFREELIBRARY hack ret=0\n");
+ ret = 0;
+ }
+ hLastModule = hModule;
+ }
+ else {
+ OutTraceE("FreeLibrary ERROR: err=%d\n", GetLastError());
+ }
+ return ret;
+}
+
extern DirectDrawCreate_Type pDirectDrawCreate;
extern DirectDrawCreateEx_Type pDirectDrawCreateEx;
extern HRESULT WINAPI extDirectDrawCreate(GUID FAR *, LPDIRECTDRAW FAR *, IUnknown FAR *);
@@ -681,89 +692,97 @@ FARPROC WINAPI extGetProcAddress(HMODULE hModule, LPCSTR proc)
// to do: the else condition: the program COULD load addresses by ordinal value ... done ??
if((DWORD)proc & 0xFFFF0000){
- FARPROC remap;
+ FARPROC remap = 0;
switch(idx){
case SYSLIBIDX_AVIFIL32:
- if (remap=Remap_AVIFil32_ProcAddress(proc, hModule)) return remap;
+ remap=Remap_AVIFil32_ProcAddress(proc, hModule);
break;
case SYSLIBIDX_DIRECTDRAW:
- if (remap=Remap_ddraw_ProcAddress(proc, hModule)) return remap;
+ remap=Remap_ddraw_ProcAddress(proc, hModule);
break;
case SYSLIBIDX_USER32:
- if (remap=Remap_user32_ProcAddress(proc, hModule)) return remap;
+ remap=Remap_user32_ProcAddress(proc, hModule);
break;
case SYSLIBIDX_GDI32:
- if (remap=Remap_GDI32_ProcAddress(proc, hModule)) return remap;
+ remap=Remap_GDI32_ProcAddress(proc, hModule);
break;
case SYSLIBIDX_KERNEL32:
- if (remap=Remap_kernel32_ProcAddress(proc, hModule)) return remap;
+ remap=Remap_kernel32_ProcAddress(proc, hModule);
break;
case SYSLIBIDX_IMELIB:
- if (remap=Remap_ImeLib_ProcAddress(proc, hModule)) return remap;
+ remap=Remap_ImeLib_ProcAddress(proc, hModule);
break;
case SYSLIBIDX_WINMM:
- if (remap=Remap_WinMM_ProcAddress(proc, hModule)) return remap;
+ remap=Remap_WinMM_ProcAddress(proc, hModule);
break;
case SYSLIBIDX_OLE32:
- if (remap=Remap_ole32_ProcAddress(proc, hModule)) return remap;
+ remap=Remap_ole32_ProcAddress(proc, hModule);
break;
case SYSLIBIDX_DIRECT3D8:
- if (remap=Remap_d3d8_ProcAddress(proc, hModule)) return remap;
+ remap=Remap_d3d8_ProcAddress(proc, hModule);
break;
case SYSLIBIDX_DIRECT3D9:
- if (remap=Remap_d3d9_ProcAddress(proc, hModule)) return remap;
+ remap=Remap_d3d9_ProcAddress(proc, hModule);
break;
case SYSLIBIDX_DIRECT3D10:
- if (remap=Remap_d3d10_ProcAddress(proc, hModule)) return remap;
+ remap=Remap_d3d10_ProcAddress(proc, hModule);
break;
case SYSLIBIDX_DIRECT3D10_1:
- if (remap=Remap_d3d10_1_ProcAddress(proc, hModule)) return remap;
+ remap=Remap_d3d10_1_ProcAddress(proc, hModule);
break;
case SYSLIBIDX_DIRECT3D11:
- if (remap=Remap_d3d11_ProcAddress(proc, hModule)) return remap;
+ remap=Remap_d3d11_ProcAddress(proc, hModule);
break;
case SYSLIBIDX_OPENGL:
- if(dxw.Windowize) if (remap=Remap_gl_ProcAddress(proc, hModule)) return remap;
+ if(dxw.Windowize) remap=Remap_gl_ProcAddress(proc, hModule);
break;
case SYSLIBIDX_MSVFW:
- if (remap=Remap_vfw_ProcAddress(proc, hModule)) return remap;
+ remap=Remap_vfw_ProcAddress(proc, hModule);
break;
case SYSLIBIDX_WINTRUST:
- if (remap=Remap_trust_ProcAddress(proc, hModule)) return remap;
+ remap=Remap_trust_ProcAddress(proc, hModule);
break;
case SYSLIBIDX_ADVAPI32:
- if (remap=Remap_AdvApi32_ProcAddress(proc, hModule)) return remap;
+ remap=Remap_AdvApi32_ProcAddress(proc, hModule);
break;
case SYSLIBIDX_DIRECT3D:
- if (remap=Remap_d3d7_ProcAddress(proc, hModule)) return remap;
+ remap=Remap_d3d7_ProcAddress(proc, hModule);
break;
case SYSLIBIDX_DIRECT3D700:
- if (remap=Remap_d3d7_ProcAddress(proc, hModule)) return remap;
+ remap=Remap_d3d7_ProcAddress(proc, hModule);
break;
case SYSLIBIDX_IMAGEHLP:
- if (remap=Remap_Imagehlp_ProcAddress(proc, hModule)) return remap;
+ remap=Remap_Imagehlp_ProcAddress(proc, hModule);
break;
case SYSLIBIDX_DINPUT:
- if (remap=Remap_DInput_ProcAddress(proc, hModule)) return remap;
+ remap=Remap_DInput_ProcAddress(proc, hModule);
break;
case SYSLIBIDX_DINPUT8:
- if (remap=Remap_DInput8_ProcAddress(proc, hModule)) return remap;
+ remap=Remap_DInput8_ProcAddress(proc, hModule);
break;
case SYSLIBIDX_COMCTL32:
- if (remap=Remap_ComCtl32_ProcAddress(proc, hModule)) return remap;
+ remap=Remap_ComCtl32_ProcAddress(proc, hModule);
break;
case SYSLIBIDX_COMDLG32:
- if (remap=Remap_ComDlg32_ProcAddress(proc, hModule)) return remap;
+ remap=Remap_ComDlg32_ProcAddress(proc, hModule);
break;
case SYSLIBIDX_DSOUND:
- if (remap=Remap_DSound_ProcAddress(proc, hModule)) return remap;
+ remap=Remap_DSound_ProcAddress(proc, hModule);
break;
case SYSLIBIDX_WING32:
- if (remap=Remap_WinG32_ProcAddress(proc, hModule)) return remap;
+ remap=Remap_WinG32_ProcAddress(proc, hModule);
break;
default:
break;
}
+ if(remap == (FARPROC)-1) {
+ OutTraceDW("GetProcAddress: FAKE ret=0\n");
+ return 0; // pretend the call isn't there ....
+ }
+ if(remap) {
+ OutTraceDW("GetProcAddress: HOOK ret=%x\n", remap);
+ return remap;
+ }
}
else {
switch(idx){
diff --git a/dll/queryint.cpp b/dll/queryint.cpp
index 4872783..108a62e 100644
--- a/dll/queryint.cpp
+++ b/dll/queryint.cpp
@@ -16,6 +16,7 @@ extern void HookDDSession(LPDIRECTDRAW *, int);
extern void HookDirect3DSession(LPDIRECTDRAW *, int);
extern void HookDirect3DDevice(LPVOID *, int);
extern void HookViewport(LPDIRECT3DVIEWPORT *, int);
+extern void HookDDClipper(LPDIRECTDRAWCLIPPER FAR *);
// extQueryInterfaceDX: this is the single procedure that manages all QueryInterface methods within the DirectX classes
// it is better to have it unique because of the transitive and reflexive properties of QueryInterface, that means
@@ -28,6 +29,7 @@ typedef enum {
TYPE_OBJECT_UNKNOWN = 0,
TYPE_OBJECT_DIRECTDRAW,
TYPE_OBJECT_DDRAWSURFACE,
+ TYPE_OBJECT_CLIPPER,
TYPE_OBJECT_DIRECT3D,
TYPE_OBJECT_D3DDEVICE,
TYPE_OBJECT_GAMMARAMP,
@@ -53,6 +55,10 @@ HRESULT WINAPI extQueryInterfaceDX(int dxversion, QueryInterface_Type pQueryInte
iObjectType = TYPE_OBJECT_UNKNOWN;
switch(riid.Data1){
// DirectDraw
+ case 0xD7B70EE0: // CLSID_DirectDraw
+ iObjectType=TYPE_OBJECT_DIRECTDRAW; iObjectVersion=1; break;
+ case 0x3c305196: // CLSID_DirectDraw7
+ iObjectType=TYPE_OBJECT_DIRECTDRAW; iObjectVersion=7; break;
case 0x6C14DB80: // IID_IDirectDraw
iObjectType=TYPE_OBJECT_DIRECTDRAW; iObjectVersion=1; break;
case 0xB3A6F3E0: // IID_IDirectDraw2
@@ -122,6 +128,8 @@ HRESULT WINAPI extQueryInterfaceDX(int dxversion, QueryInterface_Type pQueryInte
iObjectType=TYPE_OBJECT_VIEWPORT; iObjectVersion=2; break;
case 0xb0ab3b61: //IID_IDirect3DViewport3
iObjectType=TYPE_OBJECT_VIEWPORT; iObjectVersion=3; break;
+ case 0x593817A0: //CLSID_DirectDrawClipper
+ iObjectType=TYPE_OBJECT_CLIPPER; iObjectVersion=1; break;
}
char *sLabel;
@@ -129,6 +137,7 @@ HRESULT WINAPI extQueryInterfaceDX(int dxversion, QueryInterface_Type pQueryInte
case TYPE_OBJECT_UNKNOWN: sLabel = "(unknown)"; break;
case TYPE_OBJECT_DIRECTDRAW: sLabel = "IID_IDirectDraw"; break;
case TYPE_OBJECT_DDRAWSURFACE: sLabel = "IID_IDirectDrawSurface"; break;
+ case TYPE_OBJECT_CLIPPER: sLabel = "CLSID_DirectDrawClipper"; break;
case TYPE_OBJECT_DIRECT3D: sLabel = "IID_IDirect3D"; break;
case TYPE_OBJECT_D3DDEVICE: sLabel = "IID_IDirect3DDevice"; break;
case TYPE_OBJECT_GAMMARAMP: sLabel = "IID_IDirectDrawGammaRamp"; break;
@@ -162,6 +171,13 @@ HRESULT WINAPI extQueryInterfaceDX(int dxversion, QueryInterface_Type pQueryInte
dxwss.IsAPrimarySurface((LPDIRECTDRAWSURFACE)lpdds))
lpdds = lpDDSEmu_Prim;
break;
+#ifdef YEARDEAD
+ //case TYPE_OBJECT_UNKNOWN:
+ // OutTraceDW("QueryInterface: returning same object\n");
+ // ((LPDIRECTDRAWSURFACE)lpdds)->AddRef();
+ // *obp = lpdds;
+ // return DD_OK;
+#endif
}
res = (*pQueryInterface)(lpdds, riid, obp);
@@ -182,7 +198,33 @@ HRESULT WINAPI extQueryInterfaceDX(int dxversion, QueryInterface_Type pQueryInte
lpdds, riid.Data1, *obp, sLabel, iObjectVersion);
switch(iObjectType){
- // simulate unavailable interfaces (useful?)
+ case TYPE_OBJECT_UNKNOWN:
+ dwCaps = dxwcdb.GetCaps((LPDIRECTDRAWSURFACE)lpdds);
+ if (dwCaps) {
+ OutTraceDW("QueryInterface(S): PASS lpdds=%x->%x caps=%x(%s)\n", lpdds, *obp, dwCaps, ExplainDDSCaps(dwCaps));
+ dxwcdb.PushCaps(*(LPDIRECTDRAWSURFACE *)obp, dwCaps);
+ }
+ else {
+ OutTraceDW("QueryInterface(S): NO CAPS\n");
+ }
+ break;
+#ifdef YEARDEAD
+ case TYPE_OBJECT_UNKNOWN:
+ // triky: some games (actually, only one: "Year Dead") perform a QueryInterface with IID_UNKNOWN
+ // to duplicate the object. In this case, the CAPS should be passed, but maybe the new object
+ // also needs hooking?
+ dwCaps = dxwcdb.GetCaps((LPDIRECTDRAWSURFACE)lpdds);
+ if (dwCaps) {
+ OutTraceDW("QueryInterface(S): PASS lpdds=%x->%x caps=%x(%s)\n", lpdds, *obp, dwCaps, ExplainDDSCaps(dwCaps));
+ dxwcdb.PushCaps(*(LPDIRECTDRAWSURFACE *)obp, dwCaps);
+ if(dwCaps & DDSCAPS_PRIMARYSURFACE) {
+ HookDDSurface((LPDIRECTDRAWSURFACE *)obp, 1, TRUE);
+ dxwss.PushPrimarySurface((LPDIRECTDRAWSURFACE)*obp, dxversion);
+ }
+ else HookDDSurface((LPDIRECTDRAWSURFACE *)obp, 1, FALSE);
+ }
+ break;
+#endif
case TYPE_OBJECT_DIRECTDRAW:
HookDDSession((LPDIRECTDRAW *)obp, iObjectVersion);
break;
@@ -208,6 +250,9 @@ HRESULT WINAPI extQueryInterfaceDX(int dxversion, QueryInterface_Type pQueryInte
OutTraceDW("QueryInterface(S): NO CAPS\n");
}
break;
+ case TYPE_OBJECT_CLIPPER:
+ HookDDClipper((LPDIRECTDRAWCLIPPER *)obp); // there is a single Clipper intrface!
+ break;
case TYPE_OBJECT_DIRECT3D:
HookDirect3DSession((LPDIRECTDRAW *)obp, iObjectVersion);
break;
diff --git a/dll/syslibs.h b/dll/syslibs.h
index 1621455..e6776ae 100644
--- a/dll/syslibs.h
+++ b/dll/syslibs.h
@@ -180,6 +180,7 @@ typedef BOOL (WINAPI *QueryPerformanceFrequency_Type)(LARGE_INTEGER *);
typedef BOOL (WINAPI *QueryPerformanceCounter_Type)(LARGE_INTEGER *);
typedef BOOL (WINAPI *QueryPerformanceFrequency_Type)(LARGE_INTEGER *);
typedef BOOL (WINAPI *GetExitCodeProcess_Type)(HANDLE, LPDWORD);
+typedef BOOL (WINAPI *FreeLibrary_Type)(HMODULE);
// ole32.dll:
typedef HRESULT (STDAPICALLTYPE *CoCreateInstance_Type)(REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID FAR*);
@@ -494,7 +495,7 @@ DXWEXTERN CloseHandle_Type pCloseHandle DXWINITIALIZED;
DXWEXTERN QueryPerformanceFrequency_Type pQueryPerformanceFrequency DXWINITIALIZED;
DXWEXTERN QueryPerformanceCounter_Type pQueryPerformanceCounter DXWINITIALIZED;
DXWEXTERN GetExitCodeProcess_Type pGetExitCodeProcess DXWINITIALIZED;
-
+DXWEXTERN FreeLibrary_Type pFreeLibrary DXWINITIALIZED;
// ole32.dll:
DXWEXTERN CoCreateInstance_Type pCoCreateInstance DXWINITIALIZED;
@@ -806,6 +807,7 @@ extern BOOL WINAPI extCreateProcessA(LPCTSTR, LPTSTR, LPSECURITY_ATTRIBUTES, LPS
extern BOOL WINAPI extGetExitCodeProcess(HANDLE, LPDWORD);
extern BOOL WINAPI extQueryPerformanceFrequency(LARGE_INTEGER *);
extern BOOL WINAPI extQueryPerformanceCounter(LARGE_INTEGER *);
+extern BOOL WINAPI extFreeLibrary(HMODULE);
// ole32.dll:
extern HRESULT STDAPICALLTYPE extCoCreateInstance(REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID FAR*);
diff --git a/dll/user32.cpp b/dll/user32.cpp
index 06b19c0..e4b8cea 100644
--- a/dll/user32.cpp
+++ b/dll/user32.cpp
@@ -29,6 +29,9 @@ extern HDC hFlippedDC;
//EnumDisplayMonitors_Type pEnumDisplayMonitors = NULL;
//BOOL WINAPI extEnumDisplayMonitors(HDC, LPCRECT, MONITORENUMPROC, LPARAM);
+typedef BOOL (WINAPI *ValidateRgn_Type)(HWND, HRGN);
+ValidateRgn_Type pValidateRgn;
+BOOL WINAPI extValidateRgn(HWND, HRGN);
#ifdef TRACEPALETTE
typedef UINT (WINAPI *GetDIBColorTable_Type)(HDC, UINT, UINT, RGBQUAD *);
@@ -58,7 +61,7 @@ static HookEntryEx_Type Hooks[]={
{HOOK_IAT_CANDIDATE, 0, "MoveWindow", (FARPROC)MoveWindow, (FARPROC *)&pMoveWindow, (FARPROC)extMoveWindow},
{HOOK_HOT_CANDIDATE, 0, "EnumDisplaySettingsA", (FARPROC)EnumDisplaySettingsA, (FARPROC *)&pEnumDisplaySettings, (FARPROC)extEnumDisplaySettings},
{HOOK_IAT_CANDIDATE, 0, "GetClipCursor", (FARPROC)GetClipCursor, (FARPROC*)&pGetClipCursor, (FARPROC)extGetClipCursor},
- {HOOK_IAT_CANDIDATE, 0, "ClipCursor", (FARPROC)ClipCursor, (FARPROC *)&pClipCursor, (FARPROC)extClipCursor},
+ {HOOK_HOT_CANDIDATE, 0, "ClipCursor", (FARPROC)ClipCursor, (FARPROC *)&pClipCursor, (FARPROC)extClipCursor},
{HOOK_IAT_CANDIDATE, 0, "DefWindowProcA", (FARPROC)DefWindowProcA, (FARPROC *)&pDefWindowProcA, (FARPROC)extDefWindowProcA},
{HOOK_IAT_CANDIDATE, 0, "DefWindowProcW", (FARPROC)DefWindowProcW, (FARPROC *)&pDefWindowProcW, (FARPROC)extDefWindowProcW},
{HOOK_HOT_CANDIDATE, 0, "CreateWindowExA", (FARPROC)CreateWindowExA, (FARPROC *)&pCreateWindowExA, (FARPROC)extCreateWindowExA},
@@ -186,7 +189,8 @@ static HookEntryEx_Type SyscallHooks[]={
};
static HookEntryEx_Type ScaledHooks[]={
- {HOOK_IAT_CANDIDATE, 0, "ValidateRect", (FARPROC)ValidateRect, (FARPROC *)&pValidateRect, (FARPROC)extValidateRect},
+ {HOOK_HOT_CANDIDATE, 0, "ValidateRect", (FARPROC)ValidateRect, (FARPROC *)&pValidateRect, (FARPROC)extValidateRect},
+ {HOOK_HOT_CANDIDATE, 0, "ValidateRgn", (FARPROC)ValidateRgn, (FARPROC *)&pValidateRgn, (FARPROC)extValidateRgn},
{HOOK_IAT_CANDIDATE, 0, "ScrollWindow", (FARPROC)ScrollWindow, (FARPROC *)&pScrollWindow, (FARPROC)extScrollWindow},
{HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator
};
@@ -1127,8 +1131,10 @@ BOOL WINAPI extSetCursorPos(int x, int y)
static BOOL WINAPI extPeekMessage(PeekMessage_Type pPeekMessage, LPMSG lpMsg, HWND hwnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg)
{
BOOL res;
+ char *sLabel;
if(dxw.dwFlags3 & PEEKALLMESSAGES){
+ sLabel="(ANY) ";
if((wMsgFilterMin==0) && (wMsgFilterMax == 0)){
// no filtering, everything is good
res=(*pPeekMessage)(lpMsg, hwnd, wMsgFilterMin, wMsgFilterMax, (wRemoveMsg & 0x000F));
@@ -1142,22 +1148,19 @@ static BOOL WINAPI extPeekMessage(PeekMessage_Type pPeekMessage, LPMSG lpMsg, HW
if(wMsgFilterMaxhwnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg, ExplainPeekRemoveMsg(wRemoveMsg),
- lpMsg->message, ExplainWinMessage(lpMsg->message & 0xFFFF),
- lpMsg->wParam, lpMsg->lParam, lpMsg->pt.x, lpMsg->pt.y, res);
- else
- OutTraceW("PeekMessage: ANY lpmsg=%x hwnd=%x filter=(%x-%x) remove=%x(%s) res=%x\n",
- lpMsg, lpMsg->hwnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg, ExplainPeekRemoveMsg(wRemoveMsg), res);
}
else {
+ sLabel="";
res=(*pPeekMessage)(lpMsg, hwnd, wMsgFilterMin, wMsgFilterMax, (wRemoveMsg & 0x000F));
- OutTraceW("PeekMessage: lpmsg=%x hwnd=%x filter=(%x-%x) remove=%x(%s) msg=%x(%s) wparam=%x, lparam=%x pt=(%d,%d) res=%x\n",
- lpMsg, lpMsg->hwnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg, ExplainPeekRemoveMsg(wRemoveMsg),
+ }
+ if(res)
+ OutTraceW("PeekMessage: %slpmsg=%x hwnd=%x filter=(%x-%x) remove=%x(%s) msg=%x(%s) wparam=%x, lparam=%x pt=(%d,%d) res=%x\n",
+ sLabel, lpMsg, lpMsg->hwnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg, ExplainPeekRemoveMsg(wRemoveMsg),
lpMsg->message, ExplainWinMessage(lpMsg->message & 0xFFFF),
lpMsg->wParam, lpMsg->lParam, lpMsg->pt.x, lpMsg->pt.y, res);
- }
+ else
+ OutTraceW("PeekMessage: %slpmsg=%x hwnd=%x filter=(%x-%x) remove=%x(%s) res=%x\n",
+ sLabel, lpMsg, lpMsg->hwnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg, ExplainPeekRemoveMsg(wRemoveMsg), res);
if((dxw.dwFlags1 & MODIFYMOUSE) && dxw.GethWnd()){
POINT point;
@@ -1180,7 +1183,7 @@ static BOOL WINAPI extPeekMessage(PeekMessage_Type pPeekMessage, LPMSG lpMsg, HW
// }
//}
- if(dxw.dwFlags1 & SLOWDOWN) (*pSleep)(1);
+ if(dxw.dwFlags1 & SLOWDOWN) dxw.DoSlow(1);
return res;
}
@@ -2079,10 +2082,10 @@ int WINAPI extValidateRect(HWND hwnd, const RECT *lprc)
if(IsTraceDW){
if (lprc)
- OutTrace("ValidateRect: rect=(%d,%d)-(%d,%d)\n",
- lprc->left, lprc->top, lprc->right, lprc->bottom);
+ OutTrace("ValidateRect: hwnd=%x rect=(%d,%d)-(%d,%d)\n",
+ hwnd, lprc->left, lprc->top, lprc->right, lprc->bottom);
else
- OutTrace("ValidateRect: rect=(NULL)\n");
+ OutTrace("ValidateRect: hwnd=%x rect=(NULL)\n", hwnd);
}
if(lprc){
@@ -4194,6 +4197,15 @@ BOOL WINAPI extAdjustWindowRectEx(LPRECT lpRect, DWORD dwStyle, BOOL bMenu, DWOR
return ret;
}
+BOOL WINAPI extValidateRgn(HWND hwnd, HRGN hrgn)
+{
+ BOOL ret;
+ OutTraceDW("ValidateRgn: hwnd=%x hrgn=%x\n", hwnd, hrgn);
+
+ ret = (*pValidateRgn)(hwnd, hrgn);
+ return ret;
+}
+
// To do:
// GrayStringA
// GrayStringW
\ No newline at end of file
diff --git a/dll/winmm.cpp b/dll/winmm.cpp
index 1e0aea0..4e7f7e7 100644
--- a/dll/winmm.cpp
+++ b/dll/winmm.cpp
@@ -288,7 +288,8 @@ MCIERROR WINAPI extmciSendCommand(BOOL isAnsi, mciSendCommand_Type pmciSendComma
RECT saverect;
MCIERROR ret;
MCI_ANIM_RECT_PARMS *pr;
- MCI_OVLY_WINDOW_PARMSW *pw;
+ MCI_OVLY_WINDOW_PARMSA *pw;
+ MCI_OPEN_PARMSA *po;
OutTraceDW("mciSendCommand%c: IDDevice=%x msg=%x(%s) Command=%x(%s)\n",
isAnsi ? 'A' : 'W',
@@ -302,6 +303,11 @@ MCIERROR WINAPI extmciSendCommand(BOOL isAnsi, mciSendCommand_Type pmciSendComma
//MCI_OPEN_PARMS *op;
MCI_STATUS_PARMS *sp;
switch(uMsg){
+ case MCI_OPEN:
+ po = (MCI_OPEN_PARMSA *)dwParam;
+ po->wDeviceID = 1;
+ ret = 0;
+ break;
case MCI_STATUS:
if(fdwCommand & MCI_STATUS_ITEM){
// fix for Tie Fighter 95: when bypassing, let the caller know you have no CD tracks
@@ -319,6 +325,7 @@ MCIERROR WINAPI extmciSendCommand(BOOL isAnsi, mciSendCommand_Type pmciSendComma
if(sp->dwItem == MCI_STATUS_CURRENT_TRACK) sp->dwTrack = 1;
if(sp->dwItem == MCI_STATUS_NUMBER_OF_TRACKS) sp->dwTrack = 1;
if(sp->dwItem == MCI_STATUS_LENGTH) sp->dwTrack = 200;
+ if(sp->dwItem == MCI_STATUS_MEDIA_PRESENT) sp->dwTrack = 1;
sp->dwReturn = 0;
break;
}
@@ -336,7 +343,7 @@ MCIERROR WINAPI extmciSendCommand(BOOL isAnsi, mciSendCommand_Type pmciSendComma
if(dxw.IsFullScreen()){
switch(uMsg){
case MCI_WINDOW:
- pw = (MCI_OVLY_WINDOW_PARMSW *)dwParam;
+ pw = (MCI_OVLY_WINDOW_PARMSA *)dwParam;
OutTraceB("mciSendCommand: hwnd=%x CmdShow=%x\n",
pw->hWnd, pw->nCmdShow);
if(dxw.IsRealDesktop(pw->hWnd)) {
@@ -376,6 +383,9 @@ MCIERROR WINAPI extmciSendCommand(BOOL isAnsi, mciSendCommand_Type pmciSendComma
case MCI_STOP:
if(dxw.dwFlags6 & NOMOVIES) return 0; // ???
break;
+ case MCI_CLOSE:
+ if(dxw.dwFlags6 & NOMOVIES) return 0; // ???
+ break;
}
}
diff --git a/host/-dxwndhost.vs2008.suo b/host/-dxwndhost.vs2008.suo
deleted file mode 100644
index a23812b..0000000
Binary files a/host/-dxwndhost.vs2008.suo and /dev/null differ
diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo
index 72dba90..37dc736 100644
Binary files a/host/dxwndhost.vs2008.suo and b/host/dxwndhost.vs2008.suo differ