From b5e4788f9bc4eb4d15415cc8fd633a1fd8ce214f Mon Sep 17 00:00:00 2001 From: gho tik Date: Sat, 25 Mar 2017 09:59:46 -0400 Subject: [PATCH] v2_04_20_src --- Include/dxwnd.h | 2 + build/readme-relnotes.txt | 12 +++ dll/ddcreates.cpp | 6 ++ dll/ddraw.cpp | 135 ++++++++++++++++------------ dll/dxhook.cpp | 8 +- dll/dxwcore.cpp | 7 +- dll/dxwcore.hpp | 21 ++++- dll/dxwnd.cpp | 24 ++++- dll/dxwnd.vs2008.suo | Bin 138240 -> 186368 bytes dll/dxwsstack.cpp | 133 ++++++++++++++++----------- dll/queryint.cpp | 11 ++- dll/user32.cpp | 92 +++++++++++++++---- dll/winproc.cpp | 1 + host/ShimsDialog.cpp | 183 +++++++++++++++++++++++--------------- host/TabWindow.cpp | 11 ++- host/TargetDlg.cpp | 4 +- host/TargetDlg.h | 5 +- host/ViewFlagsDialog.cpp | 6 +- host/dxwndhost.aps | Bin 264168 -> 264404 bytes host/dxwndhost.rc | Bin 156500 -> 156908 bytes host/dxwndhost.vs2008.suo | Bin 235008 -> 241664 bytes host/dxwndhostDoc.cpp | 75 ---------------- host/dxwndhostView.cpp | 49 +++++++++- host/resource | Bin 56778 -> 57146 bytes proxy/d3d8.suo | Bin 8192 -> 8704 bytes proxy/d3d9.suo | Bin 8192 -> 8192 bytes proxy/ddraw.suo | Bin 8704 -> 8704 bytes proxy/init.cpp | 2 + proxy/wing32.suo | Bin 10240 -> 10240 bytes 29 files changed, 485 insertions(+), 302 deletions(-) delete mode 100644 host/dxwndhostDoc.cpp 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 30d26480bff2a7be51ad23a8f35da743984da606..515de0aab6d56d9d27002d587da250fce3f53b07 100644 GIT binary patch delta 48347 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 OkY*PN9mts?PyQcaZdr=} delta 5129 zcmb7|eOOdw8ph9aW*8BK21GE_ZPlx~NzAmfB<9nClH=`t;p4;^Dv z)n%Uhd`t1l8THr3?SFUSS1GHn-fd8e$L|dtPHJg3xs26azIv%bPcXb00i!(Ov~k**>T1LZjlKLOy;}yUhKn@F7&LQdL#EdeF<)DvjnpDE zGzr@IgSI|KeNVS?7obJG@m_x*>snZE?uL3C=G=hnhmJ!5$T&OQ6EYReQ19=WbCr}g zi?$otAA0(QS9_rV1wYFMYrH#=%4VQcCNgMHCDzRsJ-Ezny~ zEA%$>p{7!Z5_|LD{}|$W=aAc=i&9p3M7M@~fznxHYfjIuT*p$yobE;-Cr%G1^AnC9NO#mE~Rqnh?mlDhRt z>OTanV?FW+WPV&O^KGR-96vyKns&@XxM7M4sE2hg9TOzkh01TGyl&F|Ao^)=h4 z(0$RN_n^!VqCWdTPc}SGmnvRBAGj6_j-~!8 zaT)!BvOB-eEM7()a-Lg$WH@(>d9sL{j!{2gEq@sI`!8hf5SAN@+G6A=WG>$djg#a3 zz=EA*%`;U|8yp64%KZh!nt3ZI&(S#|BFi)_5hrtSFZ0E`&@B*0D#VNvwqMrNW=GQ)eysh(0+)6*E41}L%gnWG(*e=Ljj26 zEX0h5EYC!a%Mi1C=sSp`8vwH&P|GPbxGhZd%*@>NvM4S^UWhX%mk&Mk`=YGdibMhIJt<97+0AS?$g zTUf5J46xb4772R}tWenc1c5gJZh&XL6Cc(z+5HZss0&B2^3)%q7!{~Nam0CwS81iR z4Vzi{j?qOCnwE>9$5H6iRM{5ltFkvyn9AOZseWxUJwO(kvN+(rU*3v}YC{^(~Dt9%b(TYg@xQ;Sh#6v2lv!?45iib7zV;yCNJ_!Gl z=^f53Ud4}uPW>o@`dITe+_s3QJ4);_FHRjtQuUZ$Ex~8H2nYm@<`LYL7!pW%NsvkZ!zb6D)n=$ zs(CdOQ~3g=tA=VyG!rZ7g04!o(#D_N0FB~RyO%msOVO%sl^$s%#V4!c<8jp(YZU}E?){Ym294$UZa;)SyQq!Qg}eJOf5$$E5ksYFjVJXbxGAUo3%4C%yL za;w#=^@7d?KF%5s>R_opt8$CJL_Ob3nTJo1%k)+1%~Y|}*VsVCM4y_E`DwGW^R(cl zoK>5KwwigZR2|j$8eMXfJ%BOzcyw?9K=)||{B6ij3#)*C6rN+huw3{9@Z*tdZ0w-0 zLpF9;*mE}ays+A6EV#V#@CEAtIgUuhI`|iaH3{Q2`W5);$R};=Rbj8$ShKKzjlC}H zR41E;H!Ku5-W14B)gtUYVSN03VdsRc0BaK#(mmLMyt%mGhpL=g^r2AW(qse!FUsUSzuEK1bao;NgI0=o}*dV9q<8RZwupxc^{tN z*FF+f2>*`MyDlsbtR3FkM7v;1<`eISLV0^exP{#XA0_N|VSLhHVIzd`__#~hcwwbr z8N#Lr+X6OK*xVSITvopeTrL%v6$@J{Y$4b>VU;$fgw+bOCabX1Hui?FkA)FG|L;-Y z+4={8jqqosVsE@~aLW`yec(4BC)(J}!jgn7$ML@KdC18&)(@ToKLoAoZG=x@W;Lb2 zc_t^B7xjgOzCu1s2?Z+9F|vHnv#U5*zy^JjXI& zJdKNlJud7h*h*n*g{=fz2S171f4vQEu%M>>%EmSd`?atVoV*EsC-P<++XBzAO&A~l zjj&z9CWAc#&o7s|nQ{L!+#|5cR&lSeeKz*2uxcCI56@8}Y#01NVfDgzHoXMTU)*40 zS$=`XZ1A|SMjJDQov^W&;WgOJ%u|n{sKaqwx|Aa) 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 51ea7d40d95afb92adfb13a45d680e623158bc65..433abc9a832a392760986a1d73bfdda9e2e89315 100644 GIT binary patch delta 4553 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 PME|L5=4CpOVJZG6fhWaA delta 4180 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 delta 373 zcmXwz&nts*9LGQJJOt;Y;4v!q&?7=OFpCKZyU9%iIUh3%uZ&ai z>(k~qP=BSz6rghdiJvPXX#;j7pJp9S_g05^4PMdB3+ZMKm6Tk{h^$UH`{59;weaTl qEwIUwhg7lFhrZlL9oE5n*Nq%lRfNs2lSRgkai|+`AP0x8H1Y?;v4i6P diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index 985433c9a7c49342144e794dbb0aeebda0ea19f1..e26165634250905c2d9ffc12d67dbdc943f59ee0 100644 GIT binary patch delta 9405 zcmd5?dw7)9nVIc5dvChtruvJcm8OGkuWpQVx32e;S)MYynx<2~${k$j3c4yW-|enCSG8-5 zrl_H4;CP%Kt^{pUq77cQUgA$)!YpI-t=>yN*T&7ZMa|JDCp%i8eY?~e;I zC{?$_CbhQ5-b-GJ#1sSiR&T9~pGQ#?1MsSYds2biufG^Nhm!T-gd|;^u!Mh8rLwrG zn?~tf3Aqv2mNc%;plf|sGet)aE9PC@6y4fB>|UD#-i;WVxu$hP^0C2uW2%*}f0f|j z-*?kMTBtV#r^MIazH(J~QGH=$u&6RvT)Aw0QRUh-OLXe65i(J{?#NxI8}r%+^bIN) z$JMFU2p+KlJ1ol|-`buZ8W>@Jzo5{5g(VVOLzCRfqp-NQ@66uO_-IA&h9^{JYs+mx58$)OZa4aOvM=|P;bYC9!xOB|*1 z_H+vJ{-;$AJ;w)jt9iQWm3X?F50p8he9b?n0NueC(`owNc=G9~!_(;Rvg!Qhu_}^J zhN##+TFZH5A1&LNv1_Z9qay5+6!Fd*tZeqrrARqJkh>!A#l}oZX-mnZw5W*6V9C|0 zbA8w3h~SvY@#8BOx3%ZfW?#cL7{NoJ?I1Z{GoB3kA?Qb-he1CE?EpOj+6mePY60yA z?EyUsdJOav&|c6!&`&`>13eDjrwmJWt7UYxU67cds7X z^Bz9`9`ruw19`W#`d$u~T6w&`3?jQ^GdxQb(GPjI*BZn7U!)RRC)&4;FMR}!=n7Ma z!g^C&T=OKA)Rr`r&P5%l-bGu()y-}TKslXD)SU@wMhBxjV=LDzDQpX^ppd)I00+P< zgO!VKud7~E!|iuch!1;JvTd7#@T$bTTD7(r|h38c<`*%#pDBzlrB#-)RovbiFIB0bkZ>z3-nH_qjb z!IS`H+c?S+-HGMjuBJ?`7mcvzg*tkdXs$g?G2C>QiqYlW(X^;fY2DoP4&L}5!fto0rJxSS!rCuGdqauQJn09RYV#JV z<;T1hv@xtQxv^ffv7XKj)$_lI;l?e5C0Eh}x>rz(7d4aszpOrw@ z^XlQS-j+JLO^05IJ=8>bwoO*(rf?D&D819^8>N;8Xt~>5eC*OH+QV2Xx-kGMqjh-S66&Bi4T@J zy5eh&R{_$F`!bFsT_5_ah{L~8KAyT-rSW?Y(6qK?JL%zTblPW`yk`fk=k2qsLYaLa zH(gXdTYi=LaQ77U_mGbpC#V4D?SSN=usPg5%PP_>GvKtk-P|5ywa^E=soc6zS9}pm zgPgVfyOp@kbb6kjK1kI(?I2C%#+ND37C1zmL$sPOir97?4lCh@Z9U@9L2~O*sFvSu zrD6`YQi)?F!Czu!+mWuv#zyab6->CNJDpR?taKXUuyg+(!OpuxC&t<$=1`uM&YjP| z(jZ==vJ0P~G;TjmEBW9|Yc?mIh6e2UgDhW0@T7OCbb7`y#_$qVLI-5JG2EVv5u(G~ z^$Mngr_6!crEn;YVrT)E-bZ(}t$&y9AHv(xsZccb09~tmy+$$9O1G8d1n>HT%7=b< zMT@WFw=UCcIYJUwLmU|_IET6Gxmxnni~a!*4mbFOpRAj#QP6I zP2tLIeb3fMZmi+1k9v37gBWa2*+qdtx}s}12Wlz6p>DcQH||P=h&OEk&m`WlKM@-A zmj2*kDtFaUp2Lw+d*AFo-pitTzW5QX(?`2gnx|6IGfC<(ukOrEP}eT!A*a=Fy)btG z)o|$&HDzBYLMgpEA+9${#@WsY`N5)^Rcq@Ot+{>es YaAU42Z2Lu&D);Hdv9U&e zek+gu%)3ghak~Ahc#bZlG`d-&GmpzMRT7N@VY z3~n6kp)wu(ES8=YHJvN*H=e8fmXG)M;B`@=TE;Om#1;^Qg%#`ZpZajB3A}%H?e*Dq!rMmeJV zg)BbCQP&qlCC2iW@oIvTa)imsp*In>t}%OCpjsli=}x*9YL3h^mKU!>i0fDZe)Mvx zZCSN?*vnJvRk?76pTAk{#VQA$qY-`VR|9Q}4mPhN7&K(kehYl2ZJx*=ZI1HMeJY9H zzr*sk<=mm(il8js3Wo$Yo#1$j4bIuBzNRMWd*T-IsIMdbW1Z(|vWg}S*Qmu@Hyknw z)!GL-KPWqTr^7tO zqG5grI}hSeM{Mqi5jpJR&+BDj$yse9Y^sL$cUg+F>krP#+t-exD&UiJ@GG43XaibJPW3!RhI?&PV(a5AA5%wvac z|47-~AXvh89VUVSNlub<%n|$fXThPyC&bQPRA&?Pp8OP)9Pr_%Rl7cNQ?|#AGH3^H zIOjc){TfB9{bR}c~G%LGCM>$`3ZMEr}Efc3Jep3oSx$cQuEY# z7ten|JUX~iw(_5pRpNUMz0;sKK_^J(?T#Px7P|iilJekfPPVM4_qr{`Y6o%^J9Cbf z#AvRLE=zzTL&O{_3B8jTZL`nRd>SszP9k2G`fvs9)b!Tqy^)yZp1D>HpTB^N_S_{q z3iuvsw*vHTpRY^diY~Ysq*jGuVQEO)+`PqW#W&vx2Wp2gi5+bf1FikBtWK-z^o86s zPD`}{+?Z-j=b5QiJU8T12Es>=#~SCjonGE&iYtZu#MESm)+(1v_uRRP1EZ}NTwVOh zIS}kBX%K8E2`K(`3wA=s`pe(@*(jq61 zam(}BjFr8R{Tb4=YkkqEz1bqX=aB5$N%}Bx2B>>Xp_4#8eaGUio0SvP`R;Vf3EW?f z1Yf0S6IXBNz73MK7w{)rkmQL*wk^%Gc390h7DNS`9B(J}c6Ai`P+zfhnhu%)nhBZ(x&bsBGzU}$+6v;LvDOJ*oMYW>s)Ms|Z76iCNumb%%aLd}?mo*Z zadZ$;@b4|LB6)kRmE)AJP@ZgVX+cV`QXKtSTBJ*NP1ctm3D8JK;0T*ZcD*qg(K>_M z=UAbAp{W)%kFw%*ZEb8^-@ONfx6rwVaZTePGmsDT`KC4`EkVVdVHzc#I>FkCJ^m_j z6)D-HU4)9ihR6Igo~GLo2L2QgX0Zw=Ws>yvblB+ZOqD`E7OTBUcdU$o6Yed%26AJu zHOldu#*<|_deS8+U^VaDMLt??FNjzWlsfdv=(f;otDUI4H^uj{zZA1Au0t5`hrmHQ zb2}2UoB|b4$ToW%(Z@|FAHcc8sgwE0SfsL5a}iFvzzPiZ9fRElY@@-v z9_PE6z#`C>HpIbX_bykA0b|X;0I)cN4Kr8Vl3YLO7HEEa{Qh-n1qycrj7upqFZ=t~P4 ztU<(Ejt|1Nc?Og(7np&K{jg02`>DYK822-S9qWg^Y_Ky1OT)Oc26N$-RyHUYMYs^f z(BcKu7rz?A@LK&Y-FWX>Ya!#pB1ShA`Y6u1&$XkYUBy4?Bz^lIN7C1EgN17gx#n>a z*VU+=r%Bbdiq_zIG51itbv%Ni`|i=(E^V~l@J8U4&gDwN#oI!a-F9iSb#oNFPVX-z zZFO6$6BcwNfK3j?CZ&bU2}Itd23u$_;o_|ZYciM^!EW@2wN=jea9u4N^;=37`Mw;XdaxP(t( zEE!pYY;YtfMKTDq>kTH~oo2A*29t$r47Sc-GGD#H8oq1541nJ=;O>6d9)s;On4IpX z20Pzx+y#RThGokJWf8w)<*s;x30H?2EXlzd?2{xLaHJV1yG}RQ7=r^!DL(s`Xa;e z2Fpc15`Af929y3=gOwXhI6Ti_HyMmX|Bm8AC7v(!g6JPdUlx1KV7chujJ~wj4JI3Z z2mOV3zH6`m`X|k}zZgtR_G5!}8BDlz5q(+T^;tjgZ)V_^{jk3qtjA!&5t{{gxWNk9 zh_KotY(X1hFu_yNFU2#>V3Lf)m~prHTyyL%3s`Bujdc-(~{=fcQ=;LjLP8ES46O->tnOOsN z^zl%PR7^m4NqnkC6`&H4A92#ptmyd=pcyIuS|Bzw9ZVIzN}ECKFT*u0s=0dS{&|1C zm1A8%ux&W5_EEc&nAvxj9UoDEw&+cfQ*={g@P8p(@11h$uHKu?5l@bO|NFA0Bl|1= z%CZRm(t_Wt?HdY|pZ}L1M6DXvQogu_3jWi7%Pi78D^hWvAxXx74n*2I*@#qnE0DJw zqjXOyI5M#>Jscp>dd-zFxE->ymysBiZnBq?7;=Y`y_CqrSt`?cGvIf4Gs@wx-t=jP zCw0~?cFEjB^^9S8PLg70xqp-kv0?g?ucSh}>bBlJEc(J?l!`@i9UnV+h_e-!R3|dA rkR%9F+ohY&Qbs0%q)h`k8-Tbu|6A5j`KD`mKe$E!v^Dmjp%?!FGQ2-! delta 5903 zcmb_g4Rn;%nf~5;XYywlCUFRpFosD8A!I``Onyj0gh}L2L>Lf+wH3mT2$Y`?!cT3H z!D6@Dtuf?=d0QJGV2!TzXfO+-s5nr&0#zDaK)0vsrpVDA>!CqIw`&FVx%Ugf_3Syj zXHSPSWagXu-Fx5XectDNz8mRvMV@oDged(`?UOQXyJcC+@cu5|ZFs+}uE?z}_d8!4 z`k3D(i7WBZ>LJHzXC_(JEu7OTb5y{Qq9RF-?rqLl(m4Y|rl><#N>uQz3_ZR(EqMY_ z(%?`IeM2~Ce)qRiPRj(kj#uj7Z>q@^P7=6DU*?Wdk&DR_RKIJE`bElk)iiWY0y*$= z%FR3ahqhHL$EAnxF2eimpO>Zo@!F;9g#EpO@4v!(=+~}$@qMh-ea!uRDYp#nwov`d z<0I;R&GUWYU+faW?#&sqNiXco!413Ae-6Kke0-pUd}^t8x!O>Yq1>4Po|7ZpswFeu zi9wddIY-4r&RtEJJocOzt~yGF$iI28x;vivJ%sDWu7(b7KH=|i!;B5x58d|9L)o1p zvl1R$ySb?}sM2cubf4N8n5_OX?ol3jP9&=7C1om799Q2dnaY9nBl5dDCjD%-`Q0=4yJ~tY>`cd) z>cLCh{f~t+>3a9nr(f}_+uVD3ie0*##m2uxNk#X=(2^`!@*__uTgWT0l zHQbgdD!AuP>EYgX;iUyUw{qal@LL}G6(*t*?x+^o+_hO|sE%n4?(HTAJ7&q67q4w| zIIjV)r+B-d;f@%9i2Yd5id!7|YNv}5Zb?S!G&K_}OI=_0Jxb=u9im*X?c&H|$n19B z?V;uNj?UytFE@B7Pj4&8^=*{WnSp`JJmg`whcavs8>UIWO1&$KZe?o3WPO#wt3p>Z z_>HZihI^`nD|(Ky=r8tCnA8>hIaXT3mpya`NAf8P!p~>&sKVZxKTlTZWYGgA z2i!11csX241-#3LkRCpZPxYnJMVmFWIc>rh^VQMCWIpIaHoqG}a!yyv3T}8$58OjZ z^n@Ko%Xx(F-h&+d6VqrQ_HHB1=ANPC6&9)be!rP&HeJkemM>{s9^}Y6nivbMrjSFW z6;E_lE?M?K6UWz4NX;$w^Ea-NKNea~aZ+`syxcO3Qn;gm@>OI+BT2pYQtnF?S$gkz zwBOKz!{^B4CxPAf$_%>7+Y4j~N4&zr&o@#&Cp6M3{>?w&Q_BM3=Ji2YpgKNJh&F;S zCVUe_%Qlh3k&O_Ax(*wXEY;QT;hrW6a6D7^INU^jR7f!T2f*QeLZs7kn%yNFZvzn` z%YgW+k7IDdOCpcMg_On5|5>C19WV#X@)=n8lV%F2$jJomn;_jBIIM4-qjSH7E)3_^ z&H8)uz|OEzP^XR4n^7x)_fZu7BI%%yb(X$0NXH7!Z;}D-9W7l)TBsONHB*omhh!ml zRf-ha$h+I{U(*4^h0JHEj*}VmuQqt~RY-8}P-OHS4evNrm+z1Hqtxr<6I(>Fa}}y2 zm5+M`!pww(hqJPrOK`1`kGF|A94Qld^pE<^yCErgbd+~zg8QfupGGfj2!`&nR#?^6 zH?6SMXl>xyjbar4_J=ejwsIdmaVvk;O;J9pLGF5u%4i$!Y`#(3sJR5yvpR!DaP2f% z&ha8d)X_od>^KExcU4FmQ-aPl;rE^dS!MtdY;oTuKxWfZr|KmgL%HTkwO(x|YB5{m z8(wQjb zu6$9fIW=?-;$1lq?-XlW?D{DJg%7riI&NMrvgi=c)ljyK1|1A`hxG(n6ulfek1auB zX7D~Qcp5&BJ0q8DRhwxuKAkU*LZA(QfJV;uiXu%UkYp0S;YDtHf&irJ6U_42B`9>X zN(4B34Fy{FC~b>vd!K%g#-d2((pftSEuba}mnI1CTP=Jl{DqH-bwW$I<2u#Z%Y;v* zbJr=oAD!FL7NyRLcBX%g0$xX7^@DB>F&s-rHI|O@j_@B`sDv za&uz-KJpKt$F z(qKX;2QB2CKCyw@szgw?Id-4K-XcEX(6u*P7le?+J$pqlyDLSrZYmJ17i0$amSfO~ zz39cJtJRl7TqZsF>d%2`cJjL-UaLJT1O1I3Uhr4{b6YdpR$;+(<{IjeM zd&3PLpw%@)CdF1{i}qo(f+gn`Ou*@kL?=_fmHq<*YJ^vSS!46fKu;r&cXpG*nb$MsD+FD z3o&!B3fz>i%0}=IW#dRq6=U$qj!zp33F)vSB050sh zL>bXK^h95cxHz2a+5rW6f+2x}K38*3mb2;G+CT8TRiab(jbdBr+H`|nZp$Y)AD}UV zYvyrJ5qafgl>3fh_jBPU%-i)Q;tidJM83vLo5TZ07KwP0`kgmZz2P0hVh`z#;NZ{! z5s0l^DxOHVrP#WWhr8?!0fXh?P!l$8a6`ke3vVJX-75CjT*-s3)o&fZXP~gntmr{o z(0)#=kwvkhHR5a{f4W7~XgT)VE#;9dC=A0w1L)tXoKr@v)A`yDK%Dz+rAHxE-t;2u zY6oZP_K6j|q6zV3Uq-7k^*c+G_-;+7T+>JpoJWK1r>709p+4x2Zc2Y{$9)Fm@P2H? z(Fh4b5At%~J~874BxN?Mk-1#EXRg*|S=G4>ShPM)h4gm=r8P#B(NFky-L!{Ok76&L zm&Ho0)I~b7Vp|Q}F9RNP4fKElR$|5QQDCDD2Zvq~4z;Y`T*_AAiRpa)fGFgKs4U=) zS1`&ncK<85$rw4^KXgq}<$#Yk3V`N)D2k$+QQA-w2fg~WGNQ+|Tbt8)5Jee3ATpd0 z)LJ|5JSlc_{5*sM8fDh^>TZY$IB*dR>I)AvF8U8GS`+N5u5U(i=Gn|1q&tTvkcaNn z4bSeV&cVhtU~*cP3$GyJgBQiKa;>$3uRkN8r>}|&-e``T#G!K{u3o%S%$H_BKTJV) zTm)`6)y3|stK6J&Ni(}vrmBbc`zTj;1=Aw6Z%r3pnkHIon;+wM>UrlS8pgqk2vS=} z9b|0%`=T{jz59G+^cm@=+wJXMy95Xg7&pezZ|q3H{S?i%pq8$nz520xiqUk941isg zI>kY)8t^aBE;`N|51@DJnT&LuNt8*tkhI8}tIKT5FDA=(qIMUWZFXB}l zS3SncWb^BnMXfqEq71u$c{8)R_QbLC_xbiw^d!yH!gY^wkMYWXF;52@*gsaL4X+u;V9W6aaJ`)$+=2?S(FJvXpm-4yY4P~7UDOlvfMeFAr z)CbJe7Y_dMHn@{#HEMG>fJX*HJm*K4(O4`!W1Y=;ts2@SWWoC&54UzEVZypHF$v8_ z_|V7<29W$o+&4-(@OW3Gy(rp{HbB$ucG(lc?t5z}g{IknqhgB<>p4&=C&kvJ%BV+O z_KxKHbL1#A9>$ZKKQLWH8>9<3KPG%#;S^QZM3@tX4%kfh51xKk|Z#O-7oHDz7(VGgnEeJdf zFox79daAM)MXw$(3Oji21i6lzs>Mvxrcq+jp%ik7>9mys4@lzTHp2K|zM zy;+Xup7(SEuf@ouD9TN9WAJz(*ZvA%;l}iX(i9L3p1)xw2AK;n&A5_*)`8A$RB@(k zCBASLP~ZWgz+QJi!Lm5cSnB2~#g(vo20|~t5S6tYIVn0R&X+ggFrm+by_usC(`ymf z&4UQ|&cDj}!)kTmayI|(hXyG}=E;cjYsV*>ITDbd#3JcW9lF(83InNaYW2ay|8Vj!@O1zGI&dJ1_iwU|WFf!WKsd+zD;yel^@+w; zT}J07c^|iW;AlVSgmM})3x;NMq*E5zd4i;x=P33+BNKN_wZ>buR=IVDRbh>@>a0?H zuEM7>YbxI3@u><|E35!MmEvE8`8{X_aYqn$>QDM4cYM&YhFOus7o<_D@n2P{f77RZ zR?nY$^dJ2)-_56F^S@h|w1LW+KkJZXEW;`nStpCnQ>4$exe5)$2k zC)326W15=fTaq7HfGGdl=?NGdV6g@|{7I|4*XS1qwgCp+wns#s{LwzWxIU~hM{U+% zo%8V~d7Bos#3LB6*n){sa*8>g-GgJTMzu3(GER$Alk~m%WuG6nBn4DUQvUz(YWjZx DUbByy 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 06fd13d2c86668963f549d8c50522682eaf88bd2..1b226ba205d6d0a0517af89324d36cf78807fa02 100644 GIT binary patch delta 138 zcmX@Ln|aqh<_$u%ll5ltu?91QFhov1D6TsBUCkYFe}*sySB4-49|lK;03dW_Z~@AD vOuksGI(b!XjVum%22TcO2Jgv?0@9P?>ewc8)XCvAX`_ZBNX=%BxPOmqLq)M)iftpN6cLKhVq2jgS~Ox?Bh9%N zp>y`&K@hyCdl1D#!QQk7^&Vv|p%=t{K3PyN%(Bw+lywKJb>&bec!YT3Wo(8n zI@Are&G&e0!!q3E@O#Buc9sYC!*Is+X{8YJ&FiC+9tYO7kZe}bNO%$R^n?$0brBOObSMXk@%XEY0sSl8p(=^YPl?fw~X6QEE zqB-|W?3GeYcc*(zscXEF7~kC931Ohnli%R(#QDSQ4r z#yJ8E0eQNQZgTm8UM!U{zceSUgx`O^Or8=ng-Y&7hqORFbPly#rv-i#j&G#Sn{v9X z;c+wG%U5G5+|?j&h73CZr<_MCAdrLcnkUT(-b%em|GP~hCI5r&kNQ6bMD+DYrU$A1 qUNq4~bgIy9&QoV4vhwpqphZA^#xLQ$p6vuHSH`IGL?-@hZ0UPVAniKBf z+~>s`Xo{i;69;Td2V%xW{H`tI5A&f!-4gcsJ4-Ck*IUKZEAjiQMG{BX-F>(*RzYhj zYxq%drJp$h9e`#|Y7v?{cA7(~^x-R8z#zlqarPOwPQ+YF6w?IRZ4J-z0(XsdNdWLf zl1=8iL(C}!2L;+yrQS+VK0_VDabX)D?FRN8-{OQ!l4x(rlA$wF|JTEp*$Q6PENn0n zM~0BXy#+XsKAC{l7gi~zMEIsE_t delta 183 zcmZp0XmHrz!@|frS&>DatwB0i;{BA#MJ(4iBp4VN{sY0}i!3UeOIQyvGaE8kY_{a& zV&Y|FhRVU@CpU1iY_8xw!^p!1l;K0tIoUxFD8qY(g$JaT8(F4A$e)*y2`IvYEc!(# dVDb@OgUuzv4iFo+i%n$b;6hTexkRpq5de(FV24p(_O3HI@WiG;*2=?5eCLz9$ZU(cBAPA7EQ6oenE|dhExIv524ne;v zbc0%b48H3*CN2>B-+!Dm>t_90A|!NO%I1_lN$u#zu){>*HQ|A9aNA}tia!4H%LiA?rW)0q54C}8ptA%n>! z!U3!tKnXsGHem-AZlK8w@eIWbMGVQ48|C#k=Sf^;oP3zYaB_*1KO2K2P_Z!B%r8;_ itRg_37{mtY01hD}8#aHDKF`6%CuEGe1yed z^A}+U7H*(P4Dk%b3`GpdlN;srH|I%QWn^RI0V?K)D31S#13MTLhM0DgEoRsaA1