diff --git a/Include/dxwnd.h b/Include/dxwnd.h
index fda56b4..0414d79 100644
--- a/Include/dxwnd.h
+++ b/Include/dxwnd.h
@@ -218,6 +218,8 @@
#define LIMITDDRAW 0x00000001 // Limit the maximum available ddraw object version
#define DISABLEDISABLEALTTAB 0x00000002 // Disables the compatibility patch that disables the Alt-Tab key and other special combinations
#define FIXCLIPPERAREA 0x00000004 // fix clipper area in ddraw & GDI shared DC mode
+#define HOOKDIRECTSOUND 0x00000008
+#define HOOKSMACKW32 0x00000010
// eighth flags DWORD dxw.dwFlags8:
diff --git a/build/dxwnd.dll b/build/dxwnd.dll
index d42b6f0..1c875cb 100644
--- a/build/dxwnd.dll
+++ b/build/dxwnd.dll
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:cf21cb7f4efa14ec9c887287c8761ec1bc41387407bb79ad1e0a828389390503
-size 625664
+oid sha256:f5024ec55f3917b2908e231698222147516bb21efda0938c969100fc43f7fd9f
+size 626688
diff --git a/build/dxwnd.exe b/build/dxwnd.exe
index aecba88..b2e3de1 100644
--- a/build/dxwnd.exe
+++ b/build/dxwnd.exe
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:4853f064ace470ed224072af04f8ad1f48d985299be7f51b3adf36a279b4222f
-size 549376
+oid sha256:b2afb528861c05b34730d201b567c3e47f969732676f7d9fd998ffe8cf16674d
+size 553472
diff --git a/build/dxwnd.ini b/build/dxwnd.ini
new file mode 100644
index 0000000..ae9b0a2
--- /dev/null
+++ b/build/dxwnd.ini
@@ -0,0 +1,120 @@
+[window]
+exportpath=D:\DxWnd\exports\
+exepath=D:\Games\msgolf\Golf '98 Trial\
+posx=981
+posy=464
+sizx=320
+sizy=200
+[target]
+title0=Miscrosoft Golf '98 Trial
+path0=D:\Games\msgolf\Golf '98 Trial\game.exe
+launchpath0=
+module0=
+opengllib0=
+notes0=
+registry0=[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\]\n[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Games]\n[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Games\Golf '98]\n[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Games\Golf '98\Version 1.0 Demo]\n"AppPath"="D:\\Games\\msgolf\\Golf '98 Trial"\n"InstallType"="1"\n"InstalledPath"="D:\\Games\\msgolf\\Golf '98 Trial"\n"CDPath"="D:\\Games\\msgolf\\Golf '98 Trial\\"\n"ITF File Path"="D:\\Games\\msgolf\\Golf '98 Trial\\golf.itf"\n"Launched"="1"\n"PID"=""\n"Path"="D:\\Games\\msgolf\\Golf '98 Trial"\n"VersionType"="TrialVersion"\n"InstalledGroup"="1"\n"LangID"=dword:00000009\n\n\n[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft Games]\n[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft Games\Golf '98]\n[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft Games\Golf '98\Version 1.0 Demo]\n"AppPath"="D:\\Games\\msgolf\\Golf '98 Trial"\n"InstallType"="1"\n"InstalledPath"="D:\\Games\\msgolf\\Golf '98 Trial"\n"CDPath"="D:\\Games\\msgolf\\Golf '98 Trial\\"\n"ITF File Path"="D:\\Games\\msgolf\\Golf '98 Trial\\golf.itf"\n"Launched"="1"\n"PID"=""\n"Path"="D:\\Games\\msgolf\\Golf '98 Trial"\n"VersionType"="TrialVersion"\n"InstalledGroup"="1"\n"LangID"=dword:00000009
+ver0=0
+coord0=0
+flag0=2101474
+flagg0=1476395016
+flagh0=1044
+flagi0=1210187780
+flagj0=128
+flagk0=327680
+flagl0=4
+flagm0=0
+tflag0=0
+posx0=50
+posy0=50
+sizx0=880
+sizy0=660
+maxfps0=0
+initts0=0
+winver0=0
+maxres0=-1
+swapeffect0=0
+maxddinterface0=0
+title1=M1 Tank Platoon 2
+path1=D:\Games\M1 Tank Platoon 2\M1TP2.exe
+launchpath1=
+module1=
+opengllib1=
+notes1=
+registry1=
+ver1=0
+coord1=0
+flag1=134238242
+flagg1=1207959552
+flagh1=20
+flagi1=138412036
+flagj1=268439680
+flagk1=0
+flagl1=0
+flagm1=0
+tflag1=0
+posx1=50
+posy1=50
+sizx1=800
+sizy1=600
+maxfps1=0
+initts1=8
+winver1=0
+maxres1=-1
+swapeffect1=0
+maxddinterface1=7
+title2=Imperialism II
+path2=D:\Games\Imperialism 2\imperialism II.exe
+launchpath2=
+module2=
+opengllib2=
+notes2=
+registry2=
+ver2=0
+coord2=0
+flag2=679485474
+flagg2=1207959552
+flagh2=20
+flagi2=4194308
+flagj2=0
+flagk2=262144
+flagl2=4
+flagm2=0
+tflag2=0
+posx2=50
+posy2=50
+sizx2=800
+sizy2=600
+maxfps2=0
+initts2=0
+winver2=0
+maxres2=0
+swapeffect2=0
+maxddinterface2=7
+title3=Imperialism
+path3=D:\Games\Imperialism\Imperialism.exe
+launchpath3=
+module3=
+opengllib3=
+notes3=Note:\nMap zooming is currently not workind. Do not click on the magnifying glass, \nor the game will crash.
+registry3=
+ver3=0
+coord3=0
+flag3=1746935843
+flagg3=1744830464
+flagh3=20
+flagi3=71303172
+flagj3=128
+flagk3=262144
+flagl3=4
+flagm3=0
+tflag3=0
+posx3=50
+posy3=50
+sizx3=800
+sizy3=600
+maxfps3=0
+initts3=0
+winver3=0
+maxres3=-1
+swapeffect3=0
+maxddinterface3=7
diff --git a/build/dxwnd.reg b/build/dxwnd.reg
new file mode 100644
index 0000000..89fc615
--- /dev/null
+++ b/build/dxwnd.reg
@@ -0,0 +1,31 @@
+[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\]
+[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Games]
+[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Games\Golf '98]
+[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Games\Golf '98\Version 1.0 Demo]
+"AppPath"="D:\\Games\\msgolf\\Golf '98 Trial"
+"InstallType"="1"
+"InstalledPath"="D:\\Games\\msgolf\\Golf '98 Trial"
+"CDPath"="D:\\Games\\msgolf\\Golf '98 Trial\\"
+"ITF File Path"="D:\\Games\\msgolf\\Golf '98 Trial\\golf.itf"
+"Launched"="1"
+"PID"=""
+"Path"="D:\\Games\\msgolf\\Golf '98 Trial"
+"VersionType"="TrialVersion"
+"InstalledGroup"="1"
+"LangID"=dword:00000009
+
+
+[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft Games]
+[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft Games\Golf '98]
+[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft Games\Golf '98\Version 1.0 Demo]
+"AppPath"="D:\\Games\\msgolf\\Golf '98 Trial"
+"InstallType"="1"
+"InstalledPath"="D:\\Games\\msgolf\\Golf '98 Trial"
+"CDPath"="D:\\Games\\msgolf\\Golf '98 Trial\\"
+"ITF File Path"="D:\\Games\\msgolf\\Golf '98 Trial\\golf.itf"
+"Launched"="1"
+"PID"=""
+"Path"="D:\\Games\\msgolf\\Golf '98 Trial"
+"VersionType"="TrialVersion"
+"InstalledGroup"="1"
+"LangID"=dword:00000009
\ No newline at end of file
diff --git a/build/exports/11th Hour, the.dxw b/build/exports/11th Hour, the.dxw
index 5e00f75..1126e67 100644
--- a/build/exports/11th Hour, the.dxw
+++ b/build/exports/11th Hour, the.dxw
@@ -7,8 +7,8 @@ opengllib0=
notes0=
registry0=
ver0=0
-coord0=1
-flag0=136314915
+coord0=0
+flag0=137363491
flagg0=1207959552
flagh0=20
flagi0=138412036
@@ -21,12 +21,15 @@ minx0=0
miny0=0
maxx0=0
maxy0=0
-posx0=0
-posy0=0
-sizx0=1280
-sizy0=960
+posx0=50
+posy0=50
+sizx0=800
+sizy0=600
maxfps0=0
initts0=0
winver0=0
maxres0=-1
swapeffect0=0
+flagl0=0
+flagm0=0
+maxddinterface0=7
diff --git a/build/exports/Duke Nukem Forever.dxw b/build/exports/Duke Nukem Forever.dxw
new file mode 100644
index 0000000..d8ebedf
--- /dev/null
+++ b/build/exports/Duke Nukem Forever.dxw
@@ -0,0 +1,29 @@
+[target]
+title0=Duke Nukem Forever
+path0=D:\Games\Duke Nukem Forever\System\DukeForever.exe
+launchpath0=
+module0=
+opengllib0=
+notes0=
+registry0=
+ver0=0
+coord0=0
+flag0=136314914
+flagg0=1207959552
+flagh0=20
+flagi0=138412036
+flagj0=4224
+flagk0=65536
+flagl0=0
+flagm0=0
+tflag0=0
+posx0=50
+posy0=50
+sizx0=800
+sizy0=600
+maxfps0=0
+initts0=0
+winver0=0
+maxres0=-1
+swapeffect0=0
+maxddinterface0=7
diff --git a/build/exports/M1 Tank Platoon 2.dxw b/build/exports/M1 Tank Platoon 2.dxw
index 9421797..d8dc4e2 100644
--- a/build/exports/M1 Tank Platoon 2.dxw
+++ b/build/exports/M1 Tank Platoon 2.dxw
@@ -10,7 +10,7 @@ flag0=134238242
flagg0=1207959552
flagh0=20
flagi0=138412036
-flagj0=4224
+flagj0=268439680
tflag0=0
initx0=0
inity0=0
@@ -26,3 +26,10 @@ maxfps0=0
initts0=8
winver0=0
maxres0=-1
+notes0=
+registry0=
+flagk0=0
+flagl0=0
+flagm0=0
+swapeffect0=0
+maxddinterface0=7
diff --git a/build/exports/Miscrosoft Golf '98 Trial.dxw b/build/exports/Miscrosoft Golf '98 Trial.dxw
new file mode 100644
index 0000000..8f2599a
--- /dev/null
+++ b/build/exports/Miscrosoft Golf '98 Trial.dxw
@@ -0,0 +1,29 @@
+[target]
+title0=Miscrosoft Golf '98 Trial
+path0=D:\Games\msgolf\Golf '98 Trial\game.exe
+launchpath0=
+module0=
+opengllib0=
+notes0=
+registry0=[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\]\n[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Games]\n[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Games\Golf '98]\n[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Games\Golf '98\Version 1.0 Demo]\n"AppPath"="D:\\Games\\msgolf\\Golf '98 Trial"\n"InstallType"="1"\n"InstalledPath"="D:\\Games\\msgolf\\Golf '98 Trial"\n"CDPath"="D:\\Games\\msgolf\\Golf '98 Trial\\"\n"ITF File Path"="D:\\Games\\msgolf\\Golf '98 Trial\\golf.itf"\n"Launched"="1"\n"PID"=""\n"Path"="D:\\Games\\msgolf\\Golf '98 Trial"\n"VersionType"="TrialVersion"\n"InstalledGroup"="1"\n"LangID"=dword:00000009\n\n\n[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft Games]\n[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft Games\Golf '98]\n[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft Games\Golf '98\Version 1.0 Demo]\n"AppPath"="D:\\Games\\msgolf\\Golf '98 Trial"\n"InstallType"="1"\n"InstalledPath"="D:\\Games\\msgolf\\Golf '98 Trial"\n"CDPath"="D:\\Games\\msgolf\\Golf '98 Trial\\"\n"ITF File Path"="D:\\Games\\msgolf\\Golf '98 Trial\\golf.itf"\n"Launched"="1"\n"PID"=""\n"Path"="D:\\Games\\msgolf\\Golf '98 Trial"\n"VersionType"="TrialVersion"\n"InstalledGroup"="1"\n"LangID"=dword:00000009
+ver0=0
+coord0=0
+flag0=2101474
+flagg0=1476395016
+flagh0=1044
+flagi0=1210187780
+flagj0=128
+flagk0=327680
+flagl0=4
+flagm0=0
+tflag0=0
+posx0=50
+posy0=50
+sizx0=880
+sizy0=660
+maxfps0=0
+initts0=0
+winver0=0
+maxres0=-1
+swapeffect0=0
+maxddinterface0=0
diff --git a/build/exports/dxwnd.ini b/build/exports/dxwnd.ini
deleted file mode 100644
index baaa080..0000000
--- a/build/exports/dxwnd.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[window]
-posx=1182
-posy=638
-sizx=320
-sizy=200
diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt
index be9c9d4..730503e 100644
--- a/build/readme-relnotes.txt
+++ b/build/readme-relnotes.txt
@@ -1042,4 +1042,11 @@ add: "Acquire admin caps" flag to self elevate DxWnd if configured as necessary
add: added third mode to handle potentially offending messages, that is process them by the Window default process routine WinDefaultProc. Good for "Red Alert 2".
add: "fix clipper area in shared DC", temporary solution to adapt the shared DC mode to the different situations (yet to finish).
fix: fully integrated the patch for "Silver" game: returning backbuffer as a doublebuffer also when requested with DDSCAPS_VIDEOMEMORY caps.
-add: FunkyFr3sh addition to process WM_SYSCOMMAND SC_CLOSE and force program termination when requested by "Terminate on window close" option.
\ No newline at end of file
+add: FunkyFr3sh addition to process WM_SYSCOMMAND SC_CLOSE and force program termination when requested by "Terminate on window close" option.
+
+v2.03.57
+fix: improved handling of clipping regions in shared dc mode
+add: added DWM status to log file
+add: flags for preliminary hook of DirectSound and Smack libraries
+fix: changed icon colors (yellow for red, doesn't suggest the idea of error or danger)
+add: menu commands for entry movement (top, bottom, up, down) or duplication
\ No newline at end of file
diff --git a/build/redist/vbruntimes.exe b/build/redist/vbruntimes.exe
new file mode 100644
index 0000000..6e4f6ba
--- /dev/null
+++ b/build/redist/vbruntimes.exe
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b34beff662415ef318ea0bba7f0f01faf8a5593e3903e4645e290077cd74d6e3
+size 2765965
diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp
index cf3a665..c2ba941 100644
--- a/dll/ddraw.cpp
+++ b/dll/ddraw.cpp
@@ -44,10 +44,12 @@ ULONG WINAPI extReleaseD4(LPDIRECTDRAW);
ULONG WINAPI extReleaseD7(LPDIRECTDRAW);
/*** IDirectDraw methods ***/
HRESULT WINAPI extCreateClipper(LPDIRECTDRAW, DWORD, LPDIRECTDRAWCLIPPER FAR* , IUnknown FAR*);
-HRESULT WINAPI extCreatePalette(LPDIRECTDRAW, DWORD, LPPALETTEENTRY, LPDIRECTDRAWPALETTE *, IUnknown *);
+HRESULT WINAPI extCreatePalette1(LPDIRECTDRAW, DWORD, LPPALETTEENTRY, LPDIRECTDRAWPALETTE *, IUnknown *);
+HRESULT WINAPI extCreatePalette2(LPDIRECTDRAW, DWORD, LPPALETTEENTRY, LPDIRECTDRAWPALETTE *, IUnknown *);
+HRESULT WINAPI extCreatePalette4(LPDIRECTDRAW, DWORD, LPPALETTEENTRY, LPDIRECTDRAWPALETTE *, IUnknown *);
+HRESULT WINAPI extCreatePalette7(LPDIRECTDRAW, DWORD, LPPALETTEENTRY, LPDIRECTDRAWPALETTE *, IUnknown *);
HRESULT WINAPI extCreateSurface1(LPDIRECTDRAW, DDSURFACEDESC *, LPDIRECTDRAWSURFACE *, void *);
HRESULT WINAPI extCreateSurface2(LPDIRECTDRAW, DDSURFACEDESC *, LPDIRECTDRAWSURFACE *, void *);
-HRESULT WINAPI extCreateSurface3(LPDIRECTDRAW, DDSURFACEDESC *, LPDIRECTDRAWSURFACE *, void *);
HRESULT WINAPI extCreateSurface4(LPDIRECTDRAW, DDSURFACEDESC2 *, LPDIRECTDRAWSURFACE *, void *);
HRESULT WINAPI extCreateSurface7(LPDIRECTDRAW, DDSURFACEDESC2 *, LPDIRECTDRAWSURFACE *, void *);
HRESULT WINAPI extDuplicateSurface(LPDIRECTDRAW, LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE *);
@@ -56,7 +58,10 @@ HRESULT WINAPI extGetDisplayMode1(LPDIRECTDRAW, LPDDSURFACEDESC);
HRESULT WINAPI extGetDisplayMode2(LPDIRECTDRAW, LPDDSURFACEDESC);
HRESULT WINAPI extGetDisplayMode4(LPDIRECTDRAW, LPDDSURFACEDESC2);
HRESULT WINAPI extGetDisplayMode7(LPDIRECTDRAW, LPDDSURFACEDESC2);
-HRESULT WINAPI extGetGDISurface(LPDIRECTDRAW, LPDIRECTDRAWSURFACE *);
+HRESULT WINAPI extGetGDISurface1(LPDIRECTDRAW, LPDIRECTDRAWSURFACE *);
+HRESULT WINAPI extGetGDISurface2(LPDIRECTDRAW, LPDIRECTDRAWSURFACE *);
+HRESULT WINAPI extGetGDISurface4(LPDIRECTDRAW, LPDIRECTDRAWSURFACE *);
+HRESULT WINAPI extGetGDISurface7(LPDIRECTDRAW, LPDIRECTDRAWSURFACE *);
HRESULT WINAPI extEnumDisplayModes1(LPDIRECTDRAW, DWORD, LPDDSURFACEDESC, LPVOID, LPDDENUMMODESCALLBACK);
HRESULT WINAPI extEnumDisplayModes4(LPDIRECTDRAW, DWORD, LPDDSURFACEDESC2, LPVOID, LPDDENUMMODESCALLBACK2);
HRESULT WINAPI extInitialize(LPDIRECTDRAW, FAR GUID *);
@@ -163,7 +168,10 @@ ReleaseD_Type pReleaseD4 = NULL;
ReleaseD_Type pReleaseD7 = NULL;
Compact_Type pCompact;
CreateClipper_Type pCreateClipper=NULL;
-CreatePalette_Type pCreatePalette;
+CreatePalette_Type pCreatePalette1;
+CreatePalette_Type pCreatePalette2;
+CreatePalette_Type pCreatePalette4;
+CreatePalette_Type pCreatePalette7;
CreateSurface1_Type pCreateSurface1;
CreateSurface1_Type pCreateSurface2;
CreateSurface1_Type pCreateSurface3;
@@ -184,7 +192,10 @@ GetDisplayMode_Type pGetDisplayMode2;
GetDisplayMode4_Type pGetDisplayMode4;
GetDisplayMode4_Type pGetDisplayMode7;
GetFourCCCodes_Type pGetFourCCCodes;
-GetGDISurface_Type pGetGDISurface;
+GetGDISurface_Type pGetGDISurface1;
+GetGDISurface_Type pGetGDISurface2;
+GetGDISurface_Type pGetGDISurface4;
+GetGDISurface_Type pGetGDISurface7;
GetMonitorFrequency_Type pGetMonitorFrequency;
GetScanLine_Type pGetScanLine;
GetVerticalBlankStatus_Type pGetVerticalBlankStatus;
@@ -1028,8 +1039,6 @@ void HookDDSession(LPDIRECTDRAW *lplpdd, int dxversion)
// IDIrectDraw::CreateClipper
SetHook((void *)(**(DWORD **)lplpdd + 16), extCreateClipper, (void **)&pCreateClipper, "CreateClipper(D)");
- // IDIrectDraw::CreatePalette
- SetHook((void *)(**(DWORD **)lplpdd + 20), extCreatePalette, (void **)&pCreatePalette, "CreatePalette(D)");
// IDIrectDraw::QueryInterface
// IDIrectDraw::CreateSurface
// IDIrectDraw::Release
@@ -1038,22 +1047,26 @@ void HookDDSession(LPDIRECTDRAW *lplpdd, int dxversion)
case 1:
SetHook((void *)(**(DWORD **)lplpdd), extQueryInterfaceD1, (void **)&pQueryInterfaceD1, "QueryInterface(D1)");
SetHook((void *)(**(DWORD **)lplpdd + 8), extReleaseD1, (void **)&pReleaseD1, "Release(D1)");
- SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateSurface1, (void **)&pCreateSurface1, "CreateSurface(S1)");
+ SetHook((void *)(**(DWORD **)lplpdd + 20), extCreatePalette1, (void **)&pCreatePalette1, "CreatePalette(D1)");
+ SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateSurface1, (void **)&pCreateSurface1, "CreateSurface(D1)");
break;
case 2:
SetHook((void *)(**(DWORD **)lplpdd), extQueryInterfaceD2, (void **)&pQueryInterfaceD2, "QueryInterface(D2)");
SetHook((void *)(**(DWORD **)lplpdd + 8), extReleaseD2, (void **)&pReleaseD2, "Release(D2)");
- SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateSurface2, (void **)&pCreateSurface2, "CreateSurface(S2)");
+ SetHook((void *)(**(DWORD **)lplpdd + 20), extCreatePalette2, (void **)&pCreatePalette2, "CreatePalette(D2)");
+ SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateSurface2, (void **)&pCreateSurface2, "CreateSurface(D2)");
break;
case 4:
SetHook((void *)(**(DWORD **)lplpdd), extQueryInterfaceD4, (void **)&pQueryInterfaceD4, "QueryInterface(D4)");
SetHook((void *)(**(DWORD **)lplpdd + 8), extReleaseD4, (void **)&pReleaseD4, "Release(D4)");
- SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateSurface4, (void **)&pCreateSurface4, "CreateSurface(S4)");
+ SetHook((void *)(**(DWORD **)lplpdd + 20), extCreatePalette4, (void **)&pCreatePalette4, "CreatePalette(D4)");
+ SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateSurface4, (void **)&pCreateSurface4, "CreateSurface(D4)");
break;
case 7:
SetHook((void *)(**(DWORD **)lplpdd), extQueryInterfaceD7, (void **)&pQueryInterfaceD7, "QueryInterface(D7)");
SetHook((void *)(**(DWORD **)lplpdd + 8), extReleaseD7, (void **)&pReleaseD7, "Release(D7)");
- SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateSurface7, (void **)&pCreateSurface7, "CreateSurface(S7)");
+ SetHook((void *)(**(DWORD **)lplpdd + 20), extCreatePalette7, (void **)&pCreatePalette7, "CreatePalette(D7)");
+ SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateSurface7, (void **)&pCreateSurface7, "CreateSurface(D7)");
break;
}
// IDIrectDraw::DuplicateSurface
@@ -1079,30 +1092,32 @@ void HookDDSession(LPDIRECTDRAW *lplpdd, int dxversion)
case 1:
SetHook((void *)(**(DWORD **)lplpdd + 44), extGetCaps1D, (void **)&pGetCaps1D, "GetCaps(D1)");
SetHook((void *)(**(DWORD **)lplpdd + 48), extGetDisplayMode1, (void **)&pGetDisplayMode1, "GetDisplayMode(D1)");
+ SetHook((void *)(**(DWORD **)lplpdd + 56), extGetGDISurface1, (void **)&pGetGDISurface1, "GetGDISurface(D1)");
SetHook((void *)(**(DWORD **)lplpdd + 80), extSetCooperativeLevel1, (void **)&pSetCooperativeLevel1, "SetCooperativeLevel(D1)");
SetHook((void *)(**(DWORD **)lplpdd + 84), extSetDisplayMode1, (void **)&pSetDisplayMode1, "SetDisplayMode(D1)");
break;
case 2:
SetHook((void *)(**(DWORD **)lplpdd + 44), extGetCaps2D, (void **)&pGetCaps2D, "GetCaps(D2)");
SetHook((void *)(**(DWORD **)lplpdd + 48), extGetDisplayMode2, (void **)&pGetDisplayMode2, "GetDisplayMode(D2)");
+ SetHook((void *)(**(DWORD **)lplpdd + 56), extGetGDISurface2, (void **)&pGetGDISurface2, "GetGDISurface(D2)");
SetHook((void *)(**(DWORD **)lplpdd + 80), extSetCooperativeLevel2, (void **)&pSetCooperativeLevel2, "SetCooperativeLevel(D2)");
SetHook((void *)(**(DWORD **)lplpdd + 84), extSetDisplayMode2, (void **)&pSetDisplayMode2, "SetDisplayMode(D2)");
break;
case 4:
SetHook((void *)(**(DWORD **)lplpdd + 44), extGetCaps4D, (void **)&pGetCaps4D, "GetCaps(D4)");
SetHook((void *)(**(DWORD **)lplpdd + 48), extGetDisplayMode4, (void **)&pGetDisplayMode4, "GetDisplayMode(D4)");
+ SetHook((void *)(**(DWORD **)lplpdd + 56), extGetGDISurface4, (void **)&pGetGDISurface4, "GetGDISurface(D4)");
SetHook((void *)(**(DWORD **)lplpdd + 80), extSetCooperativeLevel4, (void **)&pSetCooperativeLevel4, "SetCooperativeLevel(D4)");
SetHook((void *)(**(DWORD **)lplpdd + 84), extSetDisplayMode4, (void **)&pSetDisplayMode4, "SetDisplayMode(D4)");
break;
case 7:
SetHook((void *)(**(DWORD **)lplpdd + 44), extGetCaps7D, (void **)&pGetCaps7D, "GetCaps(D7)");
SetHook((void *)(**(DWORD **)lplpdd + 48), extGetDisplayMode7, (void **)&pGetDisplayMode7, "GetDisplayMode(D7)");
+ SetHook((void *)(**(DWORD **)lplpdd + 56), extGetGDISurface7, (void **)&pGetGDISurface7, "GetGDISurface(D7)");
SetHook((void *)(**(DWORD **)lplpdd + 80), extSetCooperativeLevel7, (void **)&pSetCooperativeLevel7, "SetCooperativeLevel(D7)");
SetHook((void *)(**(DWORD **)lplpdd + 84), extSetDisplayMode7, (void **)&pSetDisplayMode7, "SetDisplayMode(D7)");
break;
}
- // IDIrectDraw::GetGDISurface
- SetHook((void *)(**(DWORD **)lplpdd + 56), extGetGDISurface, (void **)&pGetGDISurface, "GetGDISurface(D)");
// IDIrectDraw::Initialize
SetHook((void *)(**(DWORD **)lplpdd + 72), extInitialize, (void **)&pInitialize, "Initialize(D)");
// IDIrectDraw::WaitForVerticalBlank
@@ -2277,6 +2292,14 @@ static void BuildRealSurfaces(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurfa
OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[EmuPrim]", __LINE__));
res=(*pCreateSurface)(lpdd, &ddsd, &lpDDSEmu_Prim, 0);
if(res==DDERR_PRIMARYSURFACEALREADYEXISTS){
+ GetGDISurface_Type pGetGDISurface;
+ switch(dxversion){
+ default:
+ case 1: pGetGDISurface = pGetGDISurface1; break;
+ case 2: pGetGDISurface = pGetGDISurface2; break;
+ case 4: pGetGDISurface = pGetGDISurface4; break;
+ case 7: pGetGDISurface = pGetGDISurface7; break;
+ }
OutTraceDW("CreateSurface: ASSERT DDSEmu_Prim already exists\n");
if(dxw.Windowize){
// in Windowize mode, the desktop properties are untouched, then the current primary surface can be recycled
@@ -2380,6 +2403,14 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf
if((ddsd.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) &&
(dxw.dwFlags6 & SYNCPALETTE)){
if(lpDDP == NULL){
+ CreatePalette_Type pCreatePalette;
+ switch(dxversion){
+ default:
+ case 1: pCreatePalette = pCreatePalette1; break;
+ case 2: pCreatePalette = pCreatePalette2; break;
+ case 4: pCreatePalette = pCreatePalette4; break;
+ case 7: pCreatePalette = pCreatePalette7; break;
+ }
res=(*pCreatePalette)(lpdd, DDPCAPS_8BIT|DDPCAPS_ALLOW256, DefaultSystemPalette, &lpDDP, NULL);
if(res) OutTrace("CreateSurface: CreatePalette ERROR err=%x at %d\n", res, __LINE__);
}
@@ -2460,6 +2491,14 @@ static HRESULT BuildPrimaryFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pCrea
if((ddsd.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) &&
(dxw.dwFlags6 & SYNCPALETTE)){
if(lpDDP == NULL){
+ CreatePalette_Type pCreatePalette;
+ switch(dxversion){
+ default:
+ case 1: pCreatePalette = pCreatePalette1; break;
+ case 2: pCreatePalette = pCreatePalette2; break;
+ case 4: pCreatePalette = pCreatePalette4; break;
+ case 7: pCreatePalette = pCreatePalette7; break;
+ }
res=(*pCreatePalette)(lpdd, DDPCAPS_8BIT|DDPCAPS_ALLOW256, DefaultSystemPalette, &lpDDP, NULL);
if(res) OutTrace("CreateSurface: CreatePalette ERROR err=%x at %d\n", res, __LINE__);
}
@@ -2505,6 +2544,14 @@ static HRESULT BuildPrimaryDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf
if(res){
if (res==DDERR_PRIMARYSURFACEALREADYEXISTS){
LPDIRECTDRAWSURFACE lpPrim;
+ GetGDISurface_Type pGetGDISurface;
+ switch(dxversion){
+ default:
+ case 1: pGetGDISurface = pGetGDISurface1; break;
+ case 2: pGetGDISurface = pGetGDISurface2; break;
+ case 4: pGetGDISurface = pGetGDISurface4; break;
+ case 7: pGetGDISurface = pGetGDISurface7; break;
+ }
OutTraceE("CreateSurface: CreateSurface DDERR_PRIMARYSURFACEALREADYEXISTS workaround\n");
(*pGetGDISurface)(lpPrimaryDD, &lpPrim);
while ((*pReleaseS)(lpPrim));
@@ -2584,6 +2631,14 @@ static HRESULT BuildBackBufferEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateS
if((ddsd.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) &&
(dxw.dwFlags6 & SYNCPALETTE)){
if(lpDDP == NULL){
+ CreatePalette_Type pCreatePalette;
+ switch(dxversion){
+ default:
+ case 1: pCreatePalette = pCreatePalette1; break;
+ case 2: pCreatePalette = pCreatePalette2; break;
+ case 4: pCreatePalette = pCreatePalette4; break;
+ case 7: pCreatePalette = pCreatePalette7; break;
+ }
res=(*pCreatePalette)(lpdd, DDPCAPS_8BIT|DDPCAPS_ALLOW256, DefaultSystemPalette, &lpDDP, NULL);
if(res) OutTrace("CreateSurface: CreatePalette ERROR err=%x at %d\n", res, __LINE__);
}
@@ -2643,6 +2698,14 @@ static HRESULT BuildBackBufferFlippable(LPDIRECTDRAW lpdd, CreateSurface_Type pC
if((ddsd.ddpfPixelFormat.dwFlags & DDPF_PALETTEINDEXED8) &&
(dxw.dwFlags6 & SYNCPALETTE)){
if(lpDDP == NULL){
+ CreatePalette_Type pCreatePalette;
+ switch(dxversion){
+ default:
+ case 1: pCreatePalette = pCreatePalette1; break;
+ case 2: pCreatePalette = pCreatePalette2; break;
+ case 4: pCreatePalette = pCreatePalette4; break;
+ case 7: pCreatePalette = pCreatePalette7; break;
+ }
res=(*pCreatePalette)(lpdd, DDPCAPS_8BIT|DDPCAPS_ALLOW256, DefaultSystemPalette, &lpDDP, NULL);
if(res) OutTrace("CreateSurface: CreatePalette ERROR err=%x at %d\n", res, __LINE__);
}
@@ -2726,6 +2789,14 @@ static HRESULT BuildBackBufferDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateS
if (dxw.dwFlags2 & BACKBUFATTACH) {
LPDIRECTDRAWSURFACE lpPrim;
DDSURFACEDESC2 prim;
+ GetGDISurface_Type pGetGDISurface;
+ switch(dxversion){
+ default:
+ case 1: pGetGDISurface = pGetGDISurface1; break;
+ case 2: pGetGDISurface = pGetGDISurface2; break;
+ case 4: pGetGDISurface = pGetGDISurface4; break;
+ case 7: pGetGDISurface = pGetGDISurface7; break;
+ }
(*pGetGDISurface)(lpPrimaryDD, &lpPrim);
memset(&prim, 0, sizeof(DDSURFACEDESC2));
prim.dwSize = (dxversion >= 4) ? sizeof(DDSURFACEDESC2) : sizeof(DDSURFACEDESC);
@@ -3088,9 +3159,6 @@ HRESULT WINAPI extCreateSurface1(LPDIRECTDRAW lpdd, DDSURFACEDESC *lpddsd, LPDIR
HRESULT WINAPI extCreateSurface2(LPDIRECTDRAW lpdd, DDSURFACEDESC *lpddsd, LPDIRECTDRAWSURFACE *lplpdds, void *pu)
{ return extCreateSurface(2, (CreateSurface_Type)pCreateSurface2, lpdd, (DDSURFACEDESC2 *)lpddsd, lplpdds, pu); }
-HRESULT WINAPI extCreateSurface3(LPDIRECTDRAW lpdd, DDSURFACEDESC *lpddsd, LPDIRECTDRAWSURFACE *lplpdds, void *pu)
-{ return extCreateSurface(3, (CreateSurface_Type)pCreateSurface3, lpdd, (DDSURFACEDESC2 *)lpddsd, lplpdds, pu); }
-
HRESULT WINAPI extCreateSurface4(LPDIRECTDRAW lpdd, DDSURFACEDESC2 *lpddsd, LPDIRECTDRAWSURFACE *lplpdds, void *pu)
{ return extCreateSurface(4, (CreateSurface_Type)pCreateSurface4, lpdd, (DDSURFACEDESC2 *)lpddsd, lplpdds, pu); }
@@ -3789,12 +3857,12 @@ HRESULT WINAPI extWaitForVerticalBlank(LPDIRECTDRAW lpdd, DWORD dwflags, HANDLE
#define DDPCAPS_INITIALIZE_LEGACY 0x00000008l
-HRESULT WINAPI extCreatePalette(LPDIRECTDRAW lpdd, DWORD dwflags, LPPALETTEENTRY lpddpa,
- LPDIRECTDRAWPALETTE *lplpddp, IUnknown *pu)
+HRESULT WINAPI extCreatePalette(int version, CreatePalette_Type pCreatePalette,
+ LPDIRECTDRAW lpdd, DWORD dwflags, LPPALETTEENTRY lpddpa, LPDIRECTDRAWPALETTE *lplpddp, IUnknown *pu)
{
HRESULT res;
- OutTraceDDRAW("CreatePalette: dwFlags=%x(%s)\n", dwflags, ExplainCreatePaletteFlags(dwflags));
+ OutTraceDDRAW("CreatePalette: lpdd=%x dwFlags=%x(%s)\n", lpdd, dwflags, ExplainCreatePaletteFlags(dwflags));
if(IsDebug && (dwflags & DDPCAPS_8BIT)) dxw.DumpPalette(256, lpddpa);
if(dxw.dwFlags1 & EMULATESURFACE) dwflags &= ~DDPCAPS_PRIMARYSURFACE;
@@ -3806,9 +3874,21 @@ HRESULT WINAPI extCreatePalette(LPDIRECTDRAW lpdd, DWORD dwflags, LPPALETTEENTRY
OutTraceDDRAW("CreatePalette: OK lpddp=%x\n", *lplpddp);
HookDDPalette(lplpddp);
- return 0;
+ return DD_OK;
}
+HRESULT WINAPI extCreatePalette1(LPDIRECTDRAW lpdd, DWORD dwflags, LPPALETTEENTRY lpddpa, LPDIRECTDRAWPALETTE *lplpddp, IUnknown *pu)
+{ return extCreatePalette(1, (CreatePalette_Type)pCreatePalette1, lpdd, dwflags, lpddpa, lplpddp, pu); }
+
+HRESULT WINAPI extCreatePalette2(LPDIRECTDRAW lpdd, DWORD dwflags, LPPALETTEENTRY lpddpa, LPDIRECTDRAWPALETTE *lplpddp, IUnknown *pu)
+{ return extCreatePalette(2, (CreatePalette_Type)pCreatePalette2, lpdd, dwflags, lpddpa, lplpddp, pu); }
+
+HRESULT WINAPI extCreatePalette4(LPDIRECTDRAW lpdd, DWORD dwflags, LPPALETTEENTRY lpddpa, LPDIRECTDRAWPALETTE *lplpddp, IUnknown *pu)
+{ return extCreatePalette(4, (CreatePalette_Type)pCreatePalette4, lpdd, dwflags, lpddpa, lplpddp, pu); }
+
+HRESULT WINAPI extCreatePalette7(LPDIRECTDRAW lpdd, DWORD dwflags, LPPALETTEENTRY lpddpa, LPDIRECTDRAWPALETTE *lplpddp, IUnknown *pu)
+{ return extCreatePalette(7, (CreatePalette_Type)pCreatePalette7, lpdd, dwflags, lpddpa, lplpddp, pu); }
+
HRESULT WINAPI extGetPalette(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE *lplpddp)
{
HRESULT res;
@@ -4019,7 +4099,7 @@ HRESULT WINAPI extLockDir(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACED
// V2.02.43: Empire Earth does some test Lock operations apparently before the primary surface is created
if(lpPrimaryDD){
lpDDSPrim=0;
- res2=(*pGetGDISurface)(lpPrimaryDD, &lpDDSPrim);
+ res2=(*pGetGDISurface1)(lpPrimaryDD, &lpDDSPrim);
if(res2)
OutTraceE("Lock: GetGDISurface ERROR res=%x(%s) at %d\n", res2, ExplainDDError(res2), __LINE__);
else
@@ -4185,6 +4265,7 @@ HRESULT WINAPI extUnlockDir(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRAWSUR
//RECT screen, rect;
BOOL IsPrim;
LPDIRECTDRAWSURFACE lpDDSPrim;
+ GetGDISurface_Type pGetGDISurface;
IsPrim=dxwss.IsAPrimarySurface(lpdds);
@@ -4202,6 +4283,13 @@ HRESULT WINAPI extUnlockDir(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRAWSUR
}
if(dxw.dwFlags1 & LOCKEDSURFACE){
+ switch(dxversion){
+ default:
+ case 1: pGetGDISurface = pGetGDISurface1; break;
+ case 2: pGetGDISurface = pGetGDISurface2; break;
+ case 4: pGetGDISurface = pGetGDISurface4; break;
+ case 7: pGetGDISurface = pGetGDISurface7; break;
+ }
(*pGetGDISurface)(lpPrimaryDD, &lpDDSPrim);
if(lpdds==lpDDSPrim && lpDDSBuffer){
RECT client;
@@ -4268,7 +4356,7 @@ HRESULT WINAPI extGetDC(LPDIRECTDRAWSURFACE lpdds, HDC FAR *pHDC)
if(lpDDP==NULL){
// should link here to the GDI palette? See Hyperblade....
dxw.palNumEntries=256;
- res=(*pCreatePalette)(lpPrimaryDD, DDPCAPS_ALLOW256|DDPCAPS_8BIT|DDPCAPS_INITIALIZE, dxw.palPalEntry, &lpDDP, NULL);
+ res=(*pCreatePalette1)(lpPrimaryDD, DDPCAPS_ALLOW256|DDPCAPS_8BIT|DDPCAPS_INITIALIZE, dxw.palPalEntry, &lpDDP, NULL);
if (res) {
OutTraceE("GetDC: CreatePalette ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__);
return res;
@@ -4318,7 +4406,7 @@ HRESULT WINAPI extFlipToGDISurface(LPDIRECTDRAW lpdd)
return DD_OK;
}
-HRESULT WINAPI extGetGDISurface(LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE *w)
+HRESULT WINAPI extGetGDISurface(GetGDISurface_Type pGetGDISurface, LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE *w)
{
int res;
@@ -4341,6 +4429,18 @@ HRESULT WINAPI extGetGDISurface(LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE *w)
return res;
}
+HRESULT WINAPI extGetGDISurface1(LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE *w)
+{ return extGetGDISurface(pGetGDISurface1, lpdd, w); }
+
+HRESULT WINAPI extGetGDISurface2(LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE *w)
+{ return extGetGDISurface(pGetGDISurface2, lpdd, w); }
+
+HRESULT WINAPI extGetGDISurface4(LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE *w)
+{ return extGetGDISurface(pGetGDISurface4, lpdd, w); }
+
+HRESULT WINAPI extGetGDISurface7(LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE *w)
+{ return extGetGDISurface(pGetGDISurface7, lpdd, w); }
+
// debug function to dump all video modes queried by the DirectDrav::EnumDisplayModes method
HRESULT WINAPI EnumModesCallbackDumper(LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID lpContext)
diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp
index d51de71..5bac7aa 100644
--- a/dll/dxhook.cpp
+++ b/dll/dxhook.cpp
@@ -24,7 +24,6 @@
#include "MinHook.h"
#define SKIPIMEWINDOW TRUE
-#define HOOKDIRECTSOUND TRUE
dxwCore dxw;
dxwSStack dxwss;
@@ -903,8 +902,8 @@ void HookModule(HMODULE base, int dxversion)
(dxw.dwTFlags & OUTREGISTRY)) HookAdvApi32(base);
HookMSV4WLibs(base); // -- used by Aliens & Amazons demo: what for?
HookAVIFil32(base);
- //HookSmackW32(base);
- if (HOOKDIRECTSOUND) HookDirectSound(base);
+ if(dxw.dwFlags7 & HOOKSMACKW32) HookSmackW32(base);
+ if(dxw.dwFlags7 & HOOKDIRECTSOUND) HookDirectSound(base);
//HookComDlg32(base);
}
@@ -1292,6 +1291,21 @@ void HookInit(TARGETMAP *target, HWND hwnd)
dxw.hParentWnd, ClassName, WinText, dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle));
OutTrace("HookInit: target window pos=(%d,%d) size=(%d,%d)\n", dxw.iPosX, dxw.iPosY, dxw.iSizX, dxw.iSizY);
dxw.DumpDesktopStatus();
+ typedef HRESULT (WINAPI *DwmIsCompositionEnabled_Type)(BOOL *);
+ DwmIsCompositionEnabled_Type pDwmIsCompositionEnabled = NULL;
+ HMODULE DwnApiHdl;
+ DwnApiHdl = LoadLibrary("Dwmapi.dll");
+ if (DwnApiHdl) pDwmIsCompositionEnabled = (DwmIsCompositionEnabled_Type)GetProcAddress(DwnApiHdl, "DwmIsCompositionEnabled");
+ char *sRes;
+ if(pDwmIsCompositionEnabled){
+ HRESULT res;
+ BOOL val;
+ res = (*pDwmIsCompositionEnabled)(&val);
+ if(res==S_OK) sRes = val ? "ENABLED" : "DISABLED";
+ else sRes = "ERROR";
+ }
+ else sRes = "Unknown";
+ OutTrace("HookInit: DWMComposition %s\n", sRes);
}
if (SKIPIMEWINDOW) {
diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp
index 83910a3..9feee4d 100644
--- a/dll/dxwnd.cpp
+++ b/dll/dxwnd.cpp
@@ -27,7 +27,7 @@ along with this program. If not, see .
#include "TlHelp32.h"
-#define VERSION "2.03.56"
+#define VERSION "2.03.57"
#define DDTHREADLOCK 1
//#define LOCKTHREADS
diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo
index 0321b65..250b4f3 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 541bd69..08f6bc9 100644
--- a/dll/kernel32.cpp
+++ b/dll/kernel32.cpp
@@ -904,7 +904,6 @@ BOOL WINAPI extCreateProcessA(
if(dxw.dwFlags5 & INJECTSON) {
DEBUG_EVENT debug_event ={0};
char path[MAX_PATH];
- extern char *GetFileNameFromHandle(HANDLE);
DWORD dwContinueStatus = DBG_CONTINUE;
extern BOOL Inject(DWORD, const char *);
LPVOID LastExceptionPtr = 0;
diff --git a/dll/shareddc.cpp b/dll/shareddc.cpp
index bb4fa91..ddbf0b1 100644
--- a/dll/shareddc.cpp
+++ b/dll/shareddc.cpp
@@ -330,7 +330,7 @@ void dxwSDC::copyDcAttributes(HDC destDC, HDC origDc, POINT origin)
SetTextCharacterExtra(destDC, GetTextCharacterExtra(origDc));
SetTextColor(destDC, GetTextColor(origDc));
- OutTrace("copyDcAttributes: orig=(%d,%d)\n", origin.x, origin.y);
+ OutTraceB("copyDcAttributes: orig=(%d,%d)\n", origin.x, origin.y);
if(!(*pSetWindowOrgEx)(destDC, -origin.x, -origin.y, NULL))
OutTraceE("copyDcAttributes: SetWindowOrgEx ERROR orig=(%d,%d) err=%d\n", origin.x, origin.y, GetLastError());
@@ -355,35 +355,36 @@ typedef struct
static BOOL CALLBACK excludeClipRectsForOverlappingWindows(HWND hwnd, LPARAM lParam)
{
ExcludeClipRectsData_Type *excludeClipRectsData = (ExcludeClipRectsData_Type *)lParam;
- if (hwnd == dxw.GethWnd()) return FALSE; // stop
if (!IsWindowVisible(hwnd)) return TRUE; // go ahead
+ if (hwnd == excludeClipRectsData->rootWnd) return FALSE; // stop
+ if(dxw.IsDesktop(hwnd)) return FALSE;
RECT rect = {};
- (*pGetWindowRect)(hwnd, &rect);
+ (*pGetClientRect)(hwnd, &rect);
OffsetRect(&rect, -excludeClipRectsData->origin.x, -excludeClipRectsData->origin.y);
ExcludeClipRect(excludeClipRectsData->compatDc, rect.left, rect.top, rect.right, rect.bottom);
- OutTrace("dxwSDC::excludeClipRects: hwnd=%x rect=(%d,%d)-(%d,%d)\n", hwnd, rect.left, rect.top, rect.right, rect.bottom);
+ OutTraceB("dxwSDC::excludeClipRects: hwnd=%x rect=(%d,%d)-(%d,%d)\n", hwnd, rect.left, rect.top, rect.right, rect.bottom);
return TRUE;
}
void dxwSDC::setClippingRegion(HDC compatDc, HDC origDc, POINT& origin)
{
- OutTrace("dxwSDC::setClippingRegion: compdc=%x origdc=%x origin=(%d,%d)\n", compatDc, origDc, origin.x, origin.y);
+ OutTraceB("dxwSDC::setClippingRegion: compdc=%x origdc=%x origin=(%d,%d)\n", compatDc, origDc, origin.x, origin.y);
HRGN clipRgn = CreateRectRgn(0, 0, 0, 0);
const bool isEmptyClipRgn = (1 != GetRandomRgn(origDc, clipRgn, SYSRGN));
- OutTrace("dxwSDC::setClippingRegion: isEmptyClipRgn=%x\n", isEmptyClipRgn);
+ OutTraceB("dxwSDC::setClippingRegion: isEmptyClipRgn=%x\n", isEmptyClipRgn);
// scale clip region
POINT upleft={0, 0};
//(*pClientToScreen)(dxw.GethWnd(), &upleft);
(*pClientToScreen)(CurrenthWnd, &upleft);
if(IsDebug){
- OutTrace("dxwSDC::setClippingRegion: upleft=(%d,%d)\n", upleft.x, upleft.y);
+ OutTraceB("dxwSDC::setClippingRegion: upleft=(%d,%d)\n", upleft.x, upleft.y);
}
OffsetRgn(clipRgn, -upleft.x, -upleft.y);
if(IsDebug){
RECT RgnBox;
GetRgnBox(clipRgn, &RgnBox);
- OutTrace("dxwSDC::setClippingRegion: RgnBox=(%d,%d)-(%d,%d) size=(%dx%d)\n",
+ OutTraceB("dxwSDC::setClippingRegion: RgnBox=(%d,%d)-(%d,%d) size=(%dx%d)\n",
RgnBox.left, RgnBox.top, RgnBox.right, RgnBox.bottom, RgnBox.right-RgnBox.left, RgnBox.bottom-RgnBox.top);
}
// end of scaling
@@ -393,13 +394,13 @@ void dxwSDC::setClippingRegion(HDC compatDc, HDC origDc, POINT& origin)
HRGN origClipRgn = (*pCreateRectRgn)(0, 0, 0, 0);
if (1 == GetClipRgn(origDc, origClipRgn))
{
- OutTrace("dxwSDC::setClippingRegion: GetClipRgn==1\n");
+ OutTraceB("dxwSDC::setClippingRegion: GetClipRgn==1\n");
OffsetRgn(origClipRgn, origin.x, origin.y);
ExtSelectClipRgn(compatDc, origClipRgn, RGN_AND);
if(IsDebug){
RECT RgnBox;
GetRgnBox(origClipRgn, &RgnBox); // for logging only
- OutTrace("dxwSDC::setClippingRegion: OrigRgnBox=(%d,%d)-(%d,%d)\n", RgnBox.left, RgnBox.top, RgnBox.right, RgnBox.bottom);
+ OutTraceB("dxwSDC::setClippingRegion: OrigRgnBox=(%d,%d)-(%d,%d)\n", RgnBox.left, RgnBox.top, RgnBox.right, RgnBox.bottom);
}
}
DeleteObject(origClipRgn);
@@ -408,10 +409,13 @@ void dxwSDC::setClippingRegion(HDC compatDc, HDC origDc, POINT& origin)
// to finish .....
// on Win10 this part seems unnecessary and giving troubles .....
if (!isEmptyClipRgn){
+ OutTraceB("dxwSDC::setClippingRegion: isEmptyClipRgn FALSE\n");
HWND hwnd = WindowFromDC(origDc);
- if (hwnd)
- {
- ExcludeClipRectsData_Type excludeClipRectsData = { compatDc, origin, GetAncestor(hwnd, GA_ROOT) };
+ if (hwnd && (!dxw.IsDesktop(hwnd))){
+ ExcludeClipRectsData_Type excludeClipRectsData = { compatDc, origin, dxw.GethWnd() };
+ //ExcludeClipRectsData_Type excludeClipRectsData = { compatDc, origin, GetAncestor(hwnd, GA_ROOT) };
+ OutTraceB("dxwSDC::setClippingRegion: compatdc=%x origin=(%d,%d) ancestor=%x\n",
+ compatDc, origin.x, origin.y, dxw.GethWnd());
EnumWindows(&excludeClipRectsForOverlappingWindows,(LPARAM)(&excludeClipRectsData));
}
}
diff --git a/dll/smack.cpp b/dll/smack.cpp
index e4d47a4..5f09831 100644
--- a/dll/smack.cpp
+++ b/dll/smack.cpp
@@ -23,7 +23,7 @@ SmackOpen_Type pSmackOpen = NULL;
SmackStruct * WINAPI extSmackOpen(HANDLE, UINT32, INT32);
static HookEntryEx_Type Hooks[]={
- {HOOK_IAT_CANDIDATE, 0, "_SmackOpen@12", (FARPROC)NULL, (FARPROC *)&pSmackOpen, (FARPROC)extSmackOpen},
+ {HOOK_IAT_CANDIDATE, 0x000E, "_SmackOpen@12", (FARPROC)NULL, (FARPROC *)&pSmackOpen, (FARPROC)extSmackOpen},
{HOOK_IAT_CANDIDATE, 0, 0, NULL, 0, 0} // terminator
};
@@ -67,4 +67,16 @@ SmackStruct * WINAPI extSmackOpen(HANDLE SmackFile, UINT32 flags, INT32 unknown)
return ret;
}
+/* ---------------------------------------------------------------
+Used by M2 Tank Platoon II:
+Ordinal 0x0015 name _SmackNextFrame@4
+Ordinal 0x000E name _SmackOpen@12
+Ordinal 0x0026 name _SmackSoundUseDirectSound@4
+Ordinal 0x0012 name _SmackClose@4
+Ordinal 0x0013 name _SmackDoFrame@4
+Ordinal 0x0017 name _SmackToBuffer@28
+Ordinal 0x0020 name _SmackWait@4
+/* ------------------------------------------------------------ */
+
+
diff --git a/dll/user32.cpp b/dll/user32.cpp
index b80d3a5..60216ba 100644
--- a/dll/user32.cpp
+++ b/dll/user32.cpp
@@ -207,7 +207,7 @@ static HookEntryEx_Type SyscallHooks[]={
{HOOK_HOT_CANDIDATE, 0, "FillRect", (FARPROC)NULL, (FARPROC *)&pFillRect, (FARPROC)extFillRect},
{HOOK_HOT_CANDIDATE, 0, "InvertRect", (FARPROC)NULL, (FARPROC *)&pInvertRect, (FARPROC)extInvertRect},
{HOOK_HOT_CANDIDATE, 0, "DrawIcon", (FARPROC)NULL, (FARPROC *)&pDrawIcon, (FARPROC)extDrawIcon},
- {HOOK_HOT_CANDIDATE, 0, "DrawIconEx", (FARPROC)NULL, (FARPROC *)&pDrawIconEx, (FARPROC)extDrawIconEx},
+ {HOOK_IAT_CANDIDATE, 0, "DrawIconEx", (FARPROC)NULL, (FARPROC *)&pDrawIconEx, (FARPROC)extDrawIconEx},
{HOOK_HOT_CANDIDATE, 0, "DrawCaption", (FARPROC)NULL, (FARPROC *)&pDrawCaption, (FARPROC)extDrawCaption},
//TODO {HOOK_HOT_CANDIDATE, 0, "DrawEdge", (FARPROC)NULL, (FARPROC *)&pDrawEdge, (FARPROC)extDrawEdge},
//TODO {HOOK_HOT_CANDIDATE, 0, "DrawFocusRect", (FARPROC)NULL, (FARPROC *)&pDrawFocusRect, (FARPROC)extDrawFocusRect},
@@ -3559,7 +3559,7 @@ BOOL WINAPI extDrawIcon(HDC hdc, int X, int Y, HICON hIcon)
return ret;
}
-
+// not working in HOT PATCH mode
BOOL WINAPI extDrawIconEx( HDC hdc, int xLeft, int yTop, HICON hIcon, int cxWidth, int cyWidth, UINT istepIfAniCur, HBRUSH hbrFlickerFreeDraw, UINT diFlags)
{
BOOL ret;
diff --git a/host/TabCompat.cpp b/host/TabCompat.cpp
index 58a2352..282ba99 100644
--- a/host/TabCompat.cpp
+++ b/host/TabCompat.cpp
@@ -45,6 +45,8 @@ void CTabCompat::DoDataExchange(CDataExchange* pDX)
DDX_Check(pDX, IDC_DISABLEDISABLEALTTAB, cTarget->m_DisableDisableAltTab);
DDX_Check(pDX, IDC_NOIMAGEHLP, cTarget->m_NoImagehlp);
DDX_Check(pDX, IDC_REPLACEPRIVOPS, cTarget->m_ReplacePrivOps);
+ DDX_Check(pDX, IDC_HOOKDIRECTSOUND, cTarget->m_HookDirectSound);
+ DDX_Check(pDX, IDC_HOOKSMACKW32, cTarget->m_HookSmackW32);
// Registry management
DDX_Check(pDX, IDC_EMULATEREGISTRY, cTarget->m_EmulateRegistry);
diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp
index bcca2c8..bc28eb3 100644
--- a/host/TargetDlg.cpp
+++ b/host/TargetDlg.cpp
@@ -58,6 +58,8 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/)
m_SetCompatibility = TRUE; // default true !!
m_AEROBoost = TRUE; // default true !!
m_DiabloTweak = FALSE;
+ m_HookDirectSound = FALSE;
+ m_HookSmackW32 = FALSE;
m_EASportsHack = FALSE;
m_LegacyAlloc = FALSE;
m_DisableMaxWinMode = FALSE;
diff --git a/host/TargetDlg.h b/host/TargetDlg.h
index c273130..f0c3c5d 100644
--- a/host/TargetDlg.h
+++ b/host/TargetDlg.h
@@ -198,6 +198,8 @@ public:
BOOL m_SetCompatibility;
BOOL m_AEROBoost;
BOOL m_DiabloTweak;
+ BOOL m_HookDirectSound;
+ BOOL m_HookSmackW32;
BOOL m_EASportsHack;
BOOL m_LegacyAlloc;
BOOL m_DisableMaxWinMode;
diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps
index 527a3dd..5798c9e 100644
Binary files a/host/dxwndhost.aps and b/host/dxwndhost.aps differ
diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc
index 6378734..69e1097 100644
Binary files a/host/dxwndhost.rc and b/host/dxwndhost.rc differ
diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo
index 0cedd53..6cd93da 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 0b59bdd..f13cb29 100644
--- a/host/dxwndhostView.cpp
+++ b/host/dxwndhostView.cpp
@@ -117,6 +117,7 @@ BEGIN_MESSAGE_MAP(CDxwndhostView, CListView)
ON_COMMAND(ID_TASKBAR_SHOW, OnTaskbarShow)
ON_COMMAND(ID_MODIFY, OnModify)
ON_COMMAND(ID_ADD, OnAdd)
+ ON_COMMAND(ID_PDUPLICATE, OnDuplicate)
ON_COMMAND(ID_PEXPORT, OnExport)
ON_COMMAND(ID_PKILL, OnProcessKill)
ON_COMMAND(ID_FILE_IMPORT, OnImport)
@@ -139,6 +140,10 @@ BEGIN_MESSAGE_MAP(CDxwndhostView, CListView)
ON_COMMAND(ID_DESKTOPCOLORDEPTH_16BPP, OnDesktopcolordepth16bpp)
ON_COMMAND(ID_DESKTOPCOLORDEPTH_24BPP, OnDesktopcolordepth24bpp)
ON_COMMAND(ID_DESKTOPCOLORDEPTH_32BPP, OnDesktopcolordepth32bpp)
+ ON_COMMAND(ID_MOVE_TOP, OnMoveTop)
+ ON_COMMAND(ID_MOVE_UP, OnMoveUp)
+ ON_COMMAND(ID_MOVE_DOWN, OnMoveDown)
+ ON_COMMAND(ID_MOVE_BOTTOM, OnMoveBottom)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
@@ -307,6 +312,8 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg)
if(dlg->m_SetCompatibility) t->flags2 |= SETCOMPATIBILITY;
if(dlg->m_AEROBoost) t->flags5 |= AEROBOOST;
if(dlg->m_DiabloTweak) t->flags5 |= DIABLOTWEAK;
+ if(dlg->m_HookDirectSound) t->flags7 |= HOOKDIRECTSOUND;
+ if(dlg->m_HookSmackW32) t->flags7 |= HOOKSMACKW32;
if(dlg->m_EASportsHack) t->flags5 |= EASPORTSHACK;
if(dlg->m_LegacyAlloc) t->flags6 |= LEGACYALLOC;
if(dlg->m_DisableMaxWinMode) t->flags6 |= DISABLEMAXWINMODE;
@@ -539,6 +546,8 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg)
dlg->m_SetCompatibility = t->flags2 & SETCOMPATIBILITY ? 1 : 0;
dlg->m_AEROBoost = t->flags5 & AEROBOOST ? 1 : 0;
dlg->m_DiabloTweak = t->flags5 & DIABLOTWEAK ? 1 : 0;
+ dlg->m_HookDirectSound = t->flags7 & HOOKDIRECTSOUND ? 1 : 0;
+ dlg->m_HookSmackW32 = t->flags7 & HOOKSMACKW32 ? 1 : 0;
dlg->m_EASportsHack = t->flags5 & EASPORTSHACK ? 1 : 0;
dlg->m_LegacyAlloc = t->flags6 & LEGACYALLOC ? 1 : 0;
dlg->m_DisableMaxWinMode = t->flags6 & DISABLEMAXWINMODE ? 1 : 0;
@@ -1676,6 +1685,179 @@ void CDxwndhostView::OnAdd()
}
}
+void CDxwndhostView::OnDuplicate()
+{
+ POSITION pos;
+ int i;
+ CListCtrl& listctrl = GetListCtrl();
+
+ if(!(pos = listctrl.GetFirstSelectedItemPosition())) return;
+ i = listctrl.GetNextSelectedItem(pos);
+ if (listctrl.GetItemCount()>=MAXTARGETS-1) return; // too many entries to duplicate one!
+
+ for(int j=listctrl.GetItemCount(); j>i; j--){
+ TargetMaps[j+1]=TargetMaps[j];
+ PrivateMaps[j+1]=PrivateMaps[j];
+ }
+ TargetMaps[i+1] = TargetMaps[i];
+ PrivateMaps[i+1] = PrivateMaps[i];
+
+ listctrl.DeleteAllItems();
+ for(i=0; TargetMaps[i].path[0]; i++) {
+ LV_ITEM listitem;
+ listitem.mask = LVIF_TEXT | LVIF_IMAGE;
+ listitem.iItem = i;
+ listitem.iSubItem = 0;
+ listitem.iImage = SetTargetIcon(TargetMaps[i]);
+ listitem.pszText = PrivateMaps[i].title;
+ listctrl.SetItem(&listitem);
+ listctrl.InsertItem(&listitem);
+ }
+ SetTarget(TargetMaps);
+ this->isUpdated=TRUE;
+}
+
+void CDxwndhostView::OnMoveTop()
+{
+ TARGETMAP MapEntry;
+ PRIVATEMAP TitEntry;
+ POSITION pos;
+ int i;
+ CListCtrl& listctrl = GetListCtrl();
+
+ if(!(pos = listctrl.GetFirstSelectedItemPosition())) return;
+ i = listctrl.GetNextSelectedItem(pos);
+ if (i==0)return;
+
+ MapEntry=TargetMaps[i];
+ TitEntry=PrivateMaps[i];
+ for(int j=i; j; j--){
+ TargetMaps[j]=TargetMaps[j-1];
+ PrivateMaps[j]=PrivateMaps[j-1];
+ }
+ TargetMaps[0]=MapEntry;
+ PrivateMaps[0]=TitEntry;
+
+ listctrl.DeleteAllItems();
+ for(i=0; TargetMaps[i].path[0]; i++) {
+ LV_ITEM listitem;
+ listitem.mask = LVIF_TEXT | LVIF_IMAGE;
+ listitem.iItem = i;
+ listitem.iSubItem = 0;
+ listitem.iImage = SetTargetIcon(TargetMaps[i]);
+ listitem.pszText = PrivateMaps[i].title;
+ listctrl.SetItem(&listitem);
+ listctrl.InsertItem(&listitem);
+ }
+ SetTarget(TargetMaps);
+ this->isUpdated=TRUE;
+}
+
+void CDxwndhostView::OnMoveUp()
+{
+ TARGETMAP MapEntry;
+ PRIVATEMAP TitEntry;
+ POSITION pos;
+ int i;
+ CListCtrl& listctrl = GetListCtrl();
+
+ if(!(pos = listctrl.GetFirstSelectedItemPosition())) return;
+ i = listctrl.GetNextSelectedItem(pos);
+ if (i==0)return;
+
+ MapEntry=TargetMaps[i-1];
+ TargetMaps[i-1]=TargetMaps[i];
+ TargetMaps[i]=MapEntry;
+ TitEntry=PrivateMaps[i-1];
+ PrivateMaps[i-1]=PrivateMaps[i];
+ PrivateMaps[i]=TitEntry;
+
+ listctrl.DeleteAllItems();
+ for(i=0; TargetMaps[i].path[0]; i++) {
+ LV_ITEM listitem;
+ listitem.mask = LVIF_TEXT | LVIF_IMAGE;
+ listitem.iItem = i;
+ listitem.iSubItem = 0;
+ listitem.iImage = SetTargetIcon(TargetMaps[i]);
+ listitem.pszText = PrivateMaps[i].title;
+ listctrl.SetItem(&listitem);
+ listctrl.InsertItem(&listitem);
+ }
+ SetTarget(TargetMaps);
+ this->isUpdated=TRUE;
+}
+
+void CDxwndhostView::OnMoveDown()
+{
+ TARGETMAP MapEntry;
+ PRIVATEMAP TitEntry;
+ POSITION pos;
+ int i;
+ CListCtrl& listctrl = GetListCtrl();
+
+ if(!(pos = listctrl.GetFirstSelectedItemPosition())) return;
+ i = listctrl.GetNextSelectedItem(pos);
+ if (i==listctrl.GetItemCount()-1)return;
+
+ MapEntry=TargetMaps[i+1];
+ TargetMaps[i+1]=TargetMaps[i];
+ TargetMaps[i]=MapEntry;
+ TitEntry=PrivateMaps[i+1];
+ PrivateMaps[i+1]=PrivateMaps[i];
+ PrivateMaps[i]=TitEntry;
+
+ listctrl.DeleteAllItems();
+ for(i=0; TargetMaps[i].path[0]; i++) {
+ LV_ITEM listitem;
+ listitem.mask = LVIF_TEXT | LVIF_IMAGE;
+ listitem.iItem = i;
+ listitem.iSubItem = 0;
+ listitem.iImage = SetTargetIcon(TargetMaps[i]);
+ listitem.pszText = PrivateMaps[i].title;
+ listctrl.SetItem(&listitem);
+ listctrl.InsertItem(&listitem);
+ }
+ SetTarget(TargetMaps);
+ this->isUpdated=TRUE;
+}
+
+void CDxwndhostView::OnMoveBottom()
+{
+ TARGETMAP MapEntry;
+ PRIVATEMAP TitEntry;
+ POSITION pos;
+ int i, last;
+ CListCtrl& listctrl = GetListCtrl();
+
+ if(!(pos = listctrl.GetFirstSelectedItemPosition())) return;
+ i = listctrl.GetNextSelectedItem(pos);
+ last = listctrl.GetItemCount()-1;
+ if (i==last)return;
+
+ MapEntry=TargetMaps[i];
+ TitEntry=PrivateMaps[i];
+ for(int j=i; jisUpdated=TRUE;
+}
+
void CDxwndhostView::OnDelete()
{
int i, len;
@@ -1797,6 +1979,7 @@ DWORD WINAPI TrayIconUpdate(CSystemTray *Tray)
if(gTransientMode) {
IdleCount++;
if(IdleCount > 2) {
+ Tray->HideIcon();
delete(Tray->GetAncestor(GA_ROOTOWNER));
exit(0);
}
@@ -1947,6 +2130,9 @@ void CDxwndhostView::OnRButtonDown(UINT nFlags, CPoint point)
case ID_PADD:
OnAdd();
break;
+ case ID_PDUPLICATE:
+ OnDuplicate();
+ break;
case ID_PEXPLORE:
OnExplore();
break;
@@ -1992,6 +2178,18 @@ void CDxwndhostView::OnRButtonDown(UINT nFlags, CPoint point)
case ID_DESKTOPCOLORDEPTH_32BPP:
OnDesktopcolordepth32bpp();
break;
+ case ID_MOVE_TOP:
+ OnMoveTop();
+ break;
+ case ID_MOVE_UP:
+ OnMoveUp();
+ break;
+ case ID_MOVE_DOWN:
+ OnMoveDown();
+ break;
+ case ID_MOVE_BOTTOM:
+ OnMoveBottom();
+ break;
}
CListView::OnRButtonDown(nFlags, point);
}
diff --git a/host/dxwndhostView.h b/host/dxwndhostView.h
index bc2b3e2..771cde4 100644
--- a/host/dxwndhostView.h
+++ b/host/dxwndhostView.h
@@ -60,6 +60,7 @@ protected:
//{{AFX_MSG(CDxwndhostView)
afx_msg void OnDblclk(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnAdd();
+ afx_msg void OnDuplicate();
afx_msg void OnModify();
afx_msg void OnExport();
afx_msg void OnImport();
@@ -97,6 +98,10 @@ protected:
afx_msg void OnDesktopcolordepth16bpp();
afx_msg void OnDesktopcolordepth24bpp();
afx_msg void OnDesktopcolordepth32bpp();
+ afx_msg void OnMoveTop();
+ afx_msg void OnMoveUp();
+ afx_msg void OnMoveDown();
+ afx_msg void OnMoveBottom();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
diff --git a/host/host.aps b/host/host.aps
index 7948191..df6ce6c 100644
Binary files a/host/host.aps and b/host/host.aps differ
diff --git a/host/res/bigicons.bmp b/host/res/bigicons.bmp
index eb32d61..b83e604 100644
Binary files a/host/res/bigicons.bmp and b/host/res/bigicons.bmp differ
diff --git a/host/res/smallicons.bmp b/host/res/smallicons.bmp
index 9d55631..1d0078a 100644
Binary files a/host/res/smallicons.bmp and b/host/res/smallicons.bmp differ
diff --git a/host/resource b/host/resource
index 04c421f..9cc79cd 100644
Binary files a/host/resource and b/host/resource differ