diff --git a/Include/dxwnd.h b/Include/dxwnd.h index 19f592c..a2d3fdb 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -100,19 +100,21 @@ #define YUV2RGB 0x00040000 // Simulate YUV to RGB 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 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: #define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general #define OUTDDRAWTRACE 0x00000002 // traces DxWnd directdraw screen handling #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 DXPROXED 0x00000020 // hook DX proxy methods to log each call in original behaviour #define ASSERTDIALOG 0x00000040 // show assert messages in Dialog Box #define OUTIMPORTTABLE 0x00000080 // dump import table contents #define OUTDEBUG 0x00000100 // detailed debugging indormation #define OUTREGISTRY 0x00000200 // log registry operations +#define TRACEHOOKS 0x00000400 // log hook operations #define EMULATEFLAGS (EMULATEBUFFER | EMULATESURFACE | LOCKEDSURFACE) #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 OutTraceB if(dxw.dwTFlags & OUTDEBUG) OutTrace #define OutTraceR if(dxw.dwTFlags & OUTREGISTRY) OutTrace +#define OutTraceH if(dxw.dwTFlags & TRACEHOOKS) OutTrace #define OutTraceP OutTrace #define OutTraceE OutTrace @@ -194,6 +197,7 @@ LRESULT CALLBACK extWindowProc(HWND, UINT, WPARAM, LPARAM); #define IsTraceD (dxw.dwTFlags & OUTDDRAWTRACE) #define IsTraceC (dxw.dwTFlags & OUTCURSORTRACE) #define IsTraceR (dxw.dwTFlags & OUTREGISTRY) +#define IsTraceH (dxw.dwTFlags & TRACEHOOKS) #define IsTraceP (TRUE) #define IsTraceE (TRUE) #define IsDebug (dxw.dwTFlags & OUTDEBUG) diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 55ef062..dc4571c 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3f5743861a1292a4618e1a2ba0010db02dbcd6cf7af54405d41963ffc14594c0 -size 407040 +oid sha256:87bb2172d84948aba5cd6af6e3b810430441b3935584ea3d46b3ef4c0bf1f8ed +size 407552 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index d840ab8..876a9db 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fdfc4f4a7a785e89e56cf5ea2ec95e1735e2ffe4a572a4036764839d377bf628 -size 524800 +oid sha256:6228efb8d349dfee02f1fc5b997651e2bb36d01120398c7743ab495286852aeb +size 525312 diff --git a/build/dxwnd.ini b/build/dxwnd.ini deleted file mode 100644 index aeb736c..0000000 --- a/build/dxwnd.ini +++ /dev/null @@ -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 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index dcc2b62..6588311 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -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 ...) 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 diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index 37b7074..ab10273 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -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); } +//#define REFPROVE_TEST // comment out to eliminate #ifdef REFPROVE_TEST #define REFPROBE(obj, op) RefProbe((INTERFACE *)(obj), op, __LINE__) #else @@ -1287,6 +1288,22 @@ static void HookDDSurfaceGeneric(LPDIRECTDRAWSURFACE *lplpdds, int dxversion) SetHook((void *)(**(DWORD **)lplpdds + 28), extBltFast, (void **)&pBltFast, "BltFast(S)"); // IDirectDrawSurface::DeleteAttachedSurface 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 switch(dxversion) { case 1: @@ -1350,22 +1367,6 @@ static void HookDDSurfaceGeneric(LPDIRECTDRAWSURFACE *lplpdds, int dxversion) SetHook((void *)(**(DWORD **)lplpdds + 16), extAddOverlayDirtyRectProxy, (void **)&pAddOverlayDirtyRect, "AddOverlayDirtyRect(S)"); // IDirectDrawSurface::BltBatch 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 SetHook((void *)(**(DWORD **)lplpdds + 36), extEnumAttachedSurfaces, (void **)&pEnumAttachedSurfaces, "EnumAttachedSurfaces(S)"); // IDirectDrawSurface::EnumOverlayZOrders @@ -1739,6 +1740,7 @@ HRESULT WINAPI extQueryInterfaceS(void *lpdds, REFIID riid, LPVOID *obp) } if(lpdds == lpDDSBack) lpDDSBack = (LPDIRECTDRAWSURFACE)*obp; + return 0; } @@ -1947,20 +1949,20 @@ static char *FixSurfaceCaps(LPDDSURFACEDESC2 lpddsd) // Submarine titans (8BPP) OutTrace("FixSurfaceCaps: SystemMemory OffScreen PixelFormat (1)\n"); //lpddsd->ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY; - lpddsd->ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN; + lpddsd->ddsCaps.dwCaps = (DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); return SetPixFmt(lpddsd); break; case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY: // Duckman OutTrace("FixSurfaceCaps: SystemMemory OffScreen PixelFormat (2)\n"); //lpddsd->ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY; - //lpddsd->ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN; + //lpddsd->ddsCaps.dwCaps |= (DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); return SetPixFmt(lpddsd); break; case DDSCAPS_SYSTEMMEMORY|DDSCAPS_ZBUFFER: // the Sims 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"; 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)) && (lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER)){ 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; return "ZBUFFER"; } @@ -2021,9 +2023,9 @@ static char *FixSurfaceCaps(LPDDSURFACEDESC2 lpddsd) } // adjust pixel format 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_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN; + lpddsd->ddsCaps.dwCaps |= (DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); return SetPixFmt(lpddsd); } @@ -2041,6 +2043,7 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf HRESULT res; // emulated primary surface +#if 0 ClearSurfaceDesc((void *)&ddsd, dxversion); ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT; ddsd.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY | DDSCAPS_OFFSCREENPLAIN; @@ -2051,6 +2054,17 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf ddsd.dwWidth = dxw.GetScreenWidth(); ddsd.dwHeight = dxw.GetScreenHeight(); 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 DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]" , __LINE__); @@ -2134,7 +2148,7 @@ static HRESULT BuildPrimaryDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf // genuine primary surface memcpy((void *)&ddsd, lpddsd, lpddsd->dwSize); 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 DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]" , __LINE__); @@ -2192,12 +2206,25 @@ static HRESULT BuildBackBufferEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateS HRESULT res; // create BackBuffer surface +#if 0 ClearSurfaceDesc((void *)&ddsd, dxversion); ddsd.dwFlags = DDSD_CAPS|DDSD_PIXELFORMAT|DDSD_HEIGHT|DDSD_WIDTH; ddsd.ddsCaps.dwCaps=DDSCAPS_SYSTEMMEMORY | DDSCAPS_OFFSCREENPLAIN; ddsd.dwWidth = dxw.GetScreenWidth(); ddsd.dwHeight = dxw.GetScreenHeight(); 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__); res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); if(res) { @@ -2280,23 +2307,19 @@ static HRESULT BuildGenericEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf HRESULT res; 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); + DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Emu Generic]" , __LINE__); 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) { OutTraceE("CreateSurface: ERROR on Emu_Generic res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); 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 // 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.2.26: add VIDEOMEMORY|LOCALVIDMEM capability (Alien Cabal 95 - partial fix) if(dxw.dwFlags1 & EMULATESURFACE) { @@ -4101,7 +4124,7 @@ HRESULT WINAPI extGetSurfaceDesc(GetSurfaceDesc_Type pGetSurfaceDesc, LPDIRECTDR //if(dxw.dwFlags1 & EMULATESURFACE) lpddsd->ddsCaps.dwCaps |= DDSCAPS_3DDEVICE; if(dxw.dwFlags1 & EMULATESURFACE) lpddsd->ddsCaps.dwCaps |= DDSCAPS_3DDEVICE|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM; - + if(IsFixed) DumpSurfaceAttributes(lpddsd, "GetSurfaceDesc [FIXED]", __LINE__); return DD_OK; } diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 92f45fb..80bf360 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -78,7 +78,7 @@ static char *Flag4Names[32]={ static char *TFlagNames[32]={ "OUTTRACE", "OUTDDRAWTRACE", "OUTWINMESSAGES", "OUTCURSORTRACE", "OUTPROXYTRACE", "DXPROXED", "ASSERTDIALOG", "OUTIMPORTTABLE", - "OUTDEBUG", "OUTREGISTRY", "", "", + "OUTDEBUG", "OUTREGISTRY", "TRACEHOOKS", "", "", "", "", "", "", "", "", "", "", "", "", "", @@ -167,12 +167,12 @@ void HookDlls(HMODULE module) __try{ pnth = PIMAGE_NT_HEADERS(PBYTE(base) + PIMAGE_DOS_HEADER(base)->e_lfanew); if(!pnth) { - OutTraceB("HookDlls: ERROR no pnth at %d\n", __LINE__); + OutTraceH("HookDlls: ERROR no pnth at %d\n", __LINE__); return; } rva = pnth->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; if(!rva) { - OutTraceB("HookDlls: ERROR no rva at %d\n", __LINE__); + OutTraceH("HookDlls: ERROR no rva at %d\n", __LINE__); return; } @@ -190,18 +190,18 @@ void HookDlls(HMODULE module) if(idx != -1) { DllBase=GetModuleHandle(impmodule); SysLibs[idx]=DllBase; - OutTraceB("HookDlls: system module %s at %x\n", impmodule, DllBase); + OutTraceH("HookDlls: system module %s at %x\n", impmodule, DllBase); 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); if(pidesc->OriginalFirstThunk) { ptname = (PIMAGE_THUNK_DATA)(base + (DWORD)pidesc->OriginalFirstThunk); } else{ 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); @@ -283,7 +283,7 @@ void SetHook(void *target, void *hookproc, void **hookedproc, char *hookname) static DWORD MinHook=0xFFFFFFFF; 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 !!! if ((DWORD)hookproc < MinHook) MinHook=(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 ++; } if(!pidesc->FirstThunk) { - OutTraceB("HookAPI: PE unreferenced dll=%s\n", dll); + OutTraceH("HookAPI: PE unreferenced dll=%s\n", dll); 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; 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; } @@ -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__); 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) { @@ -657,11 +657,6 @@ void AdjustWindowFrame(HWND hwnd, DWORD width, DWORD height) // fixing windows message handling procedure 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){ // hooked already !!! 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_F5: 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_F6 && (dxw.TimeShift > -8)) dxw.TimeShift--; 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); if(pWindowProc) { 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 if(message==WM_NCHITTEST) LastCursorPos=ret; // v2.1.89: if FORCEWINRESIZE add standard processing for the missing WM_NC* messages diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index 46282f0..e37214c 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -911,7 +911,7 @@ char *dxwCore::GetTSCaption(int shift) "x1", ":1.5",":2",":3",":4", ":6",":8",":12",":16"}; - if (shift<0 || shift>16) return "???"; + if (shift<(-8) || shift>(+8)) return "???"; return sTSCaption[shift+8]; } char *dxwCore::GetTSCaption(void) diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 9dad871..bd248bb 100644 Binary files a/dll/dxwnd.vs2008.suo and b/dll/dxwnd.vs2008.suo differ diff --git a/dll/kernel32.cpp b/dll/kernel32.cpp index d79620f..052fbfe 100644 --- a/dll/kernel32.cpp +++ b/dll/kernel32.cpp @@ -520,9 +520,13 @@ BOOL WINAPI extReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRea static char *IOBuffer=NULL; DWORD BytesRead; DWORD Cursor; + //HANDLE hFileRead; + OutTrace("ReadFile: hFile=%x Buffer=%x BytesToRead=%d\n", hFile, lpBuffer, nNumberOfBytesToRead); #define SECTOR_SIZE 4096 +//#define LEGACY_SIZE 1024 +#define LEGACY_SIZE 1024 if(!IOBuffer) { // initial allocation 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", nNumberOfBytesToRead, FileLength, Where); if((Where+nNumberOfBytesToRead)<=FileLength) - *lpNumberOfBytesRead=nNumberOfBytesToRead; + *lpNumberOfBytesRead=nNumberOfBytesToRead; else *lpNumberOfBytesRead=FileLength-Where; 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", nNumberOfBytesToRead, *lpNumberOfBytesRead, Where); Where += (*lpNumberOfBytesRead); + //Where = ((Where+(LEGACY_SIZE-1)) / LEGACY_SIZE) * LEGACY_SIZE; 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__); return FALSE; } + OutTrace("SetFilePointer: current pos=%d\n", Where); + //hFileRead=ReOpenFile(hFile, 0, 0, 0); do {// try to read it all // when space is not enough, let's grow! - if((DWORD)(IOBuffer+Cursor+SECTOR_SIZE) > (DWORD)IOHeapSize){ - IOHeapSize += 200*SECTOR_SIZE; + if((DWORD)(Cursor+SECTOR_SIZE) > (DWORD)IOHeapSize){ + OutTrace("HeapReAlloc: about to add another chunk... current size=%d\n", IOHeapSize); + IOHeapSize += (200*SECTOR_SIZE); IOBuffer=(char *)HeapReAlloc(IOHeap, 0, IOBuffer, IOHeapSize); 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; if (ret && BytesRead == 0) ret=FALSE; // eof } while(ret); + //CloseHandle(hFileRead); OutTrace("ReadFIle: BUFFERED FileSize=%d\n", Cursor); FileLength=Cursor; @@ -587,17 +603,22 @@ HANDLE WINAPI extCreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwS OutTrace("CreateFile: FileName=%s DesiredAccess=%x SharedMode=%x Disposition=%x Flags=%x\n", lpFileName, dwDesiredAccess, dwShareMode, dwCreationDisposition, dwFlagsAndAttributes); + //dwFlagsAndAttributes &= ~FILE_FLAG_NO_BUFFERING; + ret=(*pCreateFile)(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); if(ret && (ret != (HANDLE)INVALID_SET_FILE_POINTER)) OutTrace("CreateFile: ret=%x\n", ret); else OutTraceE("CreateFile ERROR: err=%d\n", GetLastError()); return ret; -} +} 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); } @@ -610,6 +631,7 @@ DWORD WINAPI extSetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDista // if cached file ... if(LastFile==hFile){ + int LastPos=Where; if(!lpDistanceToMoveHigh){ OutTrace("SetFilePointer: buffered move\n"); switch(dwMoveMethod){ @@ -617,7 +639,18 @@ DWORD WINAPI extSetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDista case FILE_CURRENT: Where+=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; } } diff --git a/dll/user32.cpp b/dll/user32.cpp index b5fc384..f3d65ab 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -127,7 +127,7 @@ FARPROC Remap_user32_ProcAddress(LPCSTR proc, HMODULE hModule) if (addr=RemapLibrary(proc, hModule, WinHooks)) return addr; if((dxw.dwFlags1 & (MODIFYMOUSE|SLOWDOWN|KEEPCURSORWITHIN)) || (dxw.dwFlags2 & KEEPCURSORFIXED)) if (addr=RemapLibrary(proc, hModule, MouseHooks2)) return addr; - if(FALSE) + if(dxw.dwFlags3 & PEEKALLMESSAGES) if (addr=RemapLibrary(proc, hModule, PeekAllHooks)) return addr; return NULL; } @@ -145,7 +145,7 @@ void HookUser32(HMODULE hModule) if(dxw.dwFlags1 & MODIFYMOUSE)HookLibrary(hModule, MouseHooks, 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(FALSE) HookLibrary(hModule, PeekAllHooks, libname); + if(dxw.dwFlags3 & PEEKALLMESSAGES) HookLibrary(hModule, PeekAllHooks, libname); return; } @@ -784,17 +784,9 @@ BOOL WINAPI extPeekAnyMessage(LPMSG lpMsg, HWND hwnd, UINT wMsgFilterMin, UINT w { BOOL res; - if(wMsgFilterMin || wMsgFilterMax){ - 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); + res=(*pPeekMessage)(lpMsg, hwnd, 0, 0, (wRemoveMsg & 0x000F)); - 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->message, ExplainWinMessage(lpMsg->message & 0xFFFF), 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 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", lpMsg, lpMsg->hwnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg, @@ -1427,10 +1423,10 @@ BOOL WINAPI extGetClipCursor(LPRECT lpRect) ret=(*pGetClipCursor)(lpRect); if(IsTraceD){ 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); else - OutTrace("ClipCursor: PROXED rect=(NULL) ret=%d\n", ret); + OutTrace("GetClipCursor: PROXED rect=(NULL) ret=%d\n", ret); } return ret; } @@ -1443,7 +1439,7 @@ BOOL WINAPI extGetClipCursor(LPRECT lpRect) lpRect->right = dxw.GetScreenWidth(); 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); } diff --git a/dll/wndproc.cpp b/dll/wndproc.cpp index ffdff0c..9a68ce8 100644 --- a/dll/wndproc.cpp +++ b/dll/wndproc.cpp @@ -30,7 +30,8 @@ void WhndStackPush(HWND hwnd, WNDPROC wndproc) { int StackIdx; // 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); // try update first... for(StackIdx=0; StackIdx<WhndTOS; StackIdx++) diff --git a/host/Resource.h b/host/Resource.h index 07e632e..001b71f 100644 --- a/host/Resource.h +++ b/host/Resource.h @@ -170,6 +170,8 @@ #define IDC_FIXD3DFRAME 1127 #define IDC_BUFFEREDIOFIX 1128 #define IDC_FILTERMESSAGES 1129 +#define IDC_PEEKALLMESSAGES 1130 +#define IDC_TRACEHOOKS 1131 #define ID_MODIFY 32771 #define ID_DELETE 32772 #define ID_ADD 32773 diff --git a/host/TabLogs.cpp b/host/TabLogs.cpp index 7781f74..3f13f8d 100644 --- a/host/TabLogs.cpp +++ b/host/TabLogs.cpp @@ -44,6 +44,7 @@ void CTabLogs::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_OUTDXTRACE, cTarget->m_OutDXTrace); DDX_Check(pDX, IDC_IMPORTTABLE, cTarget->m_ImportTable); DDX_Check(pDX, IDC_OUTREGISTRY, cTarget->m_RegistryOp); + DDX_Check(pDX, IDC_TRACEHOOKS, cTarget->m_TraceHooks); if(gbDebug){ DDX_Check(pDX, IDC_DXPROXED, cTarget->m_DXProxed); DDX_Check(pDX, IDC_ASSERT, cTarget->m_AssertDialog); diff --git a/host/TabProgram.cpp b/host/TabProgram.cpp index 71dcc11..a58b0d3 100644 --- a/host/TabProgram.cpp +++ b/host/TabProgram.cpp @@ -37,6 +37,7 @@ void CTabProgram::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_EMULATEREGISTRY, cTarget->m_EmulateRegistry); DDX_Check(pDX, IDC_FULLSCREENONLY, cTarget->m_FullScreenOnly); 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_HOOKENABLED, cTarget->m_HookEnabled); DDX_Check(pDX, IDC_NOBANNER, cTarget->m_NoBanner); diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index 80eeeed..ea55ce9 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -52,6 +52,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_EmulateRegistry = FALSE; // default true !! m_FullScreenOnly = FALSE; m_FilterMessages = FALSE; + m_PeekAllMessages = FALSE; m_NoBanner = FALSE; m_StartDebug = FALSE; m_FilePath = _T(""); diff --git a/host/TargetDlg.h b/host/TargetDlg.h index a296bd2..058f782 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -39,6 +39,7 @@ public: BOOL m_AssertDialog; BOOL m_ImportTable; BOOL m_RegistryOp; + BOOL m_TraceHooks; BOOL m_HandleDC; BOOL m_UnNotify; BOOL m_Windowize; @@ -46,6 +47,7 @@ public: BOOL m_EmulateRegistry; BOOL m_FullScreenOnly; BOOL m_FilterMessages; + BOOL m_PeekAllMessages; BOOL m_NoBanner; BOOL m_StartDebug; BOOL m_HookEnabled; diff --git a/host/dxwnd.ini b/host/dxwnd.ini deleted file mode 100644 index f677540..0000000 --- a/host/dxwnd.ini +++ /dev/null @@ -1,5 +0,0 @@ -[window] -posx=1330 -posy=241 -sizx=320 -sizy=200 diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index a6286a8..c7f92be 100644 Binary files a/host/dxwndhost.aps and b/host/dxwndhost.aps differ diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index c027695..4e41013 100644 --- a/host/dxwndhost.rc +++ b/host/dxwndhost.rc @@ -277,24 +277,26 @@ BEGIN 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 "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 IDD_TAB_LOG DIALOGEX 0, 0, 300, 240 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD FONT 8, "MS Shell Dlg", 400, 0, 0x1 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 "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 "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 "Import Table",IDC_IMPORTTABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,94,73,12 - GROUPBOX "debug mode only",IDC_STATIC,7,139,130,94 - CONTROL "Assert Dialog",IDC_ASSERT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,152,73,12 - CONTROL "ddraw Proxy",IDC_DXPROXED,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,164,73,12 + GROUPBOX "debug mode only",IDC_STATIC,7,154,130,79 + 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,177,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 "Hook op.",IDC_TRACEHOOKS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,130,73,12 END IDD_TAB_DIRECTX DIALOGEX 0, 0, 300, 240 diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index eeb1246..970afbb 100644 Binary files a/host/dxwndhost.vs2008.suo and b/host/dxwndhost.vs2008.suo differ diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index 69a50f4..1b14c54 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -115,6 +115,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_StartDebug) t->flags2 |= STARTDEBUG; if(dlg->m_FullScreenOnly) t->flags3 |= FULLSCREENONLY; if(dlg->m_FilterMessages) t->flags3 |= FILTERMESSAGES; + if(dlg->m_PeekAllMessages) t->flags3 |= PEEKALLMESSAGES; t->flags &= ~EMULATEFLAGS; 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_ImportTable) t->tflags |= OUTIMPORTTABLE; if(dlg->m_RegistryOp) t->tflags |= OUTREGISTRY; + if(dlg->m_TraceHooks) t->tflags |= TRACEHOOKS; if(dlg->m_HandleDC) t->flags |= HANDLEDC; if(dlg->m_HandleExceptions) t->flags |= HANDLEEXCEPTIONS; 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_FullScreenOnly = t->flags3 & FULLSCREENONLY ? 1 : 0; dlg->m_FilterMessages = t->flags3 & FILTERMESSAGES ? 1 : 0; + dlg->m_PeekAllMessages = t->flags3 & PEEKALLMESSAGES ? 1 : 0; dlg->m_DxEmulationMode = 0; 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_ImportTable = t->tflags & OUTIMPORTTABLE ? 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_HandleExceptions = t->flags & HANDLEEXCEPTIONS ? 1 : 0; dlg->m_SuppressIME = t->flags2 & SUPPRESSIME ? 1 : 0;