From d5e3bf8bc55e3e379030f6e5923cf907a8cf269b Mon Sep 17 00:00:00 2001 From: gho tik Date: Sun, 13 Nov 2016 11:48:08 -0500 Subject: [PATCH] v2_03_96_src Former-commit-id: e3c19066d5e85028dcc186ae8bd4142209903234 --- Include/dxwnd.h | 2 + build/README.FIRST.txt | 26 +- build/dxwnd.dll | 4 +- build/dxwnd.exe | 4 +- build/dxwnd.ini | 281 ------------------- build/exports/Blade Runner (4CD version).dxw | 35 +++ build/exports/Blade Runner (Win7).dxw | 35 +++ build/exports/Blade Runner.dxw | 27 +- build/exports/Return Fire 2 (OpenGL).dxw | 35 +++ build/exports/Return Fire 2 (SW).dxw | 35 +++ build/exports/RoboRumble (dx5).dxw | 35 +++ build/exports/RoboRumble (sw).dxw | 35 +++ build/exports/Warhammer Dark Omen.dxw | 35 +++ build/readme-relnotes.txt | 10 + dll/ddblit.cpp | 3 + dll/ddraw.cpp | 50 +++- dll/dxwcore.cpp | 1 + dll/dxwcore.hpp | 9 +- dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.sln | 20 -- dll/dxwnd.vs2008.suo | Bin 88064 -> 118272 bytes dll/gdi32.cpp | 18 +- dll/user32.cpp | 11 +- dll/winproc.cpp | 5 + host/TabDirectX2.cpp | 2 + host/TargetDlg.cpp | 2 + host/TargetDlg.h | 2 + host/dxwndhost.aps | Bin 250776 -> 251148 bytes host/dxwndhost.rc | Bin 135580 -> 136060 bytes host/dxwndhost.vs2008.sln | 20 -- host/dxwndhost.vs2008.suo | Bin 46592 -> 51200 bytes host/dxwndhostView.cpp | 18 +- host/resource | Bin 49306 -> 49490 bytes 33 files changed, 395 insertions(+), 367 deletions(-) delete mode 100644 build/dxwnd.ini create mode 100644 build/exports/Blade Runner (4CD version).dxw create mode 100644 build/exports/Blade Runner (Win7).dxw create mode 100644 build/exports/Return Fire 2 (OpenGL).dxw create mode 100644 build/exports/Return Fire 2 (SW).dxw create mode 100644 build/exports/RoboRumble (dx5).dxw create mode 100644 build/exports/RoboRumble (sw).dxw create mode 100644 build/exports/Warhammer Dark Omen.dxw delete mode 100644 dll/dxwnd.vs2008.sln delete mode 100644 host/dxwndhost.vs2008.sln diff --git a/Include/dxwnd.h b/Include/dxwnd.h index 266d200..1bf27d1 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -244,6 +244,8 @@ #define FIXSMACKLOOP 0x04000000 // fix Smack loop by insert processmessage and blit between frames #define FIXFREELIBRARY 0x08000000 // fix FreeLibrary simulating retcode 0(error) when attempting free of unallocated module #define ANCHORED 0x10000000 // Anchored position & size, mo stretching or sliding is allowed +#define CLEARTEXTUREFOURCC 0x20000000 // Clear DDSCAPS2_FOURCC bit and makes texture load without codec +#define NODDEXCLUSIVEMODE 0x40000000 // Do not allow ddraw EXCLUSIVE mode also in non windowed mode // eighth flags DWORD dxw.dwFlags8: diff --git a/build/README.FIRST.txt b/build/README.FIRST.txt index 8c62ad3..20adf03 100644 --- a/build/README.FIRST.txt +++ b/build/README.FIRST.txt @@ -1,4 +1,4 @@ -Readme First release notes - October 10th, 2016 +Readme First release notes - November 7th, 2016 DxWnd is a project still in development, so new releases are not always fully compatible with previous ones. Compatibility issues may easily happen while trying to use old configurations (the dxwnd.ini file) or exported files (*.dxw files located in the export folder) with new releases of the program. @@ -6,22 +6,42 @@ In particular, dxw exported files are not always checked and updated before rele This file will try to provide a quick guide to the resolution of the most common portability problems, listing the known cases that can be easily fixed. ============================================================================================== +DxWnd does nothing! +If it seems that DxWnd is perfectly useless, the programs starting in fullscreen mode exactly as if DxWnd was not running, you could likely have a capability problem caused either from lack of permissions or some compatibility setting. +You can try these two simple steps: + +1) Assign to DxWnd.exe administrator privileges (right-click on DxWnd.exe, Properties->Compatibility->check "run this program as administrator" or whatever is your locale translated interface). I always try to set this flag in the DxWnd distribution, but a simple file copy can clear the privilege. + +2) Clear compatibility settings on the target program (again, "Properties"->"Compatibility"->uncheck all compatibility flags). Maybe you'd better use the dedicated DxWnd command ("Tools"->"Clear compatibility flags", apparently this one goes a little deeper and clears some possibly hidden flags). If you clear compatibility flags it is likely that the game will no longer run in fullscreen without DxWnd, so maybe you can perform the operation on a copy of the executable file. + +============================================================================================== Flip emulation: + the DirectX/"Flip emulation" flag is required for most of DirectDraw games and is now set by default, but old exported files may not have this flag set. The sympthom generally is an error in DirectDraw calls or a black screen. In case the flag is not checked, just check it. ============================================================================================== - Optimize for AERO mode: + same as above, the flag is set by default, but some old exported files may not have it. The flag activated a blitting schema that is more compatible with AERO and desktop composition that is now mandatory on recent OS (Win8 and above). Better check it in case of problems. ============================================================================================== +Force clipper: +Setting a clipper on the primary surface is something that sometimes is good, sometimes is bad. For this reason, so far the "DirectX" / "Force clipper" is unchecked by default. +But a side effect of the lack of a clipping region is the rupture of the desktop composition! So, if that happens (the desktop blinks and the AERO transparency effects disappear) you can try to set the flag and see if there are changes for the better. + +============================================================================================ Final note: + If all else fails do not despair! Defaulted values are pretty good in most cases, so better start from scratch without using an old .dxw export file. Or, even better, create a new defauled entry, import the old .dxw file and start comparing the two configurations: it is a hell of a job, but likely you can pick something good from the old file that will make the new entry working. Finally, share your success with the community! Please, post on the SF board any working and non trivial configuration to share it with other users, and notify residual problems that I could work about. Please, consider this as being part of the fun! + yours faithfully -GHO \ No newline at end of file +GHO + + + diff --git a/build/dxwnd.dll b/build/dxwnd.dll index eb6f0b0..f4ccd46 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e98419de58b94f79d91d5044fe603e7754db6ea3d79e641b4fc16d9df5ea17e5 -size 700416 +oid sha256:eca050e2e867b9ccd61ce1e78b991f48504d208b1454e486e76ace04e7763b5f +size 700928 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index a2e5bb3..4609e76 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a75eed6fc7414d986f53c430fc32131c3052a40abfabdac6c13e0ba6a8900b08 -size 664576 +oid sha256:e2ea4c3b5e4fd2628d255b154cb6d5094da8be5175c844919cc1ad8ab6eecf81 +size 665088 diff --git a/build/dxwnd.ini b/build/dxwnd.ini deleted file mode 100644 index aed0584..0000000 --- a/build/dxwnd.ini +++ /dev/null @@ -1,281 +0,0 @@ -[window] -exepath=D:\Games\Year Dead\ -posx=1164 -posy=243 -sizx=320 -sizy=494 -exportpath=G:\DxWnd.develop\v2_03_94fx3_src\build\exports\ -debug=1 -autohide=0 -checkadmin=0 -namefromfolder=0 -multiprocesshook=0 -updatepaths=1 -defaultcoord=0 -defaultposx=50 -defaultposy=50 -defaultsizx=800 -defaultsizy=600 -[target] -title0=NITRO.EXE -path0=D:\Games\WCW Nitro\NITRO.EXE -startfolder0= -launchpath0= -module0= -opengllib0= -notes0= -registry0= -ver0=0 -monitorid0=-1 -coord0=0 -flag0=136314914 -flagg0=1207959552 -flagh0=20 -flagi0=138412036 -flagj0=4224 -flagk0=65536 -flagl0=0 -flagm0=0 -tflag0=0 -dflag0=0 -posx0=50 -posy0=50 -sizx0=800 -sizy0=600 -maxfps0=0 -initts0=0 -winver0=0 -maxres0=-1 -swapeffect0=0 -maxddinterface0=7 -slowratio0=2 -initresw0=800 -initresh0=600 -title1=Warcraft II BNE.exe -path1=D:\Games\WarCraft II BNE\Warcraft II BNE.exe -startfolder1= -launchpath1= -module1= -opengllib1= -notes1= -registry1= -ver1=0 -monitorid1=-1 -coord1=0 -flag1=136314914 -flagg1=1207959552 -flagh1=20 -flagi1=138412036 -flagj1=4224 -flagk1=65536 -flagl1=0 -flagm1=0 -tflag1=0 -dflag1=0 -posx1=50 -posy1=50 -sizx1=800 -sizy1=600 -maxfps1=0 -initts1=0 -winver1=0 -maxres1=-1 -swapeffect1=0 -maxddinterface1=7 -slowratio1=2 -initresw1=800 -initresh1=600 -title2=Dethkarz -path2=D:\Games\dethkarz\Dethkarz.exe -startfolder2= -launchpath2= -module2=Vertigo Direct3D -opengllib2= -notes2=Beware! This game REQUIRES initial resolution set as 640x480 as needed by the \nintro movie, otherwise the game won't start and will show an error message\ndialog box.\nNeeds also bypass MCI calls if no CD is present.\nTested OK with D3D renderer, 16 & 32 bpp. -registry2= -ver2=0 -monitorid2=-1 -coord2=0 -flag2=681574434 -flagg2=1207959552 -flagh2=20 -flagi2=205520902 -flagj2=4224 -flagk2=35717120 -flagl2=8389120 -flagm2=0 -tflag2=0 -dflag2=0 -posx2=50 -posy2=50 -sizx2=800 -sizy2=600 -maxfps2=0 -initts2=0 -winver2=0 -maxres2=-1 -swapeffect2=0 -maxddinterface2=7 -slowratio2=2 -initresw2=640 -initresh2=480 -title3=yeardead.exe -path3=f:\Games\Year Dead\yeardead.exe -startfolder3= -launchpath3= -module3= -opengllib3= -notes3= -registry3= -ver3=0 -monitorid3=-1 -coord3=0 -flag3=681574434 -flagg3=1207959552 -flagh3=20 -flagi3=138412036 -flagj3=4224 -flagk3=2162688 -flagl3=0 -flagm3=0 -tflag3=-2147477245 -dflag3=0 -posx3=50 -posy3=50 -sizx3=800 -sizy3=600 -maxfps3=0 -initts3=0 -winver3=0 -maxres3=-1 -swapeffect3=0 -maxddinterface3=7 -slowratio3=2 -initresw3=800 -initresh3=600 -title4=SPWaW 2016 -path4=G:\Games\The Depot\SPWaW 2016\mech.exe -startfolder4= -launchpath4= -module4= -opengllib4= -notes4= -registry4= -ver4=0 -monitorid4=0 -coord4=1 -flag4=49186 -flagg4=1207992338 -flagh4=532 -flagi4=18907136 -flagj4=1152 -flagk4=0 -flagl4=0 -flagm4=0 -tflag4=0 -dflag4=0 -posx4=50 -posy4=50 -sizx4=1340 -sizy4=1000 -maxfps4=0 -initts4=0 -winver4=0 -maxres4=-1 -swapeffect4=0 -maxddinterface4=7 -slowratio4=1 -initresw4=0 -initresh4=0 -title5=Adrenix 3D -path5=F:\Games\Adrenix\AdrenixD.exe -startfolder5= -launchpath5= -module5= -opengllib5= -notes5= -registry5= -ver5=0 -monitorid5=0 -coord5=0 -flag5=134235174 -flagg5=1216413696 -flagh5=20 -flagi5=138412036 -flagj5=5248 -flagk5=65536 -flagl5=0 -flagm5=0 -tflag5=6402 -dflag5=0 -posx5=50 -posy5=50 -sizx5=800 -sizy5=600 -maxfps5=0 -initts5=0 -winver5=0 -maxres5=-1 -swapeffect5=0 -maxddinterface5=7 -slowratio5=1 -initresw5=0 -initresh5=0 -title6=Adrenix -path6=F:\Games\Adrenix\Adrenix.exe -startfolder6= -launchpath6= -module6= -opengllib6= -notes6= -registry6= -ver6=0 -monitorid6=0 -coord6=0 -flag6=136314918 -flagg6=1207959552 -flagh6=20 -flagi6=138412036 -flagj6=4224 -flagk6=0 -flagl6=0 -flagm6=0 -tflag6=0 -dflag6=0 -posx6=50 -posy6=50 -sizx6=800 -sizy6=600 -maxfps6=0 -initts6=0 -winver6=0 -maxres6=-1 -swapeffect6=0 -maxddinterface6=7 -slowratio6=1 -initresw6=0 -initresh6=0 -[texture] -MinTexX=0 -MinTexY=0 -MaxTexX=0 -MaxTexY=0 -[keymapping] -timetoggle= -timefast= -timeslow= -altf4= -cliptoggle= -refresh= -logtoggle= -plogtoggle= -fpstoggle= -printscreen= -corner= -freezetime= -fullscreen= -workarea= -desktop= -minimize= -restore= -kill= diff --git a/build/exports/Blade Runner (4CD version).dxw b/build/exports/Blade Runner (4CD version).dxw new file mode 100644 index 0000000..4cf46ab --- /dev/null +++ b/build/exports/Blade Runner (4CD version).dxw @@ -0,0 +1,35 @@ +[target] +title0=Blade Runner (4CD version) +path0=D:\Blade\BLADE.EXE +startfolder0= +launchpath0= +module0= +opengllib0= +notes0=Courtesy of Riitaoja:\n\nInstalling Blade Runner on 64bit Windows (4CD version):\n\n- Copy the "BASE" folder from CD1 to your hard drive and rename it to "BLADE".\n- Copy "CDFRAMES.DAT" file from \CD1 -forder of the optical drive to the "BLADE"\ndirectory on your hard drive and rename the file to "HDFRAMES.DAT".\n\n- Timing -> Frames per Second - Limit delay 40 msec (25 FPS)\nFixes the shooting range by limiting FPS. +registry0= +ver0=0 +monitorid0=-1 +coord0=0 +flag0=136331298 +flagg0=1207963648 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=40 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 +initresw0=800 +initresh0=600 diff --git a/build/exports/Blade Runner (Win7).dxw b/build/exports/Blade Runner (Win7).dxw new file mode 100644 index 0000000..df81a56 --- /dev/null +++ b/build/exports/Blade Runner (Win7).dxw @@ -0,0 +1,35 @@ +[target] +title0=Blade Runner (Win7) +path0=F:\Games\Blade Runner\Blade7.EXE +startfolder0= +launchpath0= +module0= +opengllib0= +notes0=From DVD version V2, with patched exe for WinXP and Win7\n\nBlade7.exe working ok also on Win10 +registry0= +ver0=0 +monitorid0=-1 +coord0=0 +flag0=136314914 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 +initresw0=800 +initresh0=600 diff --git a/build/exports/Blade Runner.dxw b/build/exports/Blade Runner.dxw index c184ac9..996e11a 100644 --- a/build/exports/Blade Runner.dxw +++ b/build/exports/Blade Runner.dxw @@ -1,21 +1,25 @@ [target] title0=Blade Runner -path0=D:\Games\blade runner\BLADE.EXE +path0=F:\Games\blade runner\BLADE.EXE +startfolder0= +launchpath0= module0= opengllib0= +notes0= +registry0= ver0=0 +monitorid0=0 coord0=0 flag0=134234210 flagg0=1480589312 flagh0=2580 -flagi0=4210692 +flagi0=4194308 +flagj0=128 +flagk0=2048 +flagl0=0 +flagm0=0 tflag0=0 -initx0=0 -inity0=0 -minx0=0 -miny0=0 -maxx0=0 -maxy0=0 +dflag0=0 posx0=50 posy0=50 sizx0=800 @@ -24,5 +28,8 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 -launchpath0= -flagj0=128 +swapeffect0=0 +maxddinterface0=7 +slowratio0=1 +initresw0=0 +initresh0=0 diff --git a/build/exports/Return Fire 2 (OpenGL).dxw b/build/exports/Return Fire 2 (OpenGL).dxw new file mode 100644 index 0000000..f1bdbaa --- /dev/null +++ b/build/exports/Return Fire 2 (OpenGL).dxw @@ -0,0 +1,35 @@ +[target] +title0=Return Fire 2 (OpenGL) +path0=F:\Games\Return Fire 2\RFireII.exe +startfolder0= +launchpath0= +module0= +opengllib0= +notes0= +registry0=HKEY_CURRENT_USER\Software\Prolific]\n\n[HKEY_CURRENT_USER\Software\Prolific\RFireII]\n\n[HKEY_CURRENT_USER\Software\Prolific\RFireII\1.0]\n;"GfxDLL"="SC_3dfx"\n"GfxDLL"="SC_OGL"\n;"GfxDLL"="36D_S3D"\n"ID"="{E6E7C9E0-41B2-11D2-9C0B-006097B4D5BF}"\n"NAME1"="JOHN"\n"name2"=""\n"name3"=""\n"name4"=""\n"LASTRFIREIIGAME"="JOHN.UI"\n\n[HKEY_LOCAL_MACHINE\Software\Prolific Publishing, Inc.]\n\n[HKEY_LOCAL_MACHINE\Software\Prolific Publishing, Inc.\Return Fire II]\n"Path"=".\\"\n\n[HKEY_LOCAL_MACHINE\Software\Prolific Publishing, Inc.\Return Fire II\1.00.000]\n\n +ver0=0 +monitorid0=-1 +coord0=0 +flag0=681574434 +flagg0=1208090624 +flagh0=3093 +flagi0=1212153860 +flagj0=4224 +flagk0=327680 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 +initresw0=800 +initresh0=600 diff --git a/build/exports/Return Fire 2 (SW).dxw b/build/exports/Return Fire 2 (SW).dxw new file mode 100644 index 0000000..286b44f --- /dev/null +++ b/build/exports/Return Fire 2 (SW).dxw @@ -0,0 +1,35 @@ +[target] +title0=Return Fire 2 (SW) +path0=F:\Games\Return Fire 2\RFireII.exe +startfolder0= +launchpath0= +module0= +opengllib0= +notes0= +registry0=HKEY_CURRENT_USER\Software\Prolific]\n\n[HKEY_CURRENT_USER\Software\Prolific\RFireII]\n\n[HKEY_CURRENT_USER\Software\Prolific\RFireII\1.0]\n;"GfxDLL"="SC_3dfx"\n"GfxDLL"="SC_OGL"\n;"GfxDLL"="36D_S3D"\n"ID"="{E6E7C9E0-41B2-11D2-9C0B-006097B4D5BF}"\n"NAME1"="JOHN"\n"name2"=""\n"name3"=""\n"name4"=""\n"LASTRFIREIIGAME"="JOHN.UI"\n\n[HKEY_LOCAL_MACHINE\Software\Prolific Publishing, Inc.]\n\n[HKEY_LOCAL_MACHINE\Software\Prolific Publishing, Inc.\Return Fire II]\n"Path"=".\\"\n\n[HKEY_LOCAL_MACHINE\Software\Prolific Publishing, Inc.\Return Fire II\1.00.000]\n\n +ver0=0 +monitorid0=-1 +coord0=0 +flag0=681574434 +flagg0=1207959552 +flagh0=1044 +flagi0=1212153860 +flagj0=4224 +flagk0=327680 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 +initresw0=800 +initresh0=600 diff --git a/build/exports/RoboRumble (dx5).dxw b/build/exports/RoboRumble (dx5).dxw new file mode 100644 index 0000000..dca6c87 --- /dev/null +++ b/build/exports/RoboRumble (dx5).dxw @@ -0,0 +1,35 @@ +[target] +title0=RoboRumble (dx5) +path0=F:\Games\RoboRumble\DATA\rr_dx5.exe +startfolder0= +launchpath0= +module0= +opengllib0= +notes0= +registry0=\n[HKEY_LOCAL_MACHINE\SOFTWARE\Metropolis]\n\n[HKEY_LOCAL_MACHINE\SOFTWARE\Metropolis\RoboRumble]\n"Directory"=".\\"\n\n +ver0=1 +monitorid0=-1 +coord0=0 +flag0=681574442 +flagg0=1208221696 +flagh0=1044 +flagi0=1212153860 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 +initresw0=800 +initresh0=600 diff --git a/build/exports/RoboRumble (sw).dxw b/build/exports/RoboRumble (sw).dxw new file mode 100644 index 0000000..f6ddbef --- /dev/null +++ b/build/exports/RoboRumble (sw).dxw @@ -0,0 +1,35 @@ +[target] +title0=RoboRumble (sw) +path0=F:\Games\RoboRumble\DATA\rr_soft.exe +startfolder0= +launchpath0=F:\Games\RoboRumble\rrumble.exe +module0= +opengllib0= +notes0= +registry0=\n[HKEY_LOCAL_MACHINE\SOFTWARE\Metropolis]\n\n[HKEY_LOCAL_MACHINE\SOFTWARE\Metropolis\RoboRumble]\n"Directory"=".\\"\n\n +ver0=1 +monitorid0=-1 +coord0=0 +flag0=681574442 +flagg0=1207959552 +flagh0=1044 +flagi0=1212153860 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 +initresw0=800 +initresh0=600 diff --git a/build/exports/Warhammer Dark Omen.dxw b/build/exports/Warhammer Dark Omen.dxw new file mode 100644 index 0000000..2378a93 --- /dev/null +++ b/build/exports/Warhammer Dark Omen.dxw @@ -0,0 +1,35 @@ +[target] +title0=Warhammer Dark Omen +path0=D:\Dark Omen\PRG_ENG\EngRel.exe +startfolder0= +launchpath0= +module0= +opengllib0= +notes0=Courtesy of Riitaoja:\n\nDark Omen needs a d3drm.dll file to run:\n- This file can be located in the CD's \DIRECTX -folder.\n- Copy the file into the "Dark Omen\PRG_ENG" directory.\n\nSound issues:\nDark Omen can sometimes produce a burst of white noise from the speakers.\nUsing the Timing option "CPU slow down" may fix this issue. +registry0=[HKEY_LOCAL_MACHINE\SOFTWARE\Electronic Arts\Dark Omen\1.0\Options\Options]\n"Selected"="4"\n"HardwareSelected"="252"\n"SoftwareSelected"="228"\n"MMXSelected"="256"\n"ToolTips"="1"\n"MusicVolume"="408"\n"SFXVolume"="816"\n"SoftwareSoundQuality"="2"\n"SoftwareParticleQuality"="2"\n"MMXSoundQuality"="2"\n"MMXParticaleQuality"="1"\n"HardwareSoundQuality"="2"\n"HardwareParticleQuality"="2"\n"InformationNum"="11"\n +ver0=0 +monitorid0=-1 +coord0=0 +flag0=136314920 +flagg0=1207959552 +flagh0=1044 +flagi0=1212153860 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 +initresw0=800 +initresh0=600 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 50dd839..94edc49 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -1339,3 +1339,13 @@ add: window position selector & "locked size" + "anchored" modes fix: transient mode when system tray is not available fix: recursion problem in kernel32 LoadLibrary* wrappers. Allows "Hot patch" on WinXP. fix: initial position problem. + +v2.03.96: +preliminary handling of hidden window +fix: handling of non-windowed mode. Fixes "Warhammer 40.000 Rites of War" in non-windowed mode +add: NODDEXCLUSIVEMODE flag. Forces non exclusive ddraw coop level in non-windowed mode. Fixes "Warhammer 40.000 Rites of War" in non-windowed mode +add: CLEARTEXTUREFOURCC flag. Suppresses FOURCC capability and handling. Should help to process compressed textures. +fix: CreateDIBSection wrapper log messages +fix: PREVENTMAXIMIZE window size checks: should avoid size bigger than initial size, bugged coding inhibited any growth. +fix: GUI setting of execution folder when running "Launcher" task. + diff --git a/dll/ddblit.cpp b/dll/ddblit.cpp index 647bca1..92cda20 100644 --- a/dll/ddblit.cpp +++ b/dll/ddblit.cpp @@ -137,6 +137,9 @@ static HRESULT sBltToPrimary(int dxversion, Blt_Type pBlt, char *api, LPDIRECTDR RECT destrect, emurect; extern PrimaryBlt_Type pPrimaryBlt; + // handle minimized states + if(!dxw.IsVisible) return DD_OK; + // check coordinates dxw.UpdateDesktopCoordinates(); diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index dbd71d4..eb69d1d 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -2273,15 +2273,16 @@ HRESULT WINAPI extGetDisplayMode(int dxversion, GetDisplayMode_Type pGetDisplayM if(dxw.Windowize){ lpddsd->dwWidth = dxw.GetScreenWidth(); lpddsd->dwHeight = dxw.GetScreenHeight(); + } - // v2.1.96: fake screen color depth - if((dxw.dwFlags2 & (INIT8BPP|INIT16BPP)) || (dxw.dwFlags7 & (INIT24BPP|INIT32BPP))){ // v2.02.32 fix - if(dxw.dwFlags2 & INIT8BPP) FixPixelFormat(8, &lpddsd->ddpfPixelFormat); - if(dxw.dwFlags2 & INIT16BPP) FixPixelFormat(16, &lpddsd->ddpfPixelFormat); - if(dxw.dwFlags7 & INIT24BPP) FixPixelFormat(24, &lpddsd->ddpfPixelFormat); - if(dxw.dwFlags7 & INIT32BPP) FixPixelFormat(32, &lpddsd->ddpfPixelFormat); - OutTraceDW("GetDisplayMode: fix RGBBitCount=%d\n", lpddsd->ddpfPixelFormat.dwRGBBitCount); - } + // v2.1.96: fake screen color depth + // v2.03.96: moved out from dxw.Windowize condition + if((dxw.dwFlags2 & (INIT8BPP|INIT16BPP)) || (dxw.dwFlags7 & (INIT24BPP|INIT32BPP))){ // v2.02.32 fix + if(dxw.dwFlags2 & INIT8BPP) FixPixelFormat(8, &lpddsd->ddpfPixelFormat); + if(dxw.dwFlags2 & INIT16BPP) FixPixelFormat(16, &lpddsd->ddpfPixelFormat); + if(dxw.dwFlags7 & INIT24BPP) FixPixelFormat(24, &lpddsd->ddpfPixelFormat); + if(dxw.dwFlags7 & INIT32BPP) FixPixelFormat(32, &lpddsd->ddpfPixelFormat); + OutTraceDW("GetDisplayMode: fix RGBBitCount=%d\n", lpddsd->ddpfPixelFormat.dwRGBBitCount); } //OutTraceDW("GetDisplayMode: returning WxH=(%dx%d) PixelFormat Flags=%x(%s) RGBBitCount=%d RGBAmask=(%x,%x,%x,%x) Caps=%x(%s)\n", @@ -2335,7 +2336,7 @@ HRESULT WINAPI extSetCooperativeLevel(int dxversion, SetCooperativeLevel_Type pS if(dxw.VirtualPixelFormat.dwRGBBitCount==0) dxw.VirtualPixelFormat=ddsd.ddpfPixelFormat; SetBltTransformations(dxversion); - if(dxw.Windowize){ + if(dxw.Windowize || (dxw.dwFlags7 & NODDEXCLUSIVEMODE)){ if (dwflags & DDSCL_FULLSCREEN){ // v2.01.82 fix: // WARN: Tomb Raider 4 demo is setting cooperative level against hwnd 0 (desktop) @@ -2450,6 +2451,13 @@ static void FixSurfaceCaps(LPDDSURFACEDESC2 lpddsd, int dxversion) lpddsd->dwFlags |= DDSD_PIXELFORMAT; GetPixFmt(lpddsd); } + if((lpddsd->dwFlags & DDSD_PIXELFORMAT) && + (lpddsd->ddpfPixelFormat.dwFlags & DDPF_FOURCC) && + (dxw.dwFlags7 & CLEARTEXTUREFOURCC)){ + lpddsd->ddpfPixelFormat = dxw.VirtualPixelFormat; + lpddsd->ddpfPixelFormat.dwFourCC = 0; + lpddsd->ddpfPixelFormat.dwFlags &= ~DDPF_FOURCC; + } return; } @@ -3211,7 +3219,9 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate OutTraceDDRAW("CreateSurface: Version=%d lpdd=%x %s\n", dxversion, lpdd, LogSurfaceAttributes((LPDDSURFACEDESC)lpddsd, "[CreateSurface]", __LINE__)); - lpddsd->ddpfPixelFormat.dwFourCC = 0; + // v2.03.95.fx1 - deleted: some texture handling REQUIRES a proper FourCC codec. + // maybe it could be suppressed by a dedicated config. flag and on primary surfaces only? + //lpddsd->ddpfPixelFormat.dwFourCC = 0; SurfaceMode = (dxw.dwFlags1 & EMULATESURFACE) ? ((dxw.dwFlags6 & FLIPEMULATION) ? PRIMARY_EMULATED : PRIMARY_FLIPPABLE) : PRIMARY_DIRECT; @@ -3342,7 +3352,8 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate // v2.3.59: same extra reference is needed by "Wahammer Chaos Gate" that uses ddraw interface release 2 // v2.3.72: fixed previous fix: condition is <=2, not >=2 ! // Be aware that it may perhaps become <=3, if we get the same problem elsewhere - if((dxw.dwDDVersion<=2) && dxw.Windowize) lpdd->AddRef(); + // if((dxw.dwDDVersion<=2) && dxw.Windowize) lpdd->AddRef(); + if(dxw.dwDDVersion<=2) lpdd->AddRef(); return DD_OK; } @@ -3660,12 +3671,21 @@ HRESULT WINAPI PrimaryStretchBlt(int dxversion, Blt_Type pBlt, LPDIRECTDRAWSURFA res= (*pBlt)(lpdds, lpdestrect, lpddsTmp, &TmpRect, DDBLT_WAIT, 0); } if(res) OutTraceE("PrimaryStretchBlt: BltFast ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + //if(res && !dxw.Windowize) RestoreDDrawSurfaces(); if(res == DDERR_SURFACELOST){ - res = lpdds->Restore(); - if(res) { - OutTraceE("PrimaryStretchBlt: Restore ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + if(lpdds->IsLost()) { + res = lpdds->Restore(); + if(res) { + OutTraceE("PrimaryStretchBlt: Restore ERROR lpdds=%x err=%x(%s) at %d\n", lpdds, res, ExplainDDError(res), __LINE__); + } } - else { + if(lpddsTmp->IsLost()) { + res = lpddsTmp->Restore(); + if(res) { + OutTraceE("PrimaryStretchBlt: Restore ERROR lpdds=%x err=%x(%s) at %d\n", lpddsTmp, res, ExplainDDError(res), __LINE__); + } + } + if(!res) { OutTraceDW("PrimaryStretchBlt: surface sucessfully recovered, retry\n"); continue; } diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index d13cd06..4af2211 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -94,6 +94,7 @@ void dxwCore::InitTarget(TARGETMAP *target) dwFlags8 = target->flags8; dwTFlags = target->tflags; Windowize = (dwFlags2 & WINDOWIZE) ? TRUE : FALSE; + IsVisible = TRUE; if(dwFlags3 & FULLSCREENONLY) FullScreen=TRUE; gsModules = target->module; MaxFPS = target->MaxFPS; diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp index 9d43712..9b41a0f 100644 --- a/dll/dxwcore.hpp +++ b/dll/dxwcore.hpp @@ -149,6 +149,7 @@ public: // methods public: // simple data variables int MonitorId; BOOL Windowize; + BOOL IsVisible; DDPIXELFORMAT ActualPixelFormat; DDPIXELFORMAT VirtualPixelFormat; DWORD dwDDVersion; @@ -401,7 +402,7 @@ char *SysNames[]={ extern char *SysNames[]; #endif -typedef enum { +enum { HINT_HINT = 0, HINT_DDRAW, HINT_D3D8, HINT_D3D9, HINT_D3D10, HINT_D3D11, HINT_OPENGL, HINT_DSOUND, HINT_DINPUT, @@ -409,9 +410,9 @@ typedef enum { HINT_FAKEOS, HINT_OBFUSCATED,HINT_SAFEDISC, HINT_SECUROM, HINT_LIMITMEM, HINT_HOOKUPDATE, HINT_LAST -} HintEnumIds; +}; -typedef enum { +enum { DXVK_NONE=0, DXVK_CLIPTOGGLE, DXVK_REFRESH, @@ -431,7 +432,7 @@ typedef enum { DXVK_SIZE }; -typedef enum { +enum { GDIMODE_NONE = 0, GDIMODE_STRETCHED, GDIMODE_EMULATED, diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index caf94af..959d2fd 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.95" +#define VERSION "2.03.96" #define DDTHREADLOCK 1 //#define LOCKTHREADS diff --git a/dll/dxwnd.vs2008.sln b/dll/dxwnd.vs2008.sln deleted file mode 100644 index 0d2e531..0000000 --- a/dll/dxwnd.vs2008.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dxwnd", "dxwnd.vs2008.vcproj", "{579E7FE7-2745-4100-A802-23511711FCDE}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {579E7FE7-2745-4100-A802-23511711FCDE}.Debug|Win32.ActiveCfg = Debug|Win32 - {579E7FE7-2745-4100-A802-23511711FCDE}.Debug|Win32.Build.0 = Debug|Win32 - {579E7FE7-2745-4100-A802-23511711FCDE}.Release|Win32.ActiveCfg = Release|Win32 - {579E7FE7-2745-4100-A802-23511711FCDE}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 40035cd8446fd5f8ae41c990175cb5033c95b98c..ede2fbc999f1a24df443cb2877f162ab3131c940 100644 GIT binary patch literal 118272 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 WRlAlLyKluH{y=B*gh6I)+P?s>8z-g! diff --git a/dll/gdi32.cpp b/dll/gdi32.cpp index 0d4c007..6d0007c 100644 --- a/dll/gdi32.cpp +++ b/dll/gdi32.cpp @@ -361,6 +361,15 @@ static char *ExplainDIBUsage(UINT u) return p; } +static char *sBMIDump(BITMAPINFO *pbmi) +{ + static char s[256]; + sprintf(s, "colors RGBX=(%x,%x,%x,%x) header bitc=%d size=(%dx%d) compr=%x", + pbmi->bmiColors->rgbRed, pbmi->bmiColors->rgbGreen, pbmi->bmiColors->rgbBlue, pbmi->bmiColors->rgbReserved, + pbmi->bmiHeader.biBitCount, pbmi->bmiHeader.biWidth, pbmi->bmiHeader.biHeight, pbmi->bmiHeader.biCompression); + return s; +} + static void TraceBITMAPINFOHEADER(char *fName, BITMAPINFOHEADER *bmi) { OutTrace("%s: BitmapInfo {Size=%d dim=(%dx%d) Planes=%d bitcount=%d Compression=%x SizeImage=%d PelsPerMeter=%dx%d colors=U%d:I%d}\n", @@ -2994,7 +3003,7 @@ HBITMAP WINAPI extCreateDIBitmap(HDC hdc, BITMAPINFOHEADER *lpbmih, DWORD fdwIni HBITMAP WINAPI extCreateDIBSection(HDC hdc, const BITMAPINFO *pbmi, UINT iUsage, VOID **ppvBits, HANDLE hSection, DWORD dwOffset) { HBITMAP ret; - OutTraceDW("CreateDIBitmap: hdc=%x\n", hdc); + OutTraceDW("CreateDIBSection: hdc=%x bmi=%s usage=%s hsect=%x offset=%x\n", hdc, sBMIDump((BITMAPINFO *)pbmi), ExplainDIBUsage(iUsage), hSection, dwOffset); if(dxw.IsToRemap(hdc)) { switch(dxw.GDIEmulationMode){ @@ -3010,7 +3019,12 @@ HBITMAP WINAPI extCreateDIBSection(HDC hdc, const BITMAPINFO *pbmi, UINT iUsage, } ret=(*pCreateDIBSection)(hdc, pbmi, iUsage, ppvBits, hSection, dwOffset); - if(!ret) OutTraceE("CreateDIBitmap ERROR: err=%d\n", GetLastError()); + if(!ret) { + OutTraceE("CreateDIBSection ERROR: err=%d\n", GetLastError()); + } + else { + OutTraceDW("CreateDIBSection: ret=%x\n", ret); + } return ret; } diff --git a/dll/user32.cpp b/dll/user32.cpp index 4ef1743..15565cf 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -788,6 +788,7 @@ BOOL WINAPI extShowWindow(HWND hwnd, int nCmdShow) // v2.03.95: force zero size when minimize and drefresh window coordinates if(hwnd == dxw.GethWnd()){ if(nCmdShow==SW_MINIMIZE) { + dxw.IsVisible = FALSE; iLastSizX = dxw.iSizX; iLastSizY = dxw.iSizY; //iLastPosX = dxw.iPosX; @@ -795,6 +796,7 @@ BOOL WINAPI extShowWindow(HWND hwnd, int nCmdShow) dxw.iSizX = dxw.iSizY = 0; } else { + dxw.IsVisible = TRUE; if((dxw.iSizX == 0) && (dxw.iSizY == 0)){ dxw.iSizX = iLastSizX; dxw.iSizY = iLastSizY; @@ -991,8 +993,9 @@ BOOL WINAPI extSetWindowPos(HWND hwnd, HWND hWndInsertAfter, int X, int Y, int c if (dxw.dwFlags1 & PREVENTMAXIMIZE){ int UpdFlag =0; int MaxX, MaxY; - MaxX = dxw.iSizX; - MaxY = dxw.iSizY; + // v2.03.96: in PREVENTMAXIMIZE mode don't exceed the initial size + MaxX = dxw.iSiz0X; + MaxY = dxw.iSiz0Y; if (!MaxX) MaxX = dxw.GetScreenWidth(); if (!MaxY) MaxY = dxw.GetScreenHeight(); if(cx>MaxX) { cx=MaxX; UpdFlag=1; } @@ -1735,6 +1738,7 @@ static HWND WINAPI CreateWindowCommon( //if (dxw.IsFullScreen() && (dxw.dwFlags1 & PREVENTMAXIMIZE)){ if ((hwnd == dxw.GethWnd()) && dxw.IsFullScreen() && (dxw.dwFlags1 & PREVENTMAXIMIZE)){ OutTraceDW("%s: entering maximized state\n", ApiName); + dxw.IsVisible = TRUE; (*pShowWindow)(hwnd, SW_MAXIMIZE); } @@ -4013,3 +4017,6 @@ INT_PTR WINAPI extDialogBoxIndirectParamA(HINSTANCE hInstance, LPCDLGTEMPLATE hD return (*pDialogBoxIndirectParamA)(hInstance, hDialogTemplate, hWndParent, lpDialogFunc, dwInitParam); } +// To do: +// GrayStringA +// GrayStringW \ No newline at end of file diff --git a/dll/winproc.cpp b/dll/winproc.cpp index a35b7e0..7ffd2e7 100644 --- a/dll/winproc.cpp +++ b/dll/winproc.cpp @@ -502,14 +502,19 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp static int iLastX, iLastY, iLastW, iLastH; switch(wparam & 0xFFF0){ case SC_MINIMIZE: + dxw.IsVisible = FALSE; iLastX = dxw.iPosX; iLastY = dxw.iPosY; iLastW = dxw.iSizX; iLastH = dxw.iSizY; dxw.iPosX = dxw.iPosY = dxw.iSizX = dxw.iSizY = 0; break; case SC_RESTORE: + dxw.IsVisible = TRUE; dxw.iPosX = iLastX; dxw.iPosY = iLastY; dxw.iSizX = iLastW; dxw.iSizY = iLastH; break; + case SC_MAXIMIZE: + dxw.IsVisible = TRUE; + break; } } break; diff --git a/host/TabDirectX2.cpp b/host/TabDirectX2.cpp index be38ea3..bc9f3fa 100644 --- a/host/TabDirectX2.cpp +++ b/host/TabDirectX2.cpp @@ -44,6 +44,8 @@ void CTabDirectX2::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_USERGB565, cTarget->m_UseRGB565); DDX_CBIndex(pDX, IDC_DDWAWLIMITCOMBO, cTarget->m_MaxDdrawInterface); DDX_Check(pDX, IDC_BACKBUFATTACH, cTarget->m_BackBufAttach); + DDX_Check(pDX, IDC_CLEARTEXTUREFOURCC, cTarget->m_ClearTextureFourCC); + DDX_Check(pDX, IDC_NODDEXCLUSIVEMODE, cTarget->m_NoDDExclusiveMode); } BEGIN_MESSAGE_MAP(CTabDirectX2, CDialog) diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index 1d10baa..30f68fb 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -192,6 +192,8 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_Init8BPP = FALSE; m_Init16BPP = FALSE; m_BackBufAttach = FALSE; + m_ClearTextureFourCC = FALSE; + m_NoDDExclusiveMode = FALSE; m_HandleAltF4 = FALSE; m_LimitFPS = FALSE; m_SkipFPS = FALSE; diff --git a/host/TargetDlg.h b/host/TargetDlg.h index 6fa1328..4778540 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -153,6 +153,8 @@ public: BOOL m_Init8BPP; BOOL m_Init16BPP; BOOL m_BackBufAttach; + BOOL m_ClearTextureFourCC; + BOOL m_NoDDExclusiveMode; BOOL m_HandleAltF4; BOOL m_HandleExceptions; BOOL m_SkipFPS; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index 674fbb24b001631c5c9ae37fbadb3db28940e317..57a972fa7726c37a6fe5c5e2bbb7bc9063bfb39f 100644 GIT binary patch delta 8420 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 HXR!Vs)UQw- delta 8123 zcmZWu34B!5)xY;W2qZutkj$P1*_VXbGhmkzWxK3I@_KEzv|A zc6T+oN&tz_oJJ1#$gleVo#7|*1W>POvjX*@aIhg1MW)A2=EDzzjndTwcD-nmt|8F% zqJ=JiSiX7WZ$uX*kx=7FPWHlm`451r(;(eQKHl=%Lo+?Lre#;P!7A3+zVTVmC*ZO-H~GR{er_MOpPiv zVKvA(9N`2>eiJ zraR%4W9B)J3KFhsREz3*KWXX15&=aF-f1U~2~>@w!Z;_v0NQdo$e#q7N~mEakql^Y zZo}y$j}wS>S?Dg9kN;cY`QZjro1i9eyVZxHeB~WZFWF7tV3$GKL*T706K#iz5f<+g zf;p!qRa>jZ17TIcBj<40$&*46Q`K2YIE*uwQ0nyMaXH9SuyBOI+>vpTiq|RuwLyvN zJzeB!*gV3r;u)b;qDr_a845(SARn&FL-q;<&T~Xb%;K1r>=T&2RTA}l|2bUMFmSRc#aVaVu$+7$3n?KJr2*~AcqO8eAQrjS?IJ>GT4xe<8*SZiyVPfBQ5k5 z*fi2ycQi{;Yf>1$93CGz)(6JbIy~fYjHC{apL7Xa2?k?vt+6Q_s^NRUYbVD+dCel7 zAaLbtCG=IO8fCP;Cb-yH#bNPN64%LY@;b~NWi`Jc^ieITHYQUTL%Ag{`5Vs0Yi8+9 z0wZ3xNPj0_f4zkM1I~;xnonjdV#w9v$$C6i*rnP*-h!gyl9E$G%VUx-R_!8h!_SJ% zws(Xk7)tPyT&va9>4DmTLG?5&EH)X>2!b9S`AOzxtI4~tx!7QQuUD6hDPnr7{p6nn zu6V;Fy-(nGZq`ul4+SrgRB&6SLjjF%Tc3-3gwgH|v-B~6FWxXjKFJJ4P0UJa zm@jHI&hnB^1-EaP-klY9Z|?n6=Cy^j=tVlvhY`H_kb z0)zI@J~MoKa?C-7^#ML0r2u`Pu6jL~M(j=8o_#BA_xYBH)Mp$MxSxkbC=U>lyNkv~C zmy4KTm${r;;3$%;f}|=5eoPaY^}=v$TW_&Sr4&xTWvndAIBrm4=~}Fv&@+bH@*Fgv z#rPCptgV16EhcF+h3F}R`2s-+t944C2~&v12kmx|G0^KSs zPMM|g6y82%tC}Dvyr99(d`7WmoG3sMbQ?lJeJL^QP6EYhlqOS{{kDNlforW+Iu+Jh ztx_e0$KN)Et3mVLjV6z&%LYs;zf!Qf6pt#OO zs$q-GSnCryG0r-zPDE~}*F*e5!`HJmuBvnNZeDVsfcZFrAs;tYO@0R7+f4rHLW6rC zjuk^Pbg9bwa)zH=By^by1N9LN>k8CW+sVZcEj36pDC|C6Zo5PfafbB5S&ifVQ#j8> z6nLn#jMl)xQX37xsnT*9gzrnOl1gFu8H-d);ej(oS_jdxGPOQ4mS`e`i^d)K93&*b z0MGA%R6MRm`2oR-cV>>lrx%V+4A8S+cbUNy&e1vD8Ks9r;GHr9597yX@8E7yWS@whIgD|Lu?CxLp|9|BtSJ-*Ck*v)ZsyqlO)*#DM;* zelYieA^oa;Fn57r{n!0q?g3-_JZK(mFwO6$-XoLNleo8(w4j)<259TxD z@RQ$A82*7_=E8nj9IwNLasAru1h|W&KhZKE_6W2UEwC zI+o@1*LNi!E#`>jIk@gt$KB*6SUScct)Ot`!*aS3o*Gjot>TSQaB6e@AnfWTH&cjx zR4)Bqz?EYQEUSevk^j;`QM$UYkiP|HkG0WTVZm6V@wSXd3}R6&p2CXE<#v!YuxYGC z`U8boADiXdF=^5VEa(O+^*eBber%+7!mx3r(pt=dAD7tf5;pXwjz_d;Agu9-=E9`$ zN4R2~t+ZJXcoGwFFT_hf7gpx$(DsOjOlTV`^7Rz1{>0=2!OoV|F09Az7GNTCm%sx- zSi$7y^0>(c=ox1;-6I$nXhM-xM6YjMm`@l~jkib}DU^O{wB4H-NT`tqa*Xg8RCObM zavv-oZ?xPm2$^z3+@QEHeQctz?o&h613yyZeG2c48RS8M^JFQiP<-L`y5Zz_H;kQN zSW!*3azYvljZke9aXG88B;Te(K^2pfszXk)U57Aj=xrC-p|{n>7=~%Vag&F2jIR_o zQ%xSx+p%82M|KJz$JazZc~pQ|Z$3L|5m?3@W`)P#%!FdYpL7^Yg9ePa+zH0<$0^vq zD#jPxiixA;R$MdfMk6$Tl_$61_t*_3gOG+-6T4yM#FA-ybOSssrm@t=yCJUhkoH_y zi|MGBJb^L(+$htNx{`4xx(|+@Gtp;Z)g+^|A0x@vCGxheVW*zmGD4gmchhW#_3+Q1uK6wmuO*X;MDMRTIY#G6h-(Jzb<$p7T z9)-D6ES6)s8GSm$-3K@Ca+5Bs#J;i6|x-JeIT^5@8(-DVt&mN46OQ+7I!+T^o{ zu4*&ssE2$(*@Qu~RQi&#nJDSMz%k86zk=wra(WIHOe>YYMt;R^!yvSR$?D(m80x=) z&S^I3JZ1jD)GB>T*&LMgKTvMB(f`79d#UstWzP+!HtBox$~iw!M)Pq@J(R59Q^Jkm z)ek<7y^Lc1v6o1a#8&0gl4-J}&jel`rt#%BrOyLi^bE+tL9B8E$wodwE-yG7qu>h1 zU^Op?;0o$W9~qPd@rdyEf8NPY24`_Rpb3uR8%Msxlmc2z3*dmmXd05`h(yClE;1Cl z9VTg*#99mR@d_n&ynvR_;V|84t{Rc;qQAEB9zIeeku=@|rd>fS*P_X|7ETZcF-map zfilS?!LPq9zu27NMDbRnmzBO$38#3{!Te^))hC)FYOq&})tYsW>)9Hbg#FiR*^Be` zaW^>SoaVwM<7rN_b!k&h6GksfWR+uvXFU~Y5M9h);<+m*F1N?>TVXT8x;Ft^#6ZA)ee zo?qr`f4}+G92+#)ehUoA1%B1uvSDk^i0CcwOP2E#bS?blN9_$zu`!bMgEzmoZ4BqM zceH=Laet0M=>-YOZ!*GL_f_Svj0sZjlL(yzI zZ`^>fq^Adtb(Fw0TTNL79S@tgPRnUefRDCTX4~-K)&lTtn~+85Bv`U7mr=DXA3C>< z%VA7`LECet6%K66qYgNI{nQ+e2R3id_3MR?a@+9W_5!$YN3K;LEZLFk*S=#29NsY| z$L57F=;2((0c12joXeOF8-B!yJUj$G=wqyUxC|;E$>q<0d5?Ir9`b6%G>(481b=%Z zcN&`@f9Jw1kxmELnY(ruwV&MiL;<}U*0m?{JtR#QkzWvJ``Px(XnXj{rw2%%-vD`g zFQDJHPufd|!Pfke_SG-lG#0F%87`JTMZcL+@JAl3bnrFKh40dM3q{Fryz9K& z+MfDsklJyXgSK8G5z;Yq5iOJO3!8c!-Afbf!|Uj8dGqq?>12tT^=^JScy_$_#OsCQLEU}nQp^G|JET%&!UCHiPLL0D0PtVO{F?;?- zI*NU_gcfl7gO^e-y}o0{Qu=-+ZD8Ye(v!51(MQorQHSGE%m`9XPe-hUo|bRx+(q$E z>ge1h&$UoDn{-GXGjRU3gluB7@vAg-5!5a!8<@O^ke%$_Lvr~*EOAK%+mFieZ{m*w z^`wE+;1l%pRHA|q`-l-3*Tv`a8whEB1`76;<;@&G$QC=Bd{{1%hk7VG=Aq`iP1s|* zm(4>^n(Je?bJ^@;Eu6IMVoa(tkc2;Ik%KeXCtP{eC9L3OlrPk<$y}bF$!2o7SYz{a zyoue;uMvH4nUCD7IMW71^3s zIFOLwPB!lqBwzP9KJPBH5JWGRx3QL2+`6(%@HF;Zc;aQ>=>1ji*_Z%hR8+ z1zb-2mfgi=IG^p}vh5;vl*{uW*3G3m!U~U}{H}>raXENCi*ng@BU`}bTWi=|T)ufP z+r{N;E$pbS-^aSSJaU8;cA@M<|6IP%&7vsfgFO=aO_y9MkqEm>SIlF(xZJpg9p!TS zy{wzdEiJ6@ILb}?SQVEWkFY40cb{SlxNPobccGN;M1!rz(cqd9>?l_}JA!p{Ikt!u zoU7f15NlQNstA)6=6!N$&~dd(F7#LU}x4#sxKY{k>q^JXNE-HVNV z*mDg!=-k`e^UI&~T#4j`&&urO{n+zDJUS!x%WVF0vU%=<*tq)n-kv*u($j*Lr@q*$ TfAlB%iD>z%mwNRrKhgg`m}%q7 diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index 56ce0ec3b9e33590843857cce65cd156a1ee2449..54c7427605f0efadb79f0e724eafbb5b5eded77e 100644 GIT binary patch delta 200 zcmbQUnB&hfj)pCaDf6aJaAee){_iOxk7o%(DnkWB2}3DE5s;<8;Kq;-W;-)DGbl0W zFnBV!09o-s?8D&7;K&ff5CWtlfMh6;?Fv-y4`w+}UntM0I$2@2$>a%zY?HTjTTMQY z$fgQX3ep@Z0j3IS;BQK+{s0+|04CT`W%NQdkC+uQl OHe@i_9ypKDyBGj$EiUu` delta 26 icmeyfjAPDXj)pCaDf1>Tn87#QW;x@A?Mw?9tBL@m(hGC| diff --git a/host/dxwndhost.vs2008.sln b/host/dxwndhost.vs2008.sln deleted file mode 100644 index 5bf4fb1..0000000 --- a/host/dxwndhost.vs2008.sln +++ /dev/null @@ -1,20 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dxwndhost", "dxwndhost.vs2008.vcproj", "{FD0B0234-8EC5-43C0-A384-1B881DD3D925}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {FD0B0234-8EC5-43C0-A384-1B881DD3D925}.Debug|Win32.ActiveCfg = Debug|Win32 - {FD0B0234-8EC5-43C0-A384-1B881DD3D925}.Debug|Win32.Build.0 = Debug|Win32 - {FD0B0234-8EC5-43C0-A384-1B881DD3D925}.Release|Win32.ActiveCfg = Release|Win32 - {FD0B0234-8EC5-43C0-A384-1B881DD3D925}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index e6386958c0f37cf90cc91f38b4f4002aa147882e..282980aa9d6ba15d3de9085e1746810e2c7c6b83 100644 GIT binary patch delta 5986 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 t->flags2 |= INIT8BPP; //if(dlg->m_Init16BPP) t->flags2 |= INIT16BPP; if(dlg->m_BackBufAttach) t->flags2 |= BACKBUFATTACH; + if(dlg->m_ClearTextureFourCC) t->flags7 |= CLEARTEXTUREFOURCC; + if(dlg->m_NoDDExclusiveMode) t->flags7 |= NODDEXCLUSIVEMODE; if(dlg->m_HandleAltF4) t->flags |= HANDLEALTF4; if(dlg->m_LimitFPS) t->flags2 |= LIMITFPS; if(dlg->m_SkipFPS) t->flags2 |= SKIPFPS; @@ -731,6 +733,8 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_RecoverScreenMode = t->flags2 & RECOVERSCREENMODE ? 1 : 0; dlg->m_RefreshOnResize = t->flags2 & REFRESHONRESIZE ? 1 : 0; dlg->m_BackBufAttach = t->flags2 & BACKBUFATTACH ? 1 : 0; + dlg->m_ClearTextureFourCC = t->flags7 & CLEARTEXTUREFOURCC ? 1 : 0; + dlg->m_NoDDExclusiveMode = t->flags7 & NODDEXCLUSIVEMODE ? 1 : 0; dlg->m_HandleAltF4 = t->flags & HANDLEALTF4 ? 1 : 0; dlg->m_LimitFPS = t->flags2 & LIMITFPS ? 1 : 0; dlg->m_SkipFPS = t->flags2 & SKIPFPS ? 1 : 0; @@ -2638,6 +2642,7 @@ DWORD WINAPI StartDebug(void *p) PROCESS_INFORMATION pinfo; char path[MAX_PATH]; extern char *GetFileNameFromHandle(HANDLE); + char *sRunTargetPath; #ifdef DXWDEBUGSTEPPING PROCESS_INFORMATION *pi; CREATE_THREAD_DEBUG_INFO *ti; @@ -2661,10 +2666,11 @@ DWORD WINAPI StartDebug(void *p) ThInfo = (ThreadInfo_Type *)p; ZeroMemory(&sinfo, sizeof(sinfo)); sinfo.cb = sizeof(sinfo); - strcpy_s(path, sizeof(path), ThInfo->TM->path); + sRunTargetPath = (strlen(ThInfo->PM->launchpath)>0) ? ThInfo->PM->launchpath : ThInfo->TM->path; + strcpy_s(path, sizeof(path), sRunTargetPath); PathRemoveFileSpec(path); if(!CreateProcess(NULL, - (strlen(ThInfo->PM->launchpath)>0) ? ThInfo->PM->launchpath : ThInfo->TM->path, + sRunTargetPath, 0, 0, false, DEBUG_PROCESS|DEBUG_ONLY_THIS_PROCESS, NULL, path, &sinfo, &pinfo)){ DWORD dwLastErr = GetLastError(); switch (dwLastErr){ @@ -3064,6 +3070,7 @@ void CDxwndhostView::OnRun() PROCESS_INFORMATION pinfo; char path[MAX_PATH]; TARGETMAP RestrictedMaps[2]; + char *sRunTargetPath; if(gTransientMode){ i=iProgIndex-1; @@ -3074,13 +3081,14 @@ void CDxwndhostView::OnRun() pos = listctrl.GetFirstSelectedItemPosition(); i = listctrl.GetNextSelectedItem(pos); } + sRunTargetPath = (strlen(PrivateMaps[i].launchpath)>0) ? PrivateMaps[i].launchpath : TargetMaps[i].path; ZeroMemory(&sinfo, sizeof(sinfo)); sinfo.cb = sizeof(sinfo); // create a virtually single entry in the targetmap array memcpy(&RestrictedMaps[0], &TargetMaps[i], sizeof(TARGETMAP)); memset(&RestrictedMaps[1], 0, sizeof(TARGETMAP)); if(!(PrivateMaps[i].startfolder[0])){ - strcpy_s(path, sizeof(path), TargetMaps[i].path); + strcpy_s(path, sizeof(path), sRunTargetPath); PathRemoveFileSpec(path); }else{ strcpy_s(path, sizeof(path), PrivateMaps[i].startfolder); @@ -3130,12 +3138,12 @@ void CDxwndhostView::OnRun() else if(TargetMaps[i].flags7 & INJECTSUSPENDED){ OutTrace("injectsuspended mode\n"); - InjectSuspended((strlen(PrivateMaps[i].launchpath)>0) ? PrivateMaps[i].launchpath: TargetMaps[i].path, path); + InjectSuspended(sRunTargetPath, path); } else{ OutTrace("setwindowshook mode\n"); CreateProcess(NULL, - (strlen(PrivateMaps[i].launchpath)>0) ? PrivateMaps[i].launchpath: TargetMaps[i].path, + sRunTargetPath, 0, 0, false, CREATE_DEFAULT_ERROR_MODE, NULL, path, &sinfo, &pinfo); CloseHandle(pinfo.hProcess); // no longer needed, avoid handle leakage CloseHandle(pinfo.hThread); // no longer needed, avoid handle leakage diff --git a/host/resource b/host/resource index dde3f7fee6cc72db2144db147c3456eec7ab03c2..52e71b72ffc9211c45c34f67fd5b2253182a80fa 100644 GIT binary patch delta 86 zcmbQ$$b6}ZdBZg|PG<%m23H10hM>ucNy6-*3_%Re49=4;sz^^RnJ72;o)d?lD?N?# delta 14 WcmccA#5}8!dBZie&3)=eW&!{*mImhl