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