From 1beb97e5aa545660c34c9602827e335cd91ec57e Mon Sep 17 00:00:00 2001 From: gho tik Date: Mon, 5 Oct 2015 12:40:44 -0400 Subject: [PATCH] v2_03_20_src Former-commit-id: a958662e8d866d5416cf839365aed28110ae7207 --- Include/dxwnd.h | 2 + build/dxwnd.dll | 4 +- build/dxwnd.exe | 2 +- build/{exports => }/dxwnd.ini | 4 +- .../Alone in the Dark the New Nightmare.dxw | 31 ++++ build/exports/Armor Command.dxw | 29 +++ .../exports/Battle Isle - the Andosia War.dxw | 31 ++++ build/exports/Black Moon Chronicles.dxw | 9 +- build/exports/Corsairs Gold (GOG).dxw | 31 ++++ .../Crusaders of Might and Magic (GOG).dxw | 12 +- .../Crusaders of Might and Magic Demo.dxw | 10 +- build/exports/Earth 2150.dxw | 28 +++ build/exports/Hearts of Iron III.dxw | 28 +++ build/exports/Hexen95.dxw | 29 +++ build/exports/Hollywood Monsters.dxw | 4 +- .../Legend of the Prophet & Assassin, the.dxw | 29 +++ build/exports/Moto Racer demo.dxw | 31 ++++ build/exports/Myth the Fallen Lords.dxw | 29 +++ build/exports/Prince of Persia 3D.dxw | 31 ++++ build/exports/Puma World Football.dxw | 29 +++ build/exports/Real War Air Land Sea.dxw | 31 ++++ build/exports/Scrapland.dxw | 28 +++ ...k Holmes The Mystery of The Mummy demo.dxw | 31 ++++ build/exports/SimCity 3000.dxw | 28 +++ build/exports/Spirit Warrior.dxw | 29 +++ build/exports/The Hobbit(TM).dxw | 29 +++ build/exports/Viper Racing.dxw | 29 +++ build/exports/Wars & Warriors Joan of Arc.dxw | 31 ++++ build/exports/Weird War.dxw | 31 ++++ build/exports/mdk 95.dxw | 29 +++ build/readme-relnotes.txt | 10 +- dll/ddraw.cpp | 166 +++++++----------- dll/ddtexture.cpp | 27 +-- dll/dxhelper.cpp | 83 +++++++++ dll/dxhelper.h | 3 +- dll/dxhook.cpp | 16 +- dll/dxwcore.cpp | 19 ++ dll/dxwcore.hpp | 1 + dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 151040 -> 206336 bytes dll/hd3d.cpp | 142 +++++++++++++-- dll/hd3d7.cpp | 37 ++-- dll/hddraw.h | 1 + dll/kernel32.cpp | 90 ++++++++-- dll/user32.cpp | 47 +++-- host/TabCompat.cpp | 1 + host/TabWindow.cpp | 2 +- host/TargetDlg.cpp | 3 +- host/TargetDlg.h | 3 +- host/dxwndhost.aps | Bin 129696 -> 156844 bytes host/dxwndhost.rc | Bin 98878 -> 99420 bytes host/dxwndhost.vs2008.suo | Bin 206848 -> 208384 bytes host/dxwndhostView.cpp | 6 +- host/resource | Bin 34496 -> 34588 bytes 54 files changed, 1143 insertions(+), 215 deletions(-) rename build/{exports => }/dxwnd.ini (58%) create mode 100644 build/exports/Alone in the Dark the New Nightmare.dxw create mode 100644 build/exports/Armor Command.dxw create mode 100644 build/exports/Battle Isle - the Andosia War.dxw create mode 100644 build/exports/Corsairs Gold (GOG).dxw create mode 100644 build/exports/Earth 2150.dxw create mode 100644 build/exports/Hearts of Iron III.dxw create mode 100644 build/exports/Hexen95.dxw create mode 100644 build/exports/Legend of the Prophet & Assassin, the.dxw create mode 100644 build/exports/Moto Racer demo.dxw create mode 100644 build/exports/Myth the Fallen Lords.dxw create mode 100644 build/exports/Prince of Persia 3D.dxw create mode 100644 build/exports/Puma World Football.dxw create mode 100644 build/exports/Real War Air Land Sea.dxw create mode 100644 build/exports/Scrapland.dxw create mode 100644 build/exports/Sherlock Holmes The Mystery of The Mummy demo.dxw create mode 100644 build/exports/SimCity 3000.dxw create mode 100644 build/exports/Spirit Warrior.dxw create mode 100644 build/exports/The Hobbit(TM).dxw create mode 100644 build/exports/Viper Racing.dxw create mode 100644 build/exports/Wars & Warriors Joan of Arc.dxw create mode 100644 build/exports/Weird War.dxw create mode 100644 build/exports/mdk 95.dxw diff --git a/Include/dxwnd.h b/Include/dxwnd.h index c39728d..325445f 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -183,6 +183,8 @@ // sixth flags DWORD dxw.dwFlags6: #define FORCESWAPEFFECT 0x00000001 // in D3D8/9, forces the SwapEffect value in CreateDevice/Reset operations +#define LEGACYALLOC 0x00000002 // reserve legacy memory segments +#define NODESTROYWINDOW 0x00000004 // suppress the main window destruction // logging Tflags DWORD: #define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 4761121..455008c 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:30f6a78ea3b87ee01aff8159e37ade8c64528ce94e51299d3f5e5b3f7c7e8276 -size 575488 +oid sha256:8b63cb25a2b2f543143293943a740859894c0a8b2ff156428c40376380a47a13 +size 577536 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 3002862..85bc625 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:292da547aea629cb8b159cd7ac8c768bdc915cdd4ecd294dbc0ec14097ec869c +oid sha256:c1bb172dc721bb8db528e064c3bc6acb78a0107c298e11368d28b36bb636dae6 size 539648 diff --git a/build/exports/dxwnd.ini b/build/dxwnd.ini similarity index 58% rename from build/exports/dxwnd.ini rename to build/dxwnd.ini index 823f159..7f729a0 100644 --- a/build/exports/dxwnd.ini +++ b/build/dxwnd.ini @@ -1,5 +1,5 @@ [window] -posx=1496 -posy=246 +posx=50 +posy=50 sizx=320 sizy=200 diff --git a/build/exports/Alone in the Dark the New Nightmare.dxw b/build/exports/Alone in the Dark the New Nightmare.dxw new file mode 100644 index 0000000..0a7a09a --- /dev/null +++ b/build/exports/Alone in the Dark the New Nightmare.dxw @@ -0,0 +1,31 @@ +[target] +title0=Alone in the Dark the New Nightmare +path0=D:\Games\Alone in the Dark\alone4.exe +launchpath0=D:\Games\Alone in the Dark\launch.exe +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=679477282 +flagg0=1207959568 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=0 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=1200 +sizy0=900 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 diff --git a/build/exports/Armor Command.dxw b/build/exports/Armor Command.dxw new file mode 100644 index 0000000..6a3648c --- /dev/null +++ b/build/exports/Armor Command.dxw @@ -0,0 +1,29 @@ +[target] +title0=Armor Command +path0=D:\Games\ArmCom\armrcmd.exe +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=671088674 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Battle Isle - the Andosia War.dxw b/build/exports/Battle Isle - the Andosia War.dxw new file mode 100644 index 0000000..69681e0 --- /dev/null +++ b/build/exports/Battle Isle - the Andosia War.dxw @@ -0,0 +1,31 @@ +[target] +title0=Battle Isle - the Andosia War +path0=D:\Games\Battle Isle - the Andosia War\BITAW.exe +launchpath0= +module0= +opengllib0= +notes0= +ver0=7 +coord0=0 +flag0=679477280 +flagg0=1207959552 +flagh0=20 +flagi0=136314884 +flagj0=134221952 +flagk0=0 +tflag0=6402 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 diff --git a/build/exports/Black Moon Chronicles.dxw b/build/exports/Black Moon Chronicles.dxw index ddb82ae..25618c3 100644 --- a/build/exports/Black Moon Chronicles.dxw +++ b/build/exports/Black Moon Chronicles.dxw @@ -8,8 +8,8 @@ coord0=0 flag0=134234146 flagg0=1207959568 flagh0=32788 -flagi0=4 -tflag0=6211 +flagi0=4194308 +tflag0=0 initx0=0 inity0=0 minx0=0 @@ -24,3 +24,8 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 +launchpath0= +notes0= +flagj0=128 +flagk0=0 +swapeffect0=0 diff --git a/build/exports/Corsairs Gold (GOG).dxw b/build/exports/Corsairs Gold (GOG).dxw new file mode 100644 index 0000000..f59eaa8 --- /dev/null +++ b/build/exports/Corsairs Gold (GOG).dxw @@ -0,0 +1,31 @@ +[target] +title0=Corsairs Gold +path0=D:\Games\Corsairs Gold\corsairs.patched.exe +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=134221858 +flagg0=1207959552 +flagh0=20 +flagi0=205520900 +flagj0=67108992 +flagk0=0 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 diff --git a/build/exports/Crusaders of Might and Magic (GOG).dxw b/build/exports/Crusaders of Might and Magic (GOG).dxw index 6038dc4..db7d088 100644 --- a/build/exports/Crusaders of Might and Magic (GOG).dxw +++ b/build/exports/Crusaders of Might and Magic (GOG).dxw @@ -4,15 +4,15 @@ path0=D:\Games\Crusaders of Might and Magic (GOG)\crusaders.exe launchpath0= module0=gfx_d3d gfx_sw opengllib0= -notes0=the ddraw.dll hooker in the game folder must be deleted or renamed \nto allow DxWnd to play the game. +notes0= ver0=0 coord0=0 flag0=-1467989966 -flagg0=1744830472 -flagh0=20 -flagi0=138412036 +flagg0=1209008640 +flagh0=65556 +flagi0=136314884 flagj0=4224 -tflag0=-2147477229 +tflag0=0 initx0=0 inity0=0 minx0=0 @@ -27,3 +27,5 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 +flagk0=2 +swapeffect0=0 diff --git a/build/exports/Crusaders of Might and Magic Demo.dxw b/build/exports/Crusaders of Might and Magic Demo.dxw index 4016a48..51cc1b4 100644 --- a/build/exports/Crusaders of Might and Magic Demo.dxw +++ b/build/exports/Crusaders of Might and Magic Demo.dxw @@ -8,11 +8,11 @@ notes0= ver0=0 coord0=0 flag0=-1467989966 -flagg0=1207959560 -flagh0=20 -flagi0=138412036 +flagg0=1207959552 +flagh0=1044 +flagi0=1212153860 flagj0=4224 -tflag0=6418 +tflag0=0 initx0=0 inity0=0 minx0=0 @@ -27,3 +27,5 @@ maxfps0=0 initts0=0 winver0=0 maxres0=-1 +flagk0=2 +swapeffect0=0 diff --git a/build/exports/Earth 2150.dxw b/build/exports/Earth 2150.dxw new file mode 100644 index 0000000..6951272 --- /dev/null +++ b/build/exports/Earth 2150.dxw @@ -0,0 +1,28 @@ +[target] +title0=Earth 2150 +path0=D:\Games\Earth 2150\Earth2150.exe +launchpath0= +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=136331298 +flagg0=1207959552 +flagh0=20 +flagi0=138412452 +flagj0=8322 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Hearts of Iron III.dxw b/build/exports/Hearts of Iron III.dxw new file mode 100644 index 0000000..172b8ee --- /dev/null +++ b/build/exports/Hearts of Iron III.dxw @@ -0,0 +1,28 @@ +[target] +title0=Hearts of Iron III +path0=D:\Games\Hearts of Iron III\hoi3game.exe +launchpath0= +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=704774688 +flagg0=1207959568 +flagh0=20 +flagi0=138412036 +flagj0=128 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Hexen95.dxw b/build/exports/Hexen95.dxw new file mode 100644 index 0000000..2ccc0f5 --- /dev/null +++ b/build/exports/Hexen95.dxw @@ -0,0 +1,29 @@ +[target] +title0=Hexen95 +path0=D:\Games\HEXEN95\HEXEN95.EXE +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=671088674 +flagg0=1207959552 +flagh0=65556 +flagi0=138412036 +flagj0=4224 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Hollywood Monsters.dxw b/build/exports/Hollywood Monsters.dxw index 0b4df23..4a4264d 100644 --- a/build/exports/Hollywood Monsters.dxw +++ b/build/exports/Hollywood Monsters.dxw @@ -9,7 +9,7 @@ flag0=134217762 flagg0=1209008384 flagh0=20 flagi0=4194308 -tflag0=64 +tflag0=0 initx0=0 inity0=0 minx0=0 @@ -25,3 +25,5 @@ initts0=0 winver0=0 maxres0=-1 launchpath0= +notes0= +flagj0=128 diff --git a/build/exports/Legend of the Prophet & Assassin, the.dxw b/build/exports/Legend of the Prophet & Assassin, the.dxw new file mode 100644 index 0000000..d53ab89 --- /dev/null +++ b/build/exports/Legend of the Prophet & Assassin, the.dxw @@ -0,0 +1,29 @@ +[target] +title0=Legend of the Prophet & Assassin, the +path0=D:\Games\La leggenda\Legend.exe +launchpath0= +module0= +opengllib0= +notes0= +ver0=1 +coord0=0 +flag0=134217762 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=67113088 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Moto Racer demo.dxw b/build/exports/Moto Racer demo.dxw new file mode 100644 index 0000000..ce248fb --- /dev/null +++ b/build/exports/Moto Racer demo.dxw @@ -0,0 +1,31 @@ +[target] +title0=Moto Racer demo +path0=D:\Games\Moto.Racer.demo\PlayDemo.exe +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=134217762 +flagg0=1207959680 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=0 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 diff --git a/build/exports/Myth the Fallen Lords.dxw b/build/exports/Myth the Fallen Lords.dxw new file mode 100644 index 0000000..6794e35 --- /dev/null +++ b/build/exports/Myth the Fallen Lords.dxw @@ -0,0 +1,29 @@ +[target] +title0=Myth the Fallen Lords +path0=D:\Games\myth\MYTH_TFL.EXE +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=134217762 +flagg0=2013265920 +flagh0=20 +flagi0=138412036 +flagj0=4224 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Prince of Persia 3D.dxw b/build/exports/Prince of Persia 3D.dxw new file mode 100644 index 0000000..98406a6 --- /dev/null +++ b/build/exports/Prince of Persia 3D.dxw @@ -0,0 +1,31 @@ +[target] +title0=Prince of Persia 3D +path0=D:\Games\Prince_of_Persia_3D\POP3D.exe +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=671105058 +flagg0=1209008128 +flagh0=20 +flagi0=136314885 +flagj0=128 +flagk0=4 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 diff --git a/build/exports/Puma World Football.dxw b/build/exports/Puma World Football.dxw new file mode 100644 index 0000000..c561e94 --- /dev/null +++ b/build/exports/Puma World Football.dxw @@ -0,0 +1,29 @@ +[target] +title0=Puma World Football +path0=D:\Games\pumawf98\WF.EXE +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=134217762 +flagg0=1207963648 +flagh0=20 +flagi0=138412036 +flagj0=4224 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=16 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Real War Air Land Sea.dxw b/build/exports/Real War Air Land Sea.dxw new file mode 100644 index 0000000..9bf9350 --- /dev/null +++ b/build/exports/Real War Air Land Sea.dxw @@ -0,0 +1,31 @@ +[target] +title0=Real War Air Land Sea +path0=D:\Games\Real War\REALWAR.EXE +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=134234146 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=0 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 diff --git a/build/exports/Scrapland.dxw b/build/exports/Scrapland.dxw new file mode 100644 index 0000000..63f1f7e --- /dev/null +++ b/build/exports/Scrapland.dxw @@ -0,0 +1,28 @@ +[target] +title0=Scrapland +path0=D:\Games\Scrapland\Bin\Scrap.exe +launchpath0= +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=134217762 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Sherlock Holmes The Mystery of The Mummy demo.dxw b/build/exports/Sherlock Holmes The Mystery of The Mummy demo.dxw new file mode 100644 index 0000000..4f6269d --- /dev/null +++ b/build/exports/Sherlock Holmes The Mystery of The Mummy demo.dxw @@ -0,0 +1,31 @@ +[target] +title0=Sherlock Holmes The Mystery of The Mummy demo +path0=D:\Games\Sherlock Holmes demo\Sherlock Holmes- Level-1- Hall\game.exe +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=136314914 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=0 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 diff --git a/build/exports/SimCity 3000.dxw b/build/exports/SimCity 3000.dxw new file mode 100644 index 0000000..9fba206 --- /dev/null +++ b/build/exports/SimCity 3000.dxw @@ -0,0 +1,28 @@ +[target] +title0=SimCity 3000 +path0=D:\Games\SimCity 3000\Game\Sc3.exe +launchpath0= +module0=SIMCITY.DLL +opengllib0= +ver0=1 +coord0=0 +flag0=1746935842 +flagg0=1811939328 +flagh0=131092 +flagi0=136314884 +flagj0=8320 +tflag0=6403 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Spirit Warrior.dxw b/build/exports/Spirit Warrior.dxw new file mode 100644 index 0000000..7ce0ef9 --- /dev/null +++ b/build/exports/Spirit Warrior.dxw @@ -0,0 +1,29 @@ +[target] +title0=Spirit Warrior +path0=D:\Games\spirit\SPIRIT.EXE +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=134217762 +flagg0=1744830464 +flagh0=1044 +flagi0=1212153862 +flagj0=4224 +tflag0=513 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/The Hobbit(TM).dxw b/build/exports/The Hobbit(TM).dxw new file mode 100644 index 0000000..b4fbc8a --- /dev/null +++ b/build/exports/The Hobbit(TM).dxw @@ -0,0 +1,29 @@ +[target] +title0=The Hobbit(TM) +path0=d:\Games\The Hobbit(TM)\Meridian.exe +launchpath0= +module0= +opengllib0= +notes0=1 - If you want to set screen mode other than the default included (800x600) \nyou should run the game without the hook, set the preferred screenmode in-game, \nthen change it in DxDwnd before else you'll reset back to the initial mode set.\n\n2 - To get the game working it took some checking/unchecking for a bit. \nAll that's needed is to activated "Fix Parent Window" which this game seems \nto use the invisible window for it's execution (per DxWnd manual even though \nexperimental... it works) and set the direct x version to 8. +ver0=8 +coord0=0 +flag0=167772194 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Viper Racing.dxw b/build/exports/Viper Racing.dxw new file mode 100644 index 0000000..d2e0bbf --- /dev/null +++ b/build/exports/Viper Racing.dxw @@ -0,0 +1,29 @@ +[target] +title0=Viper Racing +path0=D:\Games\Viper Racing\SIERRA\Viper Racing\Data\race.bin +launchpath0=D:\Games\Viper Racing\SIERRA\Viper Racing\Viper Racing.exe +module0= +opengllib0= +notes0= +ver0=1 +coord0=0 +flag0=134217762 +flagg0=1207959552 +flagh0=20 +flagi0=-2009071612 +flagj0=4224 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Wars & Warriors Joan of Arc.dxw b/build/exports/Wars & Warriors Joan of Arc.dxw new file mode 100644 index 0000000..b256c5d --- /dev/null +++ b/build/exports/Wars & Warriors Joan of Arc.dxw @@ -0,0 +1,31 @@ +[target] +title0=Wars & Warriors: Joan of Arc +path0=D:\Games\Wars & Warriors Johan of Arc\joan.exe +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=134217746 +flagg0=1207959552 +flagh0=20 +flagi0=205520900 +flagj0=4224 +flagk0=0 +tflag0=-2147477501 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=800 +maxy0=600 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 diff --git a/build/exports/Weird War.dxw b/build/exports/Weird War.dxw new file mode 100644 index 0000000..3588708 --- /dev/null +++ b/build/exports/Weird War.dxw @@ -0,0 +1,31 @@ +[target] +title0=Weird War +path0=D:\Games\Weird War\WeirdWar.exe +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=136331298 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=0 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 diff --git a/build/exports/mdk 95.dxw b/build/exports/mdk 95.dxw new file mode 100644 index 0000000..3614ab9 --- /dev/null +++ b/build/exports/mdk 95.dxw @@ -0,0 +1,29 @@ +[target] +title0=mdk 95 +path0=D:\Games\MDK\MDK95.EXE +launchpath0= +module0= +opengllib0= +notes0=Must manually set MDK.CFG hddata field with install game directory +ver0=0 +coord0=0 +flag0=134217762 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=12416 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 6443c63..1184fe0 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -793,4 +793,12 @@ fix: crash when setting "showFPS overlay" with DirectX "hybrid mode" fix: "keep aspect ratio" with DirectX "GDI mode" fix: when ddraw hook is set to "none", no hook operations are performed on ddraw add: possibility to control the D3D8/9 SwapEffect field with the "force swap effect" flag -fix: revised handling of GDI device context shared with DirectDraw primary surface, improved behaviour of "Star trek Armada" \ No newline at end of file +fix: revised handling of GDI device context shared with DirectDraw primary surface, improved behaviour of "Star trek Armada" + +v2.03.20: +fix: revised hookers for kernel32 GetVersionExA/W api, adding support for dwPlatformId field +fix: texture handling for texture dump/hack/highlight +add: "Reserve legacy memory segments" compatibility flag, needed for "Crusaders of Might & Magic" +add: preliminary support for ddraw7 DirectDrawCreateClipper api +add: "Suppress main window destruction" flag, to make "Prince of Persia 3D" playable +fix: fully revised ddraw surface handling in d3d1-7 versions. Now "Might & Magic IX" is supported \ No newline at end of file diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index b0b511f..72e540a 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -18,7 +18,7 @@ #include "syslibs.h" extern BOOL IsChangeDisplaySettingsHotPatched; -BOOL bDontReleaseBackBuffer = FALSE; +BOOL bIsWithinD3DCreateDevice = FALSE; DWORD dwBackBufferCaps; extern void TextureHandling(LPDIRECTDRAWSURFACE); ColorConversion_Type pColorConversion = NULL; @@ -33,6 +33,7 @@ HRESULT WINAPI extDirectDrawCreate(GUID FAR *, LPDIRECTDRAW FAR *, IUnknown FAR HRESULT WINAPI extDirectDrawCreateEx(GUID FAR *, LPDIRECTDRAW FAR *, REFIID, IUnknown FAR *); HRESULT WINAPI extDirectDrawEnumerate(LPDDENUMCALLBACK, LPVOID); HRESULT WINAPI extDirectDrawEnumerateEx(LPDDENUMCALLBACKEX, LPVOID, DWORD); +HRESULT WINAPI extDirectDrawCreateClipper(DWORD, LPDIRECTDRAWCLIPPER *, IUnknown *); // DirectDraw HRESULT WINAPI extQueryInterfaceD(void *, REFIID, LPVOID *); @@ -64,7 +65,6 @@ HRESULT WINAPI extTestCooperativeLevel(LPDIRECTDRAW); // STDMETHOD(EvaluateMode)(THIS_ DWORD, DWORD * ) PURE; HRESULT WINAPI extGetCapsD(LPDIRECTDRAW, LPDDCAPS, LPDDCAPS); - // DirectDrawSurface HRESULT WINAPI extQueryInterfaceS(void *, REFIID, LPVOID *); HRESULT WINAPI extReleaseS(LPDIRECTDRAWSURFACE); @@ -130,6 +130,7 @@ DirectDrawCreate_Type pDirectDrawCreate = NULL; DirectDrawCreateEx_Type pDirectDrawCreateEx = NULL; DirectDrawEnumerate_Type pDirectDrawEnumerate = NULL; DirectDrawEnumerateEx_Type pDirectDrawEnumerateEx = NULL; +DirectDrawCreateClipper_Type pDirectDrawCreateClipper = NULL; /* DirectDraw hook pointers */ QueryInterface_Type pQueryInterfaceD; @@ -280,6 +281,7 @@ static HookEntry_Type ddHooks[]={ {HOOK_HOT_CANDIDATE, "DirectDrawCreateEx", (FARPROC)NULL, (FARPROC *)&pDirectDrawCreateEx, (FARPROC)extDirectDrawCreateEx}, {HOOK_HOT_CANDIDATE, "DirectDrawEnumerateA", (FARPROC)NULL, (FARPROC *)&pDirectDrawEnumerate, (FARPROC)extDirectDrawEnumerate}, {HOOK_HOT_CANDIDATE, "DirectDrawEnumerateExA", (FARPROC)NULL, (FARPROC *)&pDirectDrawEnumerateEx, (FARPROC)extDirectDrawEnumerateEx}, + {HOOK_HOT_CANDIDATE, "DirectDrawCreateClipper", (FARPROC)NULL, (FARPROC *)&pDirectDrawCreateClipper, (FARPROC)extDirectDrawCreateClipper}, //{HOOK_IAT_CANDIDATE, "DirectDrawEnumerateW", (FARPROC)NULL, (FARPROC *)&pDirectDrawEnumerateW, (FARPROC)extDirectDrawCreate}, //{HOOK_IAT_CANDIDATE, "DirectDrawEnumerateExW", (FARPROC)NULL, (FARPROC *)&pDirectDrawEnumerateExW, (FARPROC)extDirectDrawCreate}, {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator @@ -334,87 +336,9 @@ static void Stopper(char *s, int line) #define STOPPER(s) #endif -static char *sFourCC(DWORD fcc) -{ - static char sRet[5]; - char c; - int i; - char *t=&sRet[0]; - for(i=0; i<4; i++){ - c = fcc & (0xFF); - *t++ = isprint(c) ? c : '.'; - c = c >> 8; - } - *t = 0; - return sRet; -} - static char *DumpPixelFormat(LPDDSURFACEDESC2 lpddsd) { - static char sBuf[512]; - char sItem[256]; - DWORD flags=lpddsd->ddpfPixelFormat.dwFlags; - sprintf(sBuf, " PixelFormat flags=%x(%s) BPP=%d", - flags, ExplainPixelFormatFlags(flags), lpddsd->ddpfPixelFormat.dwRGBBitCount); - if (flags & DDPF_RGB) { - if (flags & DDPF_ALPHAPIXELS) { - sprintf(sItem, " RGBA=(%x,%x,%x,%x)", - lpddsd->ddpfPixelFormat.dwRBitMask, - lpddsd->ddpfPixelFormat.dwGBitMask, - lpddsd->ddpfPixelFormat.dwBBitMask, - lpddsd->ddpfPixelFormat.dwRGBAlphaBitMask); - } - else { - sprintf(sItem, " RGB=(%x,%x,%x)", - lpddsd->ddpfPixelFormat.dwRBitMask, - lpddsd->ddpfPixelFormat.dwGBitMask, - lpddsd->ddpfPixelFormat.dwBBitMask); - } - strcat(sBuf, sItem); - } - if (flags & DDPF_YUV) { - sprintf(sItem, " YUVA=(%x,%x,%x,%x)", - lpddsd->ddpfPixelFormat.dwYBitMask, - lpddsd->ddpfPixelFormat.dwUBitMask, - lpddsd->ddpfPixelFormat.dwVBitMask, - lpddsd->ddpfPixelFormat.dwYUVAlphaBitMask); - strcat(sBuf, sItem); - } - if (flags & DDPF_ZBUFFER) { - sprintf(sItem, " SdZSbL=(%x,%x,%x,%x)", - lpddsd->ddpfPixelFormat.dwStencilBitDepth, - lpddsd->ddpfPixelFormat.dwZBitMask, - lpddsd->ddpfPixelFormat.dwStencilBitMask, - lpddsd->ddpfPixelFormat.dwLuminanceAlphaBitMask); - strcat(sBuf, sItem); - } - if (flags & DDPF_ALPHA) { - sprintf(sItem, " LBdBlZ=(%x,%x,%x,%x)", - lpddsd->ddpfPixelFormat.dwLuminanceBitMask, - lpddsd->ddpfPixelFormat.dwBumpDvBitMask, - lpddsd->ddpfPixelFormat.dwBumpLuminanceBitMask, - lpddsd->ddpfPixelFormat.dwRGBZBitMask); - strcat(sBuf, sItem); - } - if (flags & DDPF_LUMINANCE) { - sprintf(sItem, " BMbMF=(%x,%x,%x,%x)", - lpddsd->ddpfPixelFormat.dwBumpDuBitMask, - lpddsd->ddpfPixelFormat.MultiSampleCaps.wBltMSTypes, - lpddsd->ddpfPixelFormat.MultiSampleCaps.wFlipMSTypes, - lpddsd->ddpfPixelFormat.dwYUVZBitMask); - strcat(sBuf, sItem); - } - if (flags & DDPF_BUMPDUDV) { - sprintf(sItem, " O=(%x)", - lpddsd->ddpfPixelFormat.dwOperations); - strcat(sBuf, sItem); - } - if (flags & DDPF_FOURCC) { - sprintf(sItem, " FourCC=%x(%s)", - lpddsd->ddpfPixelFormat.dwFourCC, sFourCC(lpddsd->ddpfPixelFormat.dwFourCC)); - strcat(sBuf, sItem); - } - return sBuf; + return ExplainPixelFormat(&(lpddsd->ddpfPixelFormat)); } static CHAR *LogSurfaceAttributes(LPDDSURFACEDESC lpddsd, char *label, int line) @@ -1410,9 +1334,6 @@ static void HookDDSurfaceGeneric(LPDIRECTDRAWSURFACE *lplpdds, int dxversion) SetHook((void *)(**(DWORD **)lplpdds + 128), extUnlockDir4, (void **)&pUnlock4, "Unlock(S4)"); } - if (dxversion == 7) - SetHook((void *)(**(DWORD **)lplpdds + 156), extSetSurfaceDesc, (void **)&pSetSurfaceDesc, "SetSurfaceDesc(S3)"); - if (!(dxw.dwTFlags & OUTPROXYTRACE)) return; // just proxed .... @@ -1454,6 +1375,9 @@ static void HookDDSurfaceGeneric(LPDIRECTDRAWSURFACE *lplpdds, int dxversion) SetHook((void *)(**(DWORD **)lplpdds + 136), extUpdateOverlayDisplayProxy, (void **)&pUpdateOverlayDisplay, "UpdateOverlayDisplay(S)"); // IDirectDrawSurface::UpdateOverlayZOrder SetHook((void *)(**(DWORD **)lplpdds + 140), extUpdateOverlayZOrderProxy, (void **)&pUpdateOverlayZOrder, "UpdateOverlayZOrder(S)"); + if (dxversion == 7) + SetHook((void *)(**(DWORD **)lplpdds + 156), extSetSurfaceDesc, (void **)&pSetSurfaceDesc, "SetSurfaceDesc(S3)"); + } static void HookGammaControl(LPVOID *obp) @@ -1866,11 +1790,11 @@ HRESULT WINAPI extQueryInterfaceS(void *lpdds, REFIID riid, LPVOID *obp) unsigned int dwLocalDDVersion; unsigned int dwLocalTexVersion; - OutTraceDDRAW("QueryInterface(S): lpdds=%x REFIID=%x(%s) obp=%x\n", - lpdds, riid.Data1, ExplainGUID((GUID *)&riid), *obp); - IsPrim=dxw.IsAPrimarySurface((LPDIRECTDRAWSURFACE)lpdds); IsBack=dxw.IsABackBufferSurface((LPDIRECTDRAWSURFACE)lpdds); + OutTraceDDRAW("QueryInterface(S): lpdds=%x%s REFIID=%x(%s)\n", + lpdds, dxw.ExplainSurfaceRole((LPDIRECTDRAWSURFACE)lpdds), riid.Data1, ExplainGUID((GUID *)&riid)); + IsGammaRamp=FALSE; dwLocalDDVersion=0; @@ -2120,6 +2044,7 @@ HRESULT WINAPI extGetDisplayMode(LPDIRECTDRAW lpdd, LPDDSURFACEDESC lpddsd) HRESULT WINAPI extSetCooperativeLevel(void *lpdd, HWND hwnd, DWORD dwflags) { HRESULT res; + BOOL bFixFrame = FALSE; OutTraceDDRAW("SetCooperativeLevel: lpdd=%x hwnd=%x dwFlags=%x(%s)\n", lpdd, hwnd, dwflags,ExplainCoopFlags(dwflags)); @@ -2143,9 +2068,7 @@ HRESULT WINAPI extSetCooperativeLevel(void *lpdd, HWND hwnd, DWORD dwflags) dxw.SetFullScreen(TRUE); dwflags &= ~(DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE | DDSCL_ALLOWMODEX); dwflags |= DDSCL_NORMAL; - res=(*pSetCooperativeLevel)(lpdd, hwnd, dwflags); - AdjustWindowFrame(hwnd, dxw.GetScreenWidth(), dxw.GetScreenHeight()); - if (dxw.dwFlags1 & FIXWINFRAME) dxw.FixWindowFrame(hwnd); + bFixFrame = TRUE; } else{ RECT client; @@ -2153,17 +2076,25 @@ HRESULT WINAPI extSetCooperativeLevel(void *lpdd, HWND hwnd, DWORD dwflags) // v2.02.11: // Non fullscreen cooperative mode means windowed, unless the window occupies the whole desktop area dxw.SetFullScreen(client.right==dxw.iSizX && client.bottom==dxw.iSizY); - //dxw.SetFullScreen(FALSE); - res=(*pSetCooperativeLevel)(lpdd, hwnd, dwflags); } } - else { - res=(*pSetCooperativeLevel)(lpdd, hwnd, dwflags); - } - if(res) + res=(*pSetCooperativeLevel)(lpdd, hwnd, dwflags); + if(res){ + if(res == DDERR_INVALIDPARAMS){ + //hwnd = GetForegroundWindow(); + PostMessage(hwnd, WM_SYSCOMMAND, SC_RESTORE, 0); + Sleep(1000); + res=(*pSetCooperativeLevel)(lpdd, hwnd, dwflags); + } OutTraceE("SetCooperativeLevel: ERROR lpdd=%x hwnd=%x Flags=%x err=%x(%s) at %d\n", lpdd, hwnd, dwflags, res, ExplainDDError(res), __LINE__); + } + + if(bFixFrame){ + AdjustWindowFrame(hwnd, dxw.GetScreenWidth(), dxw.GetScreenHeight()); + if (dxw.dwFlags1 & FIXWINFRAME) dxw.FixWindowFrame(hwnd); + } GetHookInfo()->IsFullScreen=dxw.IsFullScreen(); @@ -3706,12 +3637,11 @@ HRESULT WINAPI extUnlock(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRAWSURFAC HRESULT res; BOOL IsPrim; BOOL IsBack; + RECT rect; IsPrim=dxw.IsAPrimarySurface(lpdds); IsBack=dxw.IsABackBufferSurface(lpdds); - if ((dxversion == 4) && lprect) CleanRect(&lprect,__LINE__); - if(IsTraceDDRAW){ char sRect[81]; if (dxversion == 4){ @@ -3723,6 +3653,18 @@ HRESULT WINAPI extUnlock(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRAWSURFAC OutTrace("Unlock(%d): lpdds=%x%s %s\n", dxversion, lpdds, (IsPrim ? "(PRIM)": (IsBack ? "(BACK)" : "")), sRect); } + if(dxversion == 4){ + // make lprect point elsewhere, so that the original values are not altered + if(lprect){ + CleanRect(&lprect,__LINE__); + rect = *lprect; + lprect = ▭ + // v2.03.20: apparently, it seems that in ddraw 7 you can set an empty rectangle to mean the whole area .... + // this fixes the black screen otherwise present in "Arcanum". + if(IsPrim && ((lprect->right - lprect->left) == 0) && ((lprect->bottom - lprect->top) == 0)) lprect = NULL; + } + } + res=(*pUnlock)(lpdds, lprect); if (IsPrim && res==DD_OK) { if(dxversion == 1) lprect=NULL; @@ -4190,17 +4132,14 @@ HRESULT WINAPI extReleaseS(LPDIRECTDRAWSURFACE lpdds) IsPrim=dxw.IsAPrimarySurface(lpdds); IsBack=dxw.IsABackBufferSurface(lpdds); - if(IsBack && bDontReleaseBackBuffer){ - OutTraceDDRAW("Release(S): SKIP RELEASE on lpdds=%x\n", lpdds); - res = 0; - } - else - res = (*pReleaseS)(lpdds); + res = (*pReleaseS)(lpdds); - OutTraceDDRAW("Release(S): lpdds=%x%s refcount=%d\n", lpdds, IsPrim?"(PRIM)":(IsBack?"(BACK)":""), res); + OutTraceDDRAW("Release(S): lpdds=%x%s refcount=%d\n", lpdds, dxw.ExplainSurfaceRole(lpdds), res); if (res==0) { // common precondition // erase surface from primary or backbuffer list - if(IsPrim || IsBack) dxw.MarkRegularSurface(lpdds); + // v2-03-20: d3d 1-7 play a dirty trick: it Release the surface passed as argument until refcount == 0, + // but then rebuilds it with the original attributes! So, better not forget them. + if(!bIsWithinD3DCreateDevice && (IsPrim || IsBack)) dxw.MarkRegularSurface(lpdds); // when releasing primary surface, erase clipping region if(IsPrim && (dxw.dwFlags1 & CLIPCURSOR)) dxw.EraseClipCursor(); @@ -4894,6 +4833,19 @@ HRESULT WINAPI extSetSurfaceDesc(LPDIRECTDRAWSURFACE lpdds, LPDDSURFACEDESC lpDD HRESULT res; OutTrace("SetSurfaceDesc: REACHED\n"); res = (*pSetSurfaceDesc)(lpdds, lpDDsd2, dwFlags); - OutTraceE("SetSurfaceDesc: ERROR res=%x(%s)\n", res, ExplainDDError(res)); + if(res) OutTraceE("SetSurfaceDesc: ERROR res=%x(%s)\n", res, ExplainDDError(res)); return res; } + +HRESULT WINAPI extDirectDrawCreateClipper(DWORD dwFlags, LPDIRECTDRAWCLIPPER *lplpDDClipper, IUnknown *pUnkOuter) +{ + HRESULT res; + OutTraceDW("DirectDrawCreateClipper: flags=%x\n", dwFlags); + res = (*pDirectDrawCreateClipper)(dwFlags, lplpDDClipper, pUnkOuter); + if(res) { + OutTraceE("DirectDrawCreateClipper: ERROR res=%x(%s)\n", res, ExplainDDError(res)); + return res; + } + HookDDClipper(lplpDDClipper); + return res; +} \ No newline at end of file diff --git a/dll/ddtexture.cpp b/dll/ddtexture.cpp index 375b4a5..287b416 100644 --- a/dll/ddtexture.cpp +++ b/dll/ddtexture.cpp @@ -37,17 +37,22 @@ static unsigned int Hash(BYTE *buf, int len) unsigned int HashSurface(BYTE *buf, int pitch, int width, int height) { - unsigned int b = 378551; - unsigned int a = 63689; - DWORD hash = 0; - for(int y = 0; y < height; y++){ - BYTE *p = buf + (y * pitch); - for(int x = 0; x < width; x++){ - hash = hash * a + p[x]; - a = a * b; - } - } - return hash; + unsigned int b = 378551; + unsigned int a = 63689; + int pixelsize; + DWORD hash = 0; + // integer divide, intentionally throwing reminder away + pixelsize = pitch / width; + for(int y = 0; y < height; y++){ + BYTE *p = buf + (y * pitch); + for(int x = 0; x < width; x++){ + for(int pixelbyte = 0; pixelbyte < pixelsize; pixelbyte++){ + hash = (hash * a) + (*p++); + a = a * b; + } + } + } + return hash; } static char *SurfaceType(DDPIXELFORMAT ddpfPixelFormat) diff --git a/dll/dxhelper.cpp b/dll/dxhelper.cpp index 2dfb051..96942d3 100644 --- a/dll/dxhelper.cpp +++ b/dll/dxhelper.cpp @@ -1803,3 +1803,86 @@ char *ExplainDDError(DWORD c) } return eb; } + +static char *sFourCC(DWORD fcc) +{ + static char sRet[5]; + char c; + int i; + char *t=&sRet[0]; + for(i=0; i<4; i++){ + c = fcc & (0xFF); + *t++ = isprint(c) ? c : '.'; + c = c >> 8; + } + *t = 0; + return sRet; +} + +char *ExplainPixelFormat(LPDDPIXELFORMAT ddpfPixelFormat) +{ + static char sBuf[512]; + char sItem[256]; + DWORD flags=ddpfPixelFormat->dwFlags; + sprintf(sBuf, " PixelFormat flags=%x(%s) BPP=%d", + flags, ExplainPixelFormatFlags(flags), ddpfPixelFormat->dwRGBBitCount); + if (flags & DDPF_RGB) { + if (flags & DDPF_ALPHAPIXELS) { + sprintf(sItem, " RGBA=(%x,%x,%x,%x)", + ddpfPixelFormat->dwRBitMask, + ddpfPixelFormat->dwGBitMask, + ddpfPixelFormat->dwBBitMask, + ddpfPixelFormat->dwRGBAlphaBitMask); + } + else { + sprintf(sItem, " RGB=(%x,%x,%x)", + ddpfPixelFormat->dwRBitMask, + ddpfPixelFormat->dwGBitMask, + ddpfPixelFormat->dwBBitMask); + } + strcat(sBuf, sItem); + } + if (flags & DDPF_YUV) { + sprintf(sItem, " YUVA=(%x,%x,%x,%x)", + ddpfPixelFormat->dwYBitMask, + ddpfPixelFormat->dwUBitMask, + ddpfPixelFormat->dwVBitMask, + ddpfPixelFormat->dwYUVAlphaBitMask); + strcat(sBuf, sItem); + } + if (flags & DDPF_ZBUFFER) { + sprintf(sItem, " SdZSbL=(%x,%x,%x,%x)", + ddpfPixelFormat->dwStencilBitDepth, + ddpfPixelFormat->dwZBitMask, + ddpfPixelFormat->dwStencilBitMask, + ddpfPixelFormat->dwLuminanceAlphaBitMask); + strcat(sBuf, sItem); + } + if (flags & DDPF_ALPHA) { + sprintf(sItem, " LBdBlZ=(%x,%x,%x,%x)", + ddpfPixelFormat->dwLuminanceBitMask, + ddpfPixelFormat->dwBumpDvBitMask, + ddpfPixelFormat->dwBumpLuminanceBitMask, + ddpfPixelFormat->dwRGBZBitMask); + strcat(sBuf, sItem); + } + if (flags & DDPF_LUMINANCE) { + sprintf(sItem, " BMbMF=(%x,%x,%x,%x)", + ddpfPixelFormat->dwBumpDuBitMask, + ddpfPixelFormat->MultiSampleCaps.wBltMSTypes, + ddpfPixelFormat->MultiSampleCaps.wFlipMSTypes, + ddpfPixelFormat->dwYUVZBitMask); + strcat(sBuf, sItem); + } + if (flags & DDPF_BUMPDUDV) { + sprintf(sItem, " O=(%x)", + ddpfPixelFormat->dwOperations); + strcat(sBuf, sItem); + } + if (flags & DDPF_FOURCC) { + sprintf(sItem, " FourCC=%x(%s)", + ddpfPixelFormat->dwFourCC, sFourCC(ddpfPixelFormat->dwFourCC)); + strcat(sBuf, sItem); + } + return sBuf; +} \ No newline at end of file diff --git a/dll/dxhelper.h b/dll/dxhelper.h index d362a9d..c1912fb 100644 --- a/dll/dxhelper.h +++ b/dll/dxhelper.h @@ -51,4 +51,5 @@ extern char *ExplainRenderstateValue(DWORD); extern char *ExplainWfPFlags(DWORD); extern char *ExplainChangeDisplaySettingsFlags(DWORD); extern char *ExplainDICooperativeFlags(DWORD); -extern char *ExplainRegionType(DWORD); \ No newline at end of file +extern char *ExplainRegionType(DWORD); +extern char *ExplainPixelFormat(LPDDPIXELFORMAT); diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 9d41a14..6bccee1 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -103,7 +103,7 @@ static char *Flag5Names[32]={ }; static char *Flag6Names[32]={ - "FORCESWAPEFFECT", "", "", "", + "FORCESWAPEFFECT", "LEGACYALLOC", "NODESTROYWINDOW", "", "", "", "", "", "", "", "", "", "", "", "", "", @@ -1654,6 +1654,15 @@ DWORD WINAPI MessagePoller(LPVOID lpParameter) return 0; } +static void MemoryReserve() +{ + VirtualAlloc((LPVOID)0x4000000, 0x04000000, MEM_RESERVE, PAGE_READWRITE); + VirtualAlloc((LPVOID)0x5000000, 0x00F00000, MEM_RESERVE, PAGE_READWRITE); + VirtualAlloc((LPVOID)0x6000000, 0x00F00000, MEM_RESERVE, PAGE_READWRITE); + VirtualAlloc((LPVOID)0x7000000, 0x00F00000, MEM_RESERVE, PAGE_READWRITE); + VirtualAlloc((LPVOID)0x8000000, 0x00F00000, MEM_RESERVE, PAGE_READWRITE); +} + void HookInit(TARGETMAP *target, HWND hwnd) { HMODULE base; @@ -1667,9 +1676,12 @@ void HookInit(TARGETMAP *target, HWND hwnd) static char *Resolutions[]={ "unlimited", "320x200", "400x300", "640x480", "800x600", "1024x768", "1280x960", "" // terminator }; - + dxw.InitTarget(target); + // reserve legacy memory segments + if(dxw.dwFlags6 & LEGACYALLOC) MemoryReserve(); + // add the DxWnd install dir to the search path, to make all included dll linkable DWORD dwAttrib; dwAttrib = GetFileAttributes("dxwnd.dll"); diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index 0869d6e..a04b9bc 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -228,6 +228,25 @@ void dxwCore::DumpDesktopStatus() // Primary surfaces auxiliary functions /* ------------------------------------------------------------------ */ +char *dxwCore::ExplainSurfaceRole(LPDIRECTDRAWSURFACE ps) +{ + int i; + for (i=0;i. #include "TlHelp32.h" -#define VERSION "2.03.19" +#define VERSION "2.03.20" #define DDTHREADLOCK 1 //#define LOCKTHREADS diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 6f7ec42d910632c9066259a6f28712735eb82bea..38ac92885d1d89c9a49f6a7873cd7985562b3b38 100644 GIT binary patch delta 38655 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
vbF0Utp#eQB}p#g1F-7qQb8 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, lpContext); + OutTraceD3D("EnumZBufferFormats: CALLBACK context=%x %s \n", ((CallbackZBufArg *)lpContext)->arg, ExplainPixelFormat(lpDDPixFmt)); res = (*(((CallbackZBufArg *)lpContext)->cb))(lpDDPixFmt, ((CallbackZBufArg *)lpContext)->arg); - OutTraceD3D("EnumDevices: CALLBACK ret=%x\n", res); + OutTraceD3D("EnumZBufferFormats: CALLBACK ret=%x\n", res); return res; } diff --git a/dll/hddraw.h b/dll/hddraw.h index 3cce6e6..3ac8b6d 100644 --- a/dll/hddraw.h +++ b/dll/hddraw.h @@ -4,6 +4,7 @@ typedef HRESULT (WINAPI *DirectDrawCreate_Type)(GUID *, LPDIRECTDRAW *, IUnknown typedef HRESULT (WINAPI *DirectDrawCreateEx_Type)(GUID *, LPDIRECTDRAW *, REFIID, IUnknown *); typedef HRESULT (WINAPI *DirectDrawEnumerate_Type)(LPDDENUMCALLBACK, LPVOID); typedef HRESULT (WINAPI *DirectDrawEnumerateEx_Type)(LPDDENUMCALLBACKEX, LPVOID, DWORD); +typedef HRESULT (WINAPI *DirectDrawCreateClipper_Type)(DWORD, LPDIRECTDRAWCLIPPER *, IUnknown *); typedef HDC (WINAPI *GDIGetDC_Type)(HWND); typedef int (WINAPI *GDIReleaseDC_Type)(HWND, HDC); diff --git a/dll/kernel32.cpp b/dll/kernel32.cpp index 940f747..ab89169 100644 --- a/dll/kernel32.cpp +++ b/dll/kernel32.cpp @@ -12,10 +12,14 @@ #define LOCKINJECTIONTHREADS BOOL WINAPI extCheckRemoteDebuggerPresent(HANDLE, PBOOL); +LPVOID WINAPI extVirtualAlloc(LPVOID, SIZE_T, DWORD, DWORD); +typedef LPVOID (WINAPI *VirtualAlloc_Type)(LPVOID, SIZE_T, DWORD, DWORD); typedef BOOL (WINAPI *CreateProcessA_Type)(LPCTSTR, LPTSTR, LPSECURITY_ATTRIBUTES, LPSECURITY_ATTRIBUTES, BOOL, DWORD, LPVOID, LPCTSTR, LPSTARTUPINFO, LPPROCESS_INFORMATION); + CreateProcessA_Type pCreateProcessA = NULL; +VirtualAlloc_Type pVirtualAlloc = NULL; #ifdef NOFREELIBRARY typedef BOOL (WINAPI *FreeLibrary_Type)(HMODULE); @@ -49,6 +53,11 @@ static HookEntry_Type Hooks[]={ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator }; +static HookEntry_Type FixAllocHooks[]={ + {HOOK_IAT_CANDIDATE, "VirtualAlloc", (FARPROC)VirtualAlloc, (FARPROC *)&pVirtualAlloc, (FARPROC)extVirtualAlloc}, + {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator +}; + static HookEntry_Type FixIOHooks[]={ {HOOK_IAT_CANDIDATE, "ReadFile", (FARPROC)NULL, (FARPROC *)&pReadFile, (FARPROC)extReadFile}, {HOOK_IAT_CANDIDATE, "CreateFileA", (FARPROC)NULL, (FARPROC *)&pCreateFile, (FARPROC)extCreateFile}, @@ -91,14 +100,17 @@ void HookKernel32(HMODULE module) if(dxw.dwFlags2 & LIMITRESOURCES) HookLibrary(module, LimitHooks, libname); if(dxw.dwFlags2 & TIMESTRETCH) HookLibrary(module, TimeHooks, libname); if(dxw.dwFlags2 & FAKEVERSION) HookLibrary(module, VersionHooks, libname); + if(dxw.dwFlags6 & LEGACYALLOC) HookLibrary(module, FixAllocHooks, libname); } void HookKernel32Init() { HookLibInit(Hooks); + HookLibInit(FixIOHooks); HookLibInit(LimitHooks); HookLibInit(TimeHooks); HookLibInit(VersionHooks); + HookLibInit(FixAllocHooks); } FARPROC Remap_kernel32_ProcAddress(LPCSTR proc, HMODULE hModule) @@ -127,6 +139,8 @@ FARPROC Remap_kernel32_ProcAddress(LPCSTR proc, HMODULE hModule) if(dxw.dwFlags2 & FAKEVERSION) if (addr=RemapLibrary(proc, hModule, VersionHooks)) return addr; + if(dxw.dwFlags6 & LEGACYALLOC) + if (addr=RemapLibrary(proc, hModule, FixAllocHooks)) return addr; return NULL; } @@ -254,17 +268,25 @@ For Windows NT and Win32s, the remaining bits in the high order word specify the For Windows 95 and Windows 98, the remaining bits of the high order word are reserved. */ -static struct {char bMajor; char bMinor; char *sName;} WinVersions[9]= +// v2.03.20: "Talonsoft's Operational Art of War II" checks the dwPlatformId field +// v2.03.20: list revised according to Microsoft compatibility settings + +static struct {DWORD bMajor; DWORD bMinor; DWORD dwPlatformId; DWORD build; char *sName;} WinVersions[9]= { - {4, 0, "Windows 95"}, - {4,10, "Windows 98/SE"}, - {4,90, "Windows ME"}, - {5, 0, "Windows 2000"}, - {5, 1, "Windows XP"}, - {5, 2, "Windows Server 2003"}, - {6, 0, "Windows Vista"}, - {6, 1, "Windows 7"}, - {6, 2, "Windows 8"} + {4, 0, VER_PLATFORM_WIN32_WINDOWS, 950, "Windows 95"}, + {4,10, VER_PLATFORM_WIN32_WINDOWS, 67766446, "Windows 98/SE"}, + {4,90, VER_PLATFORM_WIN32_WINDOWS, 0, "Windows ME"}, +// {4, 0, VER_PLATFORM_WIN32_NT, 1381, "Windows NT4.0(sp5)"}, + {5, 0, VER_PLATFORM_WIN32_NT, 2195, "Windows 2000"}, +// {5, 1, VER_PLATFORM_WIN32_NT, 2600, "Windows XP(sp2)"}, + {5, 1, VER_PLATFORM_WIN32_NT, 2600, "Windows XP(sp3)"}, + {5, 2, VER_PLATFORM_WIN32_NT, 3790, "Windows Server 2003(sp1)"}, +// {6, 0, VER_PLATFORM_WIN32_NT, 6001, "Windows Server 2008(sp1)"}, +// {6, 0, VER_PLATFORM_WIN32_NT, 6000, "Windows Vista"}, +// {6, 0, VER_PLATFORM_WIN32_NT, 6001, "Windows Vista(sp1)"}, + {6, 0, VER_PLATFORM_WIN32_NT, 6002, "Windows Vista(sp2)"}, + {6, 1, VER_PLATFORM_WIN32_NT, 7600, "Windows 7"}, + {6, 2, VER_PLATFORM_WIN32_NT, 0, "Windows 8"} }; BOOL WINAPI extGetVersionExA(LPOSVERSIONINFOA lpVersionInfo) @@ -277,16 +299,17 @@ BOOL WINAPI extGetVersionExA(LPOSVERSIONINFOA lpVersionInfo) return ret; } - OutTraceDW("GetVersionExA: version=%d.%d build=(%d)\n", - lpVersionInfo->dwMajorVersion, lpVersionInfo->dwMinorVersion, lpVersionInfo->dwBuildNumber); + OutTraceDW("GetVersionExA: version=%d.%d platform=%x build=(%d)\n", + lpVersionInfo->dwMajorVersion, lpVersionInfo->dwMinorVersion, lpVersionInfo->dwPlatformId, lpVersionInfo->dwBuildNumber); if(dxw.dwFlags2 & FAKEVERSION) { // fake Win XP build 0 lpVersionInfo->dwMajorVersion = WinVersions[dxw.FakeVersionId].bMajor; lpVersionInfo->dwMinorVersion = WinVersions[dxw.FakeVersionId].bMinor; + lpVersionInfo->dwPlatformId = WinVersions[dxw.FakeVersionId].dwPlatformId; lpVersionInfo->dwBuildNumber = 0; - OutTraceDW("GetVersionExA: FIXED version=%d.%d build=(%d) os=\"%s\"\n", - lpVersionInfo->dwMajorVersion, lpVersionInfo->dwMinorVersion, lpVersionInfo->dwBuildNumber, + OutTraceDW("GetVersionExA: FIXED version=%d.%d platform=%x build=(%d) os=\"%s\"\n", + lpVersionInfo->dwMajorVersion, lpVersionInfo->dwMinorVersion, lpVersionInfo->dwPlatformId, lpVersionInfo->dwBuildNumber, WinVersions[dxw.FakeVersionId].sName); } return TRUE; @@ -302,16 +325,17 @@ BOOL WINAPI extGetVersionExW(LPOSVERSIONINFOW lpVersionInfo) return ret; } - OutTraceDW("GetVersionExW: version=%d.%d build=(%d)\n", - lpVersionInfo->dwMajorVersion, lpVersionInfo->dwMinorVersion, lpVersionInfo->dwBuildNumber); + OutTraceDW("GetVersionExW: version=%d.%d platform=%x build=(%d)\n", + lpVersionInfo->dwMajorVersion, lpVersionInfo->dwMinorVersion, lpVersionInfo->dwPlatformId, lpVersionInfo->dwBuildNumber); if(dxw.dwFlags2 & FAKEVERSION) { // fake Win XP build 0 lpVersionInfo->dwMajorVersion = WinVersions[dxw.FakeVersionId].bMajor; lpVersionInfo->dwMinorVersion = WinVersions[dxw.FakeVersionId].bMinor; + lpVersionInfo->dwPlatformId = WinVersions[dxw.FakeVersionId].dwPlatformId; lpVersionInfo->dwBuildNumber = 0; - OutTraceDW("GetVersionExW: FIXED version=%d.%d build=(%d) os=\"%ls\"\n", - lpVersionInfo->dwMajorVersion, lpVersionInfo->dwMinorVersion, lpVersionInfo->dwBuildNumber, + OutTraceDW("GetVersionExW: FIXED version=%d.%d platform=%x build=(%d) os=\"%s\"\n", + lpVersionInfo->dwMajorVersion, lpVersionInfo->dwMinorVersion, lpVersionInfo->dwPlatformId, lpVersionInfo->dwBuildNumber, WinVersions[dxw.FakeVersionId].sName); } return TRUE; @@ -1027,3 +1051,33 @@ UINT WINAPI extGetTempFileName(LPCTSTR lpPathName, LPCTSTR lpPrefixString, UINT } return ret; } + +LPVOID WINAPI extVirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect) +{ + // v2.03.20: handling of legacy memory segments. + // Some games (Crusaders of Might and Magic, the demo and the GOG release) rely on the fact that the + // program can VirtualAlloc-ate memory on certain tipically free segments (0x4000000, 0x5000000, + // 0x6000000, 0x7000000 and 0x8000000) but when the program is hooked by DxWnd these segments could + // be allocated to extra dlls or allocated memory. + // The trick is ti pre-allocate this memory and free it upon error to make it certainly available to + // the calling program. + + LPVOID ret; + OutTraceB("VirtualAlloc: lpAddress=%x size=%x flag=%x protect=%x\n", lpAddress, dwSize, flAllocationType, flProtect); + ret = (*pVirtualAlloc)(lpAddress, dwSize, flAllocationType, flProtect); + if((ret == NULL) && lpAddress){ + OutTraceE("VirtualAlloc: RECOVERY lpAddress=%x size=%x flag=%x protect=%x\n", + lpAddress, dwSize, flAllocationType, flProtect); + if (((DWORD)lpAddress & 0xF0FFFFFF) == 0){ + BOOL bret; + bret = VirtualFree(lpAddress, 0x00000000, MEM_RELEASE); + if(!bret) OutTraceE("VirtualFree: MEM_RELEASE err=%d\n", GetLastError()); + ret = (*pVirtualAlloc)(lpAddress, dwSize, flAllocationType, flProtect); + if (ret == NULL) OutTraceE("VirtualAlloc: addr=%x err=%d\n", lpAddress, GetLastError()); + } + if (!ret) ret = (*pVirtualAlloc)((LPVOID)0x00000000, dwSize, flAllocationType, flProtect); + if(ret == NULL) OutTraceE("VirtualAlloc: addr=NULL err=%d\n", GetLastError()); + } + OutTrace("VirtualAlloc: ret=%x\n", ret); + return ret; +} \ No newline at end of file diff --git a/dll/user32.cpp b/dll/user32.cpp index e9c5e42..7e1262c 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -137,18 +137,6 @@ static HookEntry_Type EmulateHooks[]={ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator }; -static HookEntry_Type DDHooks[]={ - {HOOK_IAT_CANDIDATE, "BeginPaint", (FARPROC)BeginPaint, (FARPROC *)&pBeginPaint, (FARPROC)extDDBeginPaint}, - //{HOOK_IAT_CANDIDATE, "BeginPaint", (FARPROC)BeginPaint, (FARPROC *)&pBeginPaint, (FARPROC)extBeginPaint}, - {HOOK_IAT_CANDIDATE, "EndPaint", (FARPROC)EndPaint, (FARPROC *)&pEndPaint, (FARPROC)extDDEndPaint}, - {HOOK_IAT_CANDIDATE, "GetDC", (FARPROC)GetDC, (FARPROC *)&pGDIGetDC, (FARPROC)extDDGetDC}, - {HOOK_IAT_CANDIDATE, "GetDCEx", (FARPROC)GetDCEx, (FARPROC *)&pGDIGetDCEx, (FARPROC)extDDGetDCEx}, - {HOOK_IAT_CANDIDATE, "GetWindowDC", (FARPROC)GetWindowDC, (FARPROC *)&pGDIGetWindowDC, (FARPROC)extDDGetDC}, - {HOOK_IAT_CANDIDATE, "ReleaseDC", (FARPROC)ReleaseDC, (FARPROC *)&pGDIReleaseDC, (FARPROC)extDDReleaseDC}, - {HOOK_IAT_CANDIDATE, "InvalidateRect", (FARPROC)InvalidateRect, (FARPROC *)&pInvalidateRect, (FARPROC)extInvalidateRect}, - {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator -}; - static HookEntry_Type ScaledHooks[]={ {HOOK_IAT_CANDIDATE, "FrameRect", (FARPROC)NULL, (FARPROC *)&pFrameRect, (FARPROC)extFrameRect}, {HOOK_IAT_CANDIDATE, "TabbedTextOutA", (FARPROC)TabbedTextOutA, (FARPROC *)&pTabbedTextOutA, (FARPROC)extTabbedTextOutA}, @@ -166,6 +154,18 @@ static HookEntry_Type ScaledHooks[]={ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator }; +static HookEntry_Type DDHooks[]={ + {HOOK_IAT_CANDIDATE, "BeginPaint", (FARPROC)BeginPaint, (FARPROC *)&pBeginPaint, (FARPROC)extDDBeginPaint}, + //{HOOK_IAT_CANDIDATE, "BeginPaint", (FARPROC)BeginPaint, (FARPROC *)&pBeginPaint, (FARPROC)extBeginPaint}, + {HOOK_IAT_CANDIDATE, "EndPaint", (FARPROC)EndPaint, (FARPROC *)&pEndPaint, (FARPROC)extDDEndPaint}, + {HOOK_IAT_CANDIDATE, "GetDC", (FARPROC)GetDC, (FARPROC *)&pGDIGetDC, (FARPROC)extDDGetDC}, + {HOOK_IAT_CANDIDATE, "GetDCEx", (FARPROC)GetDCEx, (FARPROC *)&pGDIGetDCEx, (FARPROC)extDDGetDCEx}, + {HOOK_IAT_CANDIDATE, "GetWindowDC", (FARPROC)GetWindowDC, (FARPROC *)&pGDIGetWindowDC, (FARPROC)extDDGetDC}, + {HOOK_IAT_CANDIDATE, "ReleaseDC", (FARPROC)ReleaseDC, (FARPROC *)&pGDIReleaseDC, (FARPROC)extDDReleaseDC}, + {HOOK_IAT_CANDIDATE, "InvalidateRect", (FARPROC)InvalidateRect, (FARPROC *)&pInvalidateRect, (FARPROC)extInvalidateRect}, + {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator +}; + static HookEntry_Type RemapHooks[]={ {HOOK_IAT_CANDIDATE, "ScreenToClient", (FARPROC)ScreenToClient, (FARPROC *)&pScreenToClient, (FARPROC)extScreenToClient}, {HOOK_IAT_CANDIDATE, "ClientToScreen", (FARPROC)ClientToScreen, (FARPROC *)&pClientToScreen, (FARPROC)extClientToScreen}, @@ -1877,16 +1877,20 @@ static HDC WINAPI sGetDC(HWND hwnd, char *ApiName) #ifdef HANDLEFLIPTOGDI extern BOOL bFlippedDC; - //if(bFlippedDC && (OBJ_DC == GetObjectType(ret))) { if(bFlippedDC) { extern HDC hFlippedDC; LPDIRECTDRAWSURFACE lpDDSPrim; - //extern Unlock4_Type pUnlockMethod(LPDIRECTDRAWSURFACE); lpDDSPrim = dxw.GetPrimarySurface(); - //(*pUnlockMethod(lpDDSPrim))(lpDDSPrim, NULL); - (*pGetDC)(lpDDSPrim, &hFlippedDC); +#if 0 + // v2.03.20: beware, from this release the output from dxw.GetPrimarySurface() could be a + // zero reference counter released surface that could be used to feed a QueryInterface method, + // but would crash if used otherwise. + __try {(*pGetDC)(lpDDSPrim, &hFlippedDC);} __except(EXCEPTION_EXECUTE_HANDLER){hFlippedDC=NULL;}; +#else + if (lpDDSPrim) (*pGetDC)(lpDDSPrim, &hFlippedDC); +#endif OutTraceDW("%s: remapping flipped GDI hdc=%x\n", ApiName, hFlippedDC); - return hFlippedDC; + if(hFlippedDC) return hFlippedDC; } #endif @@ -1964,7 +1968,7 @@ int WINAPI extGDIReleaseDC(HWND hwnd, HDC hDC) OutTraceDW("GDI.ReleaseDC: releasing flipped GDI hdc=%x\n", hDC); ret=(*pReleaseDC)(dxw.GetPrimarySurface(), hDC); if (ret) OutTraceE("GDI.ReleaseDC ERROR: err=%x(%s) at %d\n", ret, ExplainDDError(ret), __LINE__); - dxw.ScreenRefresh(); + else dxw.ScreenRefresh(); return (ret == DD_OK); } #endif @@ -2332,10 +2336,15 @@ LONG WINAPI extTabbedTextOutA(HDC hdc, int X, int Y, LPCTSTR lpString, int nCoun BOOL WINAPI extDestroyWindow(HWND hWnd) { - // v2.02.43: Empire Earth builds test surfaces that must be destroyed! + // v2.02.43: "Empire Earth" builds test surfaces that must be destroyed! + // v2.03.20: "Prince of Persia 3D" destroys the main window that must be preserved! BOOL res; OutTraceB("DestroyWindow: hwnd=%x\n", hWnd); if (hWnd == dxw.GethWnd()) { + if(dxw.dwFlags6 & NODESTROYWINDOW) { + OutTraceDW("DestroyWindow: do NOT destroy main hwnd=%x\n", hWnd); + return TRUE; + } OutTraceDW("DestroyWindow: destroy main hwnd=%x\n", hWnd); dxw.SethWnd(NULL); } diff --git a/host/TabCompat.cpp b/host/TabCompat.cpp index ce3d98c..abce254 100644 --- a/host/TabCompat.cpp +++ b/host/TabCompat.cpp @@ -40,6 +40,7 @@ void CTabCompat::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_HIDECDROMEMPTY, cTarget->m_HideCDROMEmpty); DDX_Check(pDX, IDC_DIABLOTWEAK, cTarget->m_DiabloTweak); DDX_Check(pDX, IDC_EASPORTSHACK, cTarget->m_EASportsHack); + DDX_Check(pDX, IDC_LEGACYALLOC, cTarget->m_LegacyAlloc); DDX_Check(pDX, IDC_NOIMAGEHLP, cTarget->m_NoImagehlp); DDX_Check(pDX, IDC_REPLACEPRIVOPS, cTarget->m_ReplacePrivOps); diff --git a/host/TabWindow.cpp b/host/TabWindow.cpp index bf552f4..233f0ea 100644 --- a/host/TabWindow.cpp +++ b/host/TabWindow.cpp @@ -43,9 +43,9 @@ void CTabWindow::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_REFRESHONRESIZE, cTarget->m_RefreshOnResize); DDX_Check(pDX, IDC_FIXD3DFRAME, cTarget->m_FixD3DFrame); DDX_Check(pDX, IDC_NOWINDOWMOVE, cTarget->m_NoWindowMove); - //DDX_Check(pDX, IDC_SUPPRESSCHILD, cTarget->m_SuppressChild); DDX_Check(pDX, IDC_HIDEDESKTOP, cTarget->m_HideDesktop); DDX_Check(pDX, IDC_UNLOCKZORDER, cTarget->m_UnlockZOrder); + DDX_Check(pDX, IDC_NODESTROYWINDOW, cTarget->m_NoDestroyWindow); // color management DDX_Check(pDX, IDC_INIT8BPP, cTarget->m_Init8BPP); diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index c136853..0ddd676 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -46,6 +46,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_AEROBoost = TRUE; // default true !! m_DiabloTweak = FALSE; m_EASportsHack = FALSE; + m_LegacyAlloc = FALSE; m_NoImagehlp = FALSE; m_ReplacePrivOps = FALSE; m_ForcesHEL = FALSE; @@ -56,9 +57,9 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_FixRefCounter = TRUE; // default true !! m_ReturnNullRef = FALSE; m_NoD3DReset = FALSE; - //m_SuppressChild = FALSE; m_HideDesktop = FALSE; m_UnlockZOrder = FALSE; + m_NoDestroyWindow = FALSE; m_LockSysColors = FALSE; m_LockReservedPalette = FALSE; m_ForceYUVtoRGB = FALSE; diff --git a/host/TargetDlg.h b/host/TargetDlg.h index 6b17882..9611b4c 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -168,6 +168,7 @@ public: BOOL m_AEROBoost; BOOL m_DiabloTweak; BOOL m_EASportsHack; + BOOL m_LegacyAlloc; BOOL m_NoImagehlp; BOOL m_ForcesHEL; BOOL m_ForcesSwapEffect; @@ -177,9 +178,9 @@ public: BOOL m_FixRefCounter; BOOL m_ReturnNullRef; BOOL m_NoD3DReset; - //BOOL m_SuppressChild; BOOL m_HideDesktop; BOOL m_UnlockZOrder; + BOOL m_NoDestroyWindow; BOOL m_LockSysColors; BOOL m_LockReservedPalette; BOOL m_SingleProcAffinity; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index 34f53bace9046dbd10533ec732e3c33cfcba1b5d..c6fff39b5c7d2db9888cc1d3423fb787c57cf89a 100644 GIT binary patch delta 21142 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 bcBh?KGx>+w_z`BK9Pn>!?(ZOEDGd2QmI6Zx zLn=ctLkU9>Ln%Y@WWi9;>3qD5Y~rpA!3-e`K@9#3kqqGso(z5rE~7Rv)Vp_oAlXr?F7CTE6t1|J4j26qNWAUhIB`T(IngY)Ez-l4ok a3uh63FeG^nI5gp!E?D6}U(e1Z`0< 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 delta 5549 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 diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index a02dd19..a4a7c9c 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -273,6 +273,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_AEROBoost) t->flags5 |= AEROBOOST; if(dlg->m_DiabloTweak) t->flags5 |= DIABLOTWEAK; if(dlg->m_EASportsHack) t->flags5 |= EASPORTSHACK; + if(dlg->m_LegacyAlloc) t->flags6 |= LEGACYALLOC; if(dlg->m_NoImagehlp) t->flags5 |= NOIMAGEHLP; if(dlg->m_ForcesHEL) t->flags3 |= FORCESHEL; if(dlg->m_ForcesSwapEffect) t->flags6 |= FORCESWAPEFFECT; @@ -282,9 +283,9 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_FixRefCounter) t->flags4 |= FIXREFCOUNTER; if(dlg->m_ReturnNullRef) t->flags4 |= RETURNNULLREF; if(dlg->m_NoD3DReset) t->flags4 |= NOD3DRESET; - //if(dlg->m_SuppressChild) t->flags4 |= SUPPRESSCHILD; if(dlg->m_HideDesktop) t->flags4 |= HIDEDESKTOP; if(dlg->m_UnlockZOrder) t->flags5 |= UNLOCKZORDER; + if(dlg->m_NoDestroyWindow) t->flags6 |= NODESTROYWINDOW; if(dlg->m_LockSysColors) t->flags3 |= LOCKSYSCOLORS; if(dlg->m_LockReservedPalette) t->flags5 |= LOCKRESERVEDPALETTE; if(dlg->m_ForceYUVtoRGB) t->flags3 |= YUV2RGB; @@ -474,6 +475,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_AEROBoost = t->flags5 & AEROBOOST ? 1 : 0; dlg->m_DiabloTweak = t->flags5 & DIABLOTWEAK ? 1 : 0; dlg->m_EASportsHack = t->flags5 & EASPORTSHACK ? 1 : 0; + dlg->m_LegacyAlloc = t->flags6 & LEGACYALLOC ? 1 : 0; dlg->m_NoImagehlp = t->flags5 & NOIMAGEHLP ? 1 : 0; dlg->m_ForcesHEL = t->flags3 & FORCESHEL ? 1 : 0; dlg->m_ForcesSwapEffect = t->flags6 & FORCESWAPEFFECT ? 1 : 0; @@ -483,9 +485,9 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_FixRefCounter = t->flags4 & FIXREFCOUNTER ? 1 : 0; dlg->m_ReturnNullRef = t->flags4 & RETURNNULLREF ? 1 : 0; dlg->m_NoD3DReset = t->flags4 & NOD3DRESET ? 1 : 0; - //dlg->m_SuppressChild = t->flags4 & SUPPRESSCHILD ? 1 : 0; dlg->m_HideDesktop = t->flags4 & HIDEDESKTOP ? 1 : 0; dlg->m_UnlockZOrder = t->flags5 & UNLOCKZORDER ? 1 : 0; + dlg->m_NoDestroyWindow = t->flags6 & NODESTROYWINDOW ? 1 : 0; dlg->m_LockSysColors = t->flags3 & LOCKSYSCOLORS ? 1 : 0; dlg->m_LockReservedPalette = t->flags5 & LOCKRESERVEDPALETTE ? 1 : 0; dlg->m_ForceRGBtoYUV = t->flags3 & RGB2YUV ? 1 : 0; diff --git a/host/resource b/host/resource index 80e061a179c1c4f6cff35135338ede8a25b85e51..81ac5e80c0946cc08ada8a40563baecbbc778544 100644 GIT binary patch delta 94 zcmX@m%QUBtX~Q(f$#v3fn}0ZdlArv6k44yr!Ii|bW(Z*j0|20BtcGB>(^b delta 45 zcmV+|0Mh@Qjsn1q0