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
// 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:

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.
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);
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;

View File

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

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.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);
}
}

View File

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

View File

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

View File

@ -27,7 +27,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#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];
}

Binary file not shown.

View File

@ -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<DDSQLEN;i++) {
if (SurfaceDB[i].lpdds == NULL) break;
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_ZBUFFER) && SurfaceDB[i].uRef) iZCount++;
}
if(iPCount > 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<DDSQLEN;i++) {
lpDDS3DRef = NULL;
// search for valid entries and copy to safe place
for (i=0, j=0; i<DDSQLEN; i++) {
if(SurfaceDB[i].lpdds == NULL) break;
LastEntries[SurfaceDB[i].uRole]=SurfaceDB[i];
if(SurfaceDB[i].uRef) NewEntries[j++]=SurfaceDB[i];
}
// clear all
for (i=0;i<DDSQLEN;i++) {
SurfaceDB[i].lpdds = NULL;
SurfaceDB[i].uRef = FALSE;
SurfaceDB[i].uRole = 0;
SurfaceDB[i].uVersion = 0;
}
// bring back the valid entries to db
i = 0;
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
NewEntries[j].lpdds = NULL; // terminator
// move back to original list
for (i=0; i<DDSQLEN; i++) {
if(NewEntries[i].lpdds == NULL) break;
SurfaceDB[i]=NewEntries[i];
switch(SurfaceDB[i].uRole){
case SURFACE_ROLE_PRIMARY: lpDDSPrimary = SurfaceDB[i].lpdds; break;
case SURFACE_ROLE_BACKBUFFER: lpDDSBackBuffer = SurfaceDB[i].lpdds; break;
case SURFACE_ROLE_ZBUFFER: lpDDSZBuffer = SurfaceDB[i].lpdds; break;
}
}
SurfaceDB[i].lpdds = 0; // terminator
#ifdef DXW_SURFACE_STACK_TRACING
DumpSurfaceList(SurfaceDB);
#endif
@ -204,30 +192,49 @@ void dxwSStack::PushZBufferSurface(LPDIRECTDRAWSURFACE ps, int version, DWORD dw
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 sentry;
#ifdef DXW_SURFACE_STACK_TRACING
OutTraceSDB(">>> SURFACELIST DUPL: from=%x to=%x vers=%d\n", psfrom, psto, version);
#endif
// search for source or empty slot
for (i=0;i<DDSQLEN;i++) {
e=&SurfaceDB[i];
if ((e->lpdds==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;j<DDSQLEN;j++) if (!SurfaceDB[j].lpdds) break;
if (!e->lpdds) return 0;
// save surface entry
sentry = *e;
// 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
SurfaceDB[j] = SurfaceDB[i];
SurfaceDB[j].lpdds = psto;
SurfaceDB[j].uVersion = version;
// either overriding the old entry or writing a new one
*e = sentry;
e->lpdds = 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<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)
{
// Get a surface marked for the desired role (either PRIMARY or BACKBUFFER) and
@ -351,3 +370,17 @@ DWORD dxwSStack::GetCaps(LPDIRECTDRAWSURFACE ps)
}
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 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);

View File

@ -16,6 +16,13 @@
#include <Winuser.h>
#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);

View File

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

View File

@ -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; 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( ??? );
//hSDB = pSdbInitDatabase(HID_DATABASE_TYPE_MASK|SDB_DATABASE_MAIN_SHIM, NULL);
hSDB = pSdbInitDatabase(SDB_DATABASE_MAIN_SHIM, NULL);
if(!hSDB){
sprintf(sBuf, "Can't initialize shims database\n");
return (sBuf);
}
else{
bRet = pSdbGetMatchingExe(NULL, (LPCWSTR)szFileName, NULL, NULL, 0, &result);
if(!bRet){
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;
}

View File

@ -29,12 +29,15 @@ void CTabWindow::DoDataExchange(CDataExchange* pDX)
CDialog::DoDataExchange(pDX);
CTargetDlg *cTarget = ((CTargetDlg *)(this->GetParent()->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);

View File

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

View File

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

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));
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);

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;
}
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);

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.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);

Binary file not shown.