1
0
mirror of https://github.com/DxWnd/DxWnd.reloaded synced 2024-12-30 09:25:35 +01:00

v2_04_15_src

Former-commit-id: ed85ecc7b0db29ac5378e8152b132f529999f5f5
This commit is contained in:
gho tik 2017-02-21 11:50:21 -05:00 committed by Refael ACkermann
parent 0e42098a3d
commit fb320c8ab3
19 changed files with 329 additions and 350 deletions

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:73c4aac223a633aa820b3761678170f484fb15a016ecd2c41e77d5c820e3dd46
size 791552
oid sha256:a6e3eed0ef40c5d67c9179b539a02e0d2044ede982322f019816d85db5694161
size 793088

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:933a86972f0a96e62d8c5f4b656315cf09d656d2a131d1685acdd231b7ac2139
oid sha256:b65ce7c723d642c6c753ab05c5e3e8eb4d50fc80592f0e333decdf7e77c0b00e
size 677376

View File

@ -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

View File

@ -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

View File

@ -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?

View File

@ -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",

View File

@ -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,

View File

@ -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];

View File

@ -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);

View File

@ -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)

View File

@ -27,7 +27,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "TlHelp32.h"
#define VERSION "2.04.14"
#define VERSION "2.04.15"
#define DDTHREADLOCK 1

Binary file not shown.

View File

@ -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){

View File

@ -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;

View File

@ -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*);

View File

@ -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(wMsgFilterMax<WM_KEYFIRST)(*pPeekMessage)(&Dummy, hwnd, wMsgFilterMax+1, WM_KEYFIRST-1, TRUE); // don't touch above WM_KEYFIRST !!!!
}
if(res)
OutTraceW("PeekMessage: ANY 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),
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

View File

@ -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;
}
}

Binary file not shown.

Binary file not shown.