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