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

v2_02_36_src

Former-commit-id: 178cc79be8d4d9da34476bbe4f5e51f44d840c13
This commit is contained in:
gho tik 2013-09-22 12:38:19 -04:00 committed by Refael ACkermann
parent 8b109aa710
commit e0e9bcffd2
22 changed files with 165 additions and 151 deletions

View File

@ -100,19 +100,21 @@
#define YUV2RGB 0x00040000 // Simulate YUV to RGB color conversion #define YUV2RGB 0x00040000 // Simulate YUV to RGB color conversion
#define RGB2YUV 0x00080000 // Simulate RGB to YUV color conversion #define RGB2YUV 0x00080000 // Simulate RGB to YUV color conversion
#define BUFFEREDIOFIX 0x00100000 // fix buffered IO incompatibilities between pre-Win98 and post-WinNT #define BUFFEREDIOFIX 0x00100000 // fix buffered IO incompatibilities between pre-Win98 and post-WinNT
#define FILTERMESSAGES 0x00200000 // eliminates window-related messages that might be offending for a fullscreen program #define FILTERMESSAGES 0x00200000 // ignore offending messages that are typical of a window and are hot handled by a fullscreeen app
#define PEEKALLMESSAGES 0x00400000 // force Peek-ing all sort of messages to avoid Win7 message queue saturation that leads to program halt
// logging Tflags DWORD: // logging Tflags DWORD:
#define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general #define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general
#define OUTDDRAWTRACE 0x00000002 // traces DxWnd directdraw screen handling #define OUTDDRAWTRACE 0x00000002 // traces DxWnd directdraw screen handling
#define OUTWINMESSAGES 0x00000004 // traces windows messages #define OUTWINMESSAGES 0x00000004 // traces windows messages
#define OUTCURSORTRACE 0x00000008 // traces windows messages #define OUTCURSORTRACE 0x00000008 // traces cursor positions & operations
#define OUTPROXYTRACE 0x00000010 // warning: it also enables proxy functions !!!! #define OUTPROXYTRACE 0x00000010 // warning: it also enables proxy functions !!!!
#define DXPROXED 0x00000020 // hook DX proxy methods to log each call in original behaviour #define DXPROXED 0x00000020 // hook DX proxy methods to log each call in original behaviour
#define ASSERTDIALOG 0x00000040 // show assert messages in Dialog Box #define ASSERTDIALOG 0x00000040 // show assert messages in Dialog Box
#define OUTIMPORTTABLE 0x00000080 // dump import table contents #define OUTIMPORTTABLE 0x00000080 // dump import table contents
#define OUTDEBUG 0x00000100 // detailed debugging indormation #define OUTDEBUG 0x00000100 // detailed debugging indormation
#define OUTREGISTRY 0x00000200 // log registry operations #define OUTREGISTRY 0x00000200 // log registry operations
#define TRACEHOOKS 0x00000400 // log hook operations
#define EMULATEFLAGS (EMULATEBUFFER | EMULATESURFACE | LOCKEDSURFACE) #define EMULATEFLAGS (EMULATEBUFFER | EMULATESURFACE | LOCKEDSURFACE)
#define HANDLEFPS (SHOWFPS | SHOWFPSOVERLAY | LIMITFPS | SKIPFPS) #define HANDLEFPS (SHOWFPS | SHOWFPSOVERLAY | LIMITFPS | SKIPFPS)
@ -186,6 +188,7 @@ LRESULT CALLBACK extWindowProc(HWND, UINT, WPARAM, LPARAM);
#define OutTraceC if(dxw.dwTFlags & OUTCURSORTRACE) OutTrace #define OutTraceC if(dxw.dwTFlags & OUTCURSORTRACE) OutTrace
#define OutTraceB if(dxw.dwTFlags & OUTDEBUG) OutTrace #define OutTraceB if(dxw.dwTFlags & OUTDEBUG) OutTrace
#define OutTraceR if(dxw.dwTFlags & OUTREGISTRY) OutTrace #define OutTraceR if(dxw.dwTFlags & OUTREGISTRY) OutTrace
#define OutTraceH if(dxw.dwTFlags & TRACEHOOKS) OutTrace
#define OutTraceP OutTrace #define OutTraceP OutTrace
#define OutTraceE OutTrace #define OutTraceE OutTrace
@ -194,6 +197,7 @@ LRESULT CALLBACK extWindowProc(HWND, UINT, WPARAM, LPARAM);
#define IsTraceD (dxw.dwTFlags & OUTDDRAWTRACE) #define IsTraceD (dxw.dwTFlags & OUTDDRAWTRACE)
#define IsTraceC (dxw.dwTFlags & OUTCURSORTRACE) #define IsTraceC (dxw.dwTFlags & OUTCURSORTRACE)
#define IsTraceR (dxw.dwTFlags & OUTREGISTRY) #define IsTraceR (dxw.dwTFlags & OUTREGISTRY)
#define IsTraceH (dxw.dwTFlags & TRACEHOOKS)
#define IsTraceP (TRUE) #define IsTraceP (TRUE)
#define IsTraceE (TRUE) #define IsTraceE (TRUE)
#define IsDebug (dxw.dwTFlags & OUTDEBUG) #define IsDebug (dxw.dwTFlags & OUTDEBUG)

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:3f5743861a1292a4618e1a2ba0010db02dbcd6cf7af54405d41963ffc14594c0 oid sha256:87bb2172d84948aba5cd6af6e3b810430441b3935584ea3d46b3ef4c0bf1f8ed
size 407040 size 407552

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1 version https://git-lfs.github.com/spec/v1
oid sha256:fdfc4f4a7a785e89e56cf5ea2ec95e1735e2ffe4a572a4036764839d377bf628 oid sha256:6228efb8d349dfee02f1fc5b997651e2bb36d01120398c7743ab495286852aeb
size 524800 size 525312

View File

@ -1,52 +0,0 @@
[window]
posx=1435
posy=210
sizx=320
sizy=420
[target]
title0=Rayman 2 Demo
path0=D:\Games\Rayman2Demo\Rayman2Demo.exe
module0=
opengllib0=
ver0=1
coord0=0
flag0=402653217
flagg0=1207959552
flagh0=2097172
flagi0=0
tflag0=64
initx0=0
inity0=0
minx0=0
miny0=0
maxx0=0
maxy0=0
posx0=50
posy0=50
sizx0=800
sizy0=600
maxfps0=0
initts0=0
title1=Mirror's Edge
path1=D:\Games\Mirror's Edge\Binaries\MirrorsEdge.exe
module1=
opengllib1=
ver1=0
coord1=0
flag1=134217762
flagg1=1207959552
flagh1=2097172
flagi1=0
tflag1=512
initx1=0
inity1=0
minx1=0
miny1=0
maxx1=0
maxy1=0
posx1=50
posy1=50
sizx1=800
sizy1=600
maxfps1=0
initts1=6

View File

@ -260,7 +260,11 @@ fixed BACKBUFFER surface attributes in direct (not emulated) mode: Rayman 2 play
added FILTERMESSAGES flag ("filter offending messages") to eliminate some problems to games not developed to work windowized (Rayman 2, Mirror's Edge ...) added FILTERMESSAGES flag ("filter offending messages") to eliminate some problems to games not developed to work windowized (Rayman 2, Mirror's Edge ...)
fixed bug crashing the program when "keep aspect ratio" is selected with window size set to 0 fixed bug crashing the program when "keep aspect ratio" is selected with window size set to 0
v2.02.36
hooked GetAttachedSurface to non-PRIMARY surface to track ZBUFFER attach to BACKBUFFER. Useless, so far...
revised capability handling in CreateSurface
hook trace is now activated from a separate log flag to reduce debug log size
added "Peek all messages in queue" to avoid queue saturation and automatic task kill in Win7 (thank to P K help)
fixed message handling in the case messages are passed to a routine handle

View File

@ -268,6 +268,7 @@ static void RefProbe(INTERFACE *obj, char *op, int line)
OutTrace("### COM obj=%x op=%s refcount=%d at %d ###\n", obj, op, (*pReleaseS)((LPDIRECTDRAWSURFACE)obj), line); OutTrace("### COM obj=%x op=%s refcount=%d at %d ###\n", obj, op, (*pReleaseS)((LPDIRECTDRAWSURFACE)obj), line);
} }
//#define REFPROVE_TEST // comment out to eliminate
#ifdef REFPROVE_TEST #ifdef REFPROVE_TEST
#define REFPROBE(obj, op) RefProbe((INTERFACE *)(obj), op, __LINE__) #define REFPROBE(obj, op) RefProbe((INTERFACE *)(obj), op, __LINE__)
#else #else
@ -1287,6 +1288,22 @@ static void HookDDSurfaceGeneric(LPDIRECTDRAWSURFACE *lplpdds, int dxversion)
SetHook((void *)(**(DWORD **)lplpdds + 28), extBltFast, (void **)&pBltFast, "BltFast(S)"); SetHook((void *)(**(DWORD **)lplpdds + 28), extBltFast, (void **)&pBltFast, "BltFast(S)");
// IDirectDrawSurface::DeleteAttachedSurface // IDirectDrawSurface::DeleteAttachedSurface
SetHook((void *)(**(DWORD **)lplpdds + 32), extDeleteAttachedSurface, (void **)&pDeleteAttachedSurface, "DeleteAttachedSurface(S)"); SetHook((void *)(**(DWORD **)lplpdds + 32), extDeleteAttachedSurface, (void **)&pDeleteAttachedSurface, "DeleteAttachedSurface(S)");
// IDirectDrawSurface::GetAttachedSurface
switch(dxversion) {
case 1:
case 2:
SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface1, (void **)&pGetAttachedSurface1, "GetAttachedSurface(S1)");
break;
case 3:
SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface3, (void **)&pGetAttachedSurface3, "GetAttachedSurface(S3)");
break;
case 4:
SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface4, (void **)&pGetAttachedSurface4, "GetAttachedSurface(S4)");
break;
case 7:
SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface7, (void **)&pGetAttachedSurface7, "GetAttachedSurface(S7)");
break;
}
// IDirectDrawSurface::GetCaps // IDirectDrawSurface::GetCaps
switch(dxversion) { switch(dxversion) {
case 1: case 1:
@ -1350,22 +1367,6 @@ static void HookDDSurfaceGeneric(LPDIRECTDRAWSURFACE *lplpdds, int dxversion)
SetHook((void *)(**(DWORD **)lplpdds + 16), extAddOverlayDirtyRectProxy, (void **)&pAddOverlayDirtyRect, "AddOverlayDirtyRect(S)"); SetHook((void *)(**(DWORD **)lplpdds + 16), extAddOverlayDirtyRectProxy, (void **)&pAddOverlayDirtyRect, "AddOverlayDirtyRect(S)");
// IDirectDrawSurface::BltBatch // IDirectDrawSurface::BltBatch
SetHook((void *)(**(DWORD **)lplpdds + 24), extBltBatchProxy, (void **)&pBltBatch, "BltBatch(S)"); SetHook((void *)(**(DWORD **)lplpdds + 24), extBltBatchProxy, (void **)&pBltBatch, "BltBatch(S)");
// IDirectDrawSurface::GetAttachedSurface
switch(dxversion) {
case 1:
case 2:
SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface1Proxy, (void **)&pGetAttachedSurface1, "GetAttachedSurface(S1)");
break;
case 3:
SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface3Proxy, (void **)&pGetAttachedSurface3, "GetAttachedSurface(S3)");
break;
case 4:
SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface4Proxy, (void **)&pGetAttachedSurface4, "GetAttachedSurface(S4)");
break;
case 7:
SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface7Proxy, (void **)&pGetAttachedSurface7, "GetAttachedSurface(S7)");
break;
}
// IDirectDrawSurface::EnumAttachedSurfaces // IDirectDrawSurface::EnumAttachedSurfaces
SetHook((void *)(**(DWORD **)lplpdds + 36), extEnumAttachedSurfaces, (void **)&pEnumAttachedSurfaces, "EnumAttachedSurfaces(S)"); SetHook((void *)(**(DWORD **)lplpdds + 36), extEnumAttachedSurfaces, (void **)&pEnumAttachedSurfaces, "EnumAttachedSurfaces(S)");
// IDirectDrawSurface::EnumOverlayZOrders // IDirectDrawSurface::EnumOverlayZOrders
@ -1739,6 +1740,7 @@ HRESULT WINAPI extQueryInterfaceS(void *lpdds, REFIID riid, LPVOID *obp)
} }
if(lpdds == lpDDSBack) lpDDSBack = (LPDIRECTDRAWSURFACE)*obp; if(lpdds == lpDDSBack) lpDDSBack = (LPDIRECTDRAWSURFACE)*obp;
return 0; return 0;
} }
@ -1947,20 +1949,20 @@ static char *FixSurfaceCaps(LPDDSURFACEDESC2 lpddsd)
// Submarine titans (8BPP) // Submarine titans (8BPP)
OutTrace("FixSurfaceCaps: SystemMemory OffScreen PixelFormat (1)\n"); OutTrace("FixSurfaceCaps: SystemMemory OffScreen PixelFormat (1)\n");
//lpddsd->ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY; //lpddsd->ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY;
lpddsd->ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN; lpddsd->ddsCaps.dwCaps = (DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN);
return SetPixFmt(lpddsd); return SetPixFmt(lpddsd);
break; break;
case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY: case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY:
// Duckman // Duckman
OutTrace("FixSurfaceCaps: SystemMemory OffScreen PixelFormat (2)\n"); OutTrace("FixSurfaceCaps: SystemMemory OffScreen PixelFormat (2)\n");
//lpddsd->ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY; //lpddsd->ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY;
//lpddsd->ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN; //lpddsd->ddsCaps.dwCaps |= (DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN);
return SetPixFmt(lpddsd); return SetPixFmt(lpddsd);
break; break;
case DDSCAPS_SYSTEMMEMORY|DDSCAPS_ZBUFFER: case DDSCAPS_SYSTEMMEMORY|DDSCAPS_ZBUFFER:
// the Sims // the Sims
OutTrace("FixSurfaceCaps: SystemMemory ZBuffer for the Sims\n"); OutTrace("FixSurfaceCaps: SystemMemory ZBuffer for the Sims\n");
//lpddsd->ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY|DDSCAPS_ZBUFFER; identical ... //lpddsd->ddsCaps.dwCaps = (DDSCAPS_SYSTEMMEMORY|DDSCAPS_ZBUFFER); identical ...
return "ZBUFFER"; return "ZBUFFER";
break; break;
} }
@ -2005,7 +2007,7 @@ static char *FixSurfaceCaps(LPDDSURFACEDESC2 lpddsd)
if(((lpddsd->dwFlags & (DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT)) == (DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT)) && if(((lpddsd->dwFlags & (DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT)) == (DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT)) &&
(lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER)){ (lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER)){
OutTraceB("FixSurfaceCaps: Experimental pixelformat for ZBUFFER case\n"); OutTraceB("FixSurfaceCaps: Experimental pixelformat for ZBUFFER case\n");
lpddsd->ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY; // Evany lpddsd->ddsCaps.dwCaps &= ~(DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); // Evany
lpddsd->ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; lpddsd->ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY;
return "ZBUFFER"; return "ZBUFFER";
} }
@ -2021,9 +2023,9 @@ static char *FixSurfaceCaps(LPDDSURFACEDESC2 lpddsd)
} }
// adjust pixel format // adjust pixel format
OutTraceB("FixSurfaceCaps: suppress DDSCAPS_VIDEOMEMORY case\n"); OutTraceB("FixSurfaceCaps: suppress DDSCAPS_VIDEOMEMORY case\n");
lpddsd->dwFlags |= DDSD_CAPS | DDSD_PIXELFORMAT; lpddsd->dwFlags |= (DDSD_CAPS|DDSD_PIXELFORMAT);
lpddsd->ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY; lpddsd->ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY;
lpddsd->ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN; lpddsd->ddsCaps.dwCaps |= (DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN);
return SetPixFmt(lpddsd); return SetPixFmt(lpddsd);
} }
@ -2041,6 +2043,7 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf
HRESULT res; HRESULT res;
// emulated primary surface // emulated primary surface
#if 0
ClearSurfaceDesc((void *)&ddsd, dxversion); ClearSurfaceDesc((void *)&ddsd, dxversion);
ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT; ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
ddsd.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY | DDSCAPS_OFFSCREENPLAIN; ddsd.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY | DDSCAPS_OFFSCREENPLAIN;
@ -2051,6 +2054,17 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf
ddsd.dwWidth = dxw.GetScreenWidth(); ddsd.dwWidth = dxw.GetScreenWidth();
ddsd.dwHeight = dxw.GetScreenHeight(); ddsd.dwHeight = dxw.GetScreenHeight();
SetPixFmt((LPDDSURFACEDESC2)&ddsd); SetPixFmt((LPDDSURFACEDESC2)&ddsd);
#else
memcpy((void *)&ddsd, lpddsd, lpddsd->dwSize);
ddsd.dwFlags &= ~(DDSD_BACKBUFFERCOUNT|DDSD_REFRESHRATE);
ddsd.dwFlags |= (DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT);
ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM);
// DDSCAPS_OFFSCREENPLAIN seems required to support the palette in memory surfaces
ddsd.ddsCaps.dwCaps |= (DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN);
ddsd.dwWidth = dxw.GetScreenWidth();
ddsd.dwHeight = dxw.GetScreenHeight();
SetPixFmt((LPDDSURFACEDESC2)&ddsd);
#endif
// create Primary surface // create Primary surface
DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]" , __LINE__); DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]" , __LINE__);
@ -2134,7 +2148,7 @@ static HRESULT BuildPrimaryDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf
// genuine primary surface // genuine primary surface
memcpy((void *)&ddsd, lpddsd, lpddsd->dwSize); memcpy((void *)&ddsd, lpddsd, lpddsd->dwSize);
ddsd.dwFlags &= ~(DDSD_WIDTH|DDSD_HEIGHT|DDSD_BACKBUFFERCOUNT|DDSD_REFRESHRATE|DDSD_PIXELFORMAT); ddsd.dwFlags &= ~(DDSD_WIDTH|DDSD_HEIGHT|DDSD_BACKBUFFERCOUNT|DDSD_REFRESHRATE|DDSD_PIXELFORMAT);
ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_FLIP | DDSCAPS_COMPLEX); ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_FLIP|DDSCAPS_COMPLEX);
// create Primary surface // create Primary surface
DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]" , __LINE__); DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]" , __LINE__);
@ -2192,12 +2206,25 @@ static HRESULT BuildBackBufferEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateS
HRESULT res; HRESULT res;
// create BackBuffer surface // create BackBuffer surface
#if 0
ClearSurfaceDesc((void *)&ddsd, dxversion); ClearSurfaceDesc((void *)&ddsd, dxversion);
ddsd.dwFlags = DDSD_CAPS|DDSD_PIXELFORMAT|DDSD_HEIGHT|DDSD_WIDTH; ddsd.dwFlags = DDSD_CAPS|DDSD_PIXELFORMAT|DDSD_HEIGHT|DDSD_WIDTH;
ddsd.ddsCaps.dwCaps=DDSCAPS_SYSTEMMEMORY | DDSCAPS_OFFSCREENPLAIN; ddsd.ddsCaps.dwCaps=DDSCAPS_SYSTEMMEMORY | DDSCAPS_OFFSCREENPLAIN;
ddsd.dwWidth = dxw.GetScreenWidth(); ddsd.dwWidth = dxw.GetScreenWidth();
ddsd.dwHeight = dxw.GetScreenHeight(); ddsd.dwHeight = dxw.GetScreenHeight();
SetPixFmt(&ddsd); SetPixFmt(&ddsd);
#else
memcpy(&ddsd, lpddsd, lpddsd->dwSize);
ddsd.dwFlags &= ~(DDSD_WIDTH|DDSD_HEIGHT|DDSD_BACKBUFFERCOUNT|DDSD_REFRESHRATE);
ddsd.dwFlags |= (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT);
ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_BACKBUFFER|DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM);
// DDSCAPS_OFFSCREENPLAIN seems required to support the palette in memory surfaces
ddsd.ddsCaps.dwCaps |= (DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN);
ddsd.dwWidth = dxw.GetScreenWidth();
ddsd.dwHeight = dxw.GetScreenHeight();
SetPixFmt(&ddsd);
#endif
DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Backbuf]" , __LINE__); DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Backbuf]" , __LINE__);
res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0);
if(res) { if(res) {
@ -2280,23 +2307,19 @@ static HRESULT BuildGenericEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf
HRESULT res; HRESULT res;
memcpy(&ddsd, lpddsd, lpddsd->dwSize); // Copy over .... memcpy(&ddsd, lpddsd, lpddsd->dwSize); // Copy over ....
if(ddsd.dwFlags & DDSD_CAPS){
ddsd.ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY;
}
else{
ddsd.dwFlags |= DDSD_CAPS;
ddsd.ddsCaps.dwCaps = 0;
}
ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY;
//if (dxversion >= 4) ddsd.ddsCaps.dwCaps |= DDSCAPS_OFFSCREENPLAIN;
FixSurfaceCaps(&ddsd); FixSurfaceCaps(&ddsd);
DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Emu Generic]" , __LINE__); DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Emu Generic]" , __LINE__);
res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, pu); res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, pu);
if(res){
// v2.1.81: retry on system memory may fix not only the DDERR_OUTOFVIDEOMEMORY
// error, but the DDERR_INVALIDPIXELFORMAT (see "The Sims ???")
if ((dxw.dwFlags1 & SWITCHVIDEOMEMORY) &&
((res==DDERR_OUTOFVIDEOMEMORY) || (res==DDERR_INVALIDPIXELFORMAT))){
OutTraceD("CreateSurface: CreateSurface ERROR err=%x(%s) at %d, retry in SYSTEMMEMORY\n",
res, ExplainDDError(res), __LINE__);
ddsd.dwFlags |= DDSD_CAPS;
ddsd.ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY;
ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY;
DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Emu Generic2]" , __LINE__);
res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0);
}
}
if (res) { if (res) {
OutTraceE("CreateSurface: ERROR on Emu_Generic res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); OutTraceE("CreateSurface: ERROR on Emu_Generic res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
return res; return res;
@ -3931,7 +3954,7 @@ HRESULT WINAPI extGetCapsS(int dxInterface, GetCapsS_Type pGetCapsS, LPDIRECTDRA
// note: C&C95 Gold Edition includes a check for the primary surface NOT having // note: C&C95 Gold Edition includes a check for the primary surface NOT having
// DDSCAPS_SYSTEMMEMORY bit set // DDSCAPS_SYSTEMMEMORY bit set
if(IsPrim) caps->dwCaps = dxw.dwPrimarySurfaceCaps; if(IsPrim) caps->dwCaps |= dxw.dwPrimarySurfaceCaps;
// v2.1.83: add FLIP capability (Funtraks a.k.a. Ignition) // v2.1.83: add FLIP capability (Funtraks a.k.a. Ignition)
// v2.2.26: add VIDEOMEMORY|LOCALVIDMEM capability (Alien Cabal 95 - partial fix) // v2.2.26: add VIDEOMEMORY|LOCALVIDMEM capability (Alien Cabal 95 - partial fix)
if(dxw.dwFlags1 & EMULATESURFACE) { if(dxw.dwFlags1 & EMULATESURFACE) {

View File

@ -78,7 +78,7 @@ static char *Flag4Names[32]={
static char *TFlagNames[32]={ static char *TFlagNames[32]={
"OUTTRACE", "OUTDDRAWTRACE", "OUTWINMESSAGES", "OUTCURSORTRACE", "OUTTRACE", "OUTDDRAWTRACE", "OUTWINMESSAGES", "OUTCURSORTRACE",
"OUTPROXYTRACE", "DXPROXED", "ASSERTDIALOG", "OUTIMPORTTABLE", "OUTPROXYTRACE", "DXPROXED", "ASSERTDIALOG", "OUTIMPORTTABLE",
"OUTDEBUG", "OUTREGISTRY", "", "", "OUTDEBUG", "OUTREGISTRY", "TRACEHOOKS", "",
"", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "",
@ -167,12 +167,12 @@ void HookDlls(HMODULE module)
__try{ __try{
pnth = PIMAGE_NT_HEADERS(PBYTE(base) + PIMAGE_DOS_HEADER(base)->e_lfanew); pnth = PIMAGE_NT_HEADERS(PBYTE(base) + PIMAGE_DOS_HEADER(base)->e_lfanew);
if(!pnth) { if(!pnth) {
OutTraceB("HookDlls: ERROR no pnth at %d\n", __LINE__); OutTraceH("HookDlls: ERROR no pnth at %d\n", __LINE__);
return; return;
} }
rva = pnth->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; rva = pnth->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
if(!rva) { if(!rva) {
OutTraceB("HookDlls: ERROR no rva at %d\n", __LINE__); OutTraceH("HookDlls: ERROR no rva at %d\n", __LINE__);
return; return;
} }
@ -190,18 +190,18 @@ void HookDlls(HMODULE module)
if(idx != -1) { if(idx != -1) {
DllBase=GetModuleHandle(impmodule); DllBase=GetModuleHandle(impmodule);
SysLibs[idx]=DllBase; SysLibs[idx]=DllBase;
OutTraceB("HookDlls: system module %s at %x\n", impmodule, DllBase); OutTraceH("HookDlls: system module %s at %x\n", impmodule, DllBase);
continue; continue;
} }
OutTraceB("HookDlls: ENTRY timestamp=%x module=%s forwarderchain=%x\n", OutTraceH("HookDlls: ENTRY timestamp=%x module=%s forwarderchain=%x\n",
pidesc->TimeDateStamp, impmodule, pidesc->ForwarderChain); pidesc->TimeDateStamp, impmodule, pidesc->ForwarderChain);
if(pidesc->OriginalFirstThunk) { if(pidesc->OriginalFirstThunk) {
ptname = (PIMAGE_THUNK_DATA)(base + (DWORD)pidesc->OriginalFirstThunk); ptname = (PIMAGE_THUNK_DATA)(base + (DWORD)pidesc->OriginalFirstThunk);
} }
else{ else{
ptname = 0; ptname = 0;
OutTraceB("HookDlls: no PE OFTs - stripped module=%s\n", impmodule); OutTraceH("HookDlls: no PE OFTs - stripped module=%s\n", impmodule);
} }
DllBase=GetModuleHandle(impmodule); DllBase=GetModuleHandle(impmodule);
@ -283,7 +283,7 @@ void SetHook(void *target, void *hookproc, void **hookedproc, char *hookname)
static DWORD MinHook=0xFFFFFFFF; static DWORD MinHook=0xFFFFFFFF;
static DWORD MaxHook=0; static DWORD MaxHook=0;
OutTraceB("SetHook: DEBUG target=%x, proc=%x name=%s\n", target, hookproc, hookname); OutTraceH("SetHook: DEBUG target=%x, proc=%x name=%s\n", target, hookproc, hookname);
// keep track of hooked call range to avoid re-hooking of hooked addresses !!! // keep track of hooked call range to avoid re-hooking of hooked addresses !!!
if ((DWORD)hookproc < MinHook) MinHook=(DWORD)hookproc; if ((DWORD)hookproc < MinHook) MinHook=(DWORD)hookproc;
if ((DWORD)hookproc > MaxHook) MaxHook=(DWORD)hookproc; if ((DWORD)hookproc > MaxHook) MaxHook=(DWORD)hookproc;
@ -488,7 +488,7 @@ void *HookAPI(HMODULE module, char *dll, void *apiproc, const char *apiname, voi
pidesc ++; pidesc ++;
} }
if(!pidesc->FirstThunk) { if(!pidesc->FirstThunk) {
OutTraceB("HookAPI: PE unreferenced dll=%s\n", dll); OutTraceH("HookAPI: PE unreferenced dll=%s\n", dll);
return 0; return 0;
} }
@ -496,7 +496,7 @@ void *HookAPI(HMODULE module, char *dll, void *apiproc, const char *apiname, voi
ptname = (pidesc->OriginalFirstThunk) ? (PIMAGE_THUNK_DATA)(base + (DWORD)pidesc->OriginalFirstThunk) : NULL; ptname = (pidesc->OriginalFirstThunk) ? (PIMAGE_THUNK_DATA)(base + (DWORD)pidesc->OriginalFirstThunk) : NULL;
if((apiproc==NULL) && (ptname==NULL)){ if((apiproc==NULL) && (ptname==NULL)){
if (IsDebug) OutTraceD("HookAPI: unreacheable api=%s dll=%s\n", apiname, dll); OutTraceH("HookAPI: unreacheable api=%s dll=%s\n", apiname, dll);
return 0; return 0;
} }
@ -531,7 +531,7 @@ void *HookAPI(HMODULE module, char *dll, void *apiproc, const char *apiname, voi
OutTraceD("HookAPI: FlushInstructionCache error %d at %d\n", GetLastError(), __LINE__); OutTraceD("HookAPI: FlushInstructionCache error %d at %d\n", GetLastError(), __LINE__);
return 0; return 0;
} }
if(IsDebug) OutTrace("HookAPI hook=%s address=%x->%x\n", apiname, org, hookproc); OutTraceH("HookAPI hook=%s address=%x->%x\n", apiname, org, hookproc);
} }
__except(EXCEPTION_EXECUTE_HANDLER) __except(EXCEPTION_EXECUTE_HANDLER)
{ {
@ -657,11 +657,6 @@ void AdjustWindowFrame(HWND hwnd, DWORD width, DWORD height)
// fixing windows message handling procedure // fixing windows message handling procedure
pWindowProc = (WNDPROC)(*pGetWindowLong)(hwnd, GWL_WNDPROC); pWindowProc = (WNDPROC)(*pGetWindowLong)(hwnd, GWL_WNDPROC);
if (((DWORD)pWindowProc & 0xFFFF0000) == 0xFFFF0000){
// don't hook pseudo-callbacks (v2.1.71: Commandos 2)
OutTraceD("GetWindowLong: no valid WindowProc routine detected, hwnd=%x WindowProc=%x\n", hwnd, (DWORD)pWindowProc);
}
else
if (pWindowProc == extWindowProc){ if (pWindowProc == extWindowProc){
// hooked already !!! // hooked already !!!
OutTraceD("GetWindowLong: extWindowProc already in place, hwnd=%x\n", hwnd); OutTraceD("GetWindowLong: extWindowProc already in place, hwnd=%x\n", hwnd);
@ -1090,7 +1085,6 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp
case VK_F6: case VK_F6:
case VK_F5: case VK_F5:
if (dxw.dwFlags2 & TIMESTRETCH) { if (dxw.dwFlags2 & TIMESTRETCH) {
char *sTSCaption[17]={"x16","x8","x4","x2","x1",":2",":4",":8",":16"};
if (wparam == VK_F5 && (dxw.TimeShift < 8)) dxw.TimeShift++; if (wparam == VK_F5 && (dxw.TimeShift < 8)) dxw.TimeShift++;
if (wparam == VK_F6 && (dxw.TimeShift > -8)) dxw.TimeShift--; if (wparam == VK_F6 && (dxw.TimeShift > -8)) dxw.TimeShift--;
OutTrace("Time Stretch: shift=%d speed=%s\n", dxw.TimeShift, dxw.GetTSCaption()); OutTrace("Time Stretch: shift=%d speed=%s\n", dxw.TimeShift, dxw.GetTSCaption());
@ -1116,7 +1110,10 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp
// (*pWindowProc), extWindowProc, message, ExplainWinMessage(message), wparam, lparam); // (*pWindowProc), extWindowProc, message, ExplainWinMessage(message), wparam, lparam);
if(pWindowProc) { if(pWindowProc) {
LRESULT ret; LRESULT ret;
ret=(*pWindowProc)(hwnd, message, wparam, lparam);
// v2.02.36: use CallWindowProc that handles WinProc handles
ret=(*pCallWindowProc)(pWindowProc, hwnd, message, wparam, lparam);
// save last NCHITTEST cursor position for use with KEEPASPECTRATIO scaling // save last NCHITTEST cursor position for use with KEEPASPECTRATIO scaling
if(message==WM_NCHITTEST) LastCursorPos=ret; if(message==WM_NCHITTEST) LastCursorPos=ret;
// v2.1.89: if FORCEWINRESIZE add standard processing for the missing WM_NC* messages // v2.1.89: if FORCEWINRESIZE add standard processing for the missing WM_NC* messages

View File

@ -911,7 +911,7 @@ char *dxwCore::GetTSCaption(int shift)
"x1", "x1",
":1.5",":2",":3",":4", ":1.5",":2",":3",":4",
":6",":8",":12",":16"}; ":6",":8",":12",":16"};
if (shift<0 || shift>16) return "???"; if (shift<(-8) || shift>(+8)) return "???";
return sTSCaption[shift+8]; return sTSCaption[shift+8];
} }
char *dxwCore::GetTSCaption(void) char *dxwCore::GetTSCaption(void)

Binary file not shown.

View File

@ -520,9 +520,13 @@ BOOL WINAPI extReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRea
static char *IOBuffer=NULL; static char *IOBuffer=NULL;
DWORD BytesRead; DWORD BytesRead;
DWORD Cursor; DWORD Cursor;
//HANDLE hFileRead;
OutTrace("ReadFile: hFile=%x Buffer=%x BytesToRead=%d\n", hFile, lpBuffer, nNumberOfBytesToRead); OutTrace("ReadFile: hFile=%x Buffer=%x BytesToRead=%d\n", hFile, lpBuffer, nNumberOfBytesToRead);
#define SECTOR_SIZE 4096 #define SECTOR_SIZE 4096
//#define LEGACY_SIZE 1024
#define LEGACY_SIZE 1024
if(!IOBuffer) { // initial allocation if(!IOBuffer) { // initial allocation
IOHeap=HeapCreate(0, 0, 0); IOHeap=HeapCreate(0, 0, 0);
@ -538,14 +542,18 @@ BOOL WINAPI extReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRea
OutTrace("ReadFile: BUFFERED BEFORE BytesRequested=%d FileSize=%d where=%d\n", OutTrace("ReadFile: BUFFERED BEFORE BytesRequested=%d FileSize=%d where=%d\n",
nNumberOfBytesToRead, FileLength, Where); nNumberOfBytesToRead, FileLength, Where);
if((Where+nNumberOfBytesToRead)<=FileLength) if((Where+nNumberOfBytesToRead)<=FileLength)
*lpNumberOfBytesRead=nNumberOfBytesToRead; *lpNumberOfBytesRead=nNumberOfBytesToRead;
else else
*lpNumberOfBytesRead=FileLength-Where; *lpNumberOfBytesRead=FileLength-Where;
if (*lpNumberOfBytesRead < 0) *lpNumberOfBytesRead=0; if (*lpNumberOfBytesRead < 0) *lpNumberOfBytesRead=0;
memcpy(lpBuffer, IOBuffer+Where, nNumberOfBytesToRead); memcpy((char *)lpBuffer, IOBuffer+Where, *lpNumberOfBytesRead);
OutTrace("ReadFile: ");
for(unsigned int i=0; i<*lpNumberOfBytesRead; i++) OutTrace("%02X,", *((unsigned char *)lpBuffer+i));
OutTrace("\n");
OutTrace("ReadFile: BUFFERED READ BytesRequested=%d BytesRead=%d where=%d\n", OutTrace("ReadFile: BUFFERED READ BytesRequested=%d BytesRead=%d where=%d\n",
nNumberOfBytesToRead, *lpNumberOfBytesRead, Where); nNumberOfBytesToRead, *lpNumberOfBytesRead, Where);
Where += (*lpNumberOfBytesRead); Where += (*lpNumberOfBytesRead);
//Where = ((Where+(LEGACY_SIZE-1)) / LEGACY_SIZE) * LEGACY_SIZE;
return TRUE; return TRUE;
} }
@ -561,17 +569,25 @@ BOOL WINAPI extReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRea
OutTraceE("SetFilePointer ERROR: err=%d at %d\n", GetLastError(), __LINE__); OutTraceE("SetFilePointer ERROR: err=%d at %d\n", GetLastError(), __LINE__);
return FALSE; return FALSE;
} }
OutTrace("SetFilePointer: current pos=%d\n", Where);
//hFileRead=ReOpenFile(hFile, 0, 0, 0);
do {// try to read it all do {// try to read it all
// when space is not enough, let's grow! // when space is not enough, let's grow!
if((DWORD)(IOBuffer+Cursor+SECTOR_SIZE) > (DWORD)IOHeapSize){ if((DWORD)(Cursor+SECTOR_SIZE) > (DWORD)IOHeapSize){
IOHeapSize += 200*SECTOR_SIZE; OutTrace("HeapReAlloc: about to add another chunk... current size=%d\n", IOHeapSize);
IOHeapSize += (200*SECTOR_SIZE);
IOBuffer=(char *)HeapReAlloc(IOHeap, 0, IOBuffer, IOHeapSize); IOBuffer=(char *)HeapReAlloc(IOHeap, 0, IOBuffer, IOHeapSize);
if(IOBuffer==0) OutTraceE("HeapReAlloc ERROR: err=%d at %d\n", GetLastError(), __LINE__); if(IOBuffer==0) OutTraceE("HeapReAlloc ERROR: err=%d at %d\n", GetLastError(), __LINE__);
} }
ret=(*pReadFile)(hFile, IOBuffer+Cursor, SECTOR_SIZE, &BytesRead, lpOverlapped); // read one block ret=(*pReadFile)(hFile, IOBuffer+Cursor, SECTOR_SIZE, &BytesRead, NULL); // read one block
if(!ret)
OutTrace("ReadFIle ERROR: err=%d at %d\n", GetLastError(), __LINE__);
else
OutTrace("ReadFIle: BytesRead=%d\n", BytesRead);
Cursor+=BytesRead; Cursor+=BytesRead;
if (ret && BytesRead == 0) ret=FALSE; // eof if (ret && BytesRead == 0) ret=FALSE; // eof
} while(ret); } while(ret);
//CloseHandle(hFileRead);
OutTrace("ReadFIle: BUFFERED FileSize=%d\n", Cursor); OutTrace("ReadFIle: BUFFERED FileSize=%d\n", Cursor);
FileLength=Cursor; FileLength=Cursor;
@ -587,6 +603,8 @@ HANDLE WINAPI extCreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwS
OutTrace("CreateFile: FileName=%s DesiredAccess=%x SharedMode=%x Disposition=%x Flags=%x\n", OutTrace("CreateFile: FileName=%s DesiredAccess=%x SharedMode=%x Disposition=%x Flags=%x\n",
lpFileName, dwDesiredAccess, dwShareMode, dwCreationDisposition, dwFlagsAndAttributes); lpFileName, dwDesiredAccess, dwShareMode, dwCreationDisposition, dwFlagsAndAttributes);
//dwFlagsAndAttributes &= ~FILE_FLAG_NO_BUFFERING;
ret=(*pCreateFile)(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); ret=(*pCreateFile)(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
if(ret && (ret != (HANDLE)INVALID_SET_FILE_POINTER)) if(ret && (ret != (HANDLE)INVALID_SET_FILE_POINTER))
OutTrace("CreateFile: ret=%x\n", ret); OutTrace("CreateFile: ret=%x\n", ret);
@ -597,7 +615,10 @@ HANDLE WINAPI extCreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwS
BOOL WINAPI extCloseHandle(HANDLE hObject) BOOL WINAPI extCloseHandle(HANDLE hObject)
{ {
if (hObject==LastFile) LastFile=0; // invalidate cache if (hObject==LastFile) {
LastFile=0; // invalidate cache
OutTrace("CloseHandle: INVALIDATE CACHE hFile=%x\n", hObject);
}
return (*pCloseHandle)(hObject); return (*pCloseHandle)(hObject);
} }
@ -610,6 +631,7 @@ DWORD WINAPI extSetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDista
// if cached file ... // if cached file ...
if(LastFile==hFile){ if(LastFile==hFile){
int LastPos=Where;
if(!lpDistanceToMoveHigh){ if(!lpDistanceToMoveHigh){
OutTrace("SetFilePointer: buffered move\n"); OutTrace("SetFilePointer: buffered move\n");
switch(dwMoveMethod){ switch(dwMoveMethod){
@ -617,7 +639,18 @@ DWORD WINAPI extSetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDista
case FILE_CURRENT: Where+=lDistanceToMove; break; case FILE_CURRENT: Where+=lDistanceToMove; break;
case FILE_END: Where=FileLength-lDistanceToMove; break; case FILE_END: Where=FileLength-lDistanceToMove; break;
} }
OutTrace("SetFilePointer: ret=%x\n", Where); //if(Where % LEGACY_SIZE){
// Where=LastPos;
// SetLastError(ERROR_INVALID_PARAMETER);
// OutTrace("SetFilePointer: ret=INVALID_SET_FILE_POINTER pos=%d\n", Where);
// return INVALID_SET_FILE_POINTER;
//}
// Where = ((Where + LEGACY_SIZE-1) / LEGACY_SIZE) * LEGACY_SIZE;
Where = (Where / LEGACY_SIZE) * LEGACY_SIZE;
OutTrace("SetFilePointer: ret=0x%x(#%d)\n", Where, Where);
return Where; return Where;
} }
} }

View File

@ -127,7 +127,7 @@ FARPROC Remap_user32_ProcAddress(LPCSTR proc, HMODULE hModule)
if (addr=RemapLibrary(proc, hModule, WinHooks)) return addr; if (addr=RemapLibrary(proc, hModule, WinHooks)) return addr;
if((dxw.dwFlags1 & (MODIFYMOUSE|SLOWDOWN|KEEPCURSORWITHIN)) || (dxw.dwFlags2 & KEEPCURSORFIXED)) if((dxw.dwFlags1 & (MODIFYMOUSE|SLOWDOWN|KEEPCURSORWITHIN)) || (dxw.dwFlags2 & KEEPCURSORFIXED))
if (addr=RemapLibrary(proc, hModule, MouseHooks2)) return addr; if (addr=RemapLibrary(proc, hModule, MouseHooks2)) return addr;
if(FALSE) if(dxw.dwFlags3 & PEEKALLMESSAGES)
if (addr=RemapLibrary(proc, hModule, PeekAllHooks)) return addr; if (addr=RemapLibrary(proc, hModule, PeekAllHooks)) return addr;
return NULL; return NULL;
} }
@ -145,7 +145,7 @@ void HookUser32(HMODULE hModule)
if(dxw.dwFlags1 & MODIFYMOUSE)HookLibrary(hModule, MouseHooks, libname); if(dxw.dwFlags1 & MODIFYMOUSE)HookLibrary(hModule, MouseHooks, libname);
if (dxw.dwFlags1 & (PREVENTMAXIMIZE|FIXWINFRAME|LOCKWINPOS|LOCKWINSTYLE))HookLibrary(hModule, WinHooks, libname); if (dxw.dwFlags1 & (PREVENTMAXIMIZE|FIXWINFRAME|LOCKWINPOS|LOCKWINSTYLE))HookLibrary(hModule, WinHooks, libname);
if((dxw.dwFlags1 & (MODIFYMOUSE|SLOWDOWN|KEEPCURSORWITHIN)) || (dxw.dwFlags2 & KEEPCURSORFIXED)) HookLibrary(hModule, MouseHooks2, libname); if((dxw.dwFlags1 & (MODIFYMOUSE|SLOWDOWN|KEEPCURSORWITHIN)) || (dxw.dwFlags2 & KEEPCURSORFIXED)) HookLibrary(hModule, MouseHooks2, libname);
if(FALSE) HookLibrary(hModule, PeekAllHooks, libname); if(dxw.dwFlags3 & PEEKALLMESSAGES) HookLibrary(hModule, PeekAllHooks, libname);
return; return;
} }
@ -784,17 +784,9 @@ BOOL WINAPI extPeekAnyMessage(LPMSG lpMsg, HWND hwnd, UINT wMsgFilterMin, UINT w
{ {
BOOL res; BOOL res;
if(wMsgFilterMin || wMsgFilterMax){ res=(*pPeekMessage)(lpMsg, hwnd, 0, 0, (wRemoveMsg & 0x000F));
while (TRUE){
res=(*pPeekMessage)(lpMsg, hwnd, 0, 0, wRemoveMsg);
if((lpMsg->message >= wMsgFilterMin) && (lpMsg->message <= wMsgFilterMax)) break;
if(!wRemoveMsg)(*pPeekMessage)(lpMsg, hwnd, 0, 0, TRUE);
}
}
else
res=(*pPeekMessage)(lpMsg, hwnd, 0, 0, wRemoveMsg);
OutTraceW("PeekMessage: lpmsg=%x hwnd=%x filter=(%x-%x) remove=%x msg=%x(%s) wparam=%x, lparam=%x pt=(%d,%d) res=%x\n", OutTraceW("PeekMessage: ANY lpmsg=%x hwnd=%x filter=(%x-%x) remove=%x msg=%x(%s) wparam=%x, lparam=%x pt=(%d,%d) res=%x\n",
lpMsg, lpMsg->hwnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg, lpMsg, lpMsg->hwnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg,
lpMsg->message, ExplainWinMessage(lpMsg->message & 0xFFFF), lpMsg->message, ExplainWinMessage(lpMsg->message & 0xFFFF),
lpMsg->wParam, lpMsg->lParam, lpMsg->pt.x, lpMsg->pt.y, res); lpMsg->wParam, lpMsg->lParam, lpMsg->pt.x, lpMsg->pt.y, res);
@ -805,8 +797,12 @@ BOOL WINAPI extPeekAnyMessage(LPMSG lpMsg, HWND hwnd, UINT wMsgFilterMin, UINT w
BOOL WINAPI extPeekMessage(LPMSG lpMsg, HWND hwnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) BOOL WINAPI extPeekMessage(LPMSG lpMsg, HWND hwnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg)
{ {
BOOL res; BOOL res;
UINT iRemoveMsg;
res=(*pPeekMessage)(lpMsg, hwnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); iRemoveMsg = wRemoveMsg;
if(1) iRemoveMsg &= 0x000F; // Peek all messages
res=(*pPeekMessage)(lpMsg, hwnd, wMsgFilterMin, wMsgFilterMax, iRemoveMsg);
OutTraceW("PeekMessage: lpmsg=%x hwnd=%x filter=(%x-%x) remove=%x msg=%x(%s) wparam=%x, lparam=%x pt=(%d,%d) res=%x\n", OutTraceW("PeekMessage: lpmsg=%x hwnd=%x filter=(%x-%x) remove=%x msg=%x(%s) wparam=%x, lparam=%x pt=(%d,%d) res=%x\n",
lpMsg, lpMsg->hwnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg, lpMsg, lpMsg->hwnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg,
@ -1427,10 +1423,10 @@ BOOL WINAPI extGetClipCursor(LPRECT lpRect)
ret=(*pGetClipCursor)(lpRect); ret=(*pGetClipCursor)(lpRect);
if(IsTraceD){ if(IsTraceD){
if (lpRect) if (lpRect)
OutTrace("ClipCursor: PROXED rect=(%d,%d)-(%d,%d) ret=%d\n", OutTrace("GetClipCursor: PROXED rect=(%d,%d)-(%d,%d) ret=%d\n",
lpRect->left,lpRect->top,lpRect->right,lpRect->bottom, ret); lpRect->left,lpRect->top,lpRect->right,lpRect->bottom, ret);
else else
OutTrace("ClipCursor: PROXED rect=(NULL) ret=%d\n", ret); OutTrace("GetClipCursor: PROXED rect=(NULL) ret=%d\n", ret);
} }
return ret; return ret;
} }
@ -1443,7 +1439,7 @@ BOOL WINAPI extGetClipCursor(LPRECT lpRect)
lpRect->right = dxw.GetScreenWidth(); lpRect->right = dxw.GetScreenWidth();
lpRect->bottom = dxw.GetScreenHeight(); lpRect->bottom = dxw.GetScreenHeight();
} }
OutTraceD("ClipCursor: rect=(%d,%d)-(%d,%d) ret=%d\n", OutTraceD("GetClipCursor: rect=(%d,%d)-(%d,%d) ret=%d\n",
lpRect->left,lpRect->top,lpRect->right,lpRect->bottom, TRUE); lpRect->left,lpRect->top,lpRect->right,lpRect->bottom, TRUE);
} }

View File

@ -30,7 +30,8 @@ void WhndStackPush(HWND hwnd, WNDPROC wndproc)
{ {
int StackIdx; int StackIdx;
// wndproc values of 0xFFFFxxxx type seems to be error codes rather than valid callback addresses .... // wndproc values of 0xFFFFxxxx type seems to be error codes rather than valid callback addresses ....
if (((DWORD)wndproc & 0xFFFF0000) == 0xFFFF0000) return; // v2.02.36 using CallWindowProc you can pass WinProc handles, so you don't need to eliminate them!
//if (((DWORD)wndproc & 0xFFFF0000) == 0xFFFF0000) return;
//OutTraceD("DEBUG: WNDPROC STACK push hwnd=%x, wndproc=%x\n", hwnd, wndproc); //OutTraceD("DEBUG: WNDPROC STACK push hwnd=%x, wndproc=%x\n", hwnd, wndproc);
// try update first... // try update first...
for(StackIdx=0; StackIdx<WhndTOS; StackIdx++) for(StackIdx=0; StackIdx<WhndTOS; StackIdx++)

View File

@ -170,6 +170,8 @@
#define IDC_FIXD3DFRAME 1127 #define IDC_FIXD3DFRAME 1127
#define IDC_BUFFEREDIOFIX 1128 #define IDC_BUFFEREDIOFIX 1128
#define IDC_FILTERMESSAGES 1129 #define IDC_FILTERMESSAGES 1129
#define IDC_PEEKALLMESSAGES 1130
#define IDC_TRACEHOOKS 1131
#define ID_MODIFY 32771 #define ID_MODIFY 32771
#define ID_DELETE 32772 #define ID_DELETE 32772
#define ID_ADD 32773 #define ID_ADD 32773

View File

@ -44,6 +44,7 @@ void CTabLogs::DoDataExchange(CDataExchange* pDX)
DDX_Check(pDX, IDC_OUTDXTRACE, cTarget->m_OutDXTrace); DDX_Check(pDX, IDC_OUTDXTRACE, cTarget->m_OutDXTrace);
DDX_Check(pDX, IDC_IMPORTTABLE, cTarget->m_ImportTable); DDX_Check(pDX, IDC_IMPORTTABLE, cTarget->m_ImportTable);
DDX_Check(pDX, IDC_OUTREGISTRY, cTarget->m_RegistryOp); DDX_Check(pDX, IDC_OUTREGISTRY, cTarget->m_RegistryOp);
DDX_Check(pDX, IDC_TRACEHOOKS, cTarget->m_TraceHooks);
if(gbDebug){ if(gbDebug){
DDX_Check(pDX, IDC_DXPROXED, cTarget->m_DXProxed); DDX_Check(pDX, IDC_DXPROXED, cTarget->m_DXProxed);
DDX_Check(pDX, IDC_ASSERT, cTarget->m_AssertDialog); DDX_Check(pDX, IDC_ASSERT, cTarget->m_AssertDialog);

View File

@ -37,6 +37,7 @@ void CTabProgram::DoDataExchange(CDataExchange* pDX)
DDX_Check(pDX, IDC_EMULATEREGISTRY, cTarget->m_EmulateRegistry); DDX_Check(pDX, IDC_EMULATEREGISTRY, cTarget->m_EmulateRegistry);
DDX_Check(pDX, IDC_FULLSCREENONLY, cTarget->m_FullScreenOnly); DDX_Check(pDX, IDC_FULLSCREENONLY, cTarget->m_FullScreenOnly);
DDX_Check(pDX, IDC_FILTERMESSAGES, cTarget->m_FilterMessages); DDX_Check(pDX, IDC_FILTERMESSAGES, cTarget->m_FilterMessages);
DDX_Check(pDX, IDC_PEEKALLMESSAGES, cTarget->m_PeekAllMessages);
DDX_Check(pDX, IDC_HOOKCHILDWIN, cTarget->m_HookChildWin); DDX_Check(pDX, IDC_HOOKCHILDWIN, cTarget->m_HookChildWin);
DDX_Check(pDX, IDC_HOOKENABLED, cTarget->m_HookEnabled); DDX_Check(pDX, IDC_HOOKENABLED, cTarget->m_HookEnabled);
DDX_Check(pDX, IDC_NOBANNER, cTarget->m_NoBanner); DDX_Check(pDX, IDC_NOBANNER, cTarget->m_NoBanner);

View File

@ -52,6 +52,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
m_EmulateRegistry = FALSE; // default true !! m_EmulateRegistry = FALSE; // default true !!
m_FullScreenOnly = FALSE; m_FullScreenOnly = FALSE;
m_FilterMessages = FALSE; m_FilterMessages = FALSE;
m_PeekAllMessages = FALSE;
m_NoBanner = FALSE; m_NoBanner = FALSE;
m_StartDebug = FALSE; m_StartDebug = FALSE;
m_FilePath = _T(""); m_FilePath = _T("");

View File

@ -39,6 +39,7 @@ public:
BOOL m_AssertDialog; BOOL m_AssertDialog;
BOOL m_ImportTable; BOOL m_ImportTable;
BOOL m_RegistryOp; BOOL m_RegistryOp;
BOOL m_TraceHooks;
BOOL m_HandleDC; BOOL m_HandleDC;
BOOL m_UnNotify; BOOL m_UnNotify;
BOOL m_Windowize; BOOL m_Windowize;
@ -46,6 +47,7 @@ public:
BOOL m_EmulateRegistry; BOOL m_EmulateRegistry;
BOOL m_FullScreenOnly; BOOL m_FullScreenOnly;
BOOL m_FilterMessages; BOOL m_FilterMessages;
BOOL m_PeekAllMessages;
BOOL m_NoBanner; BOOL m_NoBanner;
BOOL m_StartDebug; BOOL m_StartDebug;
BOOL m_HookEnabled; BOOL m_HookEnabled;

View File

@ -1,5 +0,0 @@
[window]
posx=1330
posy=241
sizx=320
sizy=200

Binary file not shown.

View File

@ -277,24 +277,26 @@ BEGIN
CONTROL "Emulate Registry",IDC_EMULATEREGISTRY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,150,124,10 CONTROL "Emulate Registry",IDC_EMULATEREGISTRY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,150,124,10
CONTROL "Fullscreen only",IDC_FULLSCREENONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,170,150,114,10 CONTROL "Fullscreen only",IDC_FULLSCREENONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,170,150,114,10
CONTROL "Filter offending messages",IDC_FILTERMESSAGES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,162,114,10 CONTROL "Filter offending messages",IDC_FILTERMESSAGES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,162,114,10
CONTROL "Peek all messages in queue",IDC_PEEKALLMESSAGES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,170,162,114,10
END END
IDD_TAB_LOG DIALOGEX 0, 0, 300, 240 IDD_TAB_LOG DIALOGEX 0, 0, 300, 240
STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN
GROUPBOX "dxwnd.log logs",IDC_STATIC,7,3,129,131 GROUPBOX "dxwnd.log logs",IDC_STATIC,7,3,129,145
CONTROL "Enable Trace",IDC_LOGENABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,25,73,12 CONTROL "Enable Trace",IDC_LOGENABLED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,25,73,12
CONTROL "DxWnd",IDC_OUTTRACE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,46,73,12 CONTROL "DxWnd",IDC_OUTTRACE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,46,73,12
CONTROL "DirectX trace",IDC_OUTDXTRACE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,58,73,12 CONTROL "DirectX trace",IDC_OUTDXTRACE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,58,73,12
CONTROL "Win Events",IDC_OUTWINMESSAGES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,70,73,12 CONTROL "Win Events",IDC_OUTWINMESSAGES,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,70,73,12
CONTROL "Cursor/Mouse",IDC_CURSORTRACE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,82,73,12 CONTROL "Cursor/Mouse",IDC_CURSORTRACE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,82,73,12
CONTROL "Import Table",IDC_IMPORTTABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,94,73,12 CONTROL "Import Table",IDC_IMPORTTABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,94,73,12
GROUPBOX "debug mode only",IDC_STATIC,7,139,130,94 GROUPBOX "debug mode only",IDC_STATIC,7,154,130,79
CONTROL "Assert Dialog",IDC_ASSERT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,152,73,12 CONTROL "Assert Dialog",IDC_ASSERT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,165,73,12
CONTROL "ddraw Proxy",IDC_DXPROXED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,164,73,12 CONTROL "ddraw Proxy",IDC_DXPROXED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,177,73,12
CONTROL "Debug",IDC_OUTDEBUG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,106,73,12 CONTROL "Debug",IDC_OUTDEBUG,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,106,73,12
CONTROL "Registry op.",IDC_OUTREGISTRY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,118,73,12 CONTROL "Registry op.",IDC_OUTREGISTRY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,118,73,12
CONTROL "Hook op.",IDC_TRACEHOOKS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,130,73,12
END END
IDD_TAB_DIRECTX DIALOGEX 0, 0, 300, 240 IDD_TAB_DIRECTX DIALOGEX 0, 0, 300, 240

Binary file not shown.

View File

@ -115,6 +115,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
if(dlg->m_StartDebug) t->flags2 |= STARTDEBUG; if(dlg->m_StartDebug) t->flags2 |= STARTDEBUG;
if(dlg->m_FullScreenOnly) t->flags3 |= FULLSCREENONLY; if(dlg->m_FullScreenOnly) t->flags3 |= FULLSCREENONLY;
if(dlg->m_FilterMessages) t->flags3 |= FILTERMESSAGES; if(dlg->m_FilterMessages) t->flags3 |= FILTERMESSAGES;
if(dlg->m_PeekAllMessages) t->flags3 |= PEEKALLMESSAGES;
t->flags &= ~EMULATEFLAGS; t->flags &= ~EMULATEFLAGS;
switch(dlg->m_DxEmulationMode){ switch(dlg->m_DxEmulationMode){
@ -144,6 +145,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
if(dlg->m_AssertDialog) t->tflags |= ASSERTDIALOG; if(dlg->m_AssertDialog) t->tflags |= ASSERTDIALOG;
if(dlg->m_ImportTable) t->tflags |= OUTIMPORTTABLE; if(dlg->m_ImportTable) t->tflags |= OUTIMPORTTABLE;
if(dlg->m_RegistryOp) t->tflags |= OUTREGISTRY; if(dlg->m_RegistryOp) t->tflags |= OUTREGISTRY;
if(dlg->m_TraceHooks) t->tflags |= TRACEHOOKS;
if(dlg->m_HandleDC) t->flags |= HANDLEDC; if(dlg->m_HandleDC) t->flags |= HANDLEDC;
if(dlg->m_HandleExceptions) t->flags |= HANDLEEXCEPTIONS; if(dlg->m_HandleExceptions) t->flags |= HANDLEEXCEPTIONS;
if(dlg->m_LimitResources) t->flags2 |= LIMITRESOURCES; if(dlg->m_LimitResources) t->flags2 |= LIMITRESOURCES;
@ -245,6 +247,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
dlg->m_StartDebug = t->flags2 & STARTDEBUG ? 1 : 0; dlg->m_StartDebug = t->flags2 & STARTDEBUG ? 1 : 0;
dlg->m_FullScreenOnly = t->flags3 & FULLSCREENONLY ? 1 : 0; dlg->m_FullScreenOnly = t->flags3 & FULLSCREENONLY ? 1 : 0;
dlg->m_FilterMessages = t->flags3 & FILTERMESSAGES ? 1 : 0; dlg->m_FilterMessages = t->flags3 & FILTERMESSAGES ? 1 : 0;
dlg->m_PeekAllMessages = t->flags3 & PEEKALLMESSAGES ? 1 : 0;
dlg->m_DxEmulationMode = 0; dlg->m_DxEmulationMode = 0;
if(t->flags & EMULATEBUFFER) dlg->m_DxEmulationMode = 1; if(t->flags & EMULATEBUFFER) dlg->m_DxEmulationMode = 1;
@ -268,6 +271,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
dlg->m_AssertDialog = t->tflags & ASSERTDIALOG ? 1 : 0; dlg->m_AssertDialog = t->tflags & ASSERTDIALOG ? 1 : 0;
dlg->m_ImportTable = t->tflags & OUTIMPORTTABLE ? 1 : 0; dlg->m_ImportTable = t->tflags & OUTIMPORTTABLE ? 1 : 0;
dlg->m_RegistryOp = t->tflags & OUTREGISTRY ? 1 : 0; dlg->m_RegistryOp = t->tflags & OUTREGISTRY ? 1 : 0;
dlg->m_TraceHooks = t->tflags & TRACEHOOKS ? 1 : 0;
dlg->m_HandleDC = t->flags & HANDLEDC ? 1 : 0; dlg->m_HandleDC = t->flags & HANDLEDC ? 1 : 0;
dlg->m_HandleExceptions = t->flags & HANDLEEXCEPTIONS ? 1 : 0; dlg->m_HandleExceptions = t->flags & HANDLEEXCEPTIONS ? 1 : 0;
dlg->m_SuppressIME = t->flags2 & SUPPRESSIME ? 1 : 0; dlg->m_SuppressIME = t->flags2 & SUPPRESSIME ? 1 : 0;