From 9aca112da31d22f3a7a863bafe3ba6869ced0939 Mon Sep 17 00:00:00 2001 From: gho tik Date: Wed, 16 Mar 2016 12:45:22 -0400 Subject: [PATCH] v2_03_57_src Former-commit-id: 56291ae33fff04971e7e7e7e3ec3de827f0f4284 --- Include/dxwnd.h | 2 + build/dxwnd.dll | 4 +- build/dxwnd.exe | 4 +- build/dxwnd.ini | 120 ++++++++++++ build/dxwnd.reg | 31 +++ build/exports/11th Hour, the.dxw | 15 +- build/exports/Duke Nukem Forever.dxw | 29 +++ build/exports/M1 Tank Platoon 2.dxw | 9 +- build/exports/Miscrosoft Golf '98 Trial.dxw | 29 +++ build/exports/dxwnd.ini | 5 - build/readme-relnotes.txt | 9 +- build/redist/vbruntimes.exe | 3 + dll/ddraw.cpp | 146 ++++++++++++--- dll/dxhook.cpp | 20 +- dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 283648 -> 285696 bytes dll/kernel32.cpp | 1 - dll/shareddc.cpp | 30 +-- dll/smack.cpp | 14 +- dll/user32.cpp | 4 +- host/TabCompat.cpp | 2 + host/TargetDlg.cpp | 2 + host/TargetDlg.h | 2 + host/dxwndhost.aps | Bin 163088 -> 164800 bytes host/dxwndhost.rc | Bin 108984 -> 110172 bytes host/dxwndhost.vs2008.suo | Bin 83456 -> 99840 bytes host/dxwndhostView.cpp | 198 ++++++++++++++++++++ host/dxwndhostView.h | 5 + host/host.aps | Bin 47504 -> 47496 bytes host/res/bigicons.bmp | Bin 5174 -> 6198 bytes host/res/smallicons.bmp | Bin 2102 -> 2358 bytes host/resource | Bin 38356 -> 39104 bytes 32 files changed, 625 insertions(+), 61 deletions(-) create mode 100644 build/dxwnd.ini create mode 100644 build/dxwnd.reg create mode 100644 build/exports/Duke Nukem Forever.dxw create mode 100644 build/exports/Miscrosoft Golf '98 Trial.dxw delete mode 100644 build/exports/dxwnd.ini create mode 100644 build/redist/vbruntimes.exe 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 0321b65f93f412a87df2040e714fc2ed8525c553..250b4f3aa85f034d8c8251b289b3f78ee9dd32b1 100644 GIT binary patch delta 13757 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 bPGP$eW~0F-GMmPXs{LYUnj$V`HbVIi^A^Uu delta 12264 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 E7aIT(j{pDw 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 527a3dd09fd8fa6ba13f3e66cc3cabda1c1030ca..5798c9e4cb7a7f60aac3741a81b197de6dd0c509 100644 GIT binary patch delta 9215 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 Yg8gKv#5b=Zwu{)LM^{LE$~wvXUv(((r~m)} diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index 63787345d9db9efee40833a7056f7717dc6c64b5..69e109731121aad51c08e04cf97c929fd0a37f07 100644 GIT binary patch delta 356 zcmYk2yGp}g6vzJ`$k&@OB9?fGgV0IPwkn8&piLZ###)nDDuo)_LPdK~Qhf&pp&YP_ z51}~dd${%qoQiaE@+5=G+0OZ$-?_Yh$l*{vk9E~V4_#d00yTK>>1A@2GD}g;yEw)n z@-VOmhlHZhZgeVQp@UmA$V(N4L+RKyjXq_f3JV3CVjopfQ;Rem(}hdf*cP432^vYM z{MG|6UB|N#lTCMMQ-40qlnf~Kk22X;qT-wuxDq*LeU1)VA0I|+Tkd`Vt0}< zGi$G7y*Z-p{mS5BLBx|LUwDHCU+KeUPY-R>2g@muhD+Xg1M6WYCoO)CfdiC+B=yhA^z}IVR#8Od=?Bf?SEc{} delta 19 bcmca}hi%7YwhdooHb0Ti_^?fgF=h?`YpDs} diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index 0cedd53c9a906144d59b18c7d9a733f9076d7a78..6cd93daf37f48ea904c8c1ce45c00e847d1cf6e2 100644 GIT binary patch delta 22392 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 G_x~@o3dg1Z delta 8148 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 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 79481915e2332b5da052bf32209e54a8f13bd66c..df6ce6c6e588d47949fa9b71f87c0a46b1269987 100644 GIT binary patch delta 661 zcmXBQF=!J}7zgn89-ic=)KEeRXSmnczwGl-eS}4UEbSmf&h|mnJl!{G}792V_ z^gyKLzc`3=aL7SPlQvBgkkY}y6Oj&%QXCDa6zW)t|Kyh6@cqB<<9%=KM6I5vwIS)O zr-z+`st~2Sg^8s{^QFRzo5kE{@z(8Pd11OR^Q^qsBfBsy>gDCCbnvI@$c^>o8%ACV z@f+TjR$~fTWf_-+5DEBOT0TZVHxV*iF)(jfz3xviYg#7ZQcl*i%Ee&EETh56SMXWp zBz=dF;c*|1`l7X*tZNyAORvDIYjt`NPwTcCiz6Gi&UY6)8NkDVs6CI6jZ5gzw=lQ0 zoP)cqRc#RO2cz!8B=(b0_Xqgw_=SMpL&&~(3TKz1H&4Ob(Xs-UzJ#}<)q#zwZ5fH^ zT9)r4pnNmK!!-8OQJ8_*=pN+KO?VBherE736NP#BEYBdI9}zMg)r=$4N zv{fz-JI_OT%N>||TE2!$OYrDt%+fjdw1t2c5YiGldt5w@{&CAFDIrpDTUu>Q;?1OG nRL%);0kbVFzr&{~1U*AKgAPr=YB|-DAU4iDCpoI)Nf9ld`Uhp3D5BRJ>4G@TRhViZM){& zK`#i}my_j3H}1BRhZkGXeCyJD>(-sjC#&}!WEZl{&iY!K{{7gzJy`GbEYi2$IosX7 zKX+omg5am(SD~%QwA1Af?!2C*;N&|q!OQ~!X4S`&@wsPSB!`9_)+pD*5NOL$VkB^mOU&S8XEd1-H`Cm6j6tt*{>=oI&(4Na- zsu(}XW2PM6tH8EOOjY5mY(KOaIowr@XXNpV^6~#-Y>6AHa7s3+J9DF^{nl0NYHbw$ E0m`o8#sB~S diff --git a/host/res/bigicons.bmp b/host/res/bigicons.bmp index eb32d6114a881b87aa0a612258f1f7efd06c1b3f..b83e60491429a61cff765f0eb3beefa8a0a72c1b 100644 GIT binary patch literal 6198 zcmeI#L5|x<3_wu^2+%peEV8WSoFHo=`$4Y2qwpwP1al6q=M1x`BV?UM(D|iuNu`z? zBj^M(NG$uAB~zAJbjj|1|JS>>vTW~Oi~PwbQ1D9L@W}Q@564Fr;V$ky@W@ayQ}W-G zPyhVQi4+DBC6K5hDkxx}21g)KMNCkjV8R8gT!DQGu?BaoJgCmfreJMmCDh!T5qV{Eyg{Uw%0*SgT zA+Lp~FgOBztZy0yK158E@J*X=z2xNhfpR{Lc;=9k(&tlQy$ z_QYD=!y&!Ad@b+ud44VL@jO4OYggv;`G32d##IGe)Mb~xBTeYK92lp_gWh-2i)u1_igO`8vVQW>5dh6 zZS{>6D6(I5^Iq%F@+&`D_AD+PJiB(sMa%*B`kpmy+P(L$t*?2-?Z@}^*ZMPlagVY0 zXWz4V?|0~5>(Ka{WgnNTi$4Reb#TkiJ=?}xe!66*;mGp_Kaf0h27 zufTP7S61LYzpc74+UKXXU50c1bOlZaoUOnqeR_rL^P{RQ?(;9JuXS*)@%aBsduIFo zJI~Lx&DFL41ludN8jr7E4%n{V!vXDy?c3#$US9rR);H$ZDtkWnmTOzj{k;6GH~87_ Rf9w3W>g!#)KYm{az5--!=>-4) delta 419 zcmdmHuuVh7$=6JT0SwGo7#K8wtOg)f0AfZ44j>5x0vlCiSSL5IHUM!A5VK4^z~(S{ zp{UGc8Fq!qd)Qo{Y`Mw5*qtWFipWil;!r?h%T2c6becR@Kzj02PGu$rhRJ)lr6z}P zs*xn5IC&el)8v@~a+Ae)6llO!Wd2L0%dmJ!WwJS^=;Q!Sj>%#iYFI)98$r>7CC|vT#8F^fT+VUH4wOji#eT^|9f7RSrIZs%3ls(t4*mQaDh;0PoNJ0*OM;b`2#O9DzikXDg=?4URyf(6h};i3Ud? zcgV5w-{m5&*Kw;T@?#x`{AnGBoPn+JU56&} zX&t}vskSTbA567faq?YlSDbuT+Z89@)po^||1L+1E8oq{W#_kYw78z%%FXOgb5nCa z--DgY3H6Tctp<zp-8}9#5?{2^+tjFo~4h2_x#|?PRZ!3Jw ZZyWHM-|uG%ocs5-S~~Ur!5-yVm!HYKuI~T< delta 413 zcmdlcv`s+8$=8g70SwGo7#K8wEC(PK0AfZ4s07PKm2j5H-7I#KZ?Y&&?&jc|%*o0> zS%Xzk(jNvG{(=C*e;Alt#HuC(lLXQrd4%l${|u8$SXHF)D3~nFrXq(V4>AJT0FV)) qY)bS|Qp&1K&@=cIsIaO^!F_`sSPYXdvuHrWRbcW=4yVaJEY<)<6UdqX diff --git a/host/resource b/host/resource index 04c421fd5862d7f31d2e03c16ef5e936b8974709..9cc79cd73adcc854ddbc2233da4f49345af8a795 100644 GIT binary patch delta 282 zcmcbzn(4qsrVSeTlOJgDOm@g-;SXYPWpHK)VF+gMX9#8Ro2;lJJNZEl+hnIOg~@UX zZ2Z9tz6_2)72XWt48{yblO1`LnT;6CCqI;w-mH-yCp39kH6ODtga73JOq!EFOp%-1 z(70#vgM2nlpcq3K(D3-l_Enmb7&#^%Xylk|R3d{Uk;n{}U}2LIj0ai;)x+QdWQ9*Y z$f6C_R>UYJjx6g0lnntwe+J*l2TL@WEf`EDGuF!T2LSbjG6XRAFn9u;>^NC5Q+*O6 m3)qNF-8!3tnwAJn7GRf{ykUyOWVNX}lRI)iY>~-zQ^NpuBv0u8 delta 55 zcmX@Gk?G26rVSeTn;+!I2~B>`C@^_V)3V76+Qc^7wJs5wtk5JedCqi+$wD)9ChO#Y L*dmj&W`qF%*l8HB