diff --git a/Include/dxwnd.h b/Include/dxwnd.h index 1061df6..2571c20 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -283,6 +283,8 @@ #define HOOKDLGWIN 0x80000000 // Hook dialog WindowProc // 9th flags DWORD dxw.dwFlags9: +#define FIXTHINFRAME 0x00000001 // Fix window style like OVERLAPPEDWINDOW but with thin border + // 10th flags DWORD dxw.dwFlags10: // logging Tflags DWORD: diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index fd17466..6163212 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -1584,3 +1584,15 @@ fix: joystick api promoted to hot patching to get a more powerful hooking add: hooking of WM_STYLECHANGING/STYLECHANGED messages to allow D3D rendering within the window borders instead of over the whole window area - fixes "Nightmare Creatures" and others. fix: fixed "Need fos Speed 5" peculiarity: QueryInterface of an object on top of itself. +v2.04.20 +GUI: +add: two more 32bit words for additional flags +add: timestamp and dxwnd version added to exported files +fix: window style selector through radio buttons +fix: implementation of View->Shims +DLL: +add: management of 3DREF surfaces to handle D3D CreateDevice with offscreen surface +add: FIXTHINFRAME option to get overlapped window with thin border +fix: revised implementation for DirectDrawSurface getCaps and GetSurfaceDesc wrappers +add: hooker for SetWindowsHookEx WH_MOUSE_LL events - used by "Royal Tramp 2" +fix: added WM_NCMOUSELEAVE to the list of potentially offending messages diff --git a/dll/ddcreates.cpp b/dll/ddcreates.cpp index 726f60b..f909a08 100644 --- a/dll/ddcreates.cpp +++ b/dll/ddcreates.cpp @@ -1054,6 +1054,12 @@ HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreateSurface dxwss.PushZBufferSurface(*lplpdds, dxversion, lpddsd->ddsCaps.dwCaps); OutTraceDW("CreateSurface: ZBufferSize=%d\n", ZBufferSize); } + else { + if(lpddsd->ddsCaps.dwCaps & DDSCAPS_3DDEVICE) { + OutTraceDW("CreateSurface: lpDD3DRef=%x save 3DREF caps=%x(%s)\n", *lplpdds, lpddsd->ddsCaps.dwCaps, ExplainDDSCaps(lpddsd->ddsCaps.dwCaps)); + dxwss.Push3DRefSurface(*lplpdds, dxversion, lpddsd->ddsCaps.dwCaps); + } + } } return res; diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index 72576a7..cf91c14 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -541,10 +541,8 @@ static DWORD GetFlipWaitFlags(DWORD dwFlipFlags) static DWORD SetPrimaryCaps(DWORD dwCaps) { - dwCaps |= DDSD_Prim.ddsCaps.dwCaps; dwCaps |= (DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_FRONTBUFFER|DDSCAPS_VIDEOMEMORY|DDSCAPS_VISIBLE); // primary surfaces must be this way dwCaps &= ~(DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); // primary surfaces can't be this way - if(dwCaps & DDSCAPS_3DDEVICE) dwCaps |= DDSCAPS_LOCALVIDMEM; return dwCaps; } @@ -553,8 +551,6 @@ static DWORD SetBackBufferCaps(DWORD dwCaps) // v2.03.11: added DDSCAPS_FLIP capability to backbuffer surface: "Ignition" checks for it before Flip-ping to primary dwCaps |= (DDSCAPS_BACKBUFFER|DDSCAPS_VIDEOMEMORY|DDSCAPS_FLIP|DDSCAPS_LOCALVIDMEM); // you never know.... dwCaps &= ~(DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); // backbuffer surfaces can't be this way - if(dwCaps & DDSCAPS_3DDEVICE) dwCaps |= DDSCAPS_LOCALVIDMEM; - //if(dwCaps & DDSCAPS_3DDEVICE) dwCaps |= (DDSCAPS_LOCALVIDMEM | DDSCAPS_COMPLEX); return dwCaps; } @@ -2336,7 +2332,7 @@ HRESULT WINAPI extSetCooperativeLevel(int dxversion, SetCooperativeLevel_Type pS if(bFixFrame){ AdjustWindowFrame(hwnd, dxw.GetScreenWidth(), dxw.GetScreenHeight()); - if (dxw.dwFlags1 & FIXWINFRAME) dxw.FixWindowFrame(hwnd); + if ((dxw.dwFlags1 & FIXWINFRAME) || (dxw.dwFlags9 & FIXTHINFRAME)) dxw.FixWindowFrame(hwnd); } GetHookInfo()->IsFullScreen=dxw.IsFullScreen(); @@ -2563,19 +2559,12 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet return DD_OK; } } - // arguable utility .... - // commented out: causes "Arx Fatalis" crash assigning ZBUFFER to the wrong surface? - // would that be necessary on some game? - //if(dxw.dwFlags6 & SETZBUFFERBITDEPTHS){ - // if (lpDDZBuffer && (lpddsc->dwCaps & DDSCAPS_ZBUFFER)){ - // *lplpddas = lpDDZBuffer; - // OutTraceDW("GetAttachedSurface(%d): SIMULATE ZBUFFER attach to %s=%x add=%x\n", - // dxversion, IsPrim?"PRIM":(IsBack?"BACK":"PLAIN"), lpdds, lpDDZBuffer); - // //if (pAddRefS) (*pAddRefS)(lpDDZBuffer); - // lpDDZBuffer->AddRef(); - // return DD_OK; - // } - //} + + // Warning: AVOID simulating a ZBUFFER attach to any surface that has not it really attached + // otherwise the program steps over but crashes afterwards, as soon as it tries to use the ZBUFFER. + // Better return the error (most programs overcome the problem) or change caps policy so that the + // ZBUFFER becomes attached. + // Ref: "Arx Fatalis", "TOCA Touring Car Championship" OutTraceE("GetAttachedSurface(%d): ERROR res=%x(%s) at %d\n", dxversion, res, ExplainDDError(res), __LINE__); } @@ -2608,7 +2597,6 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet } OutTraceDW("GetAttachedSurface(%d): ZBUFFER caps=%x(%s) (%s)\n", dxversion, dwCaps, ExplainDDSCaps(dwCaps), sMode); } - } return res; @@ -4824,44 +4812,58 @@ HRESULT WINAPI cbDump(LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID lpContext) static HRESULT WINAPI extGetCapsS(int dxInterface, GetCapsS_Type pGetCapsS, LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS caps) { HRESULT res; - BOOL IsPrim, IsBack, IsZBuf, IsFixed; - IsPrim=dxwss.IsAPrimarySurface(lpdds); - IsBack=dxwss.IsABackBufferSurface(lpdds); - IsFixed=FALSE; + BOOL IsFixed=FALSE; + int role; + SurfaceDB_Type *ps; char *sLabel; - sLabel = ""; - if(IsPrim) sLabel="(PRIM)"; - if(IsBack) sLabel="(BACK)"; + ps = dxwss.GetSurface(lpdds); + // BEWARE: ZBUFFER surfaces could be created automatically so that they could exist without + // being regisered in surface stack. You must query the actual surface capabilities. res=(*pGetCapsS)(lpdds, caps); if(res) - OutTraceE("GetCaps(S%d): ERROR lpdds=%x%s err=%x(%s)\n", dxInterface, lpdds, sLabel, res, ExplainDDError(res)); + OutTraceE("GetCaps(S%d): ERROR lpdds=%x err=%x(%s)\n", dxInterface, lpdds, res, ExplainDDError(res)); else - OutTraceDDRAW("GetCaps(S%d): lpdds=%x%s caps=%x(%s)\n", dxInterface, lpdds, sLabel, caps->dwCaps, ExplainDDSCaps(caps->dwCaps)); + OutTraceDDRAW("GetCaps(S%d): lpdds=%x caps=%x(%s)\n", dxInterface, lpdds, caps->dwCaps, ExplainDDSCaps(caps->dwCaps)); - IsZBuf=(caps->dwCaps & DDSCAPS_ZBUFFER); - if(IsZBuf) sLabel="(ZBUFFER)"; + sLabel=""; + role = SURFACE_ROLE_UNKNOWN; + if (ps) { + role = ps->uRole; + switch(role){ + case SURFACE_ROLE_PRIMARY: sLabel="(PRIM)"; break; + case SURFACE_ROLE_BACKBUFFER: sLabel="(BACK)"; break; + case SURFACE_ROLE_ZBUFFER: sLabel="(ZBUF)"; break; + case SURFACE_ROLE_3DREF: sLabel="(3DREF)"; break; + } + } + else { + if (caps->dwCaps & DDSCAPS_ZBUFFER) { + sLabel="(ZBUF)"; + role = SURFACE_ROLE_ZBUFFER; + } + } if(!(dxw.IsEmulated || dxw.Windowize)) return res; - while(TRUE){ // fake loop - if (IsPrim) { + switch(role) { + case SURFACE_ROLE_PRIMARY: IsFixed=TRUE; - caps->dwCaps = SetPrimaryCaps(caps->dwCaps); + caps->dwCaps = SetPrimaryCaps(dxwss.GetCaps(lpdds)); break; - } - if (IsBack) { + case SURFACE_ROLE_BACKBUFFER: IsFixed=TRUE; - caps->dwCaps = SetBackBufferCaps(caps->dwCaps); + caps->dwCaps = SetBackBufferCaps(dxwss.GetCaps(lpdds)); break; - } - if (IsZBuf) { + case SURFACE_ROLE_ZBUFFER: IsFixed=TRUE; caps->dwCaps = SetZBufferCaps(dxwss.GetCaps(lpdds)); break; - } - break; // inconditional break; + case SURFACE_ROLE_3DREF: + IsFixed=TRUE; + caps->dwCaps = dxwss.GetCaps(lpdds); + break; } if(IsFixed) OutTraceDW("GetCaps(S%d): lpdds=%x FIXED %s caps=%x(%s)\n", dxInterface, lpdds, sLabel, caps->dwCaps, ExplainDDSCaps(caps->dwCaps)); @@ -4883,10 +4885,9 @@ HRESULT WINAPI extGetCaps7S(LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS2 caps) static HRESULT WINAPI extGetSurfaceDesc(int dxversion, GetSurfaceDesc_Type pGetSurfaceDesc, LPDIRECTDRAWSURFACE lpdds, LPDDSURFACEDESC lpddsd) { HRESULT res; - BOOL IsPrim, IsBack, IsZBuf, IsFixed; - IsPrim=dxwss.IsAPrimarySurface(lpdds); - IsBack=dxwss.IsABackBufferSurface(lpdds); - IsFixed=FALSE; + BOOL IsFixed = FALSE; + SurfaceDB_Type *ps; + int role; char *sLabel; if (!pGetSurfaceDesc) { @@ -4894,6 +4895,8 @@ static HRESULT WINAPI extGetSurfaceDesc(int dxversion, GetSurfaceDesc_Type pGetS return DDERR_INVALIDPARAMS; } + ps = dxwss.GetSurface(lpdds); + int prevsize = lpddsd->dwSize; switch(dxversion){ case 1: @@ -4913,37 +4916,51 @@ static HRESULT WINAPI extGetSurfaceDesc(int dxversion, GetSurfaceDesc_Type pGetS OutTraceE("GetSurfaceDesc(%d): ERROR err=%x(%s)\n", dxversion, res, ExplainDDError(res)); return res; } - IsZBuf=(lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER); + sLabel=""; - if(IsPrim) sLabel="(PRIM)"; - if(IsBack) sLabel="(BACK)"; - if(IsZBuf) sLabel="(ZBUFFER)"; + role = SURFACE_ROLE_UNKNOWN; + if (ps) { + role = ps->uRole; + switch(role){ + case SURFACE_ROLE_PRIMARY: sLabel="(PRIM)"; break; + case SURFACE_ROLE_BACKBUFFER: sLabel="(BACK)"; break; + case SURFACE_ROLE_ZBUFFER: sLabel="(ZBUF)"; break; + case SURFACE_ROLE_3DREF: sLabel="(3DREF)"; break; + } + } + else { + if (lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER) { + sLabel="(ZBUF)"; + role = SURFACE_ROLE_ZBUFFER; + } + } OutTraceDDRAW("GetSurfaceDesc(%d): lpdds=%x%s %s\n", dxversion, lpdds, sLabel, LogSurfaceAttributes((LPDDSURFACEDESC2)lpddsd, "GetSurfaceDesc", __LINE__)); if(!(dxw.IsEmulated || dxw.Windowize)) return res; - while(TRUE){ // fake loop - if (IsPrim) { + switch(role) { + case SURFACE_ROLE_PRIMARY: IsFixed=TRUE; - if (dxw.dwFlags1 & EMULATESURFACE) lpddsd->ddpfPixelFormat = dxw.VirtualPixelFormat; - lpddsd->ddsCaps.dwCaps = SetPrimaryCaps(lpddsd->ddsCaps.dwCaps); + //if (dxw.dwFlags1 & EMULATESURFACE) lpddsd->ddpfPixelFormat = dxw.VirtualPixelFormat; + lpddsd->ddsCaps.dwCaps = SetPrimaryCaps(dxwss.GetCaps(lpdds)); lpddsd->dwBackBufferCount=DDSD_Prim.dwBackBufferCount; lpddsd->dwHeight=dxw.GetScreenHeight(); lpddsd->dwWidth=dxw.GetScreenWidth(); break; - } - if (IsBack) { + case SURFACE_ROLE_BACKBUFFER: IsFixed=TRUE; - lpddsd->ddsCaps.dwCaps = SetBackBufferCaps(lpddsd->ddsCaps.dwCaps); + //if (dxw.dwFlags1 & EMULATESURFACE) lpddsd->ddpfPixelFormat = dxw.VirtualPixelFormat; // v2.04.20 + lpddsd->ddsCaps.dwCaps = SetBackBufferCaps(dxwss.GetCaps(lpdds)); break; - } - if (IsZBuf) { + case SURFACE_ROLE_ZBUFFER: IsFixed=TRUE; lpddsd->ddsCaps.dwCaps = SetZBufferCaps(dxwss.GetCaps(lpdds)); break; - } - break; // inconditional break + case SURFACE_ROLE_3DREF: + IsFixed=TRUE; + lpddsd->ddsCaps.dwCaps = dxwss.GetCaps(lpdds); + break; } if(IsFixed){ diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 9bb45a8..6167a61 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -110,7 +110,9 @@ static void OutTraceHeader(FILE *fp, DWORD tflags) for(i=0, dword=dxw.dwFlags6; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", GetFlagCaption(5,i)); for(i=0, dword=dxw.dwFlags7; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", GetFlagCaption(6,i)); for(i=0, dword=dxw.dwFlags8; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", GetFlagCaption(7,i)); - for(i=0, dword=tflags ; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", GetFlagCaption(8,i)); + for(i=0, dword=dxw.dwFlags9; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", GetFlagCaption(8,i)); + for(i=0, dword=dxw.dwFlags10;i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", GetFlagCaption(9,i)); + for(i=0, dword=tflags ; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", GetFlagCaption(10,i)); fprintf(fp, "***\n"); } @@ -1400,10 +1402,10 @@ void HookInit(TARGETMAP *target, HWND hwnd) // update window styles: just this window or, when FIXPARENTWIN is set, the father one as well. if (hwnd && dxw.Windowize && dxw.IsFullScreen()) { - if(dxw.dwFlags1 & FIXWINFRAME) dxw.FixWindowFrame(dxw.hChildWnd); + if((dxw.dwFlags1 & FIXWINFRAME) || (dxw.dwFlags9 & FIXTHINFRAME)) dxw.FixWindowFrame(dxw.hChildWnd); AdjustWindowPos(dxw.hChildWnd, target->sizx, target->sizy); if(dxw.dwFlags1 & FIXPARENTWIN) { - if(dxw.dwFlags1 & FIXWINFRAME) dxw.FixWindowFrame(dxw.hParentWnd); + if((dxw.dwFlags1 & FIXWINFRAME) || (dxw.dwFlags9 & FIXTHINFRAME)) dxw.FixWindowFrame(dxw.hParentWnd); AdjustWindowPos(dxw.hParentWnd, target->sizx, target->sizy); } } diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index e9090bb..5f9c57d 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -94,6 +94,8 @@ void dxwCore::InitTarget(TARGETMAP *target) dwFlags6 = target->flags6; dwFlags7 = target->flags7; dwFlags8 = target->flags8; + dwFlags9 = target->flags9; + dwFlags10= target->flags10; dwTFlags = target->tflags; Windowize = (dwFlags2 & WINDOWIZE) ? TRUE : FALSE; IsVisible = TRUE; @@ -1256,7 +1258,10 @@ void dxwCore::FixStyle(char *ApiName, HWND hwnd, WPARAM wParam, LPARAM lParam) OutTraceDW("%s: new Style=%x(%s)\n", ApiName, lpSS->styleNew, ExplainStyle(lpSS->styleNew)); if (dxw.dwFlags1 & FIXWINFRAME){ // set canonical style - lpSS->styleNew= WS_OVERLAPPEDWINDOW; + lpSS->styleNew= WS_OVERLAPPEDWINDOW; + } + if (dxw.dwFlags9 & FIXTHINFRAME){ // set canonical style with thin border + lpSS->styleNew= WS_OVERLAPPEDTHIN; } if (dxw.dwFlags1 & LOCKWINSTYLE){ // set to current value lpSS->styleNew= (*pGetWindowLong)(hwnd, GWL_STYLE); diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp index a85ef2d..363b68b 100644 --- a/dll/dxwcore.hpp +++ b/dll/dxwcore.hpp @@ -4,6 +4,13 @@ #define DDSQLEN 0x20 #define MAXFONTS 0x40 +#define WS_OVERLAPPEDTHIN (WS_OVERLAPPED | \ + WS_CAPTION | \ + WS_SYSMENU | \ + WS_THICKFRAME | \ + WS_MINIMIZEBOX | \ + WS_MAXIMIZEBOX) + typedef struct { DWORD dwTimerType; union{ @@ -40,7 +47,9 @@ typedef struct { typedef enum { SURFACE_ROLE_PRIMARY = 0, SURFACE_ROLE_BACKBUFFER, - SURFACE_ROLE_ZBUFFER + SURFACE_ROLE_ZBUFFER, + SURFACE_ROLE_3DREF, + SURFACE_ROLE_UNKNOWN } Enum_Surface_Role_Type; typedef struct { @@ -259,15 +268,21 @@ public: LPDIRECTDRAWSURFACE GetZBufferSurface(void); void PushZBufferSurface(LPDIRECTDRAWSURFACE, int, DWORD); BOOL IsAZBufferSurface(LPDIRECTDRAWSURFACE); - LPDIRECTDRAWSURFACE GetBackBufferSurface(void); void PopSurface(LPDIRECTDRAWSURFACE); - void DuplicateSurface(LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE, int); + LPDIRECTDRAWSURFACE GetBackBufferSurface(void); + void Push3DRefSurface(LPDIRECTDRAWSURFACE, int, DWORD); + BOOL IsA3DRefSurface(LPDIRECTDRAWSURFACE); + LPDIRECTDRAWSURFACE Get3DRefBufferSurface(void); + void PopSurface(LPDIRECTDRAWSURFACE); + DWORD DuplicateSurface(LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE, int); DWORD GetCaps(LPDIRECTDRAWSURFACE); + SurfaceDB_Type *GetSurface(LPDIRECTDRAWSURFACE); protected: SurfaceDB_Type SurfaceDB[DDSQLEN+1]; LPDIRECTDRAWSURFACE lpDDSPrimary; LPDIRECTDRAWSURFACE lpDDSBackBuffer; LPDIRECTDRAWSURFACE lpDDSZBuffer; + LPDIRECTDRAWSURFACE lpDDS3DRef; private: void PushSurface(LPDIRECTDRAWSURFACE, USHORT, USHORT, DWORD); diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 7be3192..aefe72d 100644 --- a/dll/dxwnd.cpp +++ b/dll/dxwnd.cpp @@ -27,7 +27,7 @@ along with this program. If not, see . #include "TlHelp32.h" -#define VERSION "2.04.19.fx1" +#define VERSION "2.04.20" #define DDTHREADLOCK 1 @@ -286,7 +286,7 @@ void InjectHook() } } -static char *FlagNames[9][32] ={{ +static char *FlagNames[11][32] ={{ // Flags1 "UNNOTIFY", "EMULATESURFACE", "CLIPCURSOR", "NEEDADMINCAPS", "HOOKDI", "MODIFYMOUSE", "HANDLEEXCEPTIONS", "SAVELOAD", @@ -367,6 +367,24 @@ static char *FlagNames[9][32] ={{ "BACKGROUNDPRIORITY", "OFFSCREENZBUFFER", "VIRTUALHEAP", "ZBUFFERHARDCLEAN", "LOADLIBRARYERR", "SHAREDDCHYBRID", "FIXADJUSTWINRECT", "HOOKDLGWIN", },{ + // Flags9 + "FIXTHINFRAME", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", },{ + // Flags10 + "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", },{ // TFlags "OUTTRACE", "OUTDDRAWTRACE", "OUTWINMESSAGES", "OUTCURSORTRACE", "OUTSEPARATED", "**", "ASSERTDIALOG", "OUTIMPORTTABLE", @@ -382,7 +400,7 @@ LPCSTR GetFlagCaption(int flag, int bit) { //if((flag<0) || (flag>(9*32))) return ""; //return FlagNames[flag >> 5][flag & 0x1F]; - if((flag<0) || (flag>8)) return ""; + if((flag<0) || (flag>10)) return ""; if((bit<0) || (bit>31)) return ""; return FlagNames[flag][bit]; } \ No newline at end of file diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 30d2648..515de0a 100644 Binary files a/dll/dxwnd.vs2008.suo and b/dll/dxwnd.vs2008.suo differ diff --git a/dll/dxwsstack.cpp b/dll/dxwsstack.cpp index 6fd629c..b791b26 100644 --- a/dll/dxwsstack.cpp +++ b/dll/dxwsstack.cpp @@ -8,8 +8,8 @@ #include "dxwnd.h" #include "dxwcore.hpp" -//#define DXW_SURFACE_STACK_TRACING -//#define OutTraceSDB OutTrace +#define DXW_SURFACE_STACK_TRACING +#define OutTraceSDB OutTrace dxwSStack::dxwSStack() { @@ -17,6 +17,7 @@ dxwSStack::dxwSStack() lpDDSPrimary = NULL; lpDDSBackBuffer = NULL; lpDDSZBuffer = NULL; + lpDDS3DRef = NULL; memset(SurfaceDB, 0, sizeof(SurfaceDB)); } @@ -31,6 +32,7 @@ static char *sRole(USHORT role) case SURFACE_ROLE_PRIMARY: s="(PRIM)"; break; case SURFACE_ROLE_BACKBUFFER: s="(BACK)"; break; case SURFACE_ROLE_ZBUFFER: s="(ZBUF)"; break; + case SURFACE_ROLE_3DREF: s="(3DREF)"; break; default: s="??"; break; // should never happen ... } return s; @@ -43,10 +45,12 @@ static void CheckSurfaceList(SurfaceDB_Type *SurfaceDB) char sMsg[81]; int iPCount = 0; int iBCount = 0; + int iZCount = 0; for (int i=0;i 1) { sprintf(sMsg, "Primary count = %d", iPCount); @@ -56,6 +60,10 @@ static void CheckSurfaceList(SurfaceDB_Type *SurfaceDB) sprintf(sMsg, "Backbuffer count = %d", iPCount); MessageBox(0, sMsg, "DxWnd SurfaceList", MB_OK | MB_ICONEXCLAMATION); } + if(iZCount > 1) { + sprintf(sMsg, "Zbuffer count = %d", iZCount); + MessageBox(0, sMsg, "DxWnd SurfaceList", MB_OK | MB_ICONEXCLAMATION); + } } static void DumpSurfaceList(SurfaceDB_Type *SurfaceDB) @@ -87,53 +95,33 @@ char *dxwSStack::ExplainSurfaceRole(LPDIRECTDRAWSURFACE ps) void dxwSStack::ClearSurfaceList() { #ifdef DXW_SURFACE_STACK_TRACING - OutTrace(">>> SURFACELIST CLEAR ALL\n"); + OutTrace(">>> SURFACELIST CLEAR UNREF\n"); #endif // v2.03.91.fx5: emptying the list entirely is no good for "Warhammer 40K Rites of War" // better leave the last used primary and backbuffer surfaces. - int i; - SurfaceDB_Type LastEntries[3]; - LastEntries[0].lpdds = 0; - LastEntries[1].lpdds = 0; - LastEntries[2].lpdds = 0; + int i, j; + SurfaceDB_Type NewEntries[DDSQLEN]; lpDDSPrimary = NULL; lpDDSBackBuffer = NULL; lpDDSZBuffer = NULL; - // search for last (more recent) entries and copy to safe place - for (i=0;i>> SAVED lpDDSPrimary=%x\n", lpDDSPrimary); -#endif - } - if(LastEntries[1].lpdds) { - SurfaceDB[i++]=LastEntries[1]; - lpDDSBackBuffer = LastEntries[1].lpdds; -#ifdef DXW_SURFACE_STACK_TRACING - OutTrace(">>> SAVED lpDDSBackBuffer=%x\n", lpDDSBackBuffer); -#endif - } - if(LastEntries[2].lpdds) { - SurfaceDB[i++]=LastEntries[2]; - lpDDSZBuffer = LastEntries[2].lpdds; -#ifdef DXW_SURFACE_STACK_TRACING - OutTrace(">>> SAVED lpDDSZBuffer=%x\n", lpDDSZBuffer); -#endif + NewEntries[j].lpdds = NULL; // terminator + // move back to original list + for (i=0; i>> SURFACELIST DUPL: from=%x to=%x vers=%d\n", psfrom, psto, version); #endif + // search for source or empty slot for (i=0;ilpdds==psfrom) || (e->lpdds==(DWORD)0)) break; // got matching entry or end of the list } // if not found, return - if (!e->lpdds) return; - // search for an empty slot - j = i; - for (j=0;jlpdds) return 0; + // save surface entry + sentry = *e; + // search for destination or empty slot + for (i=0;ilpdds==psto) || (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; + for(int j=0;jlpdds = psto; + e->uVersion = version; + e->uRef = TRUE; #ifdef DXW_SURFACE_STACK_TRACING DumpSurfaceList(SurfaceDB); #endif + return e->dwCaps; } void dxwSStack::PopSurface(LPDIRECTDRAWSURFACE ps) @@ -302,6 +309,18 @@ BOOL dxwSStack::IsAZBufferSurface(LPDIRECTDRAWSURFACE ps) return FALSE; } +BOOL dxwSStack::IsA3DRefSurface(LPDIRECTDRAWSURFACE ps) +{ + int i; + // treat NULL surface ptr as a non primary + if(!ps) return FALSE; + for (i=0;i>> GETCAPS: lpdds=%x caps=%x(%s)\n", ps, SurfaceDB[i].dwCaps, ExplainDDSCaps(SurfaceDB[i].dwCaps)); +#endif + return &SurfaceDB[i]; + } + } + return NULL; +} diff --git a/dll/queryint.cpp b/dll/queryint.cpp index cc97dbc..b8e9921 100644 --- a/dll/queryint.cpp +++ b/dll/queryint.cpp @@ -44,6 +44,7 @@ HRESULT WINAPI extQueryInterfaceDX(int dxversion, QueryInterface_Type pQueryInte int iObjectType; int iObjectVersion; extern LPDIRECTDRAWSURFACE lpDDSEmu_Prim; + DWORD caps; IsPrim=dxwss.IsAPrimarySurface((LPDIRECTDRAWSURFACE)lpdds); IsBack=dxwss.IsABackBufferSurface((LPDIRECTDRAWSURFACE)lpdds); @@ -203,16 +204,18 @@ HRESULT WINAPI extQueryInterfaceDX(int dxversion, QueryInterface_Type pQueryInte switch(iObjectType){ case TYPE_OBJECT_UNKNOWN: - if(*obp != lpdds) dxwss.PopSurface((LPDIRECTDRAWSURFACE)*obp); // clear any past attribution - dxwss.DuplicateSurface((LPDIRECTDRAWSURFACE)lpdds, (LPDIRECTDRAWSURFACE)*obp, iObjectVersion); + if(caps=dxwss.DuplicateSurface((LPDIRECTDRAWSURFACE)lpdds, (LPDIRECTDRAWSURFACE)*obp, iObjectVersion)){ + OutTraceDW("QueryInterface: MOVE caps=%x(%s)\n", caps, ExplainDDSCaps(caps)); + } break; case TYPE_OBJECT_DIRECTDRAW: HookDDSession((LPDIRECTDRAW *)obp, iObjectVersion); break; case TYPE_OBJECT_DDRAWSURFACE: dxw.dwDDVersion=iObjectVersion; - if(*obp != lpdds) dxwss.PopSurface((LPDIRECTDRAWSURFACE)*obp); // clear any past attribution - dxwss.DuplicateSurface((LPDIRECTDRAWSURFACE)lpdds, (LPDIRECTDRAWSURFACE)*obp, iObjectVersion); + if(caps=dxwss.DuplicateSurface((LPDIRECTDRAWSURFACE)lpdds, (LPDIRECTDRAWSURFACE)*obp, iObjectVersion)){ + OutTraceDW("QueryInterface: MOVE caps=%x(%s)\n", caps, ExplainDDSCaps(caps)); + } if(IsPrim){ OutTraceDW("QueryInterface(S): primary=%x new=%x\n", lpdds, *obp); HookDDSurface((LPDIRECTDRAWSURFACE *)obp, dxw.dwDDVersion, TRUE); diff --git a/dll/user32.cpp b/dll/user32.cpp index fb91ad4..ea72de5 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -16,6 +16,13 @@ #include #define FIXCHILDSIZE FALSE +//#define TRANSLATEMESSAGEHOOK + +#ifdef TRANSLATEMESSAGEHOOK +typedef BOOL (WINAPI *TranslateMessage_Type)(MSG *); +BOOL WINAPI extTranslateMessage(MSG *); +TranslateMessage_Type pTranslateMessage; +#endif #define _Warn(s) MessageBox(0, s, "to do", MB_ICONEXCLAMATION) @@ -43,9 +50,9 @@ UINT WINAPI extSetDIBColorTable(HDC, UINT, UINT, const RGBQUAD *); #endif static HookEntryEx_Type Hooks[]={ - - //{HOOK_IAT_CANDIDATE, 0, "TranslateMessage", (FARPROC)TranslateMessage, (FARPROC *)&pTranslateMessage, (FARPROC)extTranslateMessage}, - +#ifdef TRANSLATEMESSAGEHOOK + {HOOK_IAT_CANDIDATE, 0, "TranslateMessage", (FARPROC)TranslateMessage, (FARPROC *)&pTranslateMessage, (FARPROC)extTranslateMessage}, +#endif {HOOK_IAT_CANDIDATE, 0, "UpdateWindow", (FARPROC)UpdateWindow, (FARPROC *)&pUpdateWindow, (FARPROC)extUpdateWindow}, // v2.04.04: needed for "Hide Desktop" option //{HOOK_IAT_CANDIDATE, 0, "GetWindowPlacement", (FARPROC)NULL, (FARPROC *)&pGetWindowPlacement, (FARPROC)extGetWindowPlacement}, //{HOOK_IAT_CANDIDATE, 0, "SetWindowPlacement", (FARPROC)NULL, (FARPROC *)&pSetWindowPlacement, (FARPROC)extSetWindowPlacement}, @@ -801,6 +808,15 @@ LONG WINAPI extSetWindowLong(HWND hwnd, int nIndex, LONG dwNewLong, SetWindowLon dwNewLong &= ~WS_CLIPSIBLINGS; } } + + if (dxw.dwFlags1 & FIXTHINFRAME){ + //if((nIndex==GWL_STYLE) && !(dwNewLong & WS_CHILD)){ + if((nIndex==GWL_STYLE) && !(dwNewLong & WS_CHILD) && dxw.IsDesktop(hwnd)){ + OutTraceDW("SetWindowLong: GWL_STYLE %x force OVERLAPPEDWINDOW\n", dwNewLong); + dwNewLong |= WS_OVERLAPPEDTHIN; + dwNewLong &= ~WS_CLIPSIBLINGS; + } + } } // v2.03.94.fx2: removed dxw.IsFullScreen() check here ... WinProc routine must be verified in all conditions @@ -3664,6 +3680,7 @@ LRESULT CALLBACK extMouseHookProc(int code, WPARAM wParam, LPARAM lParam) HOOKPROC glpMessageHookProcessFunction; HOOKPROC glpMouseHookProcessFunction; +HOOKPROC glpMouseHookProcessFunctionLL; LRESULT CALLBACK extMessageHookProc(int code, WPARAM wParam, LPARAM lParam) { @@ -3682,17 +3699,48 @@ LRESULT CALLBACK extMessageHookProc(int code, WPARAM wParam, LPARAM lParam) return ret; } +static POINT FixMousePoint(POINT pt) +{ + dxw.UnmapWindow(&pt); + if(pt.x < 0) pt.x = 0; + if(pt.x >= (LONG)dxw.GetScreenWidth()) pt.x = dxw.GetScreenWidth()-1; + if(pt.y < 0) pt.y = 0; + if(pt.y >= (LONG)dxw.GetScreenHeight()) pt.y = dxw.GetScreenHeight()-1; + return pt; +} + LRESULT CALLBACK extMouseHookProc(int code, WPARAM wParam, LPARAM lParam) { - LRESULT ret; OutTraceC("MouseHookProc: code=%x wParam=%x lParam=%x\n", code, wParam, lParam); - MOUSEHOOKSTRUCT *pMouseStruct = (MOUSEHOOKSTRUCT *)lParam; - if (pMouseStruct != NULL){ - OutTraceC("MouseHookProc: event=%s pos=(%d,%d)\n", ExplainWinMessage(wParam), pMouseStruct->pt.x, pMouseStruct->pt.y); - extGetCursorPos(&(pMouseStruct->pt)); - } - ret = (*glpMouseHookProcessFunction)(code, wParam, lParam); - return ret; + if(code < 0) return CallNextHookEx(0, code, wParam, lParam); + + if(lParam){ + MOUSEHOOKSTRUCT MouseStruct = *(MOUSEHOOKSTRUCT *)lParam; + MouseStruct.pt = FixMousePoint(MouseStruct.pt); + OutTraceC("MouseHookProc: event=%s pos=(%d,%d)->(%d,%d)\n", + ExplainWinMessage(wParam), + ((MOUSEHOOKSTRUCT *)lParam)->pt.x, ((MOUSEHOOKSTRUCT *)lParam)->pt.y, + MouseStruct.pt.x, MouseStruct.pt.y); + return (*glpMouseHookProcessFunction)(code, wParam, (LPARAM)&MouseStruct); + } + return (*glpMouseHookProcessFunction)(code, wParam, lParam); +} + +LRESULT CALLBACK extMouseHookProcLL(int code, WPARAM wParam, LPARAM lParam) +{ + OutTraceC("MouseHookProcLL: code=%x wParam=%x lParam=%x\n", code, wParam, lParam); + if(code < 0) return CallNextHookEx(0, code, wParam, lParam); + + if(lParam){ + MSLLHOOKSTRUCT MouseStruct = *(MSLLHOOKSTRUCT *)lParam; + MouseStruct.pt = FixMousePoint(MouseStruct.pt); + OutTraceC("MouseHookProcLL: event=%s pos=(%d,%d)->(%d,%d)\n", + ExplainWinMessage(wParam), + ((MSLLHOOKSTRUCT *)lParam)->pt.x, ((MSLLHOOKSTRUCT *)lParam)->pt.y, + MouseStruct.pt.x, MouseStruct.pt.y); + return (*glpMouseHookProcessFunctionLL)(code, wParam, (LPARAM)&MouseStruct); + } + return (*glpMouseHookProcessFunctionLL)(code, wParam, lParam); } static HHOOK WINAPI extSetWindowsHookEx(SetWindowsHookEx_Type pSetWindowsHookEx, int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId) @@ -3709,6 +3757,7 @@ static HHOOK WINAPI extSetWindowsHookEx(SetWindowsHookEx_Type pSetWindowsHookEx, lpfn=extMessageHookProc; } } + // v2.03.39: "One Must Fall Battlegrounds" keyboard fix if((idHook == WH_KEYBOARD) && (dwThreadId == NULL)) { dwThreadId = GetCurrentThreadId(); @@ -3727,10 +3776,17 @@ static HHOOK WINAPI extSetWindowsHookEx(SetWindowsHookEx_Type pSetWindowsHookEx, return NULL; } - if((dxw.dwFlags8 & FIXMOUSEHOOK) && (idHook == WH_MOUSE)){ - OutTraceDW("SetWindowsHookEx: FIXMOUSEHOOK filter active\n"); - glpMouseHookProcessFunction = lpfn; - lpfn=extMouseHookProc; + if(dxw.dwFlags8 & FIXMOUSEHOOK){ + if(idHook == WH_MOUSE){ + OutTraceDW("SetWindowsHookEx: FIXMOUSEHOOK filter active on WH_MOUSE\n"); + glpMouseHookProcessFunction = lpfn; + lpfn=extMouseHookProc; + } + if (idHook == WH_MOUSE_LL){ + OutTraceDW("SetWindowsHookEx: FIXMOUSEHOOK filter active on WH_MOUSE_LL\n"); + glpMouseHookProcessFunctionLL = lpfn; + lpfn=extMouseHookProcLL; + } } ret=(*pSetWindowsHookEx)(idHook, lpfn, hMod, dwThreadId); @@ -4053,7 +4109,7 @@ BOOL WINAPI extDrawMenuBar(HWND hWnd) return ret; } -#if 0 +#ifdef TRANSLATEMESSAGEHOOK BOOL WINAPI extTranslateMessage(MSG *pMsg) { BOOL ret; @@ -4063,8 +4119,8 @@ BOOL WINAPI extTranslateMessage(MSG *pMsg) pMsg->pt=dxw.ScreenToClient(pMsg->pt); pMsg->pt=dxw.FixCursorPos(pMsg->pt); - pMsg->pt.x *= 4; - pMsg->pt.y *= 4; + //pMsg->pt.x *= 4; + //pMsg->pt.y *= 4; //if((pMsg->message <= WM_MOUSELAST) && (pMsg->message >= WM_MOUSEFIRST)) // pMsg->lParam = MAKELPARAM(pMsg->pt.x, pMsg->pt.y); OutTraceDW("TranslateMessage: new pos=(%d,%d)\n", pMsg->pt.x, pMsg->pt.y); diff --git a/dll/winproc.cpp b/dll/winproc.cpp index 737f392..2692dd2 100644 --- a/dll/winproc.cpp +++ b/dll/winproc.cpp @@ -279,6 +279,7 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp if(dxw.dwFlags3 & (FILTERMESSAGES|DEFAULTMESSAGES)){ switch(message){ + case WM_NCMOUSELEAVE: case WM_NCMOUSEMOVE: case WM_NCLBUTTONDOWN: case WM_NCLBUTTONUP: diff --git a/host/ShimsDialog.cpp b/host/ShimsDialog.cpp index 02219b1..0b0f21d 100644 --- a/host/ShimsDialog.cpp +++ b/host/ShimsDialog.cpp @@ -6,12 +6,13 @@ #include "ShimsDialog.h" // http://msdn2.microsoft.com/en-us/library/bb432457 -// PDB WINAPI SdbOpenDatabase( +// HSDB WINAPI SdbOpenDatabase( // LPCTSTR pwszPath, // PATH_TYPE eType //); -// What is PDB!? Assuming it is a pointer to somewhere => "void*" -typedef void* PDB; + +// What is HSDB!? Assuming it is a pointer to somewhere => "void*" +typedef void* HSDB; // http://msdn2.microsoft.com/en-us/library/bb432389.aspx typedef enum _PATH_TYPE @@ -61,6 +62,14 @@ typedef DWORD TAGREF; #define TAG_APP_ID (0x11 | TAG_TYPE_BINARY) #define CONTEXT_PLATFORM_ID (0x8 | TAG_TYPE_BINARY) +#define HID_DOS_PATHS 0x00000001 +#define HID_DATABASE_FULLPATH 0x00000002 +#define HID_NO_DATABASE 0x00000004 +#define HID_DATABASE_TYPE_MASK 0xF00F0000 + +#define SDB_DATABASE_MAIN_SHIM 0x80030000 +#define SDB_DATABASE_MAIN_MSI 0x80020000 +#define SDB_DATABASE_MAIN_DRIVERS 0x80040000 typedef struct TAG_RC_Entry { @@ -91,44 +100,55 @@ static DWORD s_TagGuids[] = // APIs: // http://msdn.microsoft.com/en-us/library/bb432457.aspx -//PDB WINAPI SdbOpenDatabase( +//HSDB WINAPI SdbOpenDatabase( // __in LPCTSTR pwszPath, // __in PATH_TYPE eType //); -typedef PDB (WINAPI *PSdbOpenDatabase)( - LPCWSTR pwszPath, // Docu wrong? LPCTSTR shouldn't it be LPCWSTR!? +typedef HSDB (WINAPI *PSdbOpenDatabase)( + LPCTSTR pwszPath, // Docu wrong? LPCTSTR shouldn't it be LPCWSTR!? PATH_TYPE eType ); PSdbOpenDatabase pSdbOpenDatabase = NULL; +// http://msdn.microsoft.com/en-us/library/bb432452.aspx +//HSDB WINAPI SdbInitDatabase( +// __in DWORD dwFlags, +// __in LPCTSTR pszDatabasePath +//); +typedef HSDB (WINAPI *PSdbInitDatabase)( + DWORD dwFlags, + LPCTSTR pszDatabasePath +); +PSdbInitDatabase pSdbInitDatabase = NULL; + // http://msdn.microsoft.com/en-us/library/cc895520 //void WINAPI SdbCloseDatabase( -// __inout PDB pdb +// __inout HSDB pdb //); typedef VOID (WINAPI *PSdbCloseDatabase)( - PDB handle // assuming the passed handle... + HSDB handle // assuming the passed handle... ); PSdbCloseDatabase pSdbCloseDatabase = NULL; // http://msdn2.microsoft.com/en-us/library/bb432446 //TAGID WINAPI SdbGetFirstChild( -// PDB pdb, +// HSDB pdb, // TAGID tiParent //); typedef TAGID (WINAPI *PSdbGetFirstChild)( - PDB pdb, + HSDB pdb, TAGID tiParent ); PSdbGetFirstChild pSdbGetFirstChild = NULL; // http://msdn2.microsoft.com/en-us/library/bb432449 //TAGID WINAPI SdbGetNextChild( -// PDB pdb, +// HSDB pdb, // TAGID tiParent, // TAGID tiPrev //); typedef TAGID (WINAPI *PSdbGetNextChild)( - PDB pdb, + HSDB pdb, TAGID tiParent, TAGID tiPrev ); @@ -136,11 +156,11 @@ PSdbGetNextChild pSdbGetNextChild = NULL; // http://msdn2.microsoft.com/en-us/library/bb432451 //TAG WINAPI SdbGetTagFromTagID( -// PDB pdb, +// HSDB pdb, // TAGID tiWhich //); typedef TAG (WINAPI *PSdbGetTagFromTagID)( - PDB pdb, + HSDB pdb, TAGID tiWhich ); PSdbGetTagFromTagID pSdbGetTagFromTagID = NULL; @@ -156,13 +176,13 @@ PSdbTagToString pSdbTagToString = NULL; // http://msdn2.microsoft.com/en-us/library/bb432464 //BOOL WINAPI SdbReadStringTag( -// PDB pdb, +// HSDB pdb, // TAGID tiWhich, // LPTSTR pwszBuffer, // DWORD cchBufferSize //); typedef BOOL (WINAPI *PSdbReadStringTag)( - PDB pdb, + HSDB pdb, TAGID tiWhich, LPTSTR pwszBuffer, DWORD cchBufferSize @@ -171,23 +191,23 @@ PSdbReadStringTag pSdbReadStringTag = NULL; // http://msdn2.microsoft.com/en-us/library/bb432450.aspx //LPWSTR WINAPI SdbGetStringTagPtr( -// PDB pdb, +// HSDB pdb, // TAGID tiWhich //); typedef LPWSTR (WINAPI *PSdbGetStringTagPtr)( - PDB pdb, + HSDB pdb, TAGID tiWhich ); PSdbGetStringTagPtr pSdbGetStringTagPtr = NULL; // http://msdn2.microsoft.com/en-us/library/bb432462.aspx //DWORD WINAPI SdbReadDWORDTag( -// PDB pdb, +// HSDB pdb, // TAGID tiWhich, // DWORD dwDefault //); typedef DWORD (WINAPI *PSdbReadDWORDTag)( - PDB pdb, + HSDB pdb, TAGID tiWhich, DWORD dwDefault ); @@ -195,22 +215,22 @@ PSdbReadDWORDTag pSdbReadDWORDTag = NULL; // http://msdn2.microsoft.com/en-us/library/bb432463.aspx //ULONGLONG WINAPI SdbReadQWORDTag( -// PDB pdb, +// HSDB pdb, // TAGID tiWhich, // ULONGLONG qwDefault //); typedef ULONGLONG (WINAPI *PSdbReadQWORDTag)( - PDB pdb, + HSDB pdb, TAGID tiWhich, ULONGLONG qwDefault ); PSdbReadQWORDTag pSdbReadQWORDTag = NULL; // http://msdn2.microsoft.com/en-us/library/bb432455 -//PDB WINAPI SdbOpenApphelpDetailsDatabase( +//HSDB WINAPI SdbOpenApphelpDetailsDatabase( // LPCWSTR pwsDetailsDatabasePath //); -typedef PDB (WINAPI *PSdbOpenApphelpDetailsDatabase)( +typedef HSDB (WINAPI *PSdbOpenApphelpDetailsDatabase)( LPCWSTR pwsDetailsDatabasePath ); PSdbOpenApphelpDetailsDatabase pSdbOpenApphelpDetailsDatabase = NULL; @@ -226,22 +246,22 @@ PSdbOpenApphelpResourceFile pSdbOpenApphelpResourceFile = NULL; // http://msdn.microsoft.com/en-us/library/bb432443 //PVOID WINAPI SdbGetBinaryTagData( -// __in PDB pdb, +// __in HSDB pdb, // __in TAGID tiWhich //); typedef PVOID (WINAPI *PSdbGetBinaryTagData)( - PDB pdb, + HSDB pdb, TAGID tiWhich ); PSdbGetBinaryTagData pSdbGetBinaryTagData = NULL; // ??? //DWORD WINAPI SdbGetTagDataSize( -// __in PDB pdb, +// __in HSDB pdb, // __in TAGID tiWhich //); typedef DWORD (WINAPI *PSdbGetTagDataSize)( - PDB pdb, + HSDB pdb, TAGID tiWhich ); PSdbGetTagDataSize pSdbGetTagDataSize = NULL; @@ -264,8 +284,6 @@ typedef struct tagSDBQUERYRESULT { GUID rgGuidDB[SDB_MAX_SDBS]; } SDBQUERYRESULT, *PSDBQUERYRESULT; -typedef void* HSDB; - // http://msdn.microsoft.com/en-us/library/bb432448 typedef BOOL (WINAPI *PSdbGetMatchingExe)( HSDB hSDB, @@ -360,10 +378,17 @@ char * MatchExe(char *FileName) static char sBuf[10000]; LPWSTR szFileName = (LPWSTR)malloc((strlen(FileName)+1)*sizeof(WCHAR)); MultiByteToWideChar(CP_ACP, 0, FileName, -1, szFileName, strlen(FileName)); + BOOL bRet; + HSDB hSDB; HINSTANCE hAppHelp = LoadLibrary(_T("apphelp.dll")); + if(!hAppHelp){ + sprintf(sBuf, "error %d loading apphelp.dll\n", GetLastError()); + return sBuf; + } pSdbOpenDatabase = (PSdbOpenDatabase) GetProcAddress(hAppHelp, "SdbOpenDatabase"); + pSdbInitDatabase = (PSdbInitDatabase) GetProcAddress(hAppHelp, "SdbInitDatabase"); pSdbCloseDatabase = (PSdbCloseDatabase) GetProcAddress(hAppHelp, "SdbCloseDatabase"); pSdbGetFirstChild = (PSdbGetFirstChild) GetProcAddress(hAppHelp, "SdbGetFirstChild"); pSdbGetNextChild = (PSdbGetNextChild) GetProcAddress(hAppHelp, "SdbGetNextChild"); @@ -384,55 +409,67 @@ char * MatchExe(char *FileName) if(pSdbGetMatchingExe == NULL){ // rough protection: we assume that if this is found, then all fpointers are there. sprintf(sBuf, "Unsupported Shim DB\n", FileName); + FreeLibrary(hAppHelp); return sBuf; } - BOOL bRet = pSdbGetMatchingExe(NULL, (LPCWSTR)szFileName, NULL, NULL, 0, &result); - if (bRet){ - sprintf(sBuf, "Shim found for file: %s\n", FileName); - const size_t flagsLen = 1024; - char szFlagsStr[flagsLen]; - Flags2String(result.dwFlags, szFlagsStr, flagsLen); - sprintf(sBuf, "%sFlags: 0x%x: %s\n", sBuf, result.dwFlags, szFlagsStr); - - if (result.trApphelp != TAGREF_NULL) sprintf(sBuf, "%sAppHelp-Message: 0x%x\n", sBuf, result.trApphelp); - - for(DWORD i=0; iGetParent()->GetParent())); - // window management - DDX_Check(pDX, IDC_FIXWINFRAME, cTarget->m_FixWinFrame); - DDX_Check(pDX, IDC_PREVENTMAXIMIZE, cTarget->m_PreventMaximize); + // window style + DDX_Radio(pDX, IDC_DEFAULTSTYLE, cTarget->m_WindowStyle); DDX_Check(pDX, IDC_LOCKWINSTYLE, cTarget->m_LockWinStyle); + + // window management + //DDX_Check(pDX, IDC_FIXWINFRAME, cTarget->m_FixWinFrame); + DDX_Check(pDX, IDC_PREVENTMAXIMIZE, cTarget->m_PreventMaximize); DDX_Check(pDX, IDC_FIXPARENTWIN, cTarget->m_FixParentWin); - DDX_Check(pDX, IDC_MODALSTYLE, cTarget->m_ModalStyle); + //DDX_Check(pDX, IDC_MODALSTYLE, cTarget->m_ModalStyle); DDX_Check(pDX, IDC_FORCEWINRESIZE, cTarget->m_ForceWinResize); DDX_Check(pDX, IDC_HIDEMULTIMONITOR, cTarget->m_HideMultiMonitor); DDX_Check(pDX, IDC_RECOVERSCREENMODE, cTarget->m_RecoverScreenMode); diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index 79ac89b..e86bec1 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -163,7 +163,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_AutoRefresh = FALSE; m_IndependentRefresh = FALSE; m_TextureFormat = FALSE; - m_FixWinFrame = FALSE; + //m_FixWinFrame = FALSE; m_VideoToSystemMem = FALSE; m_FixTextOut = FALSE; m_SharedDC = FALSE; @@ -195,7 +195,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_ClientRemapping = TRUE; // default true !! m_LockWinStyle = FALSE; m_FixParentWin = FALSE; - m_ModalStyle = FALSE; + //m_ModalStyle = FALSE; m_KeepAspectRatio = FALSE; m_ForceWinResize = FALSE; m_HideMultiMonitor = FALSE; diff --git a/host/TargetDlg.h b/host/TargetDlg.h index ce0d279..65735db 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -42,6 +42,7 @@ public: int m_LogMode; int m_MonitorId; int m_WinMovementType; + int m_WindowStyle; BOOL m_HookDI; BOOL m_HookDI8; BOOL m_EmulateRelMouse; @@ -112,7 +113,7 @@ public: BOOL m_AutoRefresh; BOOL m_IndependentRefresh; BOOL m_TextureFormat; - BOOL m_FixWinFrame; + //BOOL m_FixWinFrame; BOOL m_VideoToSystemMem; BOOL m_FixTextOut; BOOL m_SharedDC; @@ -144,7 +145,7 @@ public: BOOL m_ClientRemapping; BOOL m_LockWinStyle; BOOL m_FixParentWin; - BOOL m_ModalStyle; + //BOOL m_ModalStyle; BOOL m_KeepAspectRatio; BOOL m_ForceWinResize; BOOL m_HideMultiMonitor; diff --git a/host/ViewFlagsDialog.cpp b/host/ViewFlagsDialog.cpp index 149af56..8f6843b 100644 --- a/host/ViewFlagsDialog.cpp +++ b/host/ViewFlagsDialog.cpp @@ -55,8 +55,12 @@ BOOL CViewFlagsDialog::OnInitDialog() for(i=0, dword = t->flags7; i<32; i++, dword>>=1) if(dword & 0x1) sflags.AppendFormat("%s ", GetFlagCaption(6,i)); sflags.Append("\nFlags8: "); for(i=0, dword = t->flags8; i<32; i++, dword>>=1) if(dword & 0x1) sflags.AppendFormat("%s ", GetFlagCaption(7,i)); + sflags.Append("\nFlags9: "); + for(i=0, dword = t->flags8; i<32; i++, dword>>=1) if(dword & 0x1) sflags.AppendFormat("%s ", GetFlagCaption(8,i)); + sflags.Append("\nFlags10: "); + for(i=0, dword = t->flags8; i<32; i++, dword>>=1) if(dword & 0x1) sflags.AppendFormat("%s ", GetFlagCaption(9,i)); sflags.Append("\nTFlags: "); - for(i=0, dword = t->tflags; i<32; i++, dword>>=1) if(dword & 0x1) sflags.AppendFormat("%s ", GetFlagCaption(8,i)); + for(i=0, dword = t->tflags; i<32; i++, dword>>=1) if(dword & 0x1) sflags.AppendFormat("%s ", GetFlagCaption(10,i)); this->SetDlgItemTextA(IDC_DESKTOPINFO, sflags); this->SetWindowTextA(t->path); diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index 51ea7d4..433abc9 100644 Binary files a/host/dxwndhost.aps and b/host/dxwndhost.aps differ diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index 8f8b234..fe5d6a6 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 985433c..e261656 100644 Binary files a/host/dxwndhost.vs2008.suo and b/host/dxwndhost.vs2008.suo differ diff --git a/host/dxwndhostDoc.cpp b/host/dxwndhostDoc.cpp deleted file mode 100644 index 1536efc..0000000 --- a/host/dxwndhostDoc.cpp +++ /dev/null @@ -1,75 +0,0 @@ -// dxwndhostDoc.cpp : CDxwndhostDoc Define the behavior of the class. -// - -#include "stdafx.h" -#include "dxwndhost.h" - -#include "dxwndhostDoc.h" - -#ifdef _DEBUG -#define new DEBUG_NEW -#undef THIS_FILE -static char THIS_FILE[] = __FILE__; -#endif - -///////////////////////////////////////////////////////////////////////////// -// CDxwndhostDoc - -IMPLEMENT_DYNCREATE(CDxwndhostDoc, CDocument) - -BEGIN_MESSAGE_MAP(CDxwndhostDoc, CDocument) - //{{AFX_MSG_MAP(CDxwndhostDoc) - //}}AFX_MSG_MAP -END_MESSAGE_MAP() - -///////////////////////////////////////////////////////////////////////////// -// CDxwndhostDoc class constructor / destructor - -CDxwndhostDoc::CDxwndhostDoc() -{ -} - -CDxwndhostDoc::~CDxwndhostDoc() -{ -} - -BOOL CDxwndhostDoc::OnNewDocument() -{ - if (!CDocument::OnNewDocument()) - return FALSE; - - return TRUE; -} - - - -///////////////////////////////////////////////////////////////////////////// -// CDxwndhostDoc Serialization - -void CDxwndhostDoc::Serialize(CArchive& ar) -{ - if (ar.IsStoring()) - { - } - else - { - } -} - -///////////////////////////////////////////////////////////////////////////// -// CDxwndhostDoc Diagnostic Class - -#ifdef _DEBUG -void CDxwndhostDoc::AssertValid() const -{ - CDocument::AssertValid(); -} - -void CDxwndhostDoc::Dump(CDumpContext& dc) const -{ - CDocument::Dump(dc); -} -#endif //_DEBUG - -///////////////////////////////////////////////////////////////////////////// -// CDxwndhostDoc Command diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index f302923..eb5ddd4 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -354,6 +354,13 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) case 2: t->flags8 |= DDSFORMAT; break; } + switch(dlg->m_WindowStyle){ + case 0: break; + case 1: t->flags2 |= MODALSTYLE; break; + case 2: t->flags |= FIXWINFRAME; break; + case 3: t->flags9 |= FIXTHINFRAME; break; + } + if(dlg->m_HookDI) t->flags |= HOOKDI; if(dlg->m_HookDI8) t->flags |= HOOKDI8; if(dlg->m_EmulateRelMouse) t->flags6 |= EMULATERELMOUSE; @@ -453,7 +460,7 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_AutoRefresh) t->flags |= AUTOREFRESH; if(dlg->m_IndependentRefresh) t->flags2 |= INDEPENDENTREFRESH; if(dlg->m_TextureFormat) t->flags5 |= TEXTUREFORMAT; - if(dlg->m_FixWinFrame) t->flags |= FIXWINFRAME; + //if(dlg->m_FixWinFrame) t->flags |= FIXWINFRAME; if(dlg->m_VideoToSystemMem) t->flags |= SWITCHVIDEOMEMORY; if(dlg->m_FixTextOut) t->flags |= FIXTEXTOUT; if(dlg->m_HookGlide) t->flags4 |= HOOKGLIDE; @@ -483,7 +490,7 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_ClientRemapping) t->flags |= CLIENTREMAPPING; if(dlg->m_LockWinStyle) t->flags |= LOCKWINSTYLE; if(dlg->m_FixParentWin) t->flags |= FIXPARENTWIN; - if(dlg->m_ModalStyle) t->flags2 |= MODALSTYLE; + //if(dlg->m_ModalStyle) t->flags2 |= MODALSTYLE; if(dlg->m_KeepAspectRatio) t->flags2 |= KEEPASPECTRATIO; if(dlg->m_ForceWinResize) t->flags2 |= FORCEWINRESIZE; if(dlg->m_HideMultiMonitor) t->flags2 |= HIDEMULTIMONITOR; @@ -689,6 +696,11 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) if( t->flags8 & RAWFORMAT) dlg->m_TextureFileFormat = 1; if( t->flags8 & DDSFORMAT) dlg->m_TextureFileFormat = 2; + dlg->m_WindowStyle = 0; + if(t->flags2 & MODALSTYLE) dlg->m_WindowStyle = 1; + if(t->flags & FIXWINFRAME) dlg->m_WindowStyle = 2; + if(t->flags9 & FIXTHINFRAME) dlg->m_WindowStyle = 3; + dlg->m_HookDI = t->flags & HOOKDI ? 1 : 0; dlg->m_HookDI8 = t->flags & HOOKDI8 ? 1 : 0; dlg->m_EmulateRelMouse = t->flags6 & EMULATERELMOUSE ? 1 : 0; @@ -788,7 +800,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_AutoRefresh = t->flags & AUTOREFRESH ? 1 : 0; dlg->m_IndependentRefresh = t->flags2 & INDEPENDENTREFRESH ? 1 : 0; dlg->m_TextureFormat = t->flags5 & TEXTUREFORMAT ? 1 : 0; - dlg->m_FixWinFrame = t->flags & FIXWINFRAME ? 1 : 0; + //dlg->m_FixWinFrame = t->flags & FIXWINFRAME ? 1 : 0; dlg->m_VideoToSystemMem = t->flags & SWITCHVIDEOMEMORY ? 1 : 0; dlg->m_FixTextOut = t->flags & FIXTEXTOUT ? 1 : 0; dlg->m_SharedDC = t->flags6 & SHAREDDC ? 1 : 0; @@ -819,7 +831,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_ClientRemapping = t->flags & CLIENTREMAPPING ? 1 : 0; dlg->m_LockWinStyle = t->flags & LOCKWINSTYLE ? 1 : 0; dlg->m_FixParentWin = t->flags & FIXPARENTWIN ? 1 : 0; - dlg->m_ModalStyle = t->flags2 & MODALSTYLE ? 1 : 0; + //dlg->m_ModalStyle = t->flags2 & MODALSTYLE ? 1 : 0; dlg->m_KeepAspectRatio = t->flags2 & KEEPASPECTRATIO ? 1 : 0; dlg->m_ForceWinResize = t->flags2 & FORCEWINRESIZE ? 1 : 0; dlg->m_HideMultiMonitor = t->flags2 & HIDEMULTIMONITOR ? 1 : 0; @@ -973,6 +985,14 @@ static void SaveConfigItem(TARGETMAP *TargetMap, PRIVATEMAP *PrivateMap, int i, sprintf_s(val, sizeof(val), "%i", TargetMap->flags8); WritePrivateProfileString("target", key, val, InitPath); // ------- + sprintf_s(key, sizeof(key), "flagn%i", i); + sprintf_s(val, sizeof(val), "%i", TargetMap->flags9); + WritePrivateProfileString("target", key, val, InitPath); + // ------- + sprintf_s(key, sizeof(key), "flago%i", i); + sprintf_s(val, sizeof(val), "%i", TargetMap->flags10); + WritePrivateProfileString("target", key, val, InitPath); + // ------- sprintf_s(key, sizeof(key), "tflag%i", i); sprintf_s(val, sizeof(val), "%i", TargetMap->tflags); WritePrivateProfileString("target", key, val, InitPath); @@ -1041,6 +1061,16 @@ static void SaveConfigItem(TARGETMAP *TargetMap, PRIVATEMAP *PrivateMap, int i, EscBuf = NULL; } +static void SaveExportStamp(char *InitPath) +{ + char val[32]; + GetDllVersion(val); + time_t _tm = time(NULL); + struct tm *curtime = localtime(& _tm); + WritePrivateProfileString("stamp", "version", val, InitPath); + WritePrivateProfileString("stamp", "time", asctime(curtime), InitPath); +} + static void ClearTarget(int i, char *InitPath) { char key[32]; @@ -1070,6 +1100,10 @@ static void ClearTarget(int i, char *InitPath) WritePrivateProfileString("target", key, 0, InitPath); sprintf_s(key, sizeof(key), "flagm%i", i); WritePrivateProfileString("target", key, 0, InitPath); + sprintf_s(key, sizeof(key), "flagn%i", i); + WritePrivateProfileString("target", key, 0, InitPath); + sprintf_s(key, sizeof(key), "flago%i", i); + WritePrivateProfileString("target", key, 0, InitPath); sprintf_s(key, sizeof(key), "tflag%i", i); WritePrivateProfileString("target", key, 0, InitPath); sprintf_s(key, sizeof(key), "initx%i", i); @@ -1186,6 +1220,12 @@ static int LoadConfigItem(TARGETMAP *TargetMap, PRIVATEMAP *PrivateMap, int i, c sprintf_s(key, sizeof(key), "flagm%i", i); TargetMap->flags8 = GetPrivateProfileInt("target", key, 0, InitPath); // ------- + sprintf_s(key, sizeof(key), "flagn%i", i); + TargetMap->flags9 = GetPrivateProfileInt("target", key, 0, InitPath); + // ------- + sprintf_s(key, sizeof(key), "flago%i", i); + TargetMap->flags10= GetPrivateProfileInt("target", key, 0, InitPath); + // ------- sprintf_s(key, sizeof(key), "tflag%i", i); TargetMap->tflags = GetPrivateProfileInt("target", key, 0, InitPath); // ------- @@ -1508,6 +1548,7 @@ void CDxwndhostView::OnExport() TFlags = TargetMap->tflags; TargetMap->tflags = 0; SaveConfigItem(&TargetMaps[i], &PrivateMaps[i], 0, path); + SaveExportStamp(path); TargetMap->tflags = TFlags; if(GetPrivateProfileInt("window", "updatepaths", 1, gInitPath)) { GetFolderFromPath(path); diff --git a/host/resource b/host/resource index 06fd13d..1b226ba 100644 Binary files a/host/resource and b/host/resource differ diff --git a/proxy/d3d8.suo b/proxy/d3d8.suo index c0d582c..1097fab 100644 Binary files a/proxy/d3d8.suo and b/proxy/d3d8.suo differ diff --git a/proxy/d3d9.suo b/proxy/d3d9.suo index c9d2468..c275b82 100644 Binary files a/proxy/d3d9.suo and b/proxy/d3d9.suo differ diff --git a/proxy/ddraw.suo b/proxy/ddraw.suo index fe447c6..2e34330 100644 Binary files a/proxy/ddraw.suo and b/proxy/ddraw.suo differ diff --git a/proxy/init.cpp b/proxy/init.cpp index 7605656..6ebd429 100644 --- a/proxy/init.cpp +++ b/proxy/init.cpp @@ -45,6 +45,8 @@ void InitDxWnd(void) target.flags6 = GetIntEntry("flagk0", 0); target.flags7 = GetIntEntry("flagl0", 0); target.flags8 = GetIntEntry("flagm0", 0); + target.flags9 = GetIntEntry("flagn0", 0); + target.flags10 = GetIntEntry("flago0", 0); target.tflags = GetIntEntry("tflag0", 0); target.dflags = GetIntEntry("dflag0", 0); target.posx = GetIntEntry("posx0", 0); diff --git a/proxy/wing32.suo b/proxy/wing32.suo index 139a76d..5a34189 100644 Binary files a/proxy/wing32.suo and b/proxy/wing32.suo differ