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