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;