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 40035cd..ede2fbc 100644 Binary files a/dll/dxwnd.vs2008.suo and b/dll/dxwnd.vs2008.suo differ 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 674fbb2..57a972f 100644 Binary files a/host/dxwndhost.aps and b/host/dxwndhost.aps differ diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index 56ce0ec..54c7427 100644 Binary files a/host/dxwndhost.rc and b/host/dxwndhost.rc differ 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 e638695..282980a 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 fe73bd6..ab98fab 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -444,6 +444,8 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) //if(dlg->m_Init8BPP) 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 dde3f7f..52e71b7 100644 Binary files a/host/resource and b/host/resource differ