diff --git a/Include/dxwnd.h b/Include/dxwnd.h index 325445f..e6c7e8b 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -310,11 +310,6 @@ LRESULT CALLBACK extDialogWindowProc(HWND, UINT, WPARAM, LPARAM); #define IsAssertEnabled (dxw.dwTFlags & ASSERTDIALOG) #define STEP OutTrace("STEP at %s:%d\n", __FILE__, __LINE__) -extern BOOL WinDBGetSize(HWND, int *, int *); -extern WNDPROC WinDBGetProc(HWND); -extern void WinDBPutProc(HWND, WNDPROC); -extern void WinDBPutSize(HWND, int, int); - typedef enum { DXW_SET_COORDINATES = 0, DXW_DESKTOP_CENTER, diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 4954745..b0d49e7 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:95762cfc50b158119d3bcb3d7a613dd13ae5abc3555c4c8153d9560bdafad4e6 -size 577536 +oid sha256:685801c38436f785e2d29010e560c7eb98e07adb83ae0bf0593f089a2d2ed043 +size 572928 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 85bc625..e98f13e 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c1bb172dc721bb8db528e064c3bc6acb78a0107c298e11368d28b36bb636dae6 +oid sha256:ea58d479ffbb81c24c0282a35b7e8203848d66799bf047ad7d662e4fc53d0470 size 539648 diff --git a/build/exports/Gorky 17.dxw b/build/exports/Gorky 17.dxw new file mode 100644 index 0000000..7e24281 --- /dev/null +++ b/build/exports/Gorky 17.dxw @@ -0,0 +1,31 @@ +[target] +title0=Gorky 17 +path0=D:\Games\Gorky 17\gorky17.exe +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=134217762 +flagg0=1207959552 +flagh0=20 +flagi0=134217732 +flagj0=4224 +flagk0=0 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 diff --git a/build/exports/Outwars.dxw b/build/exports/Outwars.dxw new file mode 100644 index 0000000..67e2099 --- /dev/null +++ b/build/exports/Outwars.dxw @@ -0,0 +1,31 @@ +[target] +title0=Outwars +path0=D:\Games\OUTWARS\outwars.exe +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=671088678 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=0 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 diff --git a/build/exports/dxwnd.ini b/build/exports/dxwnd.ini new file mode 100644 index 0000000..cfac93f --- /dev/null +++ b/build/exports/dxwnd.ini @@ -0,0 +1,5 @@ +[window] +posx=1477 +posy=150 +sizx=320 +sizy=749 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index ea3413c..8d8e939 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -805,4 +805,11 @@ fix: fully revised ddraw surface handling in d3d1-7 versions. Now "Might & Magic v2.03.21: fix: full re-design of ddraw "special" surface management (primary & backbuffer): greater compatibility for emulation mode -fix: GDI edit window positioning for "Imperialism" city name selection \ No newline at end of file +fix: GDI edit window positioning for "Imperialism" city name selection + +v2.03.22: +more code reorganization and cleanup +eliminated GDI over directdraw emulation (MAPGDITOPRIMARY flag) +add: support for texture D3DFMT_L8 dump ("Turok") +fix: eliminate a possible divide by zero error +fix: avoid intercepting WindowProc routines when set to special values 0xFFFFxxxx - makes "The Hulk" demo working diff --git a/dll/d3dtexture.cpp b/dll/d3dtexture.cpp index 1186cc8..69ee912 100644 --- a/dll/d3dtexture.cpp +++ b/dll/d3dtexture.cpp @@ -204,6 +204,7 @@ void D3DTextureDump(D3DSURFACE_DESC Desc, D3DLOCKED_RECT LockedRect) case D3DFMT_X1R5G5B5: case D3DFMT_A1R5G5B5: case D3DFMT_A8: + case D3DFMT_L8: hash = HashSurface((BYTE *)LockedRect.pBits, LockedRect.Pitch, Desc.Width, Desc.Height); break; case D3DFMT_DXT1: @@ -274,6 +275,7 @@ void D3DTextureDump(D3DSURFACE_DESC Desc, D3DLOCKED_RECT LockedRect) case D3DFMT_DXT4: case D3DFMT_DXT5: case D3DFMT_A8: + case D3DFMT_L8: pbi.bV4BitCount = 32; pbi.bV4RedMask = 0x00FF0000; pbi.bV4GreenMask = 0x0000FF00; @@ -343,6 +345,7 @@ void D3DTextureDump(D3DSURFACE_DESC Desc, D3DLOCKED_RECT LockedRect) } break; case D3DFMT_A8: + case D3DFMT_L8: { // Copy the array of color indices into the .BMP file. BYTE *p = (BYTE *)LockedRect.pBits; diff --git a/dll/ddblit.cpp b/dll/ddblit.cpp index 1b1c146..88ff3ff 100644 --- a/dll/ddblit.cpp +++ b/dll/ddblit.cpp @@ -34,7 +34,7 @@ static HRESULT sBltNoPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdest //extern PrimaryBlt_Type pPrimaryBlt; //CkArg arg; - FromScreen=dxw.IsAPrimarySurface(lpddssrc) && !(dxw.dwFlags1 & EMULATESURFACE) && !(dxw.dwFlags1 & EMULATEBUFFER); // v2.02.77 + FromScreen=dxwss.IsAPrimarySurface(lpddssrc) && !(dxw.dwFlags1 & EMULATESURFACE) && !(dxw.dwFlags1 & EMULATEBUFFER); // v2.02.77 // make a working copy of srcrect if not NULL if (lpsrcrect){ @@ -48,7 +48,7 @@ static HRESULT sBltNoPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdest // In "The Sims" there is no quality loss, but some scrolling artifact. if(lpsrcrect && FromScreen){ LPDIRECTDRAWSURFACE lpDDSBack; - lpDDSBack = dxw.GetBackBufferSurface(); + lpDDSBack = dxwss.GetBackBufferSurface(); if(lpDDSBack && (dxw.dwFlags1 & BLITFROMBACKBUFFER)){ lpddssrc=lpDDSBack; srcrect=dxw.GetScreenRect(); @@ -154,7 +154,7 @@ static HRESULT sBltToPrimary(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdest if (isFlipping){ // handle the flipping chain ... //lpddssrc=lpDDSBack; - lpddssrc = dxw.GetBackBufferSurface(); + lpddssrc = dxwss.GetBackBufferSurface(); OutTraceDW("Flip: setting flip chain to lpdds=%x\n", lpddssrc); } } @@ -324,8 +324,8 @@ HRESULT WINAPI sBlt(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, } } - ToPrim=dxw.IsAPrimarySurface(lpdds); - FromPrim=dxw.IsAPrimarySurface(lpddssrc); + ToPrim=dxwss.IsAPrimarySurface(lpdds); + FromPrim=dxwss.IsAPrimarySurface(lpddssrc); ToScreen=ToPrim && !(dxw.dwFlags1 & EMULATESURFACE); FromScreen=FromPrim && !(dxw.dwFlags1 & EMULATESURFACE) && !(dxw.dwFlags1 & EMULATEBUFFER); // v2.02.77 diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index b5193b1..458a048 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -260,9 +260,6 @@ LPDIRECTDRAWPALETTE lpDDP=NULL; // v2.02.37: globals to store requested main surface capabilities DDSURFACEDESC2 DDSD_Prim; -DDSURFACEDESC2 DDSD_Back; -DDSURFACEDESC2 DDSD_ZBuffer; - DWORD DDZBufferCaps; DWORD PaletteEntries[256]; DWORD *Palette16BPP = NULL; @@ -1786,10 +1783,10 @@ HRESULT WINAPI extQueryInterfaceS(void *lpdds, REFIID riid, LPVOID *obp) unsigned int dwLocalDDVersion; unsigned int dwLocalTexVersion; - IsPrim=dxw.IsAPrimarySurface((LPDIRECTDRAWSURFACE)lpdds); - IsBack=dxw.IsABackBufferSurface((LPDIRECTDRAWSURFACE)lpdds); + IsPrim=dxwss.IsAPrimarySurface((LPDIRECTDRAWSURFACE)lpdds); + IsBack=dxwss.IsABackBufferSurface((LPDIRECTDRAWSURFACE)lpdds); OutTraceDDRAW("QueryInterface(S): lpdds=%x%s REFIID=%x(%s)\n", - lpdds, dxw.ExplainSurfaceRole((LPDIRECTDRAWSURFACE)lpdds), riid.Data1, ExplainGUID((GUID *)&riid)); + lpdds, dxwss.ExplainSurfaceRole((LPDIRECTDRAWSURFACE)lpdds), riid.Data1, ExplainGUID((GUID *)&riid)); IsGammaRamp=FALSE; @@ -1849,7 +1846,7 @@ HRESULT WINAPI extQueryInterfaceS(void *lpdds, REFIID riid, LPVOID *obp) } // fix the target for gamma ramp creation: if it is a primary surface, use the real one!! - if(dxw.IsAPrimarySurface((LPDIRECTDRAWSURFACE)lpdds) && IsGammaRamp) lpdds = lpDDSEmu_Prim; + if(dxwss.IsAPrimarySurface((LPDIRECTDRAWSURFACE)lpdds) && IsGammaRamp) lpdds = lpDDSEmu_Prim; res = (*pQueryInterfaceS)(lpdds, riid, obp); @@ -1879,12 +1876,12 @@ HRESULT WINAPI extQueryInterfaceS(void *lpdds, REFIID riid, LPVOID *obp) dxw.dwDDVersion=dwLocalDDVersion; if(IsPrim){ OutTraceDW("QueryInterface(S): primary=%x new=%x\n", lpdds, *obp); - dxw.MarkPrimarySurface((LPDIRECTDRAWSURFACE)*obp, dwLocalDDVersion); + dxwss.PushPrimarySurface((LPDIRECTDRAWSURFACE)*obp, dwLocalDDVersion); HookDDSurfacePrim((LPDIRECTDRAWSURFACE *)obp, dxw.dwDDVersion); } else{ - if(IsBack) dxw.MarkBackBufferSurface((LPDIRECTDRAWSURFACE)*obp, dwLocalDDVersion); - else dxw.MarkRegularSurface((LPDIRECTDRAWSURFACE)*obp); + if(IsBack) dxwss.PushBackBufferSurface((LPDIRECTDRAWSURFACE)*obp, dwLocalDDVersion); + else dxwss.PopSurface((LPDIRECTDRAWSURFACE)*obp); // v2.02.13: seems that hooking inconditionally gives troubles. What is the proper safe hook condition? HookDDSurfaceGeneric((LPDIRECTDRAWSURFACE *)obp, dxw.dwDDVersion); } @@ -2260,7 +2257,7 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf OutTraceDW("CreateSurface: created new DDSEmu_Prim=%x\n",lpDDSEmu_Prim); if(IsDebug) DescribeSurface(lpDDSEmu_Prim, dxversion, "DDSEmu_Prim", __LINE__); InitDSScreenParameters(lpDDSEmu_Prim); - dxw.MarkRegularSurface(lpDDSEmu_Prim); + dxwss.PopSurface(lpDDSEmu_Prim); // can't hook lpDDSEmu_Prim as generic, since the Flip method is unimplemented for a PRIMARY surface! // better avoid it or hook just useful methods. //if (dxw.dwTFlags & OUTPROXYTRACE) HookDDSurfaceGeneric(&lpDDSEmu_Prim, dxw.dwDDVersion); @@ -2288,12 +2285,12 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf } OutTraceDW("CreateSurface: created new DDSEmu_Back=%x\n", lpDDSEmu_Back); if(IsDebug) DescribeSurface(lpDDSEmu_Back, dxversion, "DDSEmu_Back", __LINE__); - dxw.MarkRegularSurface(lpDDSEmu_Back); + dxwss.PopSurface(lpDDSEmu_Back); if (dxw.dwTFlags & OUTPROXYTRACE) HookDDSurfaceGeneric(&lpDDSEmu_Back, dxversion); } bFlippedDC = TRUE; - + return DD_OK; } @@ -2334,7 +2331,7 @@ static HRESULT BuildPrimaryDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf if(dxw.dwFlags1 & EMULATEBUFFER){ lpDDSEmu_Prim = *lplpdds; - dxw.MarkRegularSurface(lpDDSEmu_Prim); + dxwss.PopSurface(lpDDSEmu_Prim); ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS; // warning: can't create zero sized backbuffer surface !!!! @@ -2598,10 +2595,10 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate if (lpDDSEmu_Back) while(lpDDSEmu_Back->Release()); if (lpDDSEmu_Prim) while(lpDDSEmu_Prim->Release()); if (ddsd.dwFlags & DDSD_BACKBUFFERCOUNT) { // Praetorians !!!! - lpDDSBack = dxw.GetBackBufferSurface(); + lpDDSBack = dxwss.GetBackBufferSurface(); if (lpDDSBack) { while(lpDDSBack->Release()); - dxw.MarkRegularSurface(lpDDSBack); + dxwss.PopSurface(lpDDSBack); lpDDSBack = NULL; } } @@ -2630,14 +2627,14 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate res=BuildPrimary(lpdd, pCreateSurface, lpddsd, dxversion, lplpdds, NULL); if(res) return res; lpDDSPrim = *lplpdds; - dxw.MarkPrimarySurface(lpDDSPrim, dxversion); + dxwss.PushPrimarySurface(lpDDSPrim, dxversion); RegisterPixelFormat(lpDDSPrim); if (BBCount){ // build emulated backbuffer surface res=BuildBackBuffer(lpdd, pCreateSurface, lpddsd, dxversion, &lpDDSBack, NULL); if(res) return res; - dxw.MarkBackBufferSurface(lpDDSBack, dxversion); + dxwss.PushBackBufferSurface(lpDDSBack, dxversion); // V2.1.85/V2.2.34: tricky !!!! // When a real backbuffer is created, it has a reference to its frontbuffer. @@ -2678,7 +2675,7 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate } res=BuildBackBuffer(lpdd, pCreateSurface, lpddsd, dxversion, lplpdds, NULL); - if(res == DD_OK) dxw.MarkBackBufferSurface(*lplpdds, dxversion); + if(res == DD_OK) dxwss.PushBackBufferSurface(*lplpdds, dxversion); return res; } @@ -2686,7 +2683,7 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate res=BuildGeneric(lpdd, pCreateSurface, lpddsd, dxversion, lplpdds, pu); if(!res) { - dxw.MarkRegularSurface(*lplpdds); + dxwss.PopSurface(*lplpdds); if(lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER) { lpDDZBuffer=*lplpdds; DDZBufferCaps = lpddsd->ddsCaps.dwCaps; @@ -2727,8 +2724,8 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet BOOL IsPrim; BOOL IsBack; - IsPrim=dxw.IsAPrimarySurface(lpdds); - IsBack=dxw.IsABackBufferSurface(lpdds); + 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)); @@ -2754,7 +2751,7 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet if(IsPrim && (lpddsc->dwCaps & (DDSCAPS_BACKBUFFER|DDSCAPS_FLIP))) { // v2.02.42 added DDSCAPS_FLIP for Empire Earth // in "Tomb Raider III" GOG release, the primary surface is queryed and has no attached // backbuffer, but a backbuffer does exist and has to be retrieved by GetBackBufferSurface. - LPDIRECTDRAWSURFACE lpddsback = dxw.GetBackBufferSurface(); + LPDIRECTDRAWSURFACE lpddsback = dxwss.GetBackBufferSurface(); if (lpddsback) { *lplpddas = lpddsback; OutTraceDW("GetAttachedSurface(%d): BACKBUFFER attached=%x\n", dxversion, *lplpddas); @@ -3137,7 +3134,7 @@ HRESULT WINAPI extFlip(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc, LPDIRECTDRAWSURFACE lpddsTmp; LPDIRECTDRAWSURFACE lpDDSBack; - IsPrim=dxw.IsAPrimarySurface(lpdds); + IsPrim=dxwss.IsAPrimarySurface(lpdds); OutTraceDDRAW("Flip: lpdds=%x%s, src=%x, flags=%x(%s)\n", lpdds, IsPrim?"(PRIM)":"", lpddssrc, dwflags, ExplainFlipFlags(dwflags)); @@ -3178,7 +3175,7 @@ HRESULT WINAPI extFlip(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc, if((dwflags & DDFLIP_WAIT) || (dxw.dwFlags1 & SAVELOAD)) lpPrimaryDD->WaitForVerticalBlank(DDWAITVB_BLOCKEND , 0); - lpDDSBack = dxw.GetBackBufferSurface(); + lpDDSBack = dxwss.GetBackBufferSurface(); if(dxw.dwFlags4 & NOFLIPEMULATION){ HRESULT res2; @@ -3260,7 +3257,7 @@ HRESULT WINAPI extFlip(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc, HRESULT WINAPI extBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPDDBLTFX lpddbltfx) { - if ((dxw.dwFlags2 & FULLRECTBLT) && dxw.IsAPrimarySurface(lpdds)){ + if ((dxw.dwFlags2 & FULLRECTBLT) && dxwss.IsAPrimarySurface(lpdds)){ lpsrcrect=NULL; lpdestrect=NULL; } @@ -3281,8 +3278,8 @@ HRESULT WINAPI extBltFast(LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, HRESULT ret; BOOL ToPrim, FromPrim; - ToPrim=dxw.IsAPrimarySurface(lpdds); - FromPrim=dxw.IsAPrimarySurface(lpddssrc); + ToPrim=dxwss.IsAPrimarySurface(lpdds); + FromPrim=dxwss.IsAPrimarySurface(lpddssrc); CleanRect(&lpsrcrect,__LINE__); @@ -3381,8 +3378,8 @@ HRESULT WINAPI extGetPalette(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE *lpl HRESULT res; BOOL isPrim, isBack; - isPrim=dxw.IsAPrimarySurface(lpdds); - isBack=dxw.IsABackBufferSurface(lpdds); + isPrim=dxwss.IsAPrimarySurface(lpdds); + isBack=dxwss.IsABackBufferSurface(lpdds); OutTraceDDRAW("GetPalette: lpdds=%x%s%s\n", lpdds, isPrim?"(PRIM)":"", isBack?"(BACK)":""); res=(*pGetPalette)(lpdds, lplpddp); @@ -3407,7 +3404,7 @@ HRESULT WINAPI extSetPalette(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE lpdd BOOL isPrim; HRESULT res; - isPrim=dxw.IsAPrimarySurface(lpdds); + isPrim=dxwss.IsAPrimarySurface(lpdds); OutTraceDDRAW("SetPalette: lpdds=%x%s lpddp=%x\n", lpdds, isPrim?"(PRIM)":"", lpddp); res=(*pSetPalette)(lpdds, lpddp); @@ -3427,7 +3424,7 @@ HRESULT WINAPI extSetPalette(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE lpdd mySetPalette(0, 256, lpentries); // v2.02.76: necessary for "Requiem Avenging Angel" in SURFACEEMULATION mode } // Apply palette to backbuffer surface. This is necessary on some games: "Duckman private dick", "Total Soccer 2000", ... - lpDDSBack = dxw.GetBackBufferSurface(); + lpDDSBack = dxwss.GetBackBufferSurface(); if (lpDDSBack){ OutTraceDW("SetPalette: apply PRIMARY palette lpDDP=%x to DDSBack=%x\n", lpddp, lpDDSBack); res=(*pSetPalette)(lpDDSBack, lpddp); @@ -3477,7 +3474,7 @@ HRESULT WINAPI extSetClipper(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWCLIPPER lpdd { HRESULT res; BOOL isPrim; - isPrim=dxw.IsAPrimarySurface(lpdds); + isPrim=dxwss.IsAPrimarySurface(lpdds); OutTraceDDRAW("SetClipper: lpdds=%x%s lpddc=%x\n", lpdds, isPrim?"(PRIM)":"", lpddc); // v2.1.84: SUPPRESSCLIPPING flag - improves "Monopoly Edition 3D" where continuous @@ -3487,7 +3484,7 @@ HRESULT WINAPI extSetClipper(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWCLIPPER lpdd if(dxw.dwFlags1 & (EMULATESURFACE|EMULATEBUFFER)){ if ((isPrim && lpDDSEmu_Prim) || - (dxw.IsABackBufferSurface(lpdds) && lpDDSEmu_Back)){ + (dxwss.IsABackBufferSurface(lpdds) && lpDDSEmu_Back)){ OutTraceDW("SetClipper: skip primary/backbuffer lpdds=%x\n", lpdds); res=0; } @@ -3509,7 +3506,7 @@ HRESULT WINAPI extLock(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACEDESC CleanRect(&lprect, __LINE__); if(IsTraceDDRAW){ - BOOL IsPrim=dxw.IsAPrimarySurface(lpdds); + BOOL IsPrim=dxwss.IsAPrimarySurface(lpdds); char sRect[81]; if (lprect) sprintf_s(sRect, 80, "(%d,%d)-(%d,%d)", lprect->left, lprect->top, lprect->right, lprect->bottom); else strcpy(sRect, "(NULL)"); @@ -3550,7 +3547,7 @@ HRESULT WINAPI extLockDir(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACED // to find out whether it is the primary or not, using lpdds==lpPrimaryDD->GetGDISurface(&lpDDSPrim); if(IsTraceDDRAW){ - BOOL IsPrim=dxw.IsAPrimarySurface(lpdds); + BOOL IsPrim=dxwss.IsAPrimarySurface(lpdds); char sRect[81]; if (lprect) sprintf_s(sRect, 80, "(%d,%d)-(%d,%d)", lprect->left, lprect->top, lprect->right, lprect->bottom); else strcpy(sRect, "(NULL)"); @@ -3622,8 +3619,8 @@ HRESULT WINAPI extUnlock(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRAWSURFAC BOOL IsBack; RECT rect; - IsPrim=dxw.IsAPrimarySurface(lpdds); - IsBack=dxw.IsABackBufferSurface(lpdds); + IsPrim=dxwss.IsAPrimarySurface(lpdds); + IsBack=dxwss.IsABackBufferSurface(lpdds); if(IsTraceDDRAW){ char sRect[81]; @@ -3682,7 +3679,7 @@ HRESULT WINAPI extUnlockDir(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRAWSUR BOOL IsPrim; LPDIRECTDRAWSURFACE lpDDSPrim; - IsPrim=dxw.IsAPrimarySurface(lpdds); + IsPrim=dxwss.IsAPrimarySurface(lpdds); if ((dxversion >= 4) && lprect) CleanRect(&lprect,__LINE__); @@ -3742,7 +3739,7 @@ HRESULT WINAPI extGetDC(LPDIRECTDRAWSURFACE lpdds, HDC FAR *pHDC) HRESULT res; BOOL IsPrim; - IsPrim=dxw.IsAPrimarySurface(lpdds); + IsPrim=dxwss.IsAPrimarySurface(lpdds); OutTraceDDRAW("GetDC: lpdss=%x%s\n",lpdds, IsPrim?"(PRIM)":""); res=(*pGetDC)(lpdds, pHDC); @@ -3778,7 +3775,7 @@ HRESULT WINAPI extReleaseDC(LPDIRECTDRAWSURFACE lpdds, HDC FAR hdc) HRESULT res; BOOL IsPrim; - IsPrim=dxw.IsAPrimarySurface(lpdds); + IsPrim=dxwss.IsAPrimarySurface(lpdds); OutTraceDDRAW("ReleaseDC: lpdss=%x%s hdc=%x\n",lpdds, IsPrim?"(PRIM)":"", hdc); res=(*pReleaseDC)(lpdds, hdc); if((IsPrim) && (dxw.dwFlags1 & EMULATESURFACE)) sBlt("ReleaseDC", lpdds, NULL, lpdds, NULL, 0, NULL, FALSE); @@ -3811,7 +3808,7 @@ HRESULT WINAPI extGetGDISurface(LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE *w) // v2.02.31: // in EMULATED mode, should not return the actual ddraw primary surface, but the virtual one. if(dxw.dwFlags1 & EMULATESURFACE){ - *w=dxw.GetPrimarySurface(); + *w=dxwss.GetPrimarySurface(); OutTraceDW("GetGDISurface: EMULATED lpdd=%x w=%x\n", lpdd, *w); return DD_OK; } @@ -4067,7 +4064,7 @@ HRESULT WINAPI extGetPixelFormat(LPDIRECTDRAWSURFACE lpdds, LPDDPIXELFORMAT p) DWORD res; BOOL IsPrim; - IsPrim=dxw.IsAPrimarySurface(lpdds); + IsPrim=dxwss.IsAPrimarySurface(lpdds); OutTraceDDRAW("GetPixelFormat: lpdds=%x%s\n", lpdds, IsPrim?"(PRIM)":""); res=(*pGetPixelFormat)(lpdds, p); if(res){ @@ -4112,17 +4109,17 @@ HRESULT WINAPI extReleaseS(LPDIRECTDRAWSURFACE lpdds) BOOL IsPrim; BOOL IsBack; - IsPrim=dxw.IsAPrimarySurface(lpdds); - IsBack=dxw.IsABackBufferSurface(lpdds); + IsPrim=dxwss.IsAPrimarySurface(lpdds); + IsBack=dxwss.IsABackBufferSurface(lpdds); res = (*pReleaseS)(lpdds); - OutTraceDDRAW("Release(S): lpdds=%x%s refcount=%d\n", lpdds, dxw.ExplainSurfaceRole(lpdds), res); + OutTraceDDRAW("Release(S): lpdds=%x%s refcount=%d\n", lpdds, dxwss.ExplainSurfaceRole(lpdds), res); if (res==0) { // common precondition // erase surface from primary or backbuffer list // v2-03-20: d3d 1-7 play a dirty trick: it Release the surface passed as argument until refcount == 0, // but then rebuilds it with the original attributes! So, better not forget them. - if(IsPrim || IsBack) dxw.UnrefSurface(lpdds); + if(IsPrim || IsBack) dxwss.UnrefSurface(lpdds); // when releasing primary surface, erase clipping region if(IsPrim && (dxw.dwFlags1 & CLIPCURSOR)) dxw.EraseClipCursor(); @@ -4137,10 +4134,6 @@ HRESULT WINAPI extReleaseS(LPDIRECTDRAWSURFACE lpdds) OutTraceDW("Release(S): Clearing lpDDSEmu_Back pointer\n"); lpDDSEmu_Back=NULL; } - if(lpdds==dxw.lpDDSPrimary) { - OutTraceDW("Release(S): Clearing lpDDSPrimary pointer\n"); - dxw.ResetPrimarySurface(); - } } } @@ -4152,7 +4145,7 @@ HRESULT WINAPI extSetColorKey(LPDIRECTDRAWSURFACE lpdds, DWORD flags, LPDDCOLORK { HRESULT res; BOOL IsPrim; - IsPrim=dxw.IsAPrimarySurface(lpdds); + IsPrim=dxwss.IsAPrimarySurface(lpdds); if(IsTraceDDRAW){ char sInfo[81]; if (lpDDColorKey) sprintf(sInfo, "(L:%x,H:%x)",lpDDColorKey->dwColorSpaceLowValue, lpDDColorKey->dwColorSpaceHighValue); @@ -4171,7 +4164,7 @@ HRESULT WINAPI extGetColorKey(LPDIRECTDRAWSURFACE lpdds, DWORD flags, LPDDCOLORK { HRESULT res; BOOL IsPrim; - IsPrim=dxw.IsAPrimarySurface(lpdds); + IsPrim=dxwss.IsAPrimarySurface(lpdds); OutTraceDDRAW("GetColorKey(S): lpdds=%x%s flags=%x(%s)\n", lpdds, (IsPrim ? "(PRIM)" : ""), flags, ExplainColorKeyFlag(flags)); res=(*pGetColorKey)(lpdds, flags, lpDDColorKey); @@ -4188,7 +4181,7 @@ HRESULT WINAPI extEnumAttachedSurfaces(LPDIRECTDRAWSURFACE lpdds, LPVOID lpConte HRESULT res; BOOL IsPrim; - IsPrim=dxw.IsAPrimarySurface(lpdds); + IsPrim=dxwss.IsAPrimarySurface(lpdds); OutTraceDDRAW("EnumAttachedSurfaces: lpdds=%x%s Context=%x Callback=%x\n", lpdds, (IsPrim ? "(PRIM)":""), lpContext, lpEnumSurfacesCallback); @@ -4203,7 +4196,7 @@ HRESULT WINAPI extEnumAttachedSurfaces(LPDIRECTDRAWSURFACE lpdds, LPVOID lpConte res=(*pEnumAttachedSurfaces)(lpdds, lpContext, lpEnumSurfacesCallback); if (res) OutTraceE("EnumAttachedSurfaces: ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - if(lpDDSBack = dxw.GetBackBufferSurface()){ + if(lpDDSBack = dxwss.GetBackBufferSurface()){ ddsd.dwSize=Set_dwSize_From_Surface(lpDDSBack); res=lpDDSBack->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd); if(res){ @@ -4235,8 +4228,8 @@ HRESULT WINAPI extAddAttachedSurface(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURF // just remember this for further handling in the Flip operation. // But beware: this holds to BACKBUFFER surfaces only, and NOT for attached ZBUFFERS or similar! - IsPrim=dxw.IsAPrimarySurface(lpdds); - IsBack=dxw.IsABackBufferSurface(lpdds); + IsPrim=dxwss.IsAPrimarySurface(lpdds); + IsBack=dxwss.IsABackBufferSurface(lpdds); OutTraceDDRAW("AddAttachedSurface: lpdds=%x%s lpddsadd=%x%s\n", lpdds, IsPrim?"(PRIM)":(IsBack?"(BACK)":""), lpddsadd, (lpddsadd==lpDDZBuffer)?"(ZBUF)":""); //if(!lpddsadd) return DDERR_CANNOTATTACHSURFACE; // to avoid a crash... @@ -4256,7 +4249,7 @@ HRESULT WINAPI extAddAttachedSurface(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURF if ((dxw.dwFlags1 & EMULATESURFACE) && (res==DDERR_CANNOTATTACHSURFACE) || (res==DDERR_NOEXCLUSIVEMODE)) OutTraceDW("AddAttachedSurface: emulating BACKBUFFER attach on PRIMARY\n"); - dxw.MarkBackBufferSurface(lpddsadd, 1); + dxwss.PushBackBufferSurface(lpddsadd, 1); if (pAddRefS) (*pAddRefS)(lpdds); res=DD_OK; } @@ -4282,7 +4275,7 @@ HRESULT WINAPI extDeleteAttachedSurface(LPDIRECTDRAWSURFACE lpdds, DWORD dwflag OutTraceDDRAW("DeleteAttachedSurface: lpdds=%x flags=%x lpddsdel=%x\n", lpdds, dwflags, lpddsdel); res=(*pDeleteAttachedSurface)(lpdds, dwflags, lpddsdel); if(res) OutTraceE("DeleteAttachedSurface: ERROR %x(%s)\n", res, ExplainDDError(res)); - if (res && dxw.IsABackBufferSurface(lpddsdel)){ + if (res && dxwss.IsABackBufferSurface(lpddsdel)){ OutTraceDW("DeleteAttachedSurface: emulating surface detach lpdds=%x\n", lpddsdel); res = DD_OK; } @@ -4301,8 +4294,8 @@ HRESULT WINAPI extGetCapsS(int dxInterface, GetCapsS_Type pGetCapsS, LPDIRECTDRA { HRESULT res; BOOL IsPrim, IsBack, IsFixed; - IsPrim=dxw.IsAPrimarySurface(lpdds); - IsBack=dxw.IsABackBufferSurface(lpdds); + IsPrim=dxwss.IsAPrimarySurface(lpdds); + IsBack=dxwss.IsABackBufferSurface(lpdds); IsFixed=FALSE; char *sLabel; @@ -4384,7 +4377,7 @@ ULONG WINAPI extReleaseD(LPDIRECTDRAW lpdd) if(dxw.dwFlags4 & FIXREFCOUNTER){ // v2.02.41: fix the ref counter to sumulate the unwindowed original situation --VirtualRef; // why ???? - if(dxw.GetBackBufferSurface()) --VirtualRef; + if(dxwss.GetBackBufferSurface()) --VirtualRef; if(dxw.dwFlags1 & EMULATESURFACE){ if(lpDDSEmu_Prim) --VirtualRef; if(lpDDSEmu_Back) --VirtualRef; @@ -4494,8 +4487,8 @@ HRESULT WINAPI extGetSurfaceDesc(GetSurfaceDesc_Type pGetSurfaceDesc, LPDIRECTDR { HRESULT res; BOOL IsPrim, IsBack, IsFixed; - IsPrim=dxw.IsAPrimarySurface(lpdds); - IsBack=dxw.IsABackBufferSurface(lpdds); + IsPrim=dxwss.IsAPrimarySurface(lpdds); + IsBack=dxwss.IsABackBufferSurface(lpdds); IsFixed=FALSE; if (!pGetSurfaceDesc) { @@ -4699,7 +4692,7 @@ HRESULT WINAPI extDDGetGammaRamp(LPDIRECTDRAWSURFACE lpdds, DWORD dwFlags, LPDDG HRESULT ret; OutTraceDDRAW("GetGammaRamp: dds=%x dwFlags=%x\n", lpdds, dwFlags); - if(dxw.IsAPrimarySurface(lpdds)) lpdds=lpDDSEmu_Prim; + if(dxwss.IsAPrimarySurface(lpdds)) lpdds=lpDDSEmu_Prim; ret=(*pDDGetGammaRamp)(lpdds, dwFlags, lpgr); if(ret) { diff --git a/dll/ddshot.cpp b/dll/ddshot.cpp index e3c0e49..855aba5 100644 --- a/dll/ddshot.cpp +++ b/dll/ddshot.cpp @@ -39,10 +39,10 @@ void DDrawScreenShot() } if(dxw.dwFlags5 & GDIMODE){ - s = dxw.GetBackBufferSurface(); + s = dxwss.GetBackBufferSurface(); } else{ - s = dxw.GetPrimarySurface(); + s = dxwss.GetPrimarySurface(); } if(!s) return; diff --git a/dll/ddtexture.cpp b/dll/ddtexture.cpp index b1bfc13..351886c 100644 --- a/dll/ddtexture.cpp +++ b/dll/ddtexture.cpp @@ -42,6 +42,7 @@ unsigned int HashSurface(BYTE *buf, int pitch, int width, int height) int pixelsize; DWORD hash = 0; // integer divide, intentionally throwing reminder away + if (width == 0) return 0; // avoid DivBy0 error pixelsize = pitch / width; for(int y = 0; y < height; y++){ BYTE *p = buf + (y * pitch); @@ -114,7 +115,7 @@ void TextureHighlight(LPDIRECTDRAWSURFACE s) OutTraceE("TextureHigh: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return; } - if((ddsd.ddsCaps.dwCaps & DDSCAPS_TEXTURE) && !dxw.IsABackBufferSurface(s)) { + if((ddsd.ddsCaps.dwCaps & DDSCAPS_TEXTURE) && !dxwss.IsABackBufferSurface(s)) { OutTrace("TextureHigh: lpdds=%x BitCount=%d size=(%dx%d)\n", s, ddsd.ddpfPixelFormat.dwRGBBitCount, ddsd.dwWidth, ddsd.dwHeight); w = ddsd.dwWidth; @@ -204,7 +205,7 @@ static void TextureDump(LPDIRECTDRAWSURFACE s) return; } - if((ddsd.ddsCaps.dwCaps & DDSCAPS_TEXTURE) && !dxw.IsABackBufferSurface(s)) while (TRUE) { + if((ddsd.ddsCaps.dwCaps & DDSCAPS_TEXTURE) && !dxwss.IsABackBufferSurface(s)) while (TRUE) { OutTrace("TextureDump: lpdds=%x BitCount=%d size=(%dx%d)\n", s, ddsd.ddpfPixelFormat.dwRGBBitCount, ddsd.dwWidth, ddsd.dwHeight); w = ddsd.dwWidth; @@ -281,16 +282,8 @@ static void TextureDump(LPDIRECTDRAWSURFACE s) // Copy the RGBQUAD array into the file. if(pbi.bV4ClrUsed){ - //DWORD PaletteEntries[256]; - //LPDIRECTDRAWSURFACE lpDDS=NULL; - //LPDIRECTDRAWPALETTE lpDDP=NULL; - //lpDDS=dxw.GetPrimarySurface(); - //if(lpDDS) lpDDS->GetPalette(&lpDDP); - //if(lpDDP) lpDDP->GetEntries(0, 0, 256, (LPPALETTEENTRY)PaletteEntries); - //for(int i=0; i<256; i++) PaletteEntries[i]=0xff0000; extern DWORD PaletteEntries[256]; fwrite((LPVOID)PaletteEntries, pbi.bV4ClrUsed * sizeof (RGBQUAD), 1, hf); - //fwrite((LPBYTE)PaletteEntries, pbi.bV4ClrUsed * sizeof (RGBQUAD), 1, hf); } // Copy the array of color indices into the .BMP file. @@ -318,7 +311,7 @@ static void TextureHack(LPDIRECTDRAWSURFACE s) OutTraceE("TextureHack: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return; } - if((ddsd.ddsCaps.dwCaps & DDSCAPS_TEXTURE) && !dxw.IsABackBufferSurface(s)) while (TRUE) { // fake loop to ensure final Unlock + if((ddsd.ddsCaps.dwCaps & DDSCAPS_TEXTURE) && !dxwss.IsABackBufferSurface(s)) while (TRUE) { // fake loop to ensure final Unlock OutTrace("TextureHack: lpdds=%x BitCount=%d size=(%dx%d)\n", s, ddsd.ddpfPixelFormat.dwRGBBitCount, ddsd.dwWidth, ddsd.dwHeight); w = ddsd.dwWidth; diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 904865e..84dac54 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -25,6 +25,8 @@ #define SKIPIMEWINDOW TRUE dxwCore dxw; +dxwSStack dxwss; +dxwWStack dxwws; typedef char *(*Geterrwarnmessage_Type)(unsigned long, unsigned long); typedef int (*Preparedisasm_Type)(void); @@ -594,18 +596,26 @@ void HookWindowProc(HWND hwnd) { WNDPROC pWindowProc; pWindowProc = (WNDPROC)(*pGetWindowLongA)(hwnd, GWL_WNDPROC); + // don't hook twice .... if ((pWindowProc == extWindowProc) || (pWindowProc == extChildWindowProc) || (pWindowProc == extDialogWindowProc)){ // hooked already !!! OutTraceDW("GetWindowLong: hwnd=%x WindowProc HOOK already in place\n", hwnd); + return; } - else {// don't hook twice .... - long lres; - WinDBPutProc(hwnd, pWindowProc); - lres=(*pSetWindowLongA)(hwnd, GWL_WNDPROC, (LONG)extWindowProc); - OutTraceDW("SetWindowLong: hwnd=%x HOOK WindowProc=%x->%x\n", hwnd, lres, (LONG)extWindowProc); + + // v2.03.22: don't remap WindowProc in case of special address 0xFFFFnnnn. + // This makes "The Hulk demo" work avoiding WindowProc recursion and stack overflow + if (((DWORD)pWindowProc & 0xFFFF0000) == 0xFFFF0000){ + OutTraceDW("GetWindowLong: hwnd=%x WindowProc HOOK %x not updated\n", hwnd, pWindowProc); + return; } + + long lres; + dxwws.PutProc(hwnd, pWindowProc); + lres=(*pSetWindowLongA)(hwnd, GWL_WNDPROC, (LONG)extWindowProc); + OutTraceDW("SetWindowLong: hwnd=%x HOOK WindowProc=%x->%x\n", hwnd, lres, (LONG)extWindowProc); } void AdjustWindowFrame(HWND hwnd, DWORD width, DWORD height) @@ -670,8 +680,8 @@ LRESULT CALLBACK extDialogWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPA t=tn; } - pWindowProc=WinDBGetProc(hwnd); - if(pWindowProc) return(*pCallWindowProc)(pWindowProc, hwnd, message, wparam, lparam); + pWindowProc=dxwws.GetProc(hwnd); + if(pWindowProc) return(*pCallWindowProcA)(pWindowProc, hwnd, message, wparam, lparam); char *sMsg="ASSERT: DialogWinMsg pWindowProc=NULL !!!\n"; OutTraceDW(sMsg); if (IsAssertEnabled) MessageBox(0, sMsg, "WindowProc", MB_OK | MB_ICONEXCLAMATION); @@ -726,10 +736,10 @@ LRESULT CALLBACK extChildWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPAR } } - pWindowProc=WinDBGetProc(hwnd); + pWindowProc=dxwws.GetProc(hwnd); // v2.02.82: use CallWindowProc that handles WinProc handles - if(pWindowProc) return(*pCallWindowProc)(pWindowProc, hwnd, message, wparam, lparam); + if(pWindowProc) return(*pCallWindowProcA)(pWindowProc, hwnd, message, wparam, lparam); // should never get here .... OutTraceDW("ChildWindowProc: no WndProc for CHILD hwnd=%x\n", hwnd); return DefWindowProc(hwnd, message, wparam, lparam); @@ -1116,15 +1126,15 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp } if (dxw.dwFlags1 & AUTOREFRESH) dxw.ScreenRefresh(); - pWindowProc=WinDBGetProc(hwnd); + pWindowProc=dxwws.GetProc(hwnd); //OutTraceB("WindowProc: pWindowProc=%x extWindowProc=%x message=%x(%s) wparam=%x lparam=%x\n", // (*pWindowProc), extWindowProc, message, ExplainWinMessage(message), wparam, lparam); if(pWindowProc) { LRESULT ret; // v2.02.36: use CallWindowProc that handles WinProc handles - ret=(*pCallWindowProc)(pWindowProc, hwnd, message, wparam, lparam); - + ret=(*pCallWindowProcA)(pWindowProc, hwnd, message, wparam, lparam); + // save last NCHITTEST cursor position for use with KEEPASPECTRATIO scaling if(message==WM_NCHITTEST) LastCursorPos=ret; // v2.1.89: if FORCEWINRESIZE add standard processing for the missing WM_NC* messages diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index 9d22e18..f4469db 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -8,12 +8,6 @@ #include "resource.h" #include "d3d9.h" -#if 1 -#define OutTraceSDB OutTrace -#else -#define OutTraceSDB if(0) OutTrace -#endif - /* ------------------------------------------------------------------ */ // Internal function pointers /* ------------------------------------------------------------------ */ @@ -36,7 +30,6 @@ static LARGE_INTEGER TimeShifter64Coarse(LARGE_INTEGER, int); dxwCore::dxwCore() { // initialization stuff .... - extern void WinDBInit(); FullScreen=FALSE; SethWnd(NULL); SetScreenSize(); @@ -46,12 +39,9 @@ dxwCore::dxwCore() bActive = TRUE; bDInputAbs = 0; TimeShift = 0; - lpDDSPrimary = NULL; - memset(SurfaceDB, 0, sizeof(SurfaceDB)); ResetEmulatedDC(); MustShowOverlay=FALSE; TimerEvent.dwTimerType = TIMER_TYPE_NONE; - WinDBInit(); // initialization of default vsync emulation array iRefreshDelays[0]=16; iRefreshDelays[1]=17; @@ -228,234 +218,6 @@ void dxwCore::DumpDesktopStatus() ); } - - -/* ------------------------------------------------------------------ */ -// Primary surfaces auxiliary functions -/* ------------------------------------------------------------------ */ - -//#define DXW_SURFACE_STACK_TRACING - -static char *sRole(USHORT role) -{ - char *s; - switch (role){ - case 0: s="(NULL)"; break; // should never happen ... - case SURFACE_ROLE_PRIMARY: s="(PRIM)"; break; - case SURFACE_ROLE_BACKBUFFER: s="(BACK)"; break; - default: s="??"; break; // should never happen ... - } - return s; -} - -#ifdef DXW_SURFACE_STACK_TRACING -static void CheckSurfaceList(SurfaceDB_Type *SurfaceDB) -{ - char sMsg[81]; - int iPCount = 0; - int iBCount = 0; - for (int i=0;i 1) { - sprintf(sMsg, "Primary count = %d", iPCount); - MessageBox(0, sMsg, "DxWnd SurfaceList", MB_OK | MB_ICONEXCLAMATION); - } - if(iBCount > 1) { - sprintf(sMsg, "Backbuffer count = %d", iPCount); - MessageBox(0, sMsg, "DxWnd SurfaceList", MB_OK | MB_ICONEXCLAMATION); - } -} - -static void DumpSurfaceList(SurfaceDB_Type *SurfaceDB) -{ - for (int i=0;i>> SURFACELIST CLEAR ALL\n"); -#endif - for (int i=0;i>> SURFACELIST UNREF: lpdds=%x%s ref=%x vers=%d\n", ps, sRole(SurfaceDB[i].uRole), SurfaceDB[i].uRef, SurfaceDB[i].uVersion); -#endif - SurfaceDB[i].uRef = FALSE; - } -#ifdef DXW_SURFACE_STACK_TRACING - DumpSurfaceList(SurfaceDB); -#endif -} - -void dxwCore::MarkSurfaceByRole(LPDIRECTDRAWSURFACE ps, USHORT role, USHORT version) -{ - int i; - SurfaceDB_Type *e; -#ifdef DXW_SURFACE_STACK_TRACING - OutTraceSDB(">>> SURFACELIST MARK: lpdds=%x%s vers=%d\n", ps, sRole(role), version); -#endif - for (i=0;ilpdds==ps) || (e->lpdds==(DWORD)0)) break; // got matching entry or end of the list - } - if(i == DDSQLEN) { - MessageBox(0, "Surface stack is full", "DxWnd SurfaceList", MB_OK | MB_ICONEXCLAMATION); - return; - } - e->lpdds=ps; - e->uRole = role; - e->uRef = TRUE; - e->uVersion = version; -#ifdef DXW_SURFACE_STACK_TRACING - DumpSurfaceList(SurfaceDB); -#endif -} - -void dxwCore::MarkPrimarySurface(LPDIRECTDRAWSURFACE ps, int version) -{ - MarkSurfaceByRole(ps, SURFACE_ROLE_PRIMARY, (USHORT)version); -} - -void dxwCore::MarkBackBufferSurface(LPDIRECTDRAWSURFACE ps, int version) -{ - MarkSurfaceByRole(ps, SURFACE_ROLE_BACKBUFFER, (USHORT)version); -} - -void dxwCore::MarkRegularSurface(LPDIRECTDRAWSURFACE ps) -{ - int i; - // look for entry - for (i=0;i>> SURFACELIST CLEAR: i=%d lpdds=%x%s ref=%x vers=%d\n", - i, ps, sRole(SurfaceDB[i].uRole), SurfaceDB[i].uRef, SurfaceDB[i].uVersion); -#endif - for (; i. #include "TlHelp32.h" -#define VERSION "2.03.21" +#define VERSION "2.03.22" #define DDTHREADLOCK 1 //#define LOCKTHREADS diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 7606983..bd36876 100644 Binary files a/dll/dxwnd.vs2008.suo and b/dll/dxwnd.vs2008.suo differ diff --git a/dll/dxwnd.vs2008.vcproj b/dll/dxwnd.vs2008.vcproj index 54e5136..de9bd1a 100644 --- a/dll/dxwnd.vs2008.vcproj +++ b/dll/dxwnd.vs2008.vcproj @@ -361,6 +361,14 @@ RelativePath=".\dxwnd.rc" > + + + + @@ -461,10 +469,6 @@ RelativePath=".\wintrust.cpp" > - - +#include "dxwnd.h" +#include "dxwcore.hpp" + +//#define DXW_SURFACE_STACK_TRACING + +dxwSStack::dxwSStack() +{ + lpDDSPrimary = NULL; + lpDDSBackBuffer = NULL; + memset(SurfaceDB, 0, sizeof(SurfaceDB)); +} + +dxwSStack::~dxwSStack() +{ +} + +static char *sRole(USHORT role) +{ + char *s; + switch (role){ + case 0: s="(NULL)"; break; // should never happen ... + case SURFACE_ROLE_PRIMARY: s="(PRIM)"; break; + case SURFACE_ROLE_BACKBUFFER: s="(BACK)"; break; + default: s="??"; break; // should never happen ... + } + return s; +} + +#ifdef DXW_SURFACE_STACK_TRACING +static void CheckSurfaceList(SurfaceDB_Type *SurfaceDB) +{ + char sMsg[81]; + int iPCount = 0; + int iBCount = 0; + for (int i=0;i 1) { + sprintf(sMsg, "Primary count = %d", iPCount); + MessageBox(0, sMsg, "DxWnd SurfaceList", MB_OK | MB_ICONEXCLAMATION); + } + if(iBCount > 1) { + sprintf(sMsg, "Backbuffer count = %d", iPCount); + MessageBox(0, sMsg, "DxWnd SurfaceList", MB_OK | MB_ICONEXCLAMATION); + } +} + +static void DumpSurfaceList(SurfaceDB_Type *SurfaceDB) +{ + for (int i=0;i>> SURFACELIST CLEAR ALL\n"); +#endif + for (int i=0;i>> SURFACELIST UNREF: lpdds=%x%s ref=%x vers=%d\n", ps, sRole(SurfaceDB[i].uRole), SurfaceDB[i].uRef, SurfaceDB[i].uVersion); +#endif + SurfaceDB[i].uRef = FALSE; + if(ps == lpDDSPrimary) lpDDSPrimary = GetSurfaceByRole(SURFACE_ROLE_PRIMARY); + if(ps == lpDDSBackBuffer) lpDDSBackBuffer = GetSurfaceByRole(SURFACE_ROLE_BACKBUFFER); + } +#ifdef DXW_SURFACE_STACK_TRACING + DumpSurfaceList(SurfaceDB); +#endif +} + +void dxwSStack::PushSurface(LPDIRECTDRAWSURFACE ps, USHORT role, USHORT version) +{ + int i; + SurfaceDB_Type *e; +#ifdef DXW_SURFACE_STACK_TRACING + OutTraceSDB(">>> SURFACELIST MARK: lpdds=%x%s vers=%d\n", ps, sRole(role), version); +#endif + for (i=0;ilpdds==ps) || (e->lpdds==(DWORD)0)) break; // got matching entry or end of the list + } + if(i == DDSQLEN) { + MessageBox(0, "Surface stack is full", "DxWnd SurfaceList", MB_OK | MB_ICONEXCLAMATION); + return; + } + e->lpdds=ps; + e->uRole = role; + e->uRef = TRUE; + e->uVersion = version; +#ifdef DXW_SURFACE_STACK_TRACING + DumpSurfaceList(SurfaceDB); +#endif +} + +void dxwSStack::PushPrimarySurface(LPDIRECTDRAWSURFACE ps, int version) +{ + PushSurface(ps, SURFACE_ROLE_PRIMARY, (USHORT)version); + lpDDSPrimary = ps; +} + +void dxwSStack::PushBackBufferSurface(LPDIRECTDRAWSURFACE ps, int version) +{ + PushSurface(ps, SURFACE_ROLE_BACKBUFFER, (USHORT)version); + lpDDSBackBuffer = ps; +} + +void dxwSStack::PopSurface(LPDIRECTDRAWSURFACE ps) +{ + int i; + // look for entry + for (i=0;i>> SURFACELIST CLEAR: i=%d lpdds=%x%s ref=%x vers=%d\n", + i, ps, sRole(SurfaceDB[i].uRole), SurfaceDB[i].uRef, SurfaceDB[i].uVersion); +#endif + for (; i #include -#include -#include #include "dxwnd.h" #include "dxwcore.hpp" -#include "dxhook.h" -#include "syslibs.h" -#include "dxhelper.h" - -typedef struct { - HWND hwnd; - WNDPROC wndproc; - int w; - int h; -} wndstack_entry; +//#define DXW_WINPROC_STACK_TRACING #define MAXWNDHSTACK 256 -wndstack_entry *WhndStack; -static int WhndTOS = 0; -static int WhndSize = 0; - -void WinDBInit() +dxwWStack::dxwWStack() { + WhndTOS = 0; WhndSize = MAXWNDHSTACK; WhndStack = (wndstack_entry *)malloc(WhndSize * sizeof(wndstack_entry)); } -void WinDBPut(HWND hwnd, WNDPROC wndproc, int w, int h) +dxwWStack::~dxwWStack() +{ +} + +void dxwWStack::Put(HWND hwnd, WNDPROC wndproc, int w, int h) { int StackIdx; @@ -66,7 +57,7 @@ void WinDBPut(HWND hwnd, WNDPROC wndproc, int w, int h) WhndTOS++; } -void WinDBPutProc(HWND hwnd, WNDPROC wndproc) +void dxwWStack::PutProc(HWND hwnd, WNDPROC wndproc) { int StackIdx; @@ -94,7 +85,7 @@ void WinDBPutProc(HWND hwnd, WNDPROC wndproc) WhndTOS++; } -void WinDBPutSize(HWND hwnd, int w, int h) +void dxwWStack::PutSize(HWND hwnd, int w, int h) { int StackIdx; @@ -119,7 +110,7 @@ void WinDBPutSize(HWND hwnd, int w, int h) WhndTOS++; } -BOOL WinDBGetSize(HWND hwnd, int *w, int *h) +BOOL dxwWStack::GetSize(HWND hwnd, int *w, int *h) { int StackIdx; for(StackIdx=0; StackIdxm_DCEmulationMode = 0; - if(t->flags2 & GDISTRETCHED) dlg->m_DCEmulationMode = 1; - if(t->flags3 & GDIEMULATEDC) dlg->m_DCEmulationMode = 2; - if(t->flags & MAPGDITOPRIMARY) dlg->m_DCEmulationMode = 3; -*/ - typedef BOOL (WINAPI *ExtTextOutW_Type)(HDC, int, int, UINT, const RECT *, LPCWSTR, UINT, const INT *); typedef BOOL (WINAPI *ExtTextOutA_Type)(HDC, int, int, UINT, const RECT *, LPCSTR, UINT, const INT *); BOOL WINAPI extExtTextOutW(HDC, int, int, UINT, const RECT *, LPCWSTR, UINT, const INT *); @@ -155,19 +148,6 @@ static HookEntry_Type EmulateHooks[]={ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator }; -static HookEntry_Type DDHooks[]={ - {HOOK_IAT_CANDIDATE, "CreateCompatibleDC", (FARPROC)CreateCompatibleDC, (FARPROC *)&pGDICreateCompatibleDC, (FARPROC)extDDCreateCompatibleDC}, - {HOOK_IAT_CANDIDATE, "DeleteDC", (FARPROC)DeleteDC, (FARPROC *)&pGDIDeleteDC, (FARPROC)extDDDeleteDC}, - {HOOK_IAT_CANDIDATE, "CreateDCA", (FARPROC)CreateDCA, (FARPROC *)&pGDICreateDC, (FARPROC)extDDCreateDC}, - {HOOK_IAT_CANDIDATE, "BitBlt", (FARPROC)BitBlt, (FARPROC *)&pGDIBitBlt, (FARPROC)extDDBitBlt}, - {HOOK_IAT_CANDIDATE, "StretchBlt", (FARPROC)StretchBlt, (FARPROC *)&pGDIStretchBlt, (FARPROC)extDDStretchBlt}, - {HOOK_IAT_CANDIDATE, "GetClipBox", (FARPROC)NULL, (FARPROC *)&pGDIGetClipBox, (FARPROC)extGetClipBox}, - - // {HOOK_IAT_CANDIDATE, "PatBlt", (FARPROC)PatBlt, (FARPROC *)&pGDIPatBlt, (FARPROC)extDDPatBlt}, // missing one ... - // {HOOK_IAT_CANDIDATE, "MaskBlt", (FARPROC)NULL, (FARPROC *)&pMaskBlt, (FARPROC)extDDMaskBlt}, // missing one ... - {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator -}; - static HookEntry_Type TextHooks[]={ {HOOK_IAT_CANDIDATE, "CreateFontA", (FARPROC)CreateFont, (FARPROC *)&pGDICreateFont, (FARPROC)extCreateFont}, {HOOK_IAT_CANDIDATE, "CreateFontIndirectA", (FARPROC)CreateFontIndirectA, (FARPROC *)&pGDICreateFontIndirect, (FARPROC)extCreateFontIndirect}, @@ -206,7 +186,7 @@ void HookGDI32Init() { HookLibInit(Hooks); HookLibInit(RemapHooks); - HookLibInit(DDHooks); + HookLibInit(ScaledHooks); HookLibInit(EmulateHooks); HookLibInit(TextHooks); HookLibInit(GammaHooks); @@ -220,7 +200,6 @@ void HookGDI32(HMODULE module) if (dxw.dwFlags1 & CLIENTREMAPPING) HookLibrary(module, RemapHooks, libname); if (dxw.dwFlags2 & GDISTRETCHED) HookLibrary(module, ScaledHooks, libname); if (dxw.dwFlags3 & GDIEMULATEDC) HookLibrary(module, EmulateHooks, libname); - if (dxw.dwFlags1 & MAPGDITOPRIMARY) HookLibrary(module, DDHooks, libname); if (dxw.dwFlags1 & FIXTEXTOUT) HookLibrary(module, TextHooks, libname); if (dxw.dwFlags2 & DISABLEGAMMARAMP) HookLibrary(module, GammaHooks, libname); // v2.02.33 - for "Stratego" compatibility option @@ -237,7 +216,6 @@ FARPROC Remap_GDI32_ProcAddress(LPCSTR proc, HMODULE hModule) if (dxw.dwFlags1 & CLIENTREMAPPING) if(addr=RemapLibrary(proc, hModule, RemapHooks)) return addr; if (dxw.dwFlags2 & GDISTRETCHED) if (addr=RemapLibrary(proc, hModule, ScaledHooks)) return addr; if (dxw.dwFlags3 & GDIEMULATEDC) if (addr=RemapLibrary(proc, hModule, EmulateHooks)) return addr; - if (dxw.dwFlags1 & MAPGDITOPRIMARY) if (addr=RemapLibrary(proc, hModule, DDHooks)) return addr; if (dxw.dwFlags1 & FIXTEXTOUT) if(addr=RemapLibrary(proc, hModule, TextHooks)) return addr; if (dxw.dwFlags2 & DISABLEGAMMARAMP) if(addr=RemapLibrary(proc, hModule, GammaHooks)) return addr; // v2.02.33 - for "Stratego" compatibility option @@ -495,61 +473,6 @@ BOOL WINAPI extGDIRestoreDC(HDC hdc, int nSavedDC) // maps the GDI palette to the buffered DirectDraw one. This fixes the screen // output for "Dementia" (a.k.a. "Armed & Delirious"). -HPALETTE WINAPI extGDICreatePalette(CONST LOGPALETTE *plpal) -{ - HPALETTE ret; - - OutTraceDW("GDI.CreatePalette: plpal=%x version=%x NumEntries=%d\n", plpal, plpal->palVersion, plpal->palNumEntries); - if(IsDebug) dxw.DumpPalette(plpal->palNumEntries, (LPPALETTEENTRY)plpal->palPalEntry); - ret=(*pGDICreatePalette)(plpal); - OutTraceDW("GDI.CreatePalette: hPalette=%x\n", ret); - return ret; -} - -HPALETTE hDesktopPalette=NULL; - -HPALETTE WINAPI extSelectPalette(HDC hdc, HPALETTE hpal, BOOL bForceBackground) -{ - HPALETTE ret; - - if(hdc==dxw.RealHDC) hdc= dxw.VirtualHDC; - - ret=(*pGDISelectPalette)(hdc, hpal, bForceBackground); - OutTraceDW("GDI.SelectPalette: hdc=%x hpal=%x ForceBackground=%x ret=%x\n", hdc, hpal, bForceBackground, ret); - if((OBJ_DC == GetObjectType(hdc)) && (dxw.dwFlags1 & EMULATESURFACE)){ - OutTraceDW("GDI.SelectPalette: register desktop palette hpal=%x\n", hpal); - hDesktopPalette=hpal; - } - return ret; -} - -BOOL WINAPI extAnimatePalette(HPALETTE hpal, UINT iStartIndex, UINT cEntries, const PALETTEENTRY *ppe) -{ - // Invoked by "Pharaoh's Ascent 1.4" - STOPPER("AnimatePalette"); - return TRUE; -} - -UINT WINAPI extRealizePalette(HDC hdc) -{ - UINT ret; - extern void mySetPalette(int, int, LPPALETTEENTRY); - - OutTraceDW("GDI.RealizePalette: hdc=%x\n", hdc); - if((OBJ_DC == GetObjectType(hdc)) && (dxw.dwFlags1 & EMULATESURFACE)){ - PALETTEENTRY PalEntries[256]; - UINT nEntries; - nEntries=(*pGetPaletteEntries)(hDesktopPalette, 0, 256, PalEntries); - mySetPalette(0, nEntries, PalEntries); - if(IsDebug) dxw.DumpPalette(nEntries, PalEntries); - ret=DD_OK; - } - else - ret=(*pGDIRealizePalette)(hdc); - OutTraceDW("GDI.RealizePalette: hdc=%x ret=%x\n", hdc, ret); - return ret; -} - // In emulated mode (when color depyth is 8BPP ?) it may happen that the game // expects to get the requested system palette entries, while the 32BPP screen // returns 0. "Mission Force Cyberstorm" is one of these. Returning the same @@ -622,6 +545,61 @@ static PALETTEENTRY dp[256]={ // default palette, captured on my PC with video m {0x00,0x00,0xff,0x00},{0xff,0x00,0xff,0x00},{0x00,0xff,0xff,0x00},{0xff,0xff,0xff,0x00} }; +HPALETTE WINAPI extGDICreatePalette(CONST LOGPALETTE *plpal) +{ + HPALETTE ret; + + OutTraceDW("GDI.CreatePalette: plpal=%x version=%x NumEntries=%d\n", plpal, plpal->palVersion, plpal->palNumEntries); + if(IsDebug) dxw.DumpPalette(plpal->palNumEntries, (LPPALETTEENTRY)plpal->palPalEntry); + ret=(*pGDICreatePalette)(plpal); + OutTraceDW("GDI.CreatePalette: hPalette=%x\n", ret); + return ret; +} + +HPALETTE hDesktopPalette=NULL; + +HPALETTE WINAPI extSelectPalette(HDC hdc, HPALETTE hpal, BOOL bForceBackground) +{ + HPALETTE ret; + + if(hdc==dxw.RealHDC) hdc= dxw.VirtualHDC; + + ret=(*pGDISelectPalette)(hdc, hpal, bForceBackground); + OutTraceDW("GDI.SelectPalette: hdc=%x hpal=%x ForceBackground=%x ret=%x\n", hdc, hpal, bForceBackground, ret); + if((OBJ_DC == GetObjectType(hdc)) && (dxw.dwFlags1 & EMULATESURFACE)){ + OutTraceDW("GDI.SelectPalette: register desktop palette hpal=%x\n", hpal); + hDesktopPalette=hpal; + } + return ret; +} + +BOOL WINAPI extAnimatePalette(HPALETTE hpal, UINT iStartIndex, UINT cEntries, const PALETTEENTRY *ppe) +{ + // Invoked by "Pharaoh's Ascent 1.4" + STOPPER("AnimatePalette"); + return TRUE; +} + +UINT WINAPI extRealizePalette(HDC hdc) +{ + UINT ret; + extern void mySetPalette(int, int, LPPALETTEENTRY); + + OutTraceDW("GDI.RealizePalette: hdc=%x\n", hdc); + if((OBJ_DC == GetObjectType(hdc)) && (dxw.dwFlags1 & EMULATESURFACE)){ + PALETTEENTRY PalEntries[256]; + UINT nEntries; + nEntries=(*pGetPaletteEntries)(hDesktopPalette, 0, 256, PalEntries); + mySetPalette(0, nEntries, PalEntries); + if(IsDebug && nEntries) dxw.DumpPalette(nEntries, PalEntries); + ret=nEntries; + } + else + ret=(*pGDIRealizePalette)(hdc); + OutTraceDW("GDI.RealizePalette: hdc=%x ret=%x\n", hdc, ret); + return ret; +} + UINT WINAPI extGetSystemPaletteEntries(HDC hdc, UINT iStartIndex, UINT nEntries, LPPALETTEENTRY lppe) { int ret; @@ -639,234 +617,6 @@ UINT WINAPI extGetSystemPaletteEntries(HDC hdc, UINT iStartIndex, UINT nEntries, return ret; } -/* -------------------------------------------------------------------- */ -// directdraw supported GDI calls -/* -------------------------------------------------------------------- */ - -// PrimHDC: DC handle of the selected DirectDraw primary surface. NULL when invalid. -extern HDC PrimHDC; - -HDC WINAPI extDDCreateCompatibleDC(HDC hdc) -{ - HDC RetHdc; - extern GetDC_Type pGetDC; - - OutTraceDW("GDI.CreateCompatibleDC: hdc=%x\n", hdc); - - if(dxw.IsDesktop(WindowFromDC(hdc)) && dxw.IsFullScreen()) { - dxw.SetPrimarySurface(); - if(!PrimHDC && dxw.lpDDSPrimary){ - HRESULT res; - STOPPER("null PrimHDC"); - res=(*pGetDC)(dxw.lpDDSPrimary, &PrimHDC); - if(res) OutTraceE("GDI.CreateCompatibleDC ERROR: GetDC lpdds=%x err=%d(%s) at %d\n", dxw.lpDDSPrimary, res, ExplainDDError(res), __LINE__); - } - OutTraceDW("GDI.CreateCompatibleDC: duplicating primary surface HDC lpDDSPrimary=%x SrcHdc=%x\n", dxw.lpDDSPrimary, PrimHDC); - RetHdc=(*pGDICreateCompatibleDC)(PrimHDC); - } - else - RetHdc=(*pGDICreateCompatibleDC)(hdc); - - if(RetHdc) - OutTraceDW("GDI.CreateCompatibleDC: returning HDC=%x\n", RetHdc); - else - OutTraceE("GDI.CreateCompatibleDC ERROR: err=%d at %d\n", GetLastError(), __LINE__); - - return RetHdc; -} - -BOOL WINAPI extDDDeleteDC(HDC hdc) -{ - BOOL res; - - OutTraceDW("GDI.DeleteDC: hdc=%x\n", hdc); - - res=(*pGDIDeleteDC)(hdc); - if(!res) OutTraceE("GDI.DeleteDC: ERROR err=%d at %d\n", GetLastError(), __LINE__); - return res; -} - -static HDC WINAPI winDDGetDC(HWND hwnd, char *api) -{ - HDC hdc; - HRESULT res; - extern HRESULT WINAPI extGetDC(LPDIRECTDRAWSURFACE, HDC FAR *); - - OutTraceDW("%s: hwnd=%x\n", api, hwnd); - - dxw.ResetPrimarySurface(); - dxw.SetPrimarySurface(); - if(dxw.IsRealDesktop(hwnd)) hwnd=dxw.GethWnd(); - - if(dxw.lpDDSPrimary){ - if (PrimHDC){ - OutTraceDW("%s: reusing primary hdc\n", api); - (*pUnlockMethod(dxw.lpDDSPrimary))(dxw.lpDDSPrimary, NULL); - hdc=PrimHDC; - } - else{ - OutTraceDW("%s: get hdc from PRIMARY surface lpdds=%x\n", api, dxw.lpDDSPrimary); - res=extGetDC(dxw.lpDDSPrimary,&hdc); - if(res) { - OutTraceE("%s: GetDC(%x) ERROR %x(%s) at %d\n", api, dxw.lpDDSPrimary, res, ExplainDDError(res), __LINE__); - if(res==DDERR_DCALREADYCREATED){ - // try recovery.... - (*pReleaseDC)(dxw.lpDDSPrimary,NULL); - res=extGetDC(dxw.lpDDSPrimary,&hdc); - } - if(res)return 0; - } - PrimHDC=hdc; - } - } - else { - hdc=(*pGDIGetDC)(hwnd ? hwnd : dxw.GethWnd()); - OutTraceDW("%s: returning window DC handle hwnd=%x hdc=%x\n", api, hwnd, hdc); - PrimHDC=NULL; - } - - if(hdc) - OutTraceDW("%s: hwnd=%x hdc=%x\n", api, hwnd, hdc); - else - OutTraceE("%s: ERROR err=%d at %d\n", api, GetLastError, __LINE__); - return(hdc); -} - -HDC WINAPI extDDCreateDC(LPSTR Driver, LPSTR Device, LPSTR Output, CONST DEVMODE *InitData) -{ - HDC RetHDC; - OutTraceDW("GDI.CreateDC: Driver=%s Device=%s Output=%s InitData=%x\n", - Driver?Driver:"(NULL)", Device?Device:"(NULL)", Output?Output:"(NULL)", InitData); - - if (!Driver || !strncmp(Driver,"DISPLAY",7)) { - //HDC PrimHDC; - LPDIRECTDRAWSURFACE lpdds; - OutTraceDW("GDI.CreateDC: returning primary surface DC\n"); - lpdds=dxw.GetPrimarySurface(); - (*pGetDC)(lpdds, &PrimHDC); - RetHDC=(*pGDICreateCompatibleDC)(PrimHDC); - (*pReleaseDC)(lpdds, PrimHDC); - } - else{ - RetHDC=(*pGDICreateDC)(Driver, Device, Output, InitData); - } - if(RetHDC) - OutTraceDW("GDI.CreateDC: returning HDC=%x\n", RetHDC); - else - OutTraceE("GDI.CreateDC ERROR: err=%d at %d\n", GetLastError(), __LINE__); - return RetHDC; -} - -HDC WINAPI extDDGetDC(HWND hwnd) -{ - HDC ret; - ret=winDDGetDC(hwnd, "GDI.GetDC"); - return ret; -} - -HDC WINAPI extDDGetDCEx(HWND hwnd, HRGN hrgnClip, DWORD flags) -{ - HDC ret; - ret=winDDGetDC(hwnd, "GDI.GetDCEx"); - return ret; -} - -HDC WINAPI extDDGetWindowDC(HWND hwnd) -{ - HDC ret; - ret=winDDGetDC(hwnd, "GDI.GetWindowDC"); - return ret; -} - -int WINAPI extDDReleaseDC(HWND hwnd, HDC hDC) -{ - int res; - extern HRESULT WINAPI extReleaseDC(LPDIRECTDRAWSURFACE, HDC); - - OutTraceDW("GDI.ReleaseDC(DD): hwnd=%x hdc=%x\n", hwnd, hDC); - res=0; - if ((hDC == PrimHDC) || (hwnd==0)){ - dxw.SetPrimarySurface(); - OutTraceDW("GDI.ReleaseDC(DD): refreshing primary surface lpdds=%x\n",dxw.lpDDSPrimary); - if(!dxw.lpDDSPrimary) return 0; - extReleaseDC(dxw.lpDDSPrimary, hDC); - PrimHDC=NULL; - res=1; // 1 = OK - } - else { - res=(*pGDIReleaseDC)(hwnd, hDC); - if (!res) OutTraceE("GDI.ReleaseDC: ERROR err=%d at %d\n", GetLastError(), __LINE__); - } - return(res); -} - -BOOL WINAPI extDDBitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop) -{ - BOOL ret; - HRESULT res; - extern HRESULT WINAPI extGetDC(LPDIRECTDRAWSURFACE, HDC FAR *); - - OutTraceDW("GDI.BitBlt(PRIMARY): HDC=%x nXDest=%d nYDest=%d nWidth=%d nHeight=%d hdcSrc=%x nXSrc=%d nYSrc=%d dwRop=%x(%s)\n", - hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, dwRop, ExplainROP(dwRop)); - - ret=TRUE; // OK - - if(dxw.IsDesktop(WindowFromDC(hdcDest))) { - OutTrace("hdcDest=%x PrimHDC=%x\n", hdcDest, PrimHDC); - hdcDest=PrimHDC; - if(hdcDest==0) { - dxw.ResetPrimarySurface(); - dxw.SetPrimarySurface(); - extGetDC(dxw.lpDDSPrimary, &PrimHDC); - hdcDest=PrimHDC; - } - res=(*pGDIBitBlt)(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, dwRop); - if(!res) OutTraceE("GDI.BitBlt: ERROR err=%d at %d\n", GetLastError(), __LINE__); - dxw.ScreenRefresh(); - return ret; - } - - // proxy ... - res=(*pGDIBitBlt)(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, dwRop); - if(!res) OutTraceE("GDI.BitBlt: ERROR err=%d at %d\n", GetLastError(), __LINE__); - return ret; -} - -BOOL WINAPI extDDStretchBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, - HDC hdcSrc, int nXSrc, int nYSrc, int nWSrc, int nHSrc, DWORD dwRop) -{ - BOOL ret; - RECT ClientRect; - extern HRESULT WINAPI extGetDC(LPDIRECTDRAWSURFACE, HDC FAR *); - - OutTraceDW("GDI.StretchBlt: HDC=%x nXDest=%d nYDest=%d nWidth=%d nHeight=%d hdcSrc=%x nXSrc=%d nYSrc=%d nWSrc=%x nHSrc=%x dwRop=%x\n", - hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, nWSrc, nHSrc, dwRop); - - //if(dxw.IsDesktop(WindowFromDC(hdcDest))) { - // hdcDest=PrimHDC; - // if(hdcDest==0) { - // dxw.ResetPrimarySurface(); - // dxw.SetPrimarySurface(); - // extGetDC(dxw.lpDDSPrimary, &PrimHDC); - // hdcDest=PrimHDC; - // } - //} - - if(hdcDest != hdcSrc){ - (*pGetClientRect)(dxw.GethWnd(),&ClientRect); - ret=(*pGDIStretchBlt)(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, nWidth, nHeight, dwRop); - if(!ret) { - OutTraceE("GDI.StretchBlt: ERROR err=%d at %d\n", GetLastError(), __LINE__); - return ret; - } - } - //dxw.SetPrimarySurface(); - //OutTraceDW("GDI.StretchBlt: refreshing primary surface lpdds=%x\n",dxw.lpDDSPrimary); - //sBlt("GDI.StretchBlt", dxw.lpDDSPrimary, NULL, dxw.lpDDSPrimary, NULL, 0, NULL, 0); - //res=(*pUnlockMethod(dxw.lpDDSPrimary))(dxw.lpDDSPrimary, NULL); - return ret; -} - HDC WINAPI extGDICreateDC(LPSTR Driver, LPSTR Device, LPSTR Output, CONST DEVMODE *InitData) { HDC WinHDC, RetHDC; diff --git a/dll/hd3d7.cpp b/dll/hd3d7.cpp index 2b81865..b5c67a2 100644 --- a/dll/hd3d7.cpp +++ b/dll/hd3d7.cpp @@ -504,7 +504,7 @@ HRESULT WINAPI extDirect3DCreateDevice(GUID FAR *lpGUID, LPDIRECT3D lpd3ddevice, HRESULT res; OutTraceD3D("Direct3DCreateDevice: guid=%x d3ddevice=%x dds=%x%s UnkOuter=%x\n", - lpGUID, lpd3ddevice, surf, dxw.ExplainSurfaceRole(surf), pUnkOuter); + lpGUID, lpd3ddevice, surf, dxwss.ExplainSurfaceRole(surf), pUnkOuter); res=(*pDirect3DCreateDevice)(lpGUID, lpd3ddevice, surf, lplpd3ddevice, pUnkOuter); if(res) OutTraceE("Direct3DCreateDevice ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); else OutTraceD3D("Direct3DCreateDevice: d3ddevice=%x\n", *lplpd3ddevice); @@ -879,7 +879,7 @@ HRESULT WINAPI extCreateDevice2(void *lpd3d, REFCLSID Guid, LPDIRECTDRAWSURFACE HRESULT res; OutTraceD3D("CreateDevice(D3D2): d3d=%x GUID=%x(%s) lpdds=%x%s\n", - lpd3d, Guid.Data1, ExplainGUID((GUID *)&Guid), lpdds, dxw.ExplainSurfaceRole((LPDIRECTDRAWSURFACE)lpdds)); + lpd3d, Guid.Data1, ExplainGUID((GUID *)&Guid), lpdds, dxwss.ExplainSurfaceRole((LPDIRECTDRAWSURFACE)lpdds)); res=(*pCreateDevice2)(lpd3d, Guid, lpdds, lplpd3dd); if(res) { OutTraceE("CreateDevice(D3D2) ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); @@ -903,7 +903,7 @@ HRESULT WINAPI extCreateDevice3(void *lpd3d, REFCLSID Guid, LPDIRECTDRAWSURFACE4 HRESULT res; OutTraceD3D("CreateDevice(D3D3): d3d=%x GUID=%x(%s) lpdds=%x%s\n", - lpd3d, Guid.Data1, ExplainGUID((GUID *)&Guid), lpdds, dxw.ExplainSurfaceRole((LPDIRECTDRAWSURFACE)lpdds)); + lpd3d, Guid.Data1, ExplainGUID((GUID *)&Guid), lpdds, dxwss.ExplainSurfaceRole((LPDIRECTDRAWSURFACE)lpdds)); res=(*pCreateDevice3)(lpd3d, Guid, lpdds, lplpd3dd, unk); if(res) { OutTraceE("CreateDevice(D3D3) ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); @@ -931,7 +931,7 @@ HRESULT WINAPI extCreateDevice7(void *lpd3d, REFCLSID Guid, LPDIRECTDRAWSURFACE7 HRESULT res; OutTraceD3D("CreateDevice(D3D7): d3d=%x GUID=%x(%s) lpdds=%x%s\n", - lpd3d, Guid.Data1, ExplainGUID((GUID *)&Guid), lpdds, dxw.ExplainSurfaceRole((LPDIRECTDRAWSURFACE)lpdds)); + lpd3d, Guid.Data1, ExplainGUID((GUID *)&Guid), lpdds, dxwss.ExplainSurfaceRole((LPDIRECTDRAWSURFACE)lpdds)); res=(*pCreateDevice7)(lpd3d, Guid, lpdds, lplpd3dd); if(res) { OutTraceE("CreateDevice(D3D7) ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); diff --git a/dll/hd3d8.cpp b/dll/hd3d8.cpp index 9ec1a06..43de20c 100644 --- a/dll/hd3d8.cpp +++ b/dll/hd3d8.cpp @@ -27,6 +27,7 @@ void D3D8TextureHandling(void *arg, int Level) IDirect3DSurface8 *pSurfaceLevel; D3DSURFACE_DESC Desc; D3DLOCKED_RECT LockedRect; + //OutTrace("D3D8TextureHandling: arg=%x level=%d\n", (DWORD)arg, Level); if(res=lpd3dtex->GetSurfaceLevel(Level, &pSurfaceLevel)){ OutTraceE("Texture::GetSurfaceLevel ERROR: res=%d(%s)\n", res, ExplainDDError(res)); return; diff --git a/dll/hd3d9.cpp b/dll/hd3d9.cpp index d239070..12ca359 100644 --- a/dll/hd3d9.cpp +++ b/dll/hd3d9.cpp @@ -27,15 +27,16 @@ void D3D9TextureHandling(void *arg, int Level) IDirect3DSurface9 *pSurfaceLevel; D3DSURFACE_DESC Desc; D3DLOCKED_RECT LockedRect; + //OutTrace("D3D9TextureHandling: arg=%x level=%d\n", (DWORD)arg, Level); if(res=lpd3dtex->GetSurfaceLevel(Level, &pSurfaceLevel)){ OutTraceE("Texture::GetSurfaceLevel ERROR: res=%d(%s)\n", res, ExplainDDError(res)); return; } + pSurfaceLevel->Release(); if(res=lpd3dtex->GetLevelDesc(Level, &Desc)){ OutTraceE("Texture::GetLevelDesc ERROR: res=%d(%s)\n", res, ExplainDDError(res)); return; } - pSurfaceLevel->Release(); switch(Desc.Type){ case D3DRTYPE_SURFACE: case D3DRTYPE_TEXTURE: diff --git a/dll/syslibs.h b/dll/syslibs.h index 75ec488..1dfd764 100644 --- a/dll/syslibs.h +++ b/dll/syslibs.h @@ -355,7 +355,8 @@ DXWEXTERN CoUninitialize_Type pCoUninitialize DXWINITIALIZED; // user32.dll: DXWEXTERN BeginPaint_Type pBeginPaint DXWINITIALIZED; -DXWEXTERN CallWindowProc_Type pCallWindowProc DXWINITIALIZED; +DXWEXTERN CallWindowProc_Type pCallWindowProcA DXWINITIALIZED; +DXWEXTERN CallWindowProc_Type pCallWindowProcW DXWINITIALIZED; DXWEXTERN ChangeDisplaySettingsA_Type pChangeDisplaySettingsA DXWINITIALIZED; DXWEXTERN ChangeDisplaySettingsExA_Type pChangeDisplaySettingsExA DXWINITIALIZED; DXWEXTERN ChangeDisplaySettingsW_Type pChangeDisplaySettingsW DXWINITIALIZED; @@ -466,15 +467,12 @@ extern BOOL WINAPI extImmGetOpenStatus(HIMC); extern BOOL WINAPI extGDIBitBlt(HDC, int, int, int, int, HDC, int, int, DWORD); extern HDC WINAPI extGDICreateCompatibleDC(HDC); extern HDC WINAPI extEMUCreateCompatibleDC(HDC); -extern HDC WINAPI extDDCreateCompatibleDC(HDC); extern HDC WINAPI extGDICreateDC(LPSTR, LPSTR, LPSTR, CONST DEVMODE *); -extern HDC WINAPI extDDCreateDC(LPSTR, LPSTR, LPSTR, CONST DEVMODE *); extern HFONT WINAPI extCreateFont(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCTSTR); extern HFONT WINAPI extCreateFontIndirect(const LOGFONT*); extern HPALETTE WINAPI extGDICreatePalette(CONST LOGPALETTE *); extern HDWP WINAPI extDeferWindowPos(HDWP, HWND, HWND, int, int, int, int, UINT); extern BOOL WINAPI extGDIDeleteDC(HDC); -extern BOOL WINAPI extDDDeleteDC(HDC); extern int WINAPI extGetClipBox(HDC, LPRECT); extern int WINAPI extGetRgnBox(HRGN, LPRECT); extern DWORD WINAPI extGetRegionData(HRGN, DWORD, LPRGNDATA); @@ -483,7 +481,6 @@ extern BOOL WINAPI extGetDeviceGammaRamp(HDC, LPVOID); extern UINT WINAPI extGetSystemPaletteEntries(HDC, UINT, UINT, LPPALETTEENTRY); extern BOOL WINAPI extGDIPatBlt(HDC, int, int, int, int, DWORD); extern BOOL WINAPI extPolyline(HDC, const POINT *, int); -extern BOOL WINAPI extDDBitBlt(HDC, int, int, int, int, HDC, int, int, DWORD); extern UINT WINAPI extRealizePalette(HDC); extern BOOL WINAPI extRectangle(HDC, int, int, int, int); extern BOOL WINAPI extGDIRestoreDC(HDC, int); @@ -493,7 +490,6 @@ extern HPALETTE WINAPI extSelectPalette(HDC, HPALETTE, BOOL); extern BOOL WINAPI extSetDeviceGammaRamp(HDC, LPVOID); extern BOOL WINAPI extGDIStretchBlt(HDC, int, int, int, int, HDC, int, int, int, int, DWORD); extern int WINAPI extStretchDIBits(HDC, int, int, int, int, int, int, int, int, const VOID *, const BITMAPINFO *, UINT, DWORD); -extern BOOL WINAPI extDDStretchBlt(HDC, int, int, int, int, HDC, int, int, int, int, DWORD); extern BOOL WINAPI extTextOutA(HDC, int, int, LPCTSTR, int); extern BOOL WINAPI extPolyBezierTo(HDC, const POINT *, DWORD); extern BOOL WINAPI extPolylineTo(HDC, const POINT *, DWORD); @@ -571,8 +567,8 @@ extern void STDAPICALLTYPE extCoUninitialize(void); // user32.dll: extern HDC WINAPI extBeginPaint(HWND, LPPAINTSTRUCT); -extern HDC WINAPI extDDBeginPaint(HWND, LPPAINTSTRUCT); -extern LRESULT WINAPI extCallWindowProc(WNDPROC, HWND, UINT, WPARAM, LPARAM); +extern LRESULT WINAPI extCallWindowProcA(WNDPROC, HWND, UINT, WPARAM, LPARAM); +extern LRESULT WINAPI extCallWindowProcW(WNDPROC, HWND, UINT, WPARAM, LPARAM); extern LONG WINAPI extChangeDisplaySettingsA(DEVMODEA *, DWORD); extern LONG WINAPI extChangeDisplaySettingsExA(LPCTSTR, DEVMODEA *, HWND, DWORD, LPVOID); extern LONG WINAPI extChangeDisplaySettingsW(DEVMODEW *, DWORD); @@ -588,7 +584,6 @@ extern LRESULT WINAPI extDefWindowProcW(HWND, UINT, WPARAM, LPARAM); extern int WINAPI extDrawTextA(HDC, LPCTSTR, int, LPRECT, UINT); extern int WINAPI extDrawTextExA(HDC, LPTSTR, int, LPRECT, UINT, LPDRAWTEXTPARAMS); extern BOOL WINAPI extEndPaint(HWND, const PAINTSTRUCT *); -extern BOOL WINAPI extDDEndPaint(HWND, const PAINTSTRUCT *); extern LONG WINAPI extEnumDisplaySettings(LPCTSTR, DWORD, DEVMODE *); extern int WINAPI extFillRect(HDC, const RECT *, HBRUSH); extern int WINAPI extFrameRect(HDC, const RECT *, HBRUSH); @@ -597,7 +592,6 @@ extern BOOL WINAPI extGetClipCursor(LPRECT); extern BOOL WINAPI extGetCursorPos(LPPOINT); extern HDC WINAPI extGDIGetDC(HWND); extern HDC WINAPI extEMUGetDC(HWND); -extern HDC WINAPI extDDGetDC(HWND); extern HWND WINAPI extGetDesktopWindow(void); extern BOOL WINAPI extGetMonitorInfoA(HMONITOR, LPMONITORINFO); extern BOOL WINAPI extGetMonitorInfoW(HMONITOR, LPMONITORINFO); @@ -605,12 +599,10 @@ extern int WINAPI extGetSystemMetrics(int); extern HWND WINAPI extGetTopWindow(HWND); extern int WINAPI extGetUpdateRgn(HWND, HRGN, BOOL); extern HDC WINAPI extGDIGetWindowDC(HWND); -extern HDC WINAPI extDDGetWindowDC(HWND); extern LONG WINAPI extGetWindowLongA(HWND, int); extern LONG WINAPI extGetWindowLongW(HWND, int); extern BOOL WINAPI extGetWindowRect(HWND, LPRECT); extern BOOL WINAPI extInvalidateRect(HWND, RECT *, BOOL); -//extern BOOL WINAPI extDDInvalidateRect(HWND, RECT *, BOOL); extern int WINAPI extMapWindowPoints(HWND, HWND, LPPOINT, UINT); extern BOOL WINAPI extMoveWindow(HWND, int, int, int, int, BOOL); extern BOOL WINAPI extPeekMessage(LPMSG, HWND, UINT, UINT, UINT); @@ -618,7 +610,6 @@ extern BOOL WINAPI extRedrawWindow(HWND, const RECT *, HRGN, UINT); extern ATOM WINAPI extRegisterClassExA(WNDCLASSEXA *); extern ATOM WINAPI extRegisterClassA(WNDCLASSA *); extern int WINAPI extGDIReleaseDC(HWND, HDC); -extern int WINAPI extDDReleaseDC(HWND, HDC); extern BOOL WINAPI extScreenToClient(HWND, LPPOINT); extern LRESULT WINAPI extSendMessageA(HWND, UINT, WPARAM, LPARAM); extern LRESULT WINAPI extSendMessageW(HWND, UINT, WPARAM, LPARAM); @@ -635,7 +626,6 @@ extern BOOL WINAPI extDestroyWindow(HWND); extern BOOL WINAPI extCloseWindow(HWND); extern BOOL WINAPI extSetSysColors(int, const INT *, const COLORREF *); extern HDC WINAPI extGDIGetDCEx(HWND, HRGN, DWORD); -extern HDC WINAPI extDDGetDCEx(HWND, HRGN, DWORD); extern BOOL WINAPI extUpdateWindow(HWND); extern BOOL WINAPI extGetWindowPlacement(HWND, WINDOWPLACEMENT *); extern BOOL WINAPI extSetWindowPlacement(HWND, WINDOWPLACEMENT *); diff --git a/dll/user32.cpp b/dll/user32.cpp index f045db9..108e228 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -17,7 +17,6 @@ BOOL IsChangeDisplaySettingsHotPatched = FALSE; #define GDIMODE_STRETCHED 0 #define GDIMODE_EMULATED 1 -#define GDIMODE_DIRECTDRAW 2 int GDIEmulationMode = 0; //typedef BOOL (WINAPI *ValidateRect_Type)(HWND, const RECT *); @@ -154,18 +153,6 @@ static HookEntry_Type ScaledHooks[]={ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator }; -static HookEntry_Type DDHooks[]={ - {HOOK_IAT_CANDIDATE, "BeginPaint", (FARPROC)BeginPaint, (FARPROC *)&pBeginPaint, (FARPROC)extDDBeginPaint}, - //{HOOK_IAT_CANDIDATE, "BeginPaint", (FARPROC)BeginPaint, (FARPROC *)&pBeginPaint, (FARPROC)extBeginPaint}, - {HOOK_IAT_CANDIDATE, "EndPaint", (FARPROC)EndPaint, (FARPROC *)&pEndPaint, (FARPROC)extDDEndPaint}, - {HOOK_IAT_CANDIDATE, "GetDC", (FARPROC)GetDC, (FARPROC *)&pGDIGetDC, (FARPROC)extDDGetDC}, - {HOOK_IAT_CANDIDATE, "GetDCEx", (FARPROC)GetDCEx, (FARPROC *)&pGDIGetDCEx, (FARPROC)extDDGetDCEx}, - {HOOK_IAT_CANDIDATE, "GetWindowDC", (FARPROC)GetWindowDC, (FARPROC *)&pGDIGetWindowDC, (FARPROC)extDDGetDC}, - {HOOK_IAT_CANDIDATE, "ReleaseDC", (FARPROC)ReleaseDC, (FARPROC *)&pGDIReleaseDC, (FARPROC)extDDReleaseDC}, - {HOOK_IAT_CANDIDATE, "InvalidateRect", (FARPROC)InvalidateRect, (FARPROC *)&pInvalidateRect, (FARPROC)extInvalidateRect}, - {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator -}; - static HookEntry_Type RemapHooks[]={ {HOOK_IAT_CANDIDATE, "ScreenToClient", (FARPROC)ScreenToClient, (FARPROC *)&pScreenToClient, (FARPROC)extScreenToClient}, {HOOK_IAT_CANDIDATE, "ClientToScreen", (FARPROC)ClientToScreen, (FARPROC *)&pClientToScreen, (FARPROC)extClientToScreen}, @@ -198,7 +185,8 @@ static HookEntry_Type WinHooks[]={ {HOOK_HOT_CANDIDATE, "ShowWindow", (FARPROC)ShowWindow, (FARPROC *)&pShowWindow, (FARPROC)extShowWindow}, {HOOK_HOT_CANDIDATE, "SetWindowPos", (FARPROC)SetWindowPos, (FARPROC *)&pSetWindowPos, (FARPROC)extSetWindowPos}, {HOOK_HOT_CANDIDATE, "DeferWindowPos", (FARPROC)DeferWindowPos, (FARPROC *)&pGDIDeferWindowPos, (FARPROC)extDeferWindowPos}, - {HOOK_HOT_CANDIDATE, "CallWindowProcA", (FARPROC)CallWindowProcA, (FARPROC *)&pCallWindowProc, (FARPROC)extCallWindowProc}, + {HOOK_HOT_CANDIDATE, "CallWindowProcA", (FARPROC)CallWindowProcA, (FARPROC *)&pCallWindowProcA, (FARPROC)extCallWindowProcA}, + {HOOK_HOT_CANDIDATE, "CallWindowProcW", (FARPROC)CallWindowProcW, (FARPROC *)&pCallWindowProcW, (FARPROC)extCallWindowProcW}, {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator }; @@ -221,8 +209,7 @@ FARPROC Remap_user32_ProcAddress(LPCSTR proc, HMODULE hModule) if (dxw.dwFlags2 & GDISTRETCHED) if (addr=RemapLibrary(proc, hModule, ScaledHooks)) return addr; if (dxw.dwFlags3 & GDIEMULATEDC) if (addr=RemapLibrary(proc, hModule, EmulateHooks)) return addr; - if (dxw.dwFlags1 & MAPGDITOPRIMARY) if (addr=RemapLibrary(proc, hModule, DDHooks)) return addr; - if (!(dxw.dwFlags2 & GDISTRETCHED) && !(dxw.dwFlags3 & GDIEMULATEDC) && !(dxw.dwFlags1 & MAPGDITOPRIMARY)) + if (!(dxw.dwFlags2 & GDISTRETCHED) && !(dxw.dwFlags3 & GDIEMULATEDC)) if (addr=RemapLibrary(proc, hModule, NoGDIHooks)) return addr; if (dxw.dwFlags1 & MODIFYMOUSE) if (addr=RemapLibrary(proc, hModule, MouseHooks)) return addr; @@ -245,14 +232,12 @@ void HookUser32(HMODULE hModule) GDIEmulationMode = GDIMODE_STRETCHED; // default if (dxw.dwFlags2 & GDISTRETCHED) GDIEmulationMode = GDIMODE_STRETCHED; if (dxw.dwFlags3 & GDIEMULATEDC) GDIEmulationMode = GDIMODE_EMULATED; - if (dxw.dwFlags1 & MAPGDITOPRIMARY) GDIEmulationMode = GDIMODE_DIRECTDRAW; HookLibrary(hModule, Hooks, libname); - if (!(dxw.dwFlags2 & GDISTRETCHED) && !(dxw.dwFlags3 & GDIEMULATEDC) && !(dxw.dwFlags1 & MAPGDITOPRIMARY)) + if (!(dxw.dwFlags2 & GDISTRETCHED) && !(dxw.dwFlags3 & GDIEMULATEDC)) HookLibrary(hModule, NoGDIHooks, libname); if (dxw.dwFlags3 & GDIEMULATEDC) HookLibrary(hModule, EmulateHooks, libname); if (dxw.dwFlags2 & GDISTRETCHED) HookLibrary(hModule, ScaledHooks, libname); - if (dxw.dwFlags1 & MAPGDITOPRIMARY) HookLibrary(hModule, DDHooks, libname); if (dxw.dwFlags1 & CLIENTREMAPPING) HookLibrary(hModule, RemapHooks, libname); if (dxw.dwFlags1 & MODIFYMOUSE) HookLibrary(hModule, MouseHooks, libname); @@ -268,7 +253,8 @@ void HookUser32(HMODULE hModule) void HookUser32Init() { HookLibInit(Hooks); - HookLibInit(DDHooks); + HookLibInit(ScaledHooks); + HookLibInit(EmulateHooks); HookLibInit(RemapHooks); HookLibInit(MouseHooks); HookLibInit(WinHooks); @@ -631,7 +617,7 @@ LONG WINAPI extGetWindowLong(GetWindowLong_Type pGetWindowLong, char *ApiName, H if((nIndex==GWL_WNDPROC)||(nIndex==DWL_DLGPROC)){ WNDPROC wp; - wp=WinDBGetProc(hwnd); + wp=dxwws.GetProc(hwnd); OutTraceDW("%s: remapping WindowProc res=%x -> %x\n", ApiName, res, (LONG)wp); if(wp) res=(LONG)wp; // if not found, don't alter the value. } @@ -709,8 +695,8 @@ LONG WINAPI extSetWindowLong(HWND hwnd, int nIndex, LONG dwNewLong, SetWindowLon if((OldProc==extWindowProc) || (OldProc==extChildWindowProc)|| (OldProc==extDialogWindowProc)) - OldProc=WinDBGetProc(hwnd); - WinDBPutProc(hwnd, (WNDPROC)dwNewLong); + OldProc=dxwws.GetProc(hwnd); + dxwws.PutProc(hwnd, (WNDPROC)dwNewLong); res=(LONG)OldProc; SetLastError(0); lres=(WNDPROC)(*pSetWindowLongA)(hwnd, nIndex, (LONG)extWindowProc); @@ -1089,7 +1075,7 @@ BOOL WINAPI extGetClientRect(HWND hwnd, LPRECT lpRect) if (dxw.IsFullScreen()){ int w, h; if(FIXCHILDSIZE){ - if(WinDBGetSize(hwnd, &w, &h)){ + if(dxwws.GetSize(hwnd, &w, &h)){ lpRect->top=lpRect->left=0; lpRect->right=w; lpRect->bottom=h; @@ -1275,7 +1261,7 @@ static void HookChildWndProc(HWND hwnd, DWORD dwStyle, LPCTSTR ApiName) { // child window inherit the father's windproc, so if it's redirected to // a hooker (either extWindowProc or extChildWindowProc) you have to retrieve - // the correct value (WinDBGetProc) before saving it (WinDBPutProc). + // the correct value (dxwws.GetProc) before saving it (dxwws.PutProc). long res; WNDPROC pWindowProc; @@ -1286,13 +1272,13 @@ static void HookChildWndProc(HWND hwnd, DWORD dwStyle, LPCTSTR ApiName) HWND Father; WNDPROC pFatherProc; Father=GetParent(hwnd); - pFatherProc=WinDBGetProc(Father); + pFatherProc=dxwws.GetProc(Father); OutTraceDW("%s: WndProc=%s father=%x WndProc=%x\n", ApiName, (pWindowProc == extWindowProc) ? "extWindowProc" : ((pWindowProc == extChildWindowProc) ? "extChildWindowProc" : "extDialogWindowProc"), Father, pFatherProc); pWindowProc = pFatherProc; } - WinDBPutProc(hwnd, pWindowProc); + dxwws.PutProc(hwnd, pWindowProc); if(dwStyle & WS_CHILD){ OutTraceDW("%s: Hooking CHILD hwnd=%x father WindowProc %x->%x\n", ApiName, hwnd, pWindowProc, extChildWindowProc); res=(*pSetWindowLongA)(hwnd, GWL_WNDPROC, (LONG)extChildWindowProc); @@ -1502,7 +1488,7 @@ static HWND WINAPI extCreateWindowCommon( HookChildWndProc(hwnd, dwStyle, ApiName); if ((FIXCHILDSIZE) && (dwStyle & (WS_CHILD|WS_DLGFRAME))) - WinDBPutSize(hwnd, iOrigW, iOrigH); + dxwws.PutSize(hwnd, iOrigW, iOrigH); // "Hoyle Casino Empire" needs to be in a maximized state to continue after the intro movie. // Sending a SW_MAXIMIZE message intercepted by the PREVENTMAXIMIZE handling fixes the problem. @@ -1606,16 +1592,30 @@ HWND WINAPI extCreateWindowExA( return extCreateWindowCommon("CreateWindowExA", FALSE, dwExStyle, (void *)lpClassName, (void *)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); } -LRESULT WINAPI extCallWindowProc(WNDPROC lpPrevWndFunc, HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) +LRESULT WINAPI extCallWindowProcA(WNDPROC lpPrevWndFunc, HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) { // v2.02.30: fix (Imperialism II): apply to main window only !!! HRESULT res; res = -1; - if(hwnd == dxw.GethWnd()) res=FixWindowProc("CallWindowProc", hwnd, Msg, wParam, &lParam); + if(hwnd == dxw.GethWnd()) res=FixWindowProc("CallWindowProcA", hwnd, Msg, wParam, &lParam); if (res==(HRESULT)-1) - return (*pCallWindowProc)(lpPrevWndFunc, hwnd, Msg, wParam, lParam); + return (*pCallWindowProcA)(lpPrevWndFunc, hwnd, Msg, wParam, lParam); + else + return res; +} + +LRESULT WINAPI extCallWindowProcW(WNDPROC lpPrevWndFunc, HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) +{ + // v2.02.30: fix (Imperialism II): apply to main window only !!! + HRESULT res; + + res = -1; + if(hwnd == dxw.GethWnd()) res=FixWindowProc("CallWindowProcW", hwnd, Msg, wParam, &lParam); + + if (res==(HRESULT)-1) + return (*pCallWindowProcW)(lpPrevWndFunc, hwnd, Msg, wParam, lParam); else return res; } @@ -1910,16 +1910,9 @@ static HDC WINAPI sGetDC(HWND hwnd, char *ApiName) if(bFlippedDC) { extern HDC hFlippedDC; LPDIRECTDRAWSURFACE lpDDSPrim; - lpDDSPrim = dxw.GetPrimarySurface(); -#if 0 - // v2.03.20: beware, from this release the output from dxw.GetPrimarySurface() could be a - // zero reference counter released surface that could be used to feed a QueryInterface method, - // but would crash if used otherwise. - __try {(*pGetDC)(lpDDSPrim, &hFlippedDC);} __except(EXCEPTION_EXECUTE_HANDLER){hFlippedDC=NULL;}; -#else + lpDDSPrim = dxwss.GetPrimarySurface(); if (lpDDSPrim) (*pGetDC)(lpDDSPrim, &hFlippedDC); -#endif - OutTraceDW("%s: remapping flipped GDI hdc=%x\n", ApiName, hFlippedDC); + OutTraceDW("%s: remapping flipped GDI lpDDSPrim=%x hdc=%x\n", ApiName, lpDDSPrim, hFlippedDC); if(hFlippedDC) return hFlippedDC; } #endif @@ -1932,8 +1925,6 @@ static HDC WINAPI sGetDC(HWND hwnd, char *ApiName) ret=dxw.AcquireEmulatedDC(lochwnd); dxw.VirtualHDC=ret; break; - case GDIMODE_DIRECTDRAW: - break; } if(ret){ @@ -1996,7 +1987,7 @@ int WINAPI extGDIReleaseDC(HWND hwnd, HDC hDC) if(bFlippedDC && (hDC == hFlippedDC)) { HRESULT ret; OutTraceDW("GDI.ReleaseDC: releasing flipped GDI hdc=%x\n", hDC); - ret=(*pReleaseDC)(dxw.GetPrimarySurface(), hDC); + ret=(*pReleaseDC)(dxwss.GetPrimarySurface(), hDC); if (ret) OutTraceE("GDI.ReleaseDC ERROR: err=%x(%s) at %d\n", ret, ExplainDDError(ret), __LINE__); else dxw.ScreenRefresh(); return (ret == DD_OK); @@ -2013,8 +2004,6 @@ int WINAPI extGDIReleaseDC(HWND hwnd, HDC hDC) res=dxw.ReleaseEmulatedDC(hwnd); res=(*pGDIReleaseDC)(hwnd, windc); break; - case GDIMODE_DIRECTDRAW: - break; } if (!res) OutTraceE("GDI.ReleaseDC ERROR: err=%d at %d\n", GetLastError(), __LINE__); @@ -2047,15 +2036,6 @@ HDC WINAPI extBeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint) lpPaint->hdc=EmuHDC; hdc = EmuHDC; break; - case GDIMODE_DIRECTDRAW: - (*pGDIReleaseDC)(hwnd, lpPaint->hdc); - (*pGetDC)(dxw.lpDDSPrimary,&PrimHDC); - lpPaint->hdc=PrimHDC; - // resize the paint area to virtual screen size (see CivIII clipped panels...) - lpPaint->rcPaint=dxw.GetScreenRect(); - OutTraceDW("GDI.BeginPaint(MAPGDITOPRIMARY): hdc=%x -> %x\n", hdc, PrimHDC); - hdc = PrimHDC; - break; } OutTraceDW("GDI.BeginPaint: hdc=%x rcPaint=(%d,%d)-(%d,%d)\n", @@ -2063,53 +2043,6 @@ HDC WINAPI extBeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint) return hdc; } -HDC WINAPI extDDBeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint) -{ - HDC hdc; - extern HRESULT WINAPI extGetDC(LPDIRECTDRAWSURFACE, HDC FAR *); - - OutTraceDW("GDI.BeginPaint: hwnd=%x%s lpPaint=%x FullScreen=%x\n", - hwnd, dxw.IsDesktop(hwnd)?"(DESKTOP)":"", lpPaint, dxw.IsFullScreen()); - - if(dxw.IsDesktop(hwnd)) hwnd=dxw.GethWnd(); - - hdc=(*pBeginPaint)(hwnd, lpPaint); - - // if not in fullscreen mode, that's all! - if(!dxw.IsFullScreen()) return hdc; - - // on MAPGDITOPRIMARY, return the PrimHDC handle instead of the window DC - // if a primary surface has not been created yet, do it - if(!pGetDC || !dxw.lpDDSPrimary){ - extern HRESULT WINAPI extDirectDrawCreate(GUID FAR *, LPDIRECTDRAW FAR *, IUnknown FAR *); - HRESULT res; - LPDIRECTDRAW lpDD; - LPDIRECTDRAWSURFACE lpDDS; - DDSURFACEDESC ddsd; - res=extDirectDrawCreate(0, &lpDD, NULL); - //res=extDirectDrawCreate((GUID *)&IID_IDirectDraw, &lpDD, NULL); - lpDD->SetCooperativeLevel(dxw.GethWnd(), DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE); - //lpDD->SetCooperativeLevel(dxw.GethWnd(), DDSCL_NORMAL); - memset((void *)&ddsd, 0, sizeof(DDSURFACEDESC)); - ddsd.dwSize = sizeof(DDSURFACEDESC); - ddsd.dwFlags = DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; - ddsd.dwHeight = dxw.GetScreenHeight(); - ddsd.dwWidth = dxw.GetScreenWidth(); - res=lpDD->CreateSurface(&ddsd, &lpDDS, NULL); - dxw.lpDDSPrimary = lpDDS; - OutTraceDW("GDI.BeginPaint(MAPGDITOPRIMARY): dd=%x ddsPrim=%x\n", lpDD, lpDDS); - } - - extGetDC(dxw.lpDDSPrimary,&PrimHDC); - lpPaint->hdc=PrimHDC; - // resize the paint area to virtual screen size (see CivIII clipped panels...) - lpPaint->rcPaint=dxw.GetScreenRect(); - - OutTraceDW("GDI.BeginPaint(MAPGDITOPRIMARY): hdc=%x -> %x\n", hdc, PrimHDC); - return PrimHDC; -} - BOOL WINAPI extEndPaint(HWND hwnd, const PAINTSTRUCT *lpPaint) { BOOL ret; @@ -2133,8 +2066,6 @@ BOOL WINAPI extEndPaint(HWND hwnd, const PAINTSTRUCT *lpPaint) case GDIMODE_EMULATED: ret=dxw.ReleaseEmulatedDC(hwnd); break; - case GDIMODE_DIRECTDRAW: - break; } if(ret) @@ -2145,54 +2076,6 @@ BOOL WINAPI extEndPaint(HWND hwnd, const PAINTSTRUCT *lpPaint) return ret; } -BOOL WINAPI extDDEndPaint(HWND hwnd, const PAINTSTRUCT *lpPaint) -{ - BOOL ret; - extern HRESULT WINAPI extReleaseDC(LPDIRECTDRAWSURFACE lpdds, HDC FAR hdc); - extern HRESULT WINAPI extGetDC(LPDIRECTDRAWSURFACE, HDC FAR *); - extern HRESULT WINAPI extBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPDDBLTFX lpddbltfx); - - OutTraceDW("GDI.EndPaint(DD): hwnd=%x%s lpPaint=%x lpPaint.hdc=%x\n", - hwnd, dxw.IsDesktop(hwnd)?"(DESKTOP)":"", lpPaint, lpPaint->hdc); - - // v2.02.53 ... - //if(dxw.IsFullScreen() && dxw.IsDesktop(hwnd)){ - if(dxw.IsFullScreen()){ - RECT Rect; - LPRECT lpRect; - ret=(*pEndPaint)(hwnd, lpPaint); - dxw.lpDDSPrimary->Unlock(NULL); - //dxw.ScreenRefresh(); - if(dxw.IsDesktop(hwnd)) - lpRect=NULL; - else{ -#if 1 - POINT p={0,0}; - lpRect=&Rect; - (*pGetClientRect)(hwnd, lpRect); - p=dxw.ClientOffset(hwnd); - lpRect->left += p.x; - lpRect->right += p.x; - lpRect->top += p.y; - lpRect->bottom += p.y; - //dxw.AddCoordinates(lpRect, p); - dxw.UnmapClient(lpRect); -#else - lpRect=&Rect; - Rect = dxw.MapClientRect(lpRect); -#endif - } - extBlt(dxw.lpDDSPrimary, lpRect, dxw.lpDDSPrimary, NULL, 0, NULL); - return TRUE; - } - - // proxy part ... - ret=(*pEndPaint)(hwnd, lpPaint); - OutTraceDW("GDI.EndPaint: hwnd=%x ret=%x\n", hwnd, ret); - if(!ret) OutTraceE("GDI.EndPaint ERROR: err=%d at %d\n", GetLastError(), __LINE__); - return ret; -} - HWND WINAPI extCreateDialogIndirectParam(HINSTANCE hInstance, LPCDLGTEMPLATE lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM lParamInit) { HWND RetHWND; @@ -2204,7 +2087,7 @@ HWND WINAPI extCreateDialogIndirectParam(HINSTANCE hInstance, LPCDLGTEMPLATE lpT // v2.02.73: redirect lpDialogFunc only when it is nor NULL if(lpDialogFunc) { - WinDBPutProc(RetHWND, (WNDPROC)lpDialogFunc); + dxwws.PutProc(RetHWND, (WNDPROC)lpDialogFunc); if(!(*pSetWindowLongA)(RetHWND, DWL_DLGPROC, (LONG)extDialogWindowProc)) OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__); } @@ -2226,7 +2109,7 @@ HWND WINAPI extCreateDialogParam(HINSTANCE hInstance, LPCTSTR lpTemplateName, HW // v2.02.73: redirect lpDialogFunc only when it is nor NULL: fix for "LEGO Stunt Rally" if(lpDialogFunc) { - WinDBPutProc(RetHWND, (WNDPROC)lpDialogFunc); + dxwws.PutProc(RetHWND, (WNDPROC)lpDialogFunc); if(!(*pSetWindowLongA)(RetHWND, DWL_DLGPROC, (LONG)extDialogWindowProc)) OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__); } diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index c6fff39..85265e4 100644 Binary files a/host/dxwndhost.aps and b/host/dxwndhost.aps differ diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index 75d8e63..9f2df41 100644 Binary files a/host/dxwndhost.rc and b/host/dxwndhost.rc differ diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index 8d76bf3..5652e38 100644 Binary files a/host/dxwndhost.vs2008.suo and b/host/dxwndhost.vs2008.suo differ diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index a4a7c9c..07ddc22 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -204,7 +204,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) case 0: break; case 1: t->flags2 |= GDISTRETCHED; break; case 2: t->flags3 |= GDIEMULATEDC; break; - case 3: t->flags |= MAPGDITOPRIMARY; break; + //case 3: t->flags |= MAPGDITOPRIMARY; break; } switch(dlg->m_ResTypes){ @@ -428,7 +428,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_DCEmulationMode = 0; if(t->flags2 & GDISTRETCHED) dlg->m_DCEmulationMode = 1; if(t->flags3 & GDIEMULATEDC) dlg->m_DCEmulationMode = 2; - if(t->flags & MAPGDITOPRIMARY) dlg->m_DCEmulationMode = 3; + //if(t->flags & MAPGDITOPRIMARY) dlg->m_DCEmulationMode = 3; dlg->m_ResTypes = 0; if(t->flags4 & SUPPORTSVGA) dlg->m_ResTypes = 0; diff --git a/host/resource b/host/resource index 81ac5e8..758d025 100644 Binary files a/host/resource and b/host/resource differ