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

v2_04_20_src

This commit is contained in:
gho tik 2017-03-25 09:59:46 -04:00 committed by Refael Ackermann
parent 6c06d0dac5
commit b5e4788f9b
29 changed files with 485 additions and 302 deletions

View File

@ -283,6 +283,8 @@
#define HOOKDLGWIN 0x80000000 // Hook dialog WindowProc #define HOOKDLGWIN 0x80000000 // Hook dialog WindowProc
// 9th flags DWORD dxw.dwFlags9: // 9th flags DWORD dxw.dwFlags9:
#define FIXTHINFRAME 0x00000001 // Fix window style like OVERLAPPEDWINDOW but with thin border
// 10th flags DWORD dxw.dwFlags10: // 10th flags DWORD dxw.dwFlags10:
// logging Tflags DWORD: // logging Tflags DWORD:

View File

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

View File

@ -1054,6 +1054,12 @@ HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreateSurface
dxwss.PushZBufferSurface(*lplpdds, dxversion, lpddsd->ddsCaps.dwCaps); dxwss.PushZBufferSurface(*lplpdds, dxversion, lpddsd->ddsCaps.dwCaps);
OutTraceDW("CreateSurface: ZBufferSize=%d\n", ZBufferSize); 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; return res;

View File

@ -541,10 +541,8 @@ static DWORD GetFlipWaitFlags(DWORD dwFlipFlags)
static DWORD SetPrimaryCaps(DWORD dwCaps) 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_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 dwCaps &= ~(DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); // primary surfaces can't be this way
if(dwCaps & DDSCAPS_3DDEVICE) dwCaps |= DDSCAPS_LOCALVIDMEM;
return dwCaps; 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 // 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_BACKBUFFER|DDSCAPS_VIDEOMEMORY|DDSCAPS_FLIP|DDSCAPS_LOCALVIDMEM); // you never know....
dwCaps &= ~(DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); // backbuffer surfaces can't be this way 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; return dwCaps;
} }
@ -2336,7 +2332,7 @@ HRESULT WINAPI extSetCooperativeLevel(int dxversion, SetCooperativeLevel_Type pS
if(bFixFrame){ if(bFixFrame){
AdjustWindowFrame(hwnd, dxw.GetScreenWidth(), dxw.GetScreenHeight()); 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(); GetHookInfo()->IsFullScreen=dxw.IsFullScreen();
@ -2563,19 +2559,12 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet
return DD_OK; return DD_OK;
} }
} }
// arguable utility ....
// commented out: causes "Arx Fatalis" crash assigning ZBUFFER to the wrong surface? // Warning: AVOID simulating a ZBUFFER attach to any surface that has not it really attached
// would that be necessary on some game? // otherwise the program steps over but crashes afterwards, as soon as it tries to use the ZBUFFER.
//if(dxw.dwFlags6 & SETZBUFFERBITDEPTHS){ // Better return the error (most programs overcome the problem) or change caps policy so that the
// if (lpDDZBuffer && (lpddsc->dwCaps & DDSCAPS_ZBUFFER)){ // ZBUFFER becomes attached.
// *lplpddas = lpDDZBuffer; // Ref: "Arx Fatalis", "TOCA Touring Car Championship"
// 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;
// }
//}
OutTraceE("GetAttachedSurface(%d): ERROR res=%x(%s) at %d\n", dxversion, res, ExplainDDError(res), __LINE__); 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); OutTraceDW("GetAttachedSurface(%d): ZBUFFER caps=%x(%s) (%s)\n", dxversion, dwCaps, ExplainDDSCaps(dwCaps), sMode);
} }
} }
return res; 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) static HRESULT WINAPI extGetCapsS(int dxInterface, GetCapsS_Type pGetCapsS, LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS caps)
{ {
HRESULT res; HRESULT res;
BOOL IsPrim, IsBack, IsZBuf, IsFixed; BOOL IsFixed=FALSE;
IsPrim=dxwss.IsAPrimarySurface(lpdds); int role;
IsBack=dxwss.IsABackBufferSurface(lpdds); SurfaceDB_Type *ps;
IsFixed=FALSE;
char *sLabel; char *sLabel;
sLabel = ""; ps = dxwss.GetSurface(lpdds);
if(IsPrim) sLabel="(PRIM)";
if(IsBack) sLabel="(BACK)";
// 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); res=(*pGetCapsS)(lpdds, caps);
if(res) 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 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); sLabel="";
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 (caps->dwCaps & DDSCAPS_ZBUFFER) {
sLabel="(ZBUF)";
role = SURFACE_ROLE_ZBUFFER;
}
}
if(!(dxw.IsEmulated || dxw.Windowize)) return res; if(!(dxw.IsEmulated || dxw.Windowize)) return res;
while(TRUE){ // fake loop switch(role) {
if (IsPrim) { case SURFACE_ROLE_PRIMARY:
IsFixed=TRUE; IsFixed=TRUE;
caps->dwCaps = SetPrimaryCaps(caps->dwCaps); caps->dwCaps = SetPrimaryCaps(dxwss.GetCaps(lpdds));
break; break;
} case SURFACE_ROLE_BACKBUFFER:
if (IsBack) {
IsFixed=TRUE; IsFixed=TRUE;
caps->dwCaps = SetBackBufferCaps(caps->dwCaps); caps->dwCaps = SetBackBufferCaps(dxwss.GetCaps(lpdds));
break; break;
} case SURFACE_ROLE_ZBUFFER:
if (IsZBuf) {
IsFixed=TRUE; IsFixed=TRUE;
caps->dwCaps = SetZBufferCaps(dxwss.GetCaps(lpdds)); caps->dwCaps = SetZBufferCaps(dxwss.GetCaps(lpdds));
break; break;
} case SURFACE_ROLE_3DREF:
break; // inconditional break; 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)); 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) static HRESULT WINAPI extGetSurfaceDesc(int dxversion, GetSurfaceDesc_Type pGetSurfaceDesc, LPDIRECTDRAWSURFACE lpdds, LPDDSURFACEDESC lpddsd)
{ {
HRESULT res; HRESULT res;
BOOL IsPrim, IsBack, IsZBuf, IsFixed; BOOL IsFixed = FALSE;
IsPrim=dxwss.IsAPrimarySurface(lpdds); SurfaceDB_Type *ps;
IsBack=dxwss.IsABackBufferSurface(lpdds); int role;
IsFixed=FALSE;
char *sLabel; char *sLabel;
if (!pGetSurfaceDesc) { if (!pGetSurfaceDesc) {
@ -4894,6 +4895,8 @@ static HRESULT WINAPI extGetSurfaceDesc(int dxversion, GetSurfaceDesc_Type pGetS
return DDERR_INVALIDPARAMS; return DDERR_INVALIDPARAMS;
} }
ps = dxwss.GetSurface(lpdds);
int prevsize = lpddsd->dwSize; int prevsize = lpddsd->dwSize;
switch(dxversion){ switch(dxversion){
case 1: 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)); OutTraceE("GetSurfaceDesc(%d): ERROR err=%x(%s)\n", dxversion, res, ExplainDDError(res));
return res; return res;
} }
IsZBuf=(lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER);
sLabel=""; sLabel="";
if(IsPrim) sLabel="(PRIM)"; role = SURFACE_ROLE_UNKNOWN;
if(IsBack) sLabel="(BACK)"; if (ps) {
if(IsZBuf) sLabel="(ZBUFFER)"; 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__)); OutTraceDDRAW("GetSurfaceDesc(%d): lpdds=%x%s %s\n", dxversion, lpdds, sLabel, LogSurfaceAttributes((LPDDSURFACEDESC2)lpddsd, "GetSurfaceDesc", __LINE__));
if(!(dxw.IsEmulated || dxw.Windowize)) return res; if(!(dxw.IsEmulated || dxw.Windowize)) return res;
while(TRUE){ // fake loop switch(role) {
if (IsPrim) { case SURFACE_ROLE_PRIMARY:
IsFixed=TRUE; IsFixed=TRUE;
if (dxw.dwFlags1 & EMULATESURFACE) lpddsd->ddpfPixelFormat = dxw.VirtualPixelFormat; //if (dxw.dwFlags1 & EMULATESURFACE) lpddsd->ddpfPixelFormat = dxw.VirtualPixelFormat;
lpddsd->ddsCaps.dwCaps = SetPrimaryCaps(lpddsd->ddsCaps.dwCaps); lpddsd->ddsCaps.dwCaps = SetPrimaryCaps(dxwss.GetCaps(lpdds));
lpddsd->dwBackBufferCount=DDSD_Prim.dwBackBufferCount; lpddsd->dwBackBufferCount=DDSD_Prim.dwBackBufferCount;
lpddsd->dwHeight=dxw.GetScreenHeight(); lpddsd->dwHeight=dxw.GetScreenHeight();
lpddsd->dwWidth=dxw.GetScreenWidth(); lpddsd->dwWidth=dxw.GetScreenWidth();
break; break;
} case SURFACE_ROLE_BACKBUFFER:
if (IsBack) {
IsFixed=TRUE; 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; break;
} case SURFACE_ROLE_ZBUFFER:
if (IsZBuf) {
IsFixed=TRUE; IsFixed=TRUE;
lpddsd->ddsCaps.dwCaps = SetZBufferCaps(dxwss.GetCaps(lpdds)); lpddsd->ddsCaps.dwCaps = SetZBufferCaps(dxwss.GetCaps(lpdds));
break; break;
} case SURFACE_ROLE_3DREF:
break; // inconditional break IsFixed=TRUE;
lpddsd->ddsCaps.dwCaps = dxwss.GetCaps(lpdds);
break;
} }
if(IsFixed){ if(IsFixed){

View File

@ -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.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.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=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"); 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. // update window styles: just this window or, when FIXPARENTWIN is set, the father one as well.
if (hwnd && dxw.Windowize && dxw.IsFullScreen()) { 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); AdjustWindowPos(dxw.hChildWnd, target->sizx, target->sizy);
if(dxw.dwFlags1 & FIXPARENTWIN) { 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); AdjustWindowPos(dxw.hParentWnd, target->sizx, target->sizy);
} }
} }

View File

@ -94,6 +94,8 @@ void dxwCore::InitTarget(TARGETMAP *target)
dwFlags6 = target->flags6; dwFlags6 = target->flags6;
dwFlags7 = target->flags7; dwFlags7 = target->flags7;
dwFlags8 = target->flags8; dwFlags8 = target->flags8;
dwFlags9 = target->flags9;
dwFlags10= target->flags10;
dwTFlags = target->tflags; dwTFlags = target->tflags;
Windowize = (dwFlags2 & WINDOWIZE) ? TRUE : FALSE; Windowize = (dwFlags2 & WINDOWIZE) ? TRUE : FALSE;
IsVisible = TRUE; IsVisible = TRUE;
@ -1256,7 +1258,10 @@ void dxwCore::FixStyle(char *ApiName, HWND hwnd, WPARAM wParam, LPARAM lParam)
OutTraceDW("%s: new Style=%x(%s)\n", OutTraceDW("%s: new Style=%x(%s)\n",
ApiName, lpSS->styleNew, ExplainStyle(lpSS->styleNew)); ApiName, lpSS->styleNew, ExplainStyle(lpSS->styleNew));
if (dxw.dwFlags1 & FIXWINFRAME){ // set canonical style 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 if (dxw.dwFlags1 & LOCKWINSTYLE){ // set to current value
lpSS->styleNew= (*pGetWindowLong)(hwnd, GWL_STYLE); lpSS->styleNew= (*pGetWindowLong)(hwnd, GWL_STYLE);

View File

@ -4,6 +4,13 @@
#define DDSQLEN 0x20 #define DDSQLEN 0x20
#define MAXFONTS 0x40 #define MAXFONTS 0x40
#define WS_OVERLAPPEDTHIN (WS_OVERLAPPED | \
WS_CAPTION | \
WS_SYSMENU | \
WS_THICKFRAME | \
WS_MINIMIZEBOX | \
WS_MAXIMIZEBOX)
typedef struct { typedef struct {
DWORD dwTimerType; DWORD dwTimerType;
union{ union{
@ -40,7 +47,9 @@ typedef struct {
typedef enum { typedef enum {
SURFACE_ROLE_PRIMARY = 0, SURFACE_ROLE_PRIMARY = 0,
SURFACE_ROLE_BACKBUFFER, SURFACE_ROLE_BACKBUFFER,
SURFACE_ROLE_ZBUFFER SURFACE_ROLE_ZBUFFER,
SURFACE_ROLE_3DREF,
SURFACE_ROLE_UNKNOWN
} Enum_Surface_Role_Type; } Enum_Surface_Role_Type;
typedef struct { typedef struct {
@ -259,15 +268,21 @@ public:
LPDIRECTDRAWSURFACE GetZBufferSurface(void); LPDIRECTDRAWSURFACE GetZBufferSurface(void);
void PushZBufferSurface(LPDIRECTDRAWSURFACE, int, DWORD); void PushZBufferSurface(LPDIRECTDRAWSURFACE, int, DWORD);
BOOL IsAZBufferSurface(LPDIRECTDRAWSURFACE); BOOL IsAZBufferSurface(LPDIRECTDRAWSURFACE);
LPDIRECTDRAWSURFACE GetBackBufferSurface(void); void PopSurface(LPDIRECTDRAWSURFACE); LPDIRECTDRAWSURFACE GetBackBufferSurface(void);
void DuplicateSurface(LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE, int); void Push3DRefSurface(LPDIRECTDRAWSURFACE, int, DWORD);
BOOL IsA3DRefSurface(LPDIRECTDRAWSURFACE);
LPDIRECTDRAWSURFACE Get3DRefBufferSurface(void);
void PopSurface(LPDIRECTDRAWSURFACE);
DWORD DuplicateSurface(LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE, int);
DWORD GetCaps(LPDIRECTDRAWSURFACE); DWORD GetCaps(LPDIRECTDRAWSURFACE);
SurfaceDB_Type *GetSurface(LPDIRECTDRAWSURFACE);
protected: protected:
SurfaceDB_Type SurfaceDB[DDSQLEN+1]; SurfaceDB_Type SurfaceDB[DDSQLEN+1];
LPDIRECTDRAWSURFACE lpDDSPrimary; LPDIRECTDRAWSURFACE lpDDSPrimary;
LPDIRECTDRAWSURFACE lpDDSBackBuffer; LPDIRECTDRAWSURFACE lpDDSBackBuffer;
LPDIRECTDRAWSURFACE lpDDSZBuffer; LPDIRECTDRAWSURFACE lpDDSZBuffer;
LPDIRECTDRAWSURFACE lpDDS3DRef;
private: private:
void PushSurface(LPDIRECTDRAWSURFACE, USHORT, USHORT, DWORD); void PushSurface(LPDIRECTDRAWSURFACE, USHORT, USHORT, DWORD);

View File

@ -27,7 +27,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "TlHelp32.h" #include "TlHelp32.h"
#define VERSION "2.04.19.fx1" #define VERSION "2.04.20"
#define DDTHREADLOCK 1 #define DDTHREADLOCK 1
@ -286,7 +286,7 @@ void InjectHook()
} }
} }
static char *FlagNames[9][32] ={{ static char *FlagNames[11][32] ={{
// Flags1 // Flags1
"UNNOTIFY", "EMULATESURFACE", "CLIPCURSOR", "NEEDADMINCAPS", "UNNOTIFY", "EMULATESURFACE", "CLIPCURSOR", "NEEDADMINCAPS",
"HOOKDI", "MODIFYMOUSE", "HANDLEEXCEPTIONS", "SAVELOAD", "HOOKDI", "MODIFYMOUSE", "HANDLEEXCEPTIONS", "SAVELOAD",
@ -367,6 +367,24 @@ static char *FlagNames[9][32] ={{
"BACKGROUNDPRIORITY", "OFFSCREENZBUFFER", "VIRTUALHEAP", "ZBUFFERHARDCLEAN", "BACKGROUNDPRIORITY", "OFFSCREENZBUFFER", "VIRTUALHEAP", "ZBUFFERHARDCLEAN",
"LOADLIBRARYERR", "SHAREDDCHYBRID", "FIXADJUSTWINRECT", "HOOKDLGWIN", "LOADLIBRARYERR", "SHAREDDCHYBRID", "FIXADJUSTWINRECT", "HOOKDLGWIN",
},{ },{
// Flags9
"FIXTHINFRAME", "", "", "",
"", "", "", "",
"", "", "", "",
"", "", "", "",
"", "", "", "",
"", "", "", "",
"", "", "", "",
"", "", "", "", },{
// Flags10
"", "", "", "",
"", "", "", "",
"", "", "", "",
"", "", "", "",
"", "", "", "",
"", "", "", "",
"", "", "", "",
"", "", "", "", },{
// TFlags // TFlags
"OUTTRACE", "OUTDDRAWTRACE", "OUTWINMESSAGES", "OUTCURSORTRACE", "OUTTRACE", "OUTDDRAWTRACE", "OUTWINMESSAGES", "OUTCURSORTRACE",
"OUTSEPARATED", "**", "ASSERTDIALOG", "OUTIMPORTTABLE", "OUTSEPARATED", "**", "ASSERTDIALOG", "OUTIMPORTTABLE",
@ -382,7 +400,7 @@ LPCSTR GetFlagCaption(int flag, int bit)
{ {
//if((flag<0) || (flag>(9*32))) return ""; //if((flag<0) || (flag>(9*32))) return "";
//return FlagNames[flag >> 5][flag & 0x1F]; //return FlagNames[flag >> 5][flag & 0x1F];
if((flag<0) || (flag>8)) return ""; if((flag<0) || (flag>10)) return "";
if((bit<0) || (bit>31)) return ""; if((bit<0) || (bit>31)) return "";
return FlagNames[flag][bit]; return FlagNames[flag][bit];
} }

Binary file not shown.

View File

@ -8,8 +8,8 @@
#include "dxwnd.h" #include "dxwnd.h"
#include "dxwcore.hpp" #include "dxwcore.hpp"
//#define DXW_SURFACE_STACK_TRACING #define DXW_SURFACE_STACK_TRACING
//#define OutTraceSDB OutTrace #define OutTraceSDB OutTrace
dxwSStack::dxwSStack() dxwSStack::dxwSStack()
{ {
@ -17,6 +17,7 @@ dxwSStack::dxwSStack()
lpDDSPrimary = NULL; lpDDSPrimary = NULL;
lpDDSBackBuffer = NULL; lpDDSBackBuffer = NULL;
lpDDSZBuffer = NULL; lpDDSZBuffer = NULL;
lpDDS3DRef = NULL;
memset(SurfaceDB, 0, sizeof(SurfaceDB)); memset(SurfaceDB, 0, sizeof(SurfaceDB));
} }
@ -31,6 +32,7 @@ static char *sRole(USHORT role)
case SURFACE_ROLE_PRIMARY: s="(PRIM)"; break; case SURFACE_ROLE_PRIMARY: s="(PRIM)"; break;
case SURFACE_ROLE_BACKBUFFER: s="(BACK)"; break; case SURFACE_ROLE_BACKBUFFER: s="(BACK)"; break;
case SURFACE_ROLE_ZBUFFER: s="(ZBUF)"; break; case SURFACE_ROLE_ZBUFFER: s="(ZBUF)"; break;
case SURFACE_ROLE_3DREF: s="(3DREF)"; break;
default: s="??"; break; // should never happen ... default: s="??"; break; // should never happen ...
} }
return s; return s;
@ -43,10 +45,12 @@ static void CheckSurfaceList(SurfaceDB_Type *SurfaceDB)
char sMsg[81]; char sMsg[81];
int iPCount = 0; int iPCount = 0;
int iBCount = 0; int iBCount = 0;
int iZCount = 0;
for (int i=0;i<DDSQLEN;i++) { for (int i=0;i<DDSQLEN;i++) {
if (SurfaceDB[i].lpdds == NULL) break; if (SurfaceDB[i].lpdds == NULL) break;
if ((SurfaceDB[i].uRole == SURFACE_ROLE_PRIMARY) && SurfaceDB[i].uRef) iPCount++; if ((SurfaceDB[i].uRole == SURFACE_ROLE_PRIMARY) && SurfaceDB[i].uRef) iPCount++;
if ((SurfaceDB[i].uRole == SURFACE_ROLE_BACKBUFFER) && SurfaceDB[i].uRef) iBCount++; if ((SurfaceDB[i].uRole == SURFACE_ROLE_BACKBUFFER) && SurfaceDB[i].uRef) iBCount++;
if ((SurfaceDB[i].uRole == SURFACE_ROLE_ZBUFFER) && SurfaceDB[i].uRef) iZCount++;
} }
if(iPCount > 1) { if(iPCount > 1) {
sprintf(sMsg, "Primary count = %d", iPCount); sprintf(sMsg, "Primary count = %d", iPCount);
@ -56,6 +60,10 @@ static void CheckSurfaceList(SurfaceDB_Type *SurfaceDB)
sprintf(sMsg, "Backbuffer count = %d", iPCount); sprintf(sMsg, "Backbuffer count = %d", iPCount);
MessageBox(0, sMsg, "DxWnd SurfaceList", MB_OK | MB_ICONEXCLAMATION); 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) static void DumpSurfaceList(SurfaceDB_Type *SurfaceDB)
@ -87,53 +95,33 @@ char *dxwSStack::ExplainSurfaceRole(LPDIRECTDRAWSURFACE ps)
void dxwSStack::ClearSurfaceList() void dxwSStack::ClearSurfaceList()
{ {
#ifdef DXW_SURFACE_STACK_TRACING #ifdef DXW_SURFACE_STACK_TRACING
OutTrace(">>> SURFACELIST CLEAR ALL\n"); OutTrace(">>> SURFACELIST CLEAR UNREF\n");
#endif #endif
// v2.03.91.fx5: emptying the list entirely is no good for "Warhammer 40K Rites of War" // 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. // better leave the last used primary and backbuffer surfaces.
int i; int i, j;
SurfaceDB_Type LastEntries[3]; SurfaceDB_Type NewEntries[DDSQLEN];
LastEntries[0].lpdds = 0;
LastEntries[1].lpdds = 0;
LastEntries[2].lpdds = 0;
lpDDSPrimary = NULL; lpDDSPrimary = NULL;
lpDDSBackBuffer = NULL; lpDDSBackBuffer = NULL;
lpDDSZBuffer = NULL; lpDDSZBuffer = NULL;
// search for last (more recent) entries and copy to safe place lpDDS3DRef = NULL;
for (i=0;i<DDSQLEN;i++) { // search for valid entries and copy to safe place
for (i=0, j=0; i<DDSQLEN; i++) {
if(SurfaceDB[i].lpdds == NULL) break; if(SurfaceDB[i].lpdds == NULL) break;
LastEntries[SurfaceDB[i].uRole]=SurfaceDB[i]; if(SurfaceDB[i].uRef) NewEntries[j++]=SurfaceDB[i];
} }
// clear all NewEntries[j].lpdds = NULL; // terminator
for (i=0;i<DDSQLEN;i++) { // move back to original list
SurfaceDB[i].lpdds = NULL; for (i=0; i<DDSQLEN; i++) {
SurfaceDB[i].uRef = FALSE; if(NewEntries[i].lpdds == NULL) break;
SurfaceDB[i].uRole = 0; SurfaceDB[i]=NewEntries[i];
SurfaceDB[i].uVersion = 0; switch(SurfaceDB[i].uRole){
} case SURFACE_ROLE_PRIMARY: lpDDSPrimary = SurfaceDB[i].lpdds; break;
// bring back the valid entries to db case SURFACE_ROLE_BACKBUFFER: lpDDSBackBuffer = SurfaceDB[i].lpdds; break;
i = 0; case SURFACE_ROLE_ZBUFFER: lpDDSZBuffer = SurfaceDB[i].lpdds; break;
if(LastEntries[0].lpdds) { }
SurfaceDB[i++]=LastEntries[0];
lpDDSPrimary = LastEntries[0].lpdds;
#ifdef DXW_SURFACE_STACK_TRACING
OutTrace(">>> 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
} }
SurfaceDB[i].lpdds = 0; // terminator
#ifdef DXW_SURFACE_STACK_TRACING #ifdef DXW_SURFACE_STACK_TRACING
DumpSurfaceList(SurfaceDB); DumpSurfaceList(SurfaceDB);
#endif #endif
@ -204,30 +192,49 @@ void dxwSStack::PushZBufferSurface(LPDIRECTDRAWSURFACE ps, int version, DWORD dw
PushSurface(ps, SURFACE_ROLE_ZBUFFER, (USHORT)version, dwCaps); PushSurface(ps, SURFACE_ROLE_ZBUFFER, (USHORT)version, dwCaps);
} }
void dxwSStack::DuplicateSurface(LPDIRECTDRAWSURFACE psfrom, LPDIRECTDRAWSURFACE psto, int version) void dxwSStack::Push3DRefSurface(LPDIRECTDRAWSURFACE ps, int version, DWORD dwCaps)
{ {
int i, j; PushSurface(ps, SURFACE_ROLE_3DREF, (USHORT)version, dwCaps);
}
DWORD dxwSStack::DuplicateSurface(LPDIRECTDRAWSURFACE psfrom, LPDIRECTDRAWSURFACE psto, int version)
{
int i;
SurfaceDB_Type *e; SurfaceDB_Type *e;
SurfaceDB_Type sentry;
#ifdef DXW_SURFACE_STACK_TRACING #ifdef DXW_SURFACE_STACK_TRACING
OutTraceSDB(">>> SURFACELIST DUPL: from=%x to=%x vers=%d\n", psfrom, psto, version); OutTraceSDB(">>> SURFACELIST DUPL: from=%x to=%x vers=%d\n", psfrom, psto, version);
#endif #endif
// search for source or empty slot
for (i=0;i<DDSQLEN;i++) { for (i=0;i<DDSQLEN;i++) {
e=&SurfaceDB[i]; e=&SurfaceDB[i];
if ((e->lpdds==psfrom) || (e->lpdds==(DWORD)0)) break; // got matching entry or end of the list if ((e->lpdds==psfrom) || (e->lpdds==(DWORD)0)) break; // got matching entry or end of the list
} }
// if not found, return // if not found, return
if (!e->lpdds) return; if (!e->lpdds) return 0;
// search for an empty slot // save surface entry
j = i; sentry = *e;
for (j=0;j<DDSQLEN;j++) if (!SurfaceDB[j].lpdds) break; // search for destination or empty slot
for (i=0;i<DDSQLEN;i++) {
e=&SurfaceDB[i];
if ((e->lpdds==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;j<DDSQLEN-1;j++) SurfaceDB[j]=SurfaceDB[j+1]; // scale down the whole stack one entry
e=&SurfaceDB[DDSQLEN-1];
}
// duplicate the entry with the new lpdds and version but old role / capabilities // duplicate the entry with the new lpdds and version but old role / capabilities
SurfaceDB[j] = SurfaceDB[i]; // either overriding the old entry or writing a new one
SurfaceDB[j].lpdds = psto; *e = sentry;
SurfaceDB[j].uVersion = version; e->lpdds = psto;
e->uVersion = version;
e->uRef = TRUE;
#ifdef DXW_SURFACE_STACK_TRACING #ifdef DXW_SURFACE_STACK_TRACING
DumpSurfaceList(SurfaceDB); DumpSurfaceList(SurfaceDB);
#endif #endif
return e->dwCaps;
} }
void dxwSStack::PopSurface(LPDIRECTDRAWSURFACE ps) void dxwSStack::PopSurface(LPDIRECTDRAWSURFACE ps)
@ -302,6 +309,18 @@ BOOL dxwSStack::IsAZBufferSurface(LPDIRECTDRAWSURFACE ps)
return FALSE; 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<DDSQLEN;i++) {
if (SurfaceDB[i].lpdds==0) return FALSE;
if (SurfaceDB[i].lpdds==ps) return (SurfaceDB[i].uRole == SURFACE_ROLE_3DREF);
}
return FALSE;
}
LPDIRECTDRAWSURFACE dxwSStack::GetSurfaceByRole(USHORT role) LPDIRECTDRAWSURFACE dxwSStack::GetSurfaceByRole(USHORT role)
{ {
// Get a surface marked for the desired role (either PRIMARY or BACKBUFFER) and // Get a surface marked for the desired role (either PRIMARY or BACKBUFFER) and
@ -351,3 +370,17 @@ DWORD dxwSStack::GetCaps(LPDIRECTDRAWSURFACE ps)
} }
return 0; return 0;
} }
SurfaceDB_Type *dxwSStack::GetSurface(LPDIRECTDRAWSURFACE ps)
{
for (int i=0;i<DDSQLEN;i++) {
if (SurfaceDB[i].lpdds==0) return NULL;
if (SurfaceDB[i].lpdds==ps) {
#ifdef DXW_SURFACE_STACK_TRACING
OutTraceSDB(">>> GETCAPS: lpdds=%x caps=%x(%s)\n", ps, SurfaceDB[i].dwCaps, ExplainDDSCaps(SurfaceDB[i].dwCaps));
#endif
return &SurfaceDB[i];
}
}
return NULL;
}

View File

@ -44,6 +44,7 @@ HRESULT WINAPI extQueryInterfaceDX(int dxversion, QueryInterface_Type pQueryInte
int iObjectType; int iObjectType;
int iObjectVersion; int iObjectVersion;
extern LPDIRECTDRAWSURFACE lpDDSEmu_Prim; extern LPDIRECTDRAWSURFACE lpDDSEmu_Prim;
DWORD caps;
IsPrim=dxwss.IsAPrimarySurface((LPDIRECTDRAWSURFACE)lpdds); IsPrim=dxwss.IsAPrimarySurface((LPDIRECTDRAWSURFACE)lpdds);
IsBack=dxwss.IsABackBufferSurface((LPDIRECTDRAWSURFACE)lpdds); IsBack=dxwss.IsABackBufferSurface((LPDIRECTDRAWSURFACE)lpdds);
@ -203,16 +204,18 @@ HRESULT WINAPI extQueryInterfaceDX(int dxversion, QueryInterface_Type pQueryInte
switch(iObjectType){ switch(iObjectType){
case TYPE_OBJECT_UNKNOWN: case TYPE_OBJECT_UNKNOWN:
if(*obp != lpdds) dxwss.PopSurface((LPDIRECTDRAWSURFACE)*obp); // clear any past attribution if(caps=dxwss.DuplicateSurface((LPDIRECTDRAWSURFACE)lpdds, (LPDIRECTDRAWSURFACE)*obp, iObjectVersion)){
dxwss.DuplicateSurface((LPDIRECTDRAWSURFACE)lpdds, (LPDIRECTDRAWSURFACE)*obp, iObjectVersion); OutTraceDW("QueryInterface: MOVE caps=%x(%s)\n", caps, ExplainDDSCaps(caps));
}
break; break;
case TYPE_OBJECT_DIRECTDRAW: case TYPE_OBJECT_DIRECTDRAW:
HookDDSession((LPDIRECTDRAW *)obp, iObjectVersion); HookDDSession((LPDIRECTDRAW *)obp, iObjectVersion);
break; break;
case TYPE_OBJECT_DDRAWSURFACE: case TYPE_OBJECT_DDRAWSURFACE:
dxw.dwDDVersion=iObjectVersion; dxw.dwDDVersion=iObjectVersion;
if(*obp != lpdds) dxwss.PopSurface((LPDIRECTDRAWSURFACE)*obp); // clear any past attribution if(caps=dxwss.DuplicateSurface((LPDIRECTDRAWSURFACE)lpdds, (LPDIRECTDRAWSURFACE)*obp, iObjectVersion)){
dxwss.DuplicateSurface((LPDIRECTDRAWSURFACE)lpdds, (LPDIRECTDRAWSURFACE)*obp, iObjectVersion); OutTraceDW("QueryInterface: MOVE caps=%x(%s)\n", caps, ExplainDDSCaps(caps));
}
if(IsPrim){ if(IsPrim){
OutTraceDW("QueryInterface(S): primary=%x new=%x\n", lpdds, *obp); OutTraceDW("QueryInterface(S): primary=%x new=%x\n", lpdds, *obp);
HookDDSurface((LPDIRECTDRAWSURFACE *)obp, dxw.dwDDVersion, TRUE); HookDDSurface((LPDIRECTDRAWSURFACE *)obp, dxw.dwDDVersion, TRUE);

View File

@ -16,6 +16,13 @@
#include <Winuser.h> #include <Winuser.h>
#define FIXCHILDSIZE FALSE #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) #define _Warn(s) MessageBox(0, s, "to do", MB_ICONEXCLAMATION)
@ -43,9 +50,9 @@ UINT WINAPI extSetDIBColorTable(HDC, UINT, UINT, const RGBQUAD *);
#endif #endif
static HookEntryEx_Type Hooks[]={ static HookEntryEx_Type Hooks[]={
#ifdef TRANSLATEMESSAGEHOOK
//{HOOK_IAT_CANDIDATE, 0, "TranslateMessage", (FARPROC)TranslateMessage, (FARPROC *)&pTranslateMessage, (FARPROC)extTranslateMessage}, {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, "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, "GetWindowPlacement", (FARPROC)NULL, (FARPROC *)&pGetWindowPlacement, (FARPROC)extGetWindowPlacement},
//{HOOK_IAT_CANDIDATE, 0, "SetWindowPlacement", (FARPROC)NULL, (FARPROC *)&pSetWindowPlacement, (FARPROC)extSetWindowPlacement}, //{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; 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 // 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 glpMessageHookProcessFunction;
HOOKPROC glpMouseHookProcessFunction; HOOKPROC glpMouseHookProcessFunction;
HOOKPROC glpMouseHookProcessFunctionLL;
LRESULT CALLBACK extMessageHookProc(int code, WPARAM wParam, LPARAM lParam) LRESULT CALLBACK extMessageHookProc(int code, WPARAM wParam, LPARAM lParam)
{ {
@ -3682,17 +3699,48 @@ LRESULT CALLBACK extMessageHookProc(int code, WPARAM wParam, LPARAM lParam)
return ret; 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 CALLBACK extMouseHookProc(int code, WPARAM wParam, LPARAM lParam)
{ {
LRESULT ret;
OutTraceC("MouseHookProc: code=%x wParam=%x lParam=%x\n", code, wParam, lParam); OutTraceC("MouseHookProc: code=%x wParam=%x lParam=%x\n", code, wParam, lParam);
MOUSEHOOKSTRUCT *pMouseStruct = (MOUSEHOOKSTRUCT *)lParam; if(code < 0) return CallNextHookEx(0, code, wParam, lParam);
if (pMouseStruct != NULL){
OutTraceC("MouseHookProc: event=%s pos=(%d,%d)\n", ExplainWinMessage(wParam), pMouseStruct->pt.x, pMouseStruct->pt.y); if(lParam){
extGetCursorPos(&(pMouseStruct->pt)); MOUSEHOOKSTRUCT MouseStruct = *(MOUSEHOOKSTRUCT *)lParam;
} MouseStruct.pt = FixMousePoint(MouseStruct.pt);
ret = (*glpMouseHookProcessFunction)(code, wParam, lParam); OutTraceC("MouseHookProc: event=%s pos=(%d,%d)->(%d,%d)\n",
return ret; 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) 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; lpfn=extMessageHookProc;
} }
} }
// v2.03.39: "One Must Fall Battlegrounds" keyboard fix // v2.03.39: "One Must Fall Battlegrounds" keyboard fix
if((idHook == WH_KEYBOARD) && (dwThreadId == NULL)) { if((idHook == WH_KEYBOARD) && (dwThreadId == NULL)) {
dwThreadId = GetCurrentThreadId(); dwThreadId = GetCurrentThreadId();
@ -3727,10 +3776,17 @@ static HHOOK WINAPI extSetWindowsHookEx(SetWindowsHookEx_Type pSetWindowsHookEx,
return NULL; return NULL;
} }
if((dxw.dwFlags8 & FIXMOUSEHOOK) && (idHook == WH_MOUSE)){ if(dxw.dwFlags8 & FIXMOUSEHOOK){
OutTraceDW("SetWindowsHookEx: FIXMOUSEHOOK filter active\n"); if(idHook == WH_MOUSE){
glpMouseHookProcessFunction = lpfn; OutTraceDW("SetWindowsHookEx: FIXMOUSEHOOK filter active on WH_MOUSE\n");
lpfn=extMouseHookProc; 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); ret=(*pSetWindowsHookEx)(idHook, lpfn, hMod, dwThreadId);
@ -4053,7 +4109,7 @@ BOOL WINAPI extDrawMenuBar(HWND hWnd)
return ret; return ret;
} }
#if 0 #ifdef TRANSLATEMESSAGEHOOK
BOOL WINAPI extTranslateMessage(MSG *pMsg) BOOL WINAPI extTranslateMessage(MSG *pMsg)
{ {
BOOL ret; BOOL ret;
@ -4063,8 +4119,8 @@ BOOL WINAPI extTranslateMessage(MSG *pMsg)
pMsg->pt=dxw.ScreenToClient(pMsg->pt); pMsg->pt=dxw.ScreenToClient(pMsg->pt);
pMsg->pt=dxw.FixCursorPos(pMsg->pt); pMsg->pt=dxw.FixCursorPos(pMsg->pt);
pMsg->pt.x *= 4; //pMsg->pt.x *= 4;
pMsg->pt.y *= 4; //pMsg->pt.y *= 4;
//if((pMsg->message <= WM_MOUSELAST) && (pMsg->message >= WM_MOUSEFIRST)) //if((pMsg->message <= WM_MOUSELAST) && (pMsg->message >= WM_MOUSEFIRST))
// pMsg->lParam = MAKELPARAM(pMsg->pt.x, pMsg->pt.y); // pMsg->lParam = MAKELPARAM(pMsg->pt.x, pMsg->pt.y);
OutTraceDW("TranslateMessage: new pos=(%d,%d)\n", pMsg->pt.x, pMsg->pt.y); OutTraceDW("TranslateMessage: new pos=(%d,%d)\n", pMsg->pt.x, pMsg->pt.y);

View File

@ -279,6 +279,7 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp
if(dxw.dwFlags3 & (FILTERMESSAGES|DEFAULTMESSAGES)){ if(dxw.dwFlags3 & (FILTERMESSAGES|DEFAULTMESSAGES)){
switch(message){ switch(message){
case WM_NCMOUSELEAVE:
case WM_NCMOUSEMOVE: case WM_NCMOUSEMOVE:
case WM_NCLBUTTONDOWN: case WM_NCLBUTTONDOWN:
case WM_NCLBUTTONUP: case WM_NCLBUTTONUP:

View File

@ -6,12 +6,13 @@
#include "ShimsDialog.h" #include "ShimsDialog.h"
// http://msdn2.microsoft.com/en-us/library/bb432457 // http://msdn2.microsoft.com/en-us/library/bb432457
// PDB WINAPI SdbOpenDatabase( // HSDB WINAPI SdbOpenDatabase(
// LPCTSTR pwszPath, // LPCTSTR pwszPath,
// PATH_TYPE eType // 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 // http://msdn2.microsoft.com/en-us/library/bb432389.aspx
typedef enum _PATH_TYPE typedef enum _PATH_TYPE
@ -61,6 +62,14 @@ typedef DWORD TAGREF;
#define TAG_APP_ID (0x11 | TAG_TYPE_BINARY) #define TAG_APP_ID (0x11 | TAG_TYPE_BINARY)
#define CONTEXT_PLATFORM_ID (0x8 | 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 typedef struct TAG_RC_Entry
{ {
@ -91,44 +100,55 @@ static DWORD s_TagGuids[] =
// APIs: // APIs:
// http://msdn.microsoft.com/en-us/library/bb432457.aspx // http://msdn.microsoft.com/en-us/library/bb432457.aspx
//PDB WINAPI SdbOpenDatabase( //HSDB WINAPI SdbOpenDatabase(
// __in LPCTSTR pwszPath, // __in LPCTSTR pwszPath,
// __in PATH_TYPE eType // __in PATH_TYPE eType
//); //);
typedef PDB (WINAPI *PSdbOpenDatabase)( typedef HSDB (WINAPI *PSdbOpenDatabase)(
LPCWSTR pwszPath, // Docu wrong? LPCTSTR shouldn't it be LPCWSTR!? LPCTSTR pwszPath, // Docu wrong? LPCTSTR shouldn't it be LPCWSTR!?
PATH_TYPE eType PATH_TYPE eType
); );
PSdbOpenDatabase pSdbOpenDatabase = NULL; 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 // http://msdn.microsoft.com/en-us/library/cc895520
//void WINAPI SdbCloseDatabase( //void WINAPI SdbCloseDatabase(
// __inout PDB pdb // __inout HSDB pdb
//); //);
typedef VOID (WINAPI *PSdbCloseDatabase)( typedef VOID (WINAPI *PSdbCloseDatabase)(
PDB handle // assuming the passed handle... HSDB handle // assuming the passed handle...
); );
PSdbCloseDatabase pSdbCloseDatabase = NULL; PSdbCloseDatabase pSdbCloseDatabase = NULL;
// http://msdn2.microsoft.com/en-us/library/bb432446 // http://msdn2.microsoft.com/en-us/library/bb432446
//TAGID WINAPI SdbGetFirstChild( //TAGID WINAPI SdbGetFirstChild(
// PDB pdb, // HSDB pdb,
// TAGID tiParent // TAGID tiParent
//); //);
typedef TAGID (WINAPI *PSdbGetFirstChild)( typedef TAGID (WINAPI *PSdbGetFirstChild)(
PDB pdb, HSDB pdb,
TAGID tiParent TAGID tiParent
); );
PSdbGetFirstChild pSdbGetFirstChild = NULL; PSdbGetFirstChild pSdbGetFirstChild = NULL;
// http://msdn2.microsoft.com/en-us/library/bb432449 // http://msdn2.microsoft.com/en-us/library/bb432449
//TAGID WINAPI SdbGetNextChild( //TAGID WINAPI SdbGetNextChild(
// PDB pdb, // HSDB pdb,
// TAGID tiParent, // TAGID tiParent,
// TAGID tiPrev // TAGID tiPrev
//); //);
typedef TAGID (WINAPI *PSdbGetNextChild)( typedef TAGID (WINAPI *PSdbGetNextChild)(
PDB pdb, HSDB pdb,
TAGID tiParent, TAGID tiParent,
TAGID tiPrev TAGID tiPrev
); );
@ -136,11 +156,11 @@ PSdbGetNextChild pSdbGetNextChild = NULL;
// http://msdn2.microsoft.com/en-us/library/bb432451 // http://msdn2.microsoft.com/en-us/library/bb432451
//TAG WINAPI SdbGetTagFromTagID( //TAG WINAPI SdbGetTagFromTagID(
// PDB pdb, // HSDB pdb,
// TAGID tiWhich // TAGID tiWhich
//); //);
typedef TAG (WINAPI *PSdbGetTagFromTagID)( typedef TAG (WINAPI *PSdbGetTagFromTagID)(
PDB pdb, HSDB pdb,
TAGID tiWhich TAGID tiWhich
); );
PSdbGetTagFromTagID pSdbGetTagFromTagID = NULL; PSdbGetTagFromTagID pSdbGetTagFromTagID = NULL;
@ -156,13 +176,13 @@ PSdbTagToString pSdbTagToString = NULL;
// http://msdn2.microsoft.com/en-us/library/bb432464 // http://msdn2.microsoft.com/en-us/library/bb432464
//BOOL WINAPI SdbReadStringTag( //BOOL WINAPI SdbReadStringTag(
// PDB pdb, // HSDB pdb,
// TAGID tiWhich, // TAGID tiWhich,
// LPTSTR pwszBuffer, // LPTSTR pwszBuffer,
// DWORD cchBufferSize // DWORD cchBufferSize
//); //);
typedef BOOL (WINAPI *PSdbReadStringTag)( typedef BOOL (WINAPI *PSdbReadStringTag)(
PDB pdb, HSDB pdb,
TAGID tiWhich, TAGID tiWhich,
LPTSTR pwszBuffer, LPTSTR pwszBuffer,
DWORD cchBufferSize DWORD cchBufferSize
@ -171,23 +191,23 @@ PSdbReadStringTag pSdbReadStringTag = NULL;
// http://msdn2.microsoft.com/en-us/library/bb432450.aspx // http://msdn2.microsoft.com/en-us/library/bb432450.aspx
//LPWSTR WINAPI SdbGetStringTagPtr( //LPWSTR WINAPI SdbGetStringTagPtr(
// PDB pdb, // HSDB pdb,
// TAGID tiWhich // TAGID tiWhich
//); //);
typedef LPWSTR (WINAPI *PSdbGetStringTagPtr)( typedef LPWSTR (WINAPI *PSdbGetStringTagPtr)(
PDB pdb, HSDB pdb,
TAGID tiWhich TAGID tiWhich
); );
PSdbGetStringTagPtr pSdbGetStringTagPtr = NULL; PSdbGetStringTagPtr pSdbGetStringTagPtr = NULL;
// http://msdn2.microsoft.com/en-us/library/bb432462.aspx // http://msdn2.microsoft.com/en-us/library/bb432462.aspx
//DWORD WINAPI SdbReadDWORDTag( //DWORD WINAPI SdbReadDWORDTag(
// PDB pdb, // HSDB pdb,
// TAGID tiWhich, // TAGID tiWhich,
// DWORD dwDefault // DWORD dwDefault
//); //);
typedef DWORD (WINAPI *PSdbReadDWORDTag)( typedef DWORD (WINAPI *PSdbReadDWORDTag)(
PDB pdb, HSDB pdb,
TAGID tiWhich, TAGID tiWhich,
DWORD dwDefault DWORD dwDefault
); );
@ -195,22 +215,22 @@ PSdbReadDWORDTag pSdbReadDWORDTag = NULL;
// http://msdn2.microsoft.com/en-us/library/bb432463.aspx // http://msdn2.microsoft.com/en-us/library/bb432463.aspx
//ULONGLONG WINAPI SdbReadQWORDTag( //ULONGLONG WINAPI SdbReadQWORDTag(
// PDB pdb, // HSDB pdb,
// TAGID tiWhich, // TAGID tiWhich,
// ULONGLONG qwDefault // ULONGLONG qwDefault
//); //);
typedef ULONGLONG (WINAPI *PSdbReadQWORDTag)( typedef ULONGLONG (WINAPI *PSdbReadQWORDTag)(
PDB pdb, HSDB pdb,
TAGID tiWhich, TAGID tiWhich,
ULONGLONG qwDefault ULONGLONG qwDefault
); );
PSdbReadQWORDTag pSdbReadQWORDTag = NULL; PSdbReadQWORDTag pSdbReadQWORDTag = NULL;
// http://msdn2.microsoft.com/en-us/library/bb432455 // http://msdn2.microsoft.com/en-us/library/bb432455
//PDB WINAPI SdbOpenApphelpDetailsDatabase( //HSDB WINAPI SdbOpenApphelpDetailsDatabase(
// LPCWSTR pwsDetailsDatabasePath // LPCWSTR pwsDetailsDatabasePath
//); //);
typedef PDB (WINAPI *PSdbOpenApphelpDetailsDatabase)( typedef HSDB (WINAPI *PSdbOpenApphelpDetailsDatabase)(
LPCWSTR pwsDetailsDatabasePath LPCWSTR pwsDetailsDatabasePath
); );
PSdbOpenApphelpDetailsDatabase pSdbOpenApphelpDetailsDatabase = NULL; PSdbOpenApphelpDetailsDatabase pSdbOpenApphelpDetailsDatabase = NULL;
@ -226,22 +246,22 @@ PSdbOpenApphelpResourceFile pSdbOpenApphelpResourceFile = NULL;
// http://msdn.microsoft.com/en-us/library/bb432443 // http://msdn.microsoft.com/en-us/library/bb432443
//PVOID WINAPI SdbGetBinaryTagData( //PVOID WINAPI SdbGetBinaryTagData(
// __in PDB pdb, // __in HSDB pdb,
// __in TAGID tiWhich // __in TAGID tiWhich
//); //);
typedef PVOID (WINAPI *PSdbGetBinaryTagData)( typedef PVOID (WINAPI *PSdbGetBinaryTagData)(
PDB pdb, HSDB pdb,
TAGID tiWhich TAGID tiWhich
); );
PSdbGetBinaryTagData pSdbGetBinaryTagData = NULL; PSdbGetBinaryTagData pSdbGetBinaryTagData = NULL;
// ??? // ???
//DWORD WINAPI SdbGetTagDataSize( //DWORD WINAPI SdbGetTagDataSize(
// __in PDB pdb, // __in HSDB pdb,
// __in TAGID tiWhich // __in TAGID tiWhich
//); //);
typedef DWORD (WINAPI *PSdbGetTagDataSize)( typedef DWORD (WINAPI *PSdbGetTagDataSize)(
PDB pdb, HSDB pdb,
TAGID tiWhich TAGID tiWhich
); );
PSdbGetTagDataSize pSdbGetTagDataSize = NULL; PSdbGetTagDataSize pSdbGetTagDataSize = NULL;
@ -264,8 +284,6 @@ typedef struct tagSDBQUERYRESULT {
GUID rgGuidDB[SDB_MAX_SDBS]; GUID rgGuidDB[SDB_MAX_SDBS];
} SDBQUERYRESULT, *PSDBQUERYRESULT; } SDBQUERYRESULT, *PSDBQUERYRESULT;
typedef void* HSDB;
// http://msdn.microsoft.com/en-us/library/bb432448 // http://msdn.microsoft.com/en-us/library/bb432448
typedef BOOL (WINAPI *PSdbGetMatchingExe)( typedef BOOL (WINAPI *PSdbGetMatchingExe)(
HSDB hSDB, HSDB hSDB,
@ -360,10 +378,17 @@ char * MatchExe(char *FileName)
static char sBuf[10000]; static char sBuf[10000];
LPWSTR szFileName = (LPWSTR)malloc((strlen(FileName)+1)*sizeof(WCHAR)); LPWSTR szFileName = (LPWSTR)malloc((strlen(FileName)+1)*sizeof(WCHAR));
MultiByteToWideChar(CP_ACP, 0, FileName, -1, szFileName, strlen(FileName)); MultiByteToWideChar(CP_ACP, 0, FileName, -1, szFileName, strlen(FileName));
BOOL bRet;
HSDB hSDB;
HINSTANCE hAppHelp = LoadLibrary(_T("apphelp.dll")); HINSTANCE hAppHelp = LoadLibrary(_T("apphelp.dll"));
if(!hAppHelp){
sprintf(sBuf, "error %d loading apphelp.dll\n", GetLastError());
return sBuf;
}
pSdbOpenDatabase = (PSdbOpenDatabase) GetProcAddress(hAppHelp, "SdbOpenDatabase"); pSdbOpenDatabase = (PSdbOpenDatabase) GetProcAddress(hAppHelp, "SdbOpenDatabase");
pSdbInitDatabase = (PSdbInitDatabase) GetProcAddress(hAppHelp, "SdbInitDatabase");
pSdbCloseDatabase = (PSdbCloseDatabase) GetProcAddress(hAppHelp, "SdbCloseDatabase"); pSdbCloseDatabase = (PSdbCloseDatabase) GetProcAddress(hAppHelp, "SdbCloseDatabase");
pSdbGetFirstChild = (PSdbGetFirstChild) GetProcAddress(hAppHelp, "SdbGetFirstChild"); pSdbGetFirstChild = (PSdbGetFirstChild) GetProcAddress(hAppHelp, "SdbGetFirstChild");
pSdbGetNextChild = (PSdbGetNextChild) GetProcAddress(hAppHelp, "SdbGetNextChild"); pSdbGetNextChild = (PSdbGetNextChild) GetProcAddress(hAppHelp, "SdbGetNextChild");
@ -384,55 +409,67 @@ char * MatchExe(char *FileName)
if(pSdbGetMatchingExe == NULL){ if(pSdbGetMatchingExe == NULL){
// rough protection: we assume that if this is found, then all fpointers are there. // rough protection: we assume that if this is found, then all fpointers are there.
sprintf(sBuf, "Unsupported Shim DB\n", FileName); sprintf(sBuf, "Unsupported Shim DB\n", FileName);
FreeLibrary(hAppHelp);
return sBuf; return sBuf;
} }
BOOL bRet = pSdbGetMatchingExe(NULL, (LPCWSTR)szFileName, NULL, NULL, 0, &result); //hSDB = pSdbInitDatabase(HID_DATABASE_TYPE_MASK|SDB_DATABASE_MAIN_SHIM, NULL);
if (bRet){ hSDB = pSdbInitDatabase(SDB_DATABASE_MAIN_SHIM, NULL);
sprintf(sBuf, "Shim found for file: %s\n", FileName); if(!hSDB){
const size_t flagsLen = 1024; sprintf(sBuf, "Can't initialize shims database\n");
char szFlagsStr[flagsLen]; return (sBuf);
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; i<result.dwExeCount; i++){
sprintf(sBuf, "%sExe-Shim: 0x%x, ", sBuf, result.atrExes[i]);
Flags2String(result.adwExeFlags[i], szFlagsStr, flagsLen);
sprintf(sBuf, "%sFlags: 0x%x: %s\n", sBuf, result.adwExeFlags[i], szFlagsStr);
}
for(DWORD i=0; i<result.dwLayerCount; i++){
sprintf(sBuf, "%sLayer-Shim: 0x%x\n", sBuf, result.atrLayers[i]);
}
Flags2String(result.dwLayerFlags, szFlagsStr, flagsLen);
sprintf(sBuf, "%sLayer-Flags: 0x%x: %s\n", sBuf, result.dwLayerFlags, szFlagsStr);
for(DWORD i=0; i<SDB_MAX_SDBS; i++){
if (result.rgGuidDB[i] != GUID_NULL){
sprintf(sBuf, "%sShim-Database: %8.8X-%4.4X-%4.4X-%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X\n",
sBuf,
result.rgGuidDB[i].Data1,
result.rgGuidDB[i].Data2,
result.rgGuidDB[i].Data3,
result.rgGuidDB[i].Data4[0],
result.rgGuidDB[i].Data4[1],
result.rgGuidDB[i].Data4[2],
result.rgGuidDB[i].Data4[3],
result.rgGuidDB[i].Data4[4],
result.rgGuidDB[i].Data4[5],
result.rgGuidDB[i].Data4[6],
result.rgGuidDB[i].Data4[7]
);
}
}
//pSdbReleaseMatchingExe( ??? );
} }
else{
bRet = pSdbGetMatchingExe(NULL, (LPCWSTR)szFileName, NULL, NULL, 0, &result);
if(!bRet){
sprintf(sBuf, "No Shim found for file: %s\n", FileName); sprintf(sBuf, "No Shim found for file: %s\n", FileName);
FreeLibrary(hAppHelp);
return (sBuf);
} }
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; i<result.dwExeCount; i++){
sprintf(sBuf, "%sExe-Shim: 0x%x, ", sBuf, result.atrExes[i]);
Flags2String(result.adwExeFlags[i], szFlagsStr, flagsLen);
sprintf(sBuf, "%sFlags: 0x%x: %s\n", sBuf, result.adwExeFlags[i], szFlagsStr);
}
for(DWORD i=0; i<result.dwLayerCount; i++){
sprintf(sBuf, "%sLayer-Shim: 0x%x\n", sBuf, result.atrLayers[i]);
}
Flags2String(result.dwLayerFlags, szFlagsStr, flagsLen);
sprintf(sBuf, "%sLayer-Flags: 0x%x: %s\n", sBuf, result.dwLayerFlags, szFlagsStr);
sprintf(sBuf, "%sCustomSDBMap: 0x%x\n", sBuf, result.dwCustomSDBMap);
for(DWORD i=0; i<SDB_MAX_SDBS; i++){
if (result.rgGuidDB[i] != GUID_NULL){
sprintf(sBuf, "%sShim-Database: %8.8X-%4.4X-%4.4X-%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X\n",
sBuf,
result.rgGuidDB[i].Data1,
result.rgGuidDB[i].Data2,
result.rgGuidDB[i].Data3,
result.rgGuidDB[i].Data4[0],
result.rgGuidDB[i].Data4[1],
result.rgGuidDB[i].Data4[2],
result.rgGuidDB[i].Data4[3],
result.rgGuidDB[i].Data4[4],
result.rgGuidDB[i].Data4[5],
result.rgGuidDB[i].Data4[6],
result.rgGuidDB[i].Data4[7]
);
}
}
pSdbReleaseMatchingExe(hSDB, (TAGREF)&result);
FreeLibrary(hAppHelp);
return sBuf; return sBuf;
} }

View File

@ -29,12 +29,15 @@ void CTabWindow::DoDataExchange(CDataExchange* pDX)
CDialog::DoDataExchange(pDX); CDialog::DoDataExchange(pDX);
CTargetDlg *cTarget = ((CTargetDlg *)(this->GetParent()->GetParent())); CTargetDlg *cTarget = ((CTargetDlg *)(this->GetParent()->GetParent()));
// window management // window style
DDX_Check(pDX, IDC_FIXWINFRAME, cTarget->m_FixWinFrame); DDX_Radio(pDX, IDC_DEFAULTSTYLE, cTarget->m_WindowStyle);
DDX_Check(pDX, IDC_PREVENTMAXIMIZE, cTarget->m_PreventMaximize);
DDX_Check(pDX, IDC_LOCKWINSTYLE, cTarget->m_LockWinStyle); 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_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_FORCEWINRESIZE, cTarget->m_ForceWinResize);
DDX_Check(pDX, IDC_HIDEMULTIMONITOR, cTarget->m_HideMultiMonitor); DDX_Check(pDX, IDC_HIDEMULTIMONITOR, cTarget->m_HideMultiMonitor);
DDX_Check(pDX, IDC_RECOVERSCREENMODE, cTarget->m_RecoverScreenMode); DDX_Check(pDX, IDC_RECOVERSCREENMODE, cTarget->m_RecoverScreenMode);

View File

@ -163,7 +163,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
m_AutoRefresh = FALSE; m_AutoRefresh = FALSE;
m_IndependentRefresh = FALSE; m_IndependentRefresh = FALSE;
m_TextureFormat = FALSE; m_TextureFormat = FALSE;
m_FixWinFrame = FALSE; //m_FixWinFrame = FALSE;
m_VideoToSystemMem = FALSE; m_VideoToSystemMem = FALSE;
m_FixTextOut = FALSE; m_FixTextOut = FALSE;
m_SharedDC = FALSE; m_SharedDC = FALSE;
@ -195,7 +195,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
m_ClientRemapping = TRUE; // default true !! m_ClientRemapping = TRUE; // default true !!
m_LockWinStyle = FALSE; m_LockWinStyle = FALSE;
m_FixParentWin = FALSE; m_FixParentWin = FALSE;
m_ModalStyle = FALSE; //m_ModalStyle = FALSE;
m_KeepAspectRatio = FALSE; m_KeepAspectRatio = FALSE;
m_ForceWinResize = FALSE; m_ForceWinResize = FALSE;
m_HideMultiMonitor = FALSE; m_HideMultiMonitor = FALSE;

View File

@ -42,6 +42,7 @@ public:
int m_LogMode; int m_LogMode;
int m_MonitorId; int m_MonitorId;
int m_WinMovementType; int m_WinMovementType;
int m_WindowStyle;
BOOL m_HookDI; BOOL m_HookDI;
BOOL m_HookDI8; BOOL m_HookDI8;
BOOL m_EmulateRelMouse; BOOL m_EmulateRelMouse;
@ -112,7 +113,7 @@ public:
BOOL m_AutoRefresh; BOOL m_AutoRefresh;
BOOL m_IndependentRefresh; BOOL m_IndependentRefresh;
BOOL m_TextureFormat; BOOL m_TextureFormat;
BOOL m_FixWinFrame; //BOOL m_FixWinFrame;
BOOL m_VideoToSystemMem; BOOL m_VideoToSystemMem;
BOOL m_FixTextOut; BOOL m_FixTextOut;
BOOL m_SharedDC; BOOL m_SharedDC;
@ -144,7 +145,7 @@ public:
BOOL m_ClientRemapping; BOOL m_ClientRemapping;
BOOL m_LockWinStyle; BOOL m_LockWinStyle;
BOOL m_FixParentWin; BOOL m_FixParentWin;
BOOL m_ModalStyle; //BOOL m_ModalStyle;
BOOL m_KeepAspectRatio; BOOL m_KeepAspectRatio;
BOOL m_ForceWinResize; BOOL m_ForceWinResize;
BOOL m_HideMultiMonitor; BOOL m_HideMultiMonitor;

View File

@ -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)); for(i=0, dword = t->flags7; i<32; i++, dword>>=1) if(dword & 0x1) sflags.AppendFormat("%s ", GetFlagCaption(6,i));
sflags.Append("\nFlags8: "); sflags.Append("\nFlags8: ");
for(i=0, dword = t->flags8; i<32; i++, dword>>=1) if(dword & 0x1) sflags.AppendFormat("%s ", GetFlagCaption(7,i)); 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: "); 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->SetDlgItemTextA(IDC_DESKTOPINFO, sflags);
this->SetWindowTextA(t->path); this->SetWindowTextA(t->path);

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

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

View File

@ -354,6 +354,13 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
case 2: t->flags8 |= DDSFORMAT; break; 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_HookDI) t->flags |= HOOKDI;
if(dlg->m_HookDI8) t->flags |= HOOKDI8; if(dlg->m_HookDI8) t->flags |= HOOKDI8;
if(dlg->m_EmulateRelMouse) t->flags6 |= EMULATERELMOUSE; 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_AutoRefresh) t->flags |= AUTOREFRESH;
if(dlg->m_IndependentRefresh) t->flags2 |= INDEPENDENTREFRESH; if(dlg->m_IndependentRefresh) t->flags2 |= INDEPENDENTREFRESH;
if(dlg->m_TextureFormat) t->flags5 |= TEXTUREFORMAT; 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_VideoToSystemMem) t->flags |= SWITCHVIDEOMEMORY;
if(dlg->m_FixTextOut) t->flags |= FIXTEXTOUT; if(dlg->m_FixTextOut) t->flags |= FIXTEXTOUT;
if(dlg->m_HookGlide) t->flags4 |= HOOKGLIDE; 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_ClientRemapping) t->flags |= CLIENTREMAPPING;
if(dlg->m_LockWinStyle) t->flags |= LOCKWINSTYLE; if(dlg->m_LockWinStyle) t->flags |= LOCKWINSTYLE;
if(dlg->m_FixParentWin) t->flags |= FIXPARENTWIN; 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_KeepAspectRatio) t->flags2 |= KEEPASPECTRATIO;
if(dlg->m_ForceWinResize) t->flags2 |= FORCEWINRESIZE; if(dlg->m_ForceWinResize) t->flags2 |= FORCEWINRESIZE;
if(dlg->m_HideMultiMonitor) t->flags2 |= HIDEMULTIMONITOR; 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 & RAWFORMAT) dlg->m_TextureFileFormat = 1;
if( t->flags8 & DDSFORMAT) dlg->m_TextureFileFormat = 2; 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_HookDI = t->flags & HOOKDI ? 1 : 0;
dlg->m_HookDI8 = t->flags & HOOKDI8 ? 1 : 0; dlg->m_HookDI8 = t->flags & HOOKDI8 ? 1 : 0;
dlg->m_EmulateRelMouse = t->flags6 & EMULATERELMOUSE ? 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_AutoRefresh = t->flags & AUTOREFRESH ? 1 : 0;
dlg->m_IndependentRefresh = t->flags2 & INDEPENDENTREFRESH ? 1 : 0; dlg->m_IndependentRefresh = t->flags2 & INDEPENDENTREFRESH ? 1 : 0;
dlg->m_TextureFormat = t->flags5 & TEXTUREFORMAT ? 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_VideoToSystemMem = t->flags & SWITCHVIDEOMEMORY ? 1 : 0;
dlg->m_FixTextOut = t->flags & FIXTEXTOUT ? 1 : 0; dlg->m_FixTextOut = t->flags & FIXTEXTOUT ? 1 : 0;
dlg->m_SharedDC = t->flags6 & SHAREDDC ? 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_ClientRemapping = t->flags & CLIENTREMAPPING ? 1 : 0;
dlg->m_LockWinStyle = t->flags & LOCKWINSTYLE ? 1 : 0; dlg->m_LockWinStyle = t->flags & LOCKWINSTYLE ? 1 : 0;
dlg->m_FixParentWin = t->flags & FIXPARENTWIN ? 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_KeepAspectRatio = t->flags2 & KEEPASPECTRATIO ? 1 : 0;
dlg->m_ForceWinResize = t->flags2 & FORCEWINRESIZE ? 1 : 0; dlg->m_ForceWinResize = t->flags2 & FORCEWINRESIZE ? 1 : 0;
dlg->m_HideMultiMonitor = t->flags2 & HIDEMULTIMONITOR ? 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); sprintf_s(val, sizeof(val), "%i", TargetMap->flags8);
WritePrivateProfileString("target", key, val, InitPath); 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(key, sizeof(key), "tflag%i", i);
sprintf_s(val, sizeof(val), "%i", TargetMap->tflags); sprintf_s(val, sizeof(val), "%i", TargetMap->tflags);
WritePrivateProfileString("target", key, val, InitPath); WritePrivateProfileString("target", key, val, InitPath);
@ -1041,6 +1061,16 @@ static void SaveConfigItem(TARGETMAP *TargetMap, PRIVATEMAP *PrivateMap, int i,
EscBuf = NULL; 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) static void ClearTarget(int i, char *InitPath)
{ {
char key[32]; char key[32];
@ -1070,6 +1100,10 @@ static void ClearTarget(int i, char *InitPath)
WritePrivateProfileString("target", key, 0, InitPath); WritePrivateProfileString("target", key, 0, InitPath);
sprintf_s(key, sizeof(key), "flagm%i", i); sprintf_s(key, sizeof(key), "flagm%i", i);
WritePrivateProfileString("target", key, 0, InitPath); 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); sprintf_s(key, sizeof(key), "tflag%i", i);
WritePrivateProfileString("target", key, 0, InitPath); WritePrivateProfileString("target", key, 0, InitPath);
sprintf_s(key, sizeof(key), "initx%i", i); 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); sprintf_s(key, sizeof(key), "flagm%i", i);
TargetMap->flags8 = GetPrivateProfileInt("target", key, 0, InitPath); 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); sprintf_s(key, sizeof(key), "tflag%i", i);
TargetMap->tflags = GetPrivateProfileInt("target", key, 0, InitPath); TargetMap->tflags = GetPrivateProfileInt("target", key, 0, InitPath);
// ------- // -------
@ -1508,6 +1548,7 @@ void CDxwndhostView::OnExport()
TFlags = TargetMap->tflags; TFlags = TargetMap->tflags;
TargetMap->tflags = 0; TargetMap->tflags = 0;
SaveConfigItem(&TargetMaps[i], &PrivateMaps[i], 0, path); SaveConfigItem(&TargetMaps[i], &PrivateMaps[i], 0, path);
SaveExportStamp(path);
TargetMap->tflags = TFlags; TargetMap->tflags = TFlags;
if(GetPrivateProfileInt("window", "updatepaths", 1, gInitPath)) { if(GetPrivateProfileInt("window", "updatepaths", 1, gInitPath)) {
GetFolderFromPath(path); GetFolderFromPath(path);

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -45,6 +45,8 @@ void InitDxWnd(void)
target.flags6 = GetIntEntry("flagk0", 0); target.flags6 = GetIntEntry("flagk0", 0);
target.flags7 = GetIntEntry("flagl0", 0); target.flags7 = GetIntEntry("flagl0", 0);
target.flags8 = GetIntEntry("flagm0", 0); target.flags8 = GetIntEntry("flagm0", 0);
target.flags9 = GetIntEntry("flagn0", 0);
target.flags10 = GetIntEntry("flago0", 0);
target.tflags = GetIntEntry("tflag0", 0); target.tflags = GetIntEntry("tflag0", 0);
target.dflags = GetIntEntry("dflag0", 0); target.dflags = GetIntEntry("dflag0", 0);
target.posx = GetIntEntry("posx0", 0); target.posx = GetIntEntry("posx0", 0);

Binary file not shown.