From 9385cb7fe1d9c51f0cce7d6595e665e66839cc7a Mon Sep 17 00:00:00 2001 From: gho tik Date: Fri, 1 Apr 2016 12:42:40 -0400 Subject: [PATCH] v2_03_50_src Former-commit-id: f4660317a5ae4ef5de3fe2d7cb1f2d3a3253c477 --- Include/dinput.h | 2 +- build/dxwnd.dll | 4 +- build/dxwnd.exe | 2 +- build/dxwnd.ini | 908 ++++++++++++++++++++++++++ build/exports/Geneforge (Steam).dxw | 32 + build/exports/Geneforge 2 (Steam).dxw | 32 + build/exports/Geneforge 3 (Steam).dxw | 32 + build/exports/Geneforge 4 (Steam).dxw | 32 + build/exports/LEGO Pirates.dxw | 32 + build/exports/Road Rash.dxw | 1 + build/exports/Swat 3 (GOG).dxw | 32 + build/exports/Swat 3.dxw | 32 + build/readme-relnotes.txt | 11 +- dll/ddproxy.cpp | 124 +++- dll/ddproxy.h | 5 +- dll/ddraw.cpp | 255 ++++++-- dll/dinput.cpp | 61 +- dll/dxhook.cpp | 6 + dll/dxwcore.cpp | 22 +- dll/dxwcore.hpp | 1 + dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 233472 -> 259584 bytes dll/dxwnd.vs2008.vcproj | 4 + dll/glhook.h | 3 + dll/hddraw.h | 1 + dll/opengl.cpp | 12 +- dll/user32.cpp | 22 +- host/dxwndhost.aps | Bin 134268 -> 162300 bytes host/dxwndhost.vs2008.suo | Bin 50176 -> 48640 bytes 29 files changed, 1542 insertions(+), 128 deletions(-) create mode 100644 build/dxwnd.ini create mode 100644 build/exports/Geneforge (Steam).dxw create mode 100644 build/exports/Geneforge 2 (Steam).dxw create mode 100644 build/exports/Geneforge 3 (Steam).dxw create mode 100644 build/exports/Geneforge 4 (Steam).dxw create mode 100644 build/exports/LEGO Pirates.dxw create mode 100644 build/exports/Swat 3 (GOG).dxw create mode 100644 build/exports/Swat 3.dxw diff --git a/Include/dinput.h b/Include/dinput.h index 5aac256..64bffb0 100644 --- a/Include/dinput.h +++ b/Include/dinput.h @@ -822,7 +822,7 @@ typedef LPDICONFIGUREDEVICESPARAMSA LPDICONFIGUREDEVICESPARAMS; typedef const DICONFIGUREDEVICESPARAMSA *LPCDICONFIGUREDEVICESPARAMSA; typedef const DICONFIGUREDEVICESPARAMSW *LPCDICONFIGUREDEVICESPARAMSW; #ifdef UNICODE -typedef DICONFIGUREDEVICESPARAMSW DICONFIGUREDEVICESPARAMS; +typedef DCIONFIGUREDEVICESPARAMSW DICONFIGUREDEVICESPARAMS; typedef LPCDICONFIGUREDEVICESPARAMSW LPCDICONFIGUREDEVICESPARAMS; #else typedef DICONFIGUREDEVICESPARAMSA DICONFIGUREDEVICESPARAMS; diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 5559888..4f92797 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:60fd77705e2eacd38c4bc60177d1f90e73b8a19e6bcd615465449f5b59eec3e5 -size 622592 +oid sha256:58984ac106a91ee758fe27b885e80e4c0c07d1d5de6105c9a397032410db5b4c +size 626176 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index a30e56e..a3b7d5e 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:49ce540832a013e5fe01bbacfdbbeb19232c1205a8ac94ba391ba85cfb2b6b13 +oid sha256:7e22776dc66acf9e798458cd8bf1e95195ee0577c99153c150b1a8e69e704b8f size 546816 diff --git a/build/dxwnd.ini b/build/dxwnd.ini new file mode 100644 index 0000000..b8fb4a7 --- /dev/null +++ b/build/dxwnd.ini @@ -0,0 +1,908 @@ +[window] +exportpath=D:\DxWnd\v2_03_50_src\build\exports\ +posx=1045 +posy=439 +sizx=492 +sizy=367 +exepath=D:\Games\SWAT 3 (GOG)\game\ +debug=1 +[target] +title0=Command & Conquer - Red Alert The Aftermath +path0=D:\Games\C&C - Red Alert The Aftermath\RA95.EXE +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=136368226 +flagg0=1224740864 +flagh0=532 +flagi0=138412036 +flagj0=4224 +flagk0=262144 +tflag0=-1476388605 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=4 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +title1=hlp.exe +path1=D:\Games\DylanDog\hlp.exe +launchpath1= +module1= +opengllib1= +notes1= +registry1= +ver1=0 +coord1=0 +flag1=2097184 +flagg1=1207959552 +flagh1=1048596 +flagi1=138412038 +flagj1=4224 +flagk1=2 +tflag1=-2147477245 +initx1=0 +inity1=0 +minx1=0 +miny1=0 +maxx1=0 +maxy1=0 +posx1=50 +posy1=50 +sizx1=800 +sizy1=600 +maxfps1=0 +initts1=0 +winver1=0 +maxres1=-1 +swapeffect1=0 +title2=Riven DVD +path2=D:\Games\Riven\Riven.patched.exe +launchpath2= +module2= +opengllib2= +notes2= +registry2= +ver2=0 +coord2=0 +flag2=673185824 +flagg2=1207959552 +flagh2=20 +flagi2=138412036 +flagj2=67108992 +flagk2=33554432 +tflag2=-2147477245 +initx2=0 +inity2=0 +minx2=0 +miny2=0 +maxx2=0 +maxy2=0 +posx2=50 +posy2=50 +sizx2=800 +sizy2=600 +maxfps2=0 +initts2=0 +winver2=0 +maxres2=-1 +swapeffect2=0 +title3=Rogue Squadron.EXE +path3=D:\Games\Rogue Squadron 3D\Rogue Squadron.EXE +launchpath3= +module3= +opengllib3= +notes3= +registry3= +ver3=0 +coord3=0 +flag3=136314914 +flagg3=1207959552 +flagh3=20 +flagi3=138412036 +flagj3=4224 +flagk3=65536 +tflag3=0 +initx3=0 +inity3=0 +minx3=0 +miny3=0 +maxx3=0 +maxy3=0 +posx3=50 +posy3=50 +sizx3=800 +sizy3=600 +maxfps3=0 +initts3=0 +winver3=0 +maxres3=-1 +swapeffect3=0 +title4=Geneforge +path4=d:\games\Geneforge\Geneforge.exe +launchpath4= +module4= +opengllib4= +notes4= +registry4= +ver4=0 +coord4=0 +flag4=134234628 +flagg4=1207959808 +flagh4=65620 +flagi4=4194308 +flagj4=0 +flagk4=0 +tflag4=64 +initx4=0 +inity4=0 +minx4=0 +miny4=0 +maxx4=0 +maxy4=0 +posx4=50 +posy4=50 +sizx4=1200 +sizy4=900 +maxfps4=0 +initts4=0 +winver4=0 +maxres4=4 +swapeffect4=0 +title5=One Must Fall - Battlegrounds - Demo +path5=D:\Games\One Must Fall - Battlegrounds - Demo\Engine\OMFBG.exe +launchpath5= +module5= +opengllib5= +notes5= +registry5= +ver5=0 +coord5=0 +flag5=136314914 +flagg5=1207959552 +flagh5=20 +flagi5=138412036 +flagj5=4224 +flagk5=65536 +tflag5=0 +initx5=0 +inity5=0 +minx5=0 +miny5=0 +maxx5=0 +maxy5=0 +posx5=50 +posy5=50 +sizx5=800 +sizy5=600 +maxfps5=0 +initts5=0 +winver5=0 +maxres5=-1 +swapeffect5=0 +title6=One Must Fall - Battlegrounds +path6=D:\Games\One Must Fall - Battlegrounds\Engine\OMFBG.exe +launchpath6= +module6=core_module.dll +opengllib6= +notes6= +registry6= +ver6=0 +coord6=0 +flag6=136314915 +flagg6=1275068416 +flagh6=33554460 +flagi6=675283252 +flagj6=21120 +flagk6=458752 +tflag6=-2147477245 +initx6=0 +inity6=0 +minx6=0 +miny6=0 +maxx6=0 +maxy6=0 +posx6=50 +posy6=50 +sizx6=800 +sizy6=600 +maxfps6=0 +initts6=0 +winver6=0 +maxres6=-1 +swapeffect6=0 +title7=Geneforge 1 GOG +path7=D:\Games\Geneforge GOG\Geneforge\Geneforge.exe +launchpath7= +module7= +opengllib7= +notes7= +registry7= +ver7=0 +coord7=0 +flag7=-2011160538 +flagg7=1241513984 +flagh7=20 +flagi7=138412036 +flagj7=4224 +flagk7=268500992 +tflag7=-2147477241 +initx7=0 +inity7=0 +minx7=0 +miny7=0 +maxx7=800 +maxy7=600 +posx7=50 +posy7=50 +sizx7=800 +sizy7=600 +maxfps7=0 +initts7=0 +winver7=0 +maxres7=-1 +swapeffect7=0 +title8=Geneforge 2 GOG +path8=D:\Games\Geneforge GOG\Geneforge 2\Geneforge 2.exe +launchpath8= +module8= +opengllib8= +notes8= +registry8= +ver8=0 +coord8=0 +flag8=136315446 +flagg8=1207959552 +flagh8=20 +flagi8=138412036 +flagj8=4224 +flagk8=65536 +tflag8=-2147477245 +initx8=0 +inity8=0 +minx8=0 +miny8=0 +maxx8=800 +maxy8=600 +posx8=50 +posy8=50 +sizx8=800 +sizy8=600 +maxfps8=0 +initts8=0 +winver8=0 +maxres8=-1 +swapeffect8=0 +title9=Geneforge 3 GOG +path9=D:\Games\Geneforge GOG\Geneforge 3\Geneforge 3.exe +launchpath9= +module9= +opengllib9= +notes9= +registry9= +ver9=0 +coord9=0 +flag9=136314886 +flagg9=1207959808 +flagh9=20 +flagi9=138412036 +flagj9=67113088 +flagk9=65536 +tflag9=0 +initx9=0 +inity9=0 +minx9=0 +miny9=0 +maxx9=0 +maxy9=0 +posx9=50 +posy9=50 +sizx9=800 +sizy9=600 +maxfps9=0 +initts9=0 +winver9=0 +maxres9=-1 +swapeffect9=0 +title10=Wizardry 8 (3DfX) +path10=D:\Games\Wizardry 8\Wiz8.exe +launchpath10= +module10= +opengllib10= +notes10= +registry10= +ver10=9 +coord10=0 +flag10=134225922 +flagg10=1207959552 +flagh10=20 +flagi10=205520900 +flagj10=4224 +flagk10=0 +tflag10=0 +initx10=0 +inity10=0 +minx10=0 +miny10=0 +maxx10=0 +maxy10=0 +posx10=50 +posy10=50 +sizx10=800 +sizy10=600 +maxfps10=0 +initts10=0 +winver10=0 +maxres10=-1 +swapeffect10=0 +title11=Warcraft 2 Battlenet Ed +path11=D:\Games\Warcraft 2 Battlenet Ed\Warcraft II BNE.exe +launchpath11= +module11= +opengllib11= +notes11= +registry11= +ver11=0 +coord11=0 +flag11=134221986 +flagg11=1207959552 +flagh11=20 +flagi11=138412036 +flagj11=128 +flagk11=0 +tflag11=0 +initx11=0 +inity11=0 +minx11=0 +miny11=0 +maxx11=0 +maxy11=0 +posx11=50 +posy11=50 +sizx11=800 +sizy11=600 +maxfps11=0 +initts11=0 +winver11=0 +maxres11=0 +swapeffect11=0 +title12=Star Wars Rogue Squadron 3D +path12=D:\Games\rogue\Rogue Squadron.EXE +launchpath12= +module12= +opengllib12= +notes12= +registry12= +ver12=0 +coord12=0 +flag12=136314934 +flagg12=1207959552 +flagh12=20 +flagi12=138412038 +flagj12=4224 +flagk12=402718720 +tflag12=0 +initx12=0 +inity12=0 +minx12=0 +miny12=0 +maxx12=0 +maxy12=0 +posx12=50 +posy12=50 +sizx12=800 +sizy12=600 +maxfps12=0 +initts12=0 +winver12=0 +maxres12=-1 +swapeffect12=0 +title13=Dark Colony +path13=D:\Games\DarkColony\DCOLONY\DC.EXE +launchpath13= +module13= +opengllib13= +notes13= +registry13= +ver13=0 +coord13=0 +flag13=134255138 +flagg13=1207963648 +flagh13=20 +flagi13=4194308 +flagj13=67108992 +flagk13=0 +tflag13=0 +initx13=0 +inity13=0 +minx13=0 +miny13=0 +maxx13=0 +maxy13=0 +posx13=50 +posy13=50 +sizx13=800 +sizy13=600 +maxfps13=20 +initts13=0 +winver13=0 +maxres13=-1 +swapeffect13=0 +title14=Empire of the Ants +path14=D:\Games\Empire of the Ants\Game.exe +launchpath14= +module14= +opengllib14= +notes14= +registry14= +ver14=0 +coord14=0 +flag14=402669606 +flagg14=1207959552 +flagh14=20 +flagi14=4194308 +flagj14=128 +flagk14=65536 +tflag14=0 +initx14=0 +inity14=0 +minx14=0 +miny14=0 +maxx14=0 +maxy14=0 +posx14=50 +posy14=50 +sizx14=800 +sizy14=600 +maxfps14=0 +initts14=0 +winver14=0 +maxres14=-1 +swapeffect14=0 +title15=Paladin 3 RIP +path15=D:\Games\QGPAL3\rungame.exe +launchpath15= +module15= +opengllib15= +notes15= +registry15= +ver15=0 +coord15=0 +flag15=136314914 +flagg15=1207959552 +flagh15=20 +flagi15=205520900 +flagj15=4224 +flagk15=65536 +tflag15=-2147477245 +initx15=0 +inity15=0 +minx15=0 +miny15=0 +maxx15=0 +maxy15=0 +posx15=50 +posy15=50 +sizx15=800 +sizy15=600 +maxfps15=0 +initts15=0 +winver15=0 +maxres15=-1 +swapeffect15=0 +title16=Revenant (GOG) +path16=D:\Games\Revenant GOG\Revenant.exe +launchpath16=D:\Games\Revenant GOG\Launcher.exe +module16= +opengllib16= +notes16= +registry16= +ver16=0 +coord16=3 +flag16=1019216498 +flagg16=1207959552 +flagh16=20 +flagi16=138412036 +flagj16=134218368 +flagk16=2162696 +tflag16=-2147477245 +initx16=0 +inity16=0 +minx16=0 +miny16=0 +maxx16=0 +maxy16=0 +posx16=50 +posy16=50 +sizx16=800 +sizy16=600 +maxfps16=0 +initts16=0 +winver16=0 +maxres16=-1 +swapeffect16=0 +title17=Revenant.exe +path17=D:\Games\Revenant GOG\Disk2\Revenant.exe +launchpath17= +module17= +opengllib17= +notes17= +registry17= +ver17=0 +coord17=0 +flag17=136314914 +flagg17=1207959552 +flagh17=20 +flagi17=134217732 +flagj17=4224 +flagk17=65536 +tflag17=0 +initx17=0 +inity17=0 +minx17=0 +miny17=0 +maxx17=0 +maxy17=0 +posx17=50 +posy17=50 +sizx17=800 +sizy17=600 +maxfps17=0 +initts17=0 +winver17=0 +maxres17=-1 +swapeffect17=0 +title18=Revenant - No Cd.exe +path18=D:\Games\Revenant\Revenant - No Cd.exe +launchpath18= +module18= +opengllib18= +notes18= +registry18= +ver18=0 +coord18=0 +flag18=136314914 +flagg18=1207959552 +flagh18=20 +flagi18=138412036 +flagj18=4224 +flagk18=65536 +tflag18=-2147477245 +initx18=0 +inity18=0 +minx18=0 +miny18=0 +maxx18=0 +maxy18=0 +posx18=50 +posy18=50 +sizx18=800 +sizy18=600 +maxfps18=0 +initts18=0 +winver18=0 +maxres18=-1 +swapeffect18=0 +title19=Enemy Zero +path19=F:\EZERO\EZERO.EXE +launchpath19= +module19= +opengllib19= +notes19= +registry19= +ver19=0 +coord19=0 +flag19=681574434 +flagg19=1207959552 +flagh19=20 +flagi19=138412036 +flagj19=4224 +flagk19=65536 +tflag19=-2147477245 +initx19=0 +inity19=0 +minx19=0 +miny19=0 +maxx19=0 +maxy19=0 +posx19=50 +posy19=50 +sizx19=800 +sizy19=600 +maxfps19=0 +initts19=0 +winver19=0 +maxres19=-1 +swapeffect19=0 +title20=Revenant ICD GOG +path20=D:\Games\Revenant GOG\Revenant.icd +launchpath20= +module20= +opengllib20= +notes20= +registry20= +ver20=0 +coord20=0 +flag20=681574434 +flagg20=1207959552 +flagh20=20 +flagi20=138412036 +flagj20=4224 +flagk20=65536 +tflag20=0 +initx20=0 +inity20=0 +minx20=0 +miny20=0 +maxx20=0 +maxy20=0 +posx20=50 +posy20=50 +sizx20=800 +sizy20=600 +maxfps20=0 +initts20=0 +winver20=0 +maxres20=-1 +swapeffect20=0 +title21=Geneforge 4 (Steam) +path21=D:\Program Files (x86)\Steam\SteamApps\common\Geneforge 4\Geneforge 4.exe +launchpath21= +module21= +opengllib21= +notes21= +registry21= +ver21=0 +coord21=0 +flag21=136314934 +flagg21=1207959552 +flagh21=20 +flagi21=138412036 +flagj21=5248 +flagk21=65536 +tflag21=0 +initx21=0 +inity21=0 +minx21=0 +miny21=0 +maxx21=1024 +maxy21=768 +posx21=50 +posy21=50 +sizx21=800 +sizy21=600 +maxfps21=0 +initts21=0 +winver21=0 +maxres21=-1 +swapeffect21=0 +title22=Geneforge (Steam) +path22=D:\Program Files (x86)\Steam\SteamApps\common\Geneforge\Geneforge.exe +launchpath22= +module22= +opengllib22= +notes22= +registry22= +ver22=0 +coord22=0 +flag22=136314902 +flagg22=1207959552 +flagh22=20 +flagi22=138412036 +flagj22=4224 +flagk22=65536 +tflag22=-2147477237 +initx22=400 +inity22=300 +minx22=0 +miny22=0 +maxx22=800 +maxy22=600 +posx22=50 +posy22=50 +sizx22=800 +sizy22=600 +maxfps22=0 +initts22=0 +winver22=0 +maxres22=-1 +swapeffect22=0 +title23=Geneforge 2 (Steam) +path23=D:\Program Files (x86)\Steam\SteamApps\common\Geneforge 2\Geneforge 2.exe +launchpath23= +module23= +opengllib23= +notes23= +registry23= +ver23=0 +coord23=0 +flag23=136314886 +flagg23=1207959552 +flagh23=20 +flagi23=138412036 +flagj23=4224 +flagk23=268503040 +tflag23=-2147477245 +initx23=0 +inity23=0 +minx23=0 +miny23=0 +maxx23=0 +maxy23=0 +posx23=50 +posy23=50 +sizx23=800 +sizy23=600 +maxfps23=0 +initts23=0 +winver23=0 +maxres23=-1 +swapeffect23=0 +title24=Geneforge 3 (Steam) +path24=D:\Program Files (x86)\Steam\SteamApps\common\Geneforge 3\Geneforge 3.exe +launchpath24= +module24= +opengllib24= +notes24= +registry24= +ver24=0 +coord24=0 +flag24=136314886 +flagg24=1207959552 +flagh24=20 +flagi24=138412036 +flagj24=4224 +flagk24=268500992 +tflag24=0 +initx24=0 +inity24=0 +minx24=0 +miny24=0 +maxx24=0 +maxy24=0 +posx24=50 +posy24=50 +sizx24=800 +sizy24=600 +maxfps24=0 +initts24=0 +winver24=0 +maxres24=-1 +swapeffect24=0 +title25=LEGO Pirates +path25=d:\Games\Disney Interactive Studios\LEGOŽ Pirates\LEGOPirates.exe +launchpath25= +module25= +opengllib25= +notes25= +registry25= +ver25=9 +coord25=0 +flag25=136314914 +flagg25=1207959552 +flagh25=20 +flagi25=138412036 +flagj25=4224 +flagk25=65536 +tflag25=0 +initx25=0 +inity25=0 +minx25=0 +miny25=0 +maxx25=0 +maxy25=0 +posx25=50 +posy25=50 +sizx25=800 +sizy25=600 +maxfps25=0 +initts25=0 +winver25=0 +maxres25=-1 +swapeffect25=0 +title26=Deadlock II +path26=D:\Games\deadlock II\DEADLOCK.EXE +launchpath26= +module26= +opengllib26= +notes26= +registry26= +ver26=7 +coord26=0 +flag26=-1996488672 +flagg26=1209008128 +flagh26=20 +flagi26=138420228 +flagj26=67108992 +flagk26=0 +tflag26=0 +initx26=0 +inity26=0 +minx26=0 +miny26=0 +maxx26=0 +maxy26=0 +posx26=50 +posy26=50 +sizx26=800 +sizy26=600 +maxfps26=0 +initts26=0 +winver26=0 +maxres26=-1 +swapeffect26=0 +title27=Swat 3 +path27=D:\Games\SWAT3\SWAT.EXE +launchpath27= +module27= +opengllib27= +notes27= +registry27= +ver27=0 +coord27=0 +flag27=136314914 +flagg27=1209008128 +flagh27=20 +flagi27=138412036 +flagj27=4224 +flagk27=65536 +tflag27=-2147477245 +initx27=0 +inity27=0 +minx27=0 +miny27=0 +maxx27=0 +maxy27=0 +posx27=50 +posy27=50 +sizx27=800 +sizy27=600 +maxfps27=0 +initts27=0 +winver27=0 +maxres27=-1 +swapeffect27=0 +title28=Swat 3 (GOG) +path28=D:\Games\SWAT 3 (GOG)\game\swat.exe +launchpath28= +module28= +opengllib28= +notes28= +registry28= +ver28=1 +coord28=0 +flag28=136314914 +flagg28=1207959552 +flagh28=20 +flagi28=138412036 +flagj28=4224 +flagk28=65536 +tflag28=-2147477245 +initx28=0 +inity28=0 +minx28=0 +miny28=0 +maxx28=0 +maxy28=0 +posx28=50 +posy28=50 +sizx28=800 +sizy28=600 +maxfps28=0 +initts28=0 +winver28=0 +maxres28=-1 +swapeffect28=0 diff --git a/build/exports/Geneforge (Steam).dxw b/build/exports/Geneforge (Steam).dxw new file mode 100644 index 0000000..bb90549 --- /dev/null +++ b/build/exports/Geneforge (Steam).dxw @@ -0,0 +1,32 @@ +[target] +title0=Geneforge (Steam) +path0=D:\Program Files (x86)\Steam\SteamApps\common\Geneforge\Geneforge.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=136314918 +flagg0=1207959552 +flagh0=20 +flagi0=134217732 +flagj0=4224 +flagk0=65536 +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/Geneforge 2 (Steam).dxw b/build/exports/Geneforge 2 (Steam).dxw new file mode 100644 index 0000000..23b013b --- /dev/null +++ b/build/exports/Geneforge 2 (Steam).dxw @@ -0,0 +1,32 @@ +[target] +title0=Geneforge 2 (Steam) +path0=D:\Program Files (x86)\Steam\SteamApps\common\Geneforge 2\Geneforge 2.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=136314918 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=67584 +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/Geneforge 3 (Steam).dxw b/build/exports/Geneforge 3 (Steam).dxw new file mode 100644 index 0000000..3d12ade --- /dev/null +++ b/build/exports/Geneforge 3 (Steam).dxw @@ -0,0 +1,32 @@ +[target] +title0=Geneforge 3 (Steam) +path0=D:\Program Files (x86)\Steam\SteamApps\common\Geneforge 3\Geneforge 3.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=136314918 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=65536 +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/Geneforge 4 (Steam).dxw b/build/exports/Geneforge 4 (Steam).dxw new file mode 100644 index 0000000..2f9f0c5 --- /dev/null +++ b/build/exports/Geneforge 4 (Steam).dxw @@ -0,0 +1,32 @@ +[target] +title0=Geneforge 4 (Steam) +path0=D:\Program Files (x86)\Steam\SteamApps\common\Geneforge 4\Geneforge 4.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=136314918 +flagg0=1207959552 +flagh0=20 +flagi0=134217732 +flagj0=4224 +flagk0=65536 +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/LEGO Pirates.dxw b/build/exports/LEGO Pirates.dxw new file mode 100644 index 0000000..34a8b1b --- /dev/null +++ b/build/exports/LEGO Pirates.dxw @@ -0,0 +1,32 @@ +[target] +title0=LEGO Pirates +path0=d:\Games\Disney Interactive Studios\LEGOŽ Pirates\LEGOPirates.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=9 +coord0=0 +flag0=136314914 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=65536 +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/Road Rash.dxw b/build/exports/Road Rash.dxw index 24fee6c..1f00af9 100644 --- a/build/exports/Road Rash.dxw +++ b/build/exports/Road Rash.dxw @@ -29,3 +29,4 @@ winver0=0 maxres0=-1 flagk0=0 swapeffect0=0 +registry0=[HKEY_LOCAL_MACHINE\SOFTWARE]\n\n; Road Rash\n\n[HKEY_LOCAL_MACHINE\SOFTWARE\Electronic Arts]\n[HKEY_LOCAL_MACHINE\SOFTWARE\Electronic Arts\RoadRash 95]\n""=""\n"Path"="."\n"CheckDialup"=hex:00\n"ChatState"=hex:02\n"MiniDash"=hex:00\n"OpponentList"=hex:01\n diff --git a/build/exports/Swat 3 (GOG).dxw b/build/exports/Swat 3 (GOG).dxw new file mode 100644 index 0000000..73c9607 --- /dev/null +++ b/build/exports/Swat 3 (GOG).dxw @@ -0,0 +1,32 @@ +[target] +title0=Swat 3 (GOG) +path0=D:\Games\SWAT 3 (GOG)\game\swat.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=1 +coord0=0 +flag0=136314914 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=65536 +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/Swat 3.dxw b/build/exports/Swat 3.dxw new file mode 100644 index 0000000..a9476aa --- /dev/null +++ b/build/exports/Swat 3.dxw @@ -0,0 +1,32 @@ +[target] +title0=Swat 3 +path0=D:\Games\SWAT3\SWAT.EXE +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=136314914 +flagg0=1209008128 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=65536 +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/readme-relnotes.txt b/build/readme-relnotes.txt index 688214e..338695e 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -989,8 +989,15 @@ fix: proper default values for"Share ddraw and GDI DC" and "Lock/Unlock Pitch Fi v2.03.49 fix: a few improvements in handling NULL lpDDSSource in Blit/Flip operations -optimization: avoid applying palette to primarty surface when emulated add: option to print relative timing to log fix: avoid handling textures at level greater than 0 since this seems to cause application crash fix: restore cursor clipping through WM_SETFOCUS and DefWindowProc when focus is gained -fix: "One Must Fall Battlegrounds" keyboard fix - can't SetWindowsHookEx with WH_KEYBOARD and NULL thread \ No newline at end of file +fix: "One Must Fall Battlegrounds" keyboard fix - can't SetWindowsHookEx with WH_KEYBOARD and NULL thread + +v2.03.50 +fix: check for errors that could cause random GDI cursor clipping regions +fix: more accurate hooking of ddraw pointers - fixes several DD_GENERIC_ERROR in Win8/10 platforms, makes "SWAT 3" working +fix: improvements (not finished) in dinput handling +add: the OS version info is traced in the log file +fix: added cursor clipping when requested on new main window creation +fix: handling of cursor clipping when the window gain/lose focus threough DefWindowProc message handling \ No newline at end of file diff --git a/dll/ddproxy.cpp b/dll/ddproxy.cpp index c4f7dda..50af319 100644 --- a/dll/ddproxy.cpp +++ b/dll/ddproxy.cpp @@ -53,8 +53,14 @@ extern EnumDisplayModes4_Type pEnumDisplayModes4; extern EnumSurfaces1_Type pEnumSurfaces1; extern EnumSurfaces4_Type pEnumSurfaces4; extern FlipToGDISurface_Type pFlipToGDISurface; -extern GetCapsD_Type pGetCapsD; -extern GetDisplayMode_Type pGetDisplayMode; +extern GetCapsD_Type pGetCaps1D; +extern GetCapsD_Type pGetCaps2D; +extern GetCapsD_Type pGetCaps4D; +extern GetCapsD_Type pGetCaps7D; +extern GetDisplayMode_Type pGetDisplayMode1; +extern GetDisplayMode_Type pGetDisplayMode2; +extern GetDisplayMode4_Type pGetDisplayMode4; +extern GetDisplayMode4_Type pGetDisplayMode7; extern GetFourCCCodes_Type pGetFourCCCodes; extern GetGDISurface_Type pGetGDISurface; extern GetMonitorFrequency_Type pGetMonitorFrequency; @@ -62,9 +68,14 @@ extern GetScanLine_Type pGetScanLine; extern GetVerticalBlankStatus_Type pGetVerticalBlankStatus; extern Initialize_Type pInitialize; extern RestoreDisplayMode_Type pRestoreDisplayMode; -extern SetCooperativeLevel_Type pSetCooperativeLevel; +extern SetCooperativeLevel_Type pSetCooperativeLevel1; +extern SetCooperativeLevel_Type pSetCooperativeLevel2; +extern SetCooperativeLevel_Type pSetCooperativeLevel4; +extern SetCooperativeLevel_Type pSetCooperativeLevel7; extern SetDisplayMode1_Type pSetDisplayMode1; extern SetDisplayMode2_Type pSetDisplayMode2; +extern SetDisplayMode2_Type pSetDisplayMode4; +extern SetDisplayMode2_Type pSetDisplayMode7; // missing WaitForVerticalBlank ... // v2 interface extern GetAvailableVidMem_Type pGetAvailableVidMem; @@ -940,10 +951,10 @@ HRESULT WINAPI extFlipToGDISurfaceProxy(LPDIRECTDRAW lpdd) return res; } -HRESULT WINAPI extGetDisplayModeProxy(LPDIRECTDRAW lpdd, LPDDSURFACEDESC lpddsd) +HRESULT WINAPI extGetDisplayModeProxy(GetDisplayMode_Type pGetDisplayMode, LPDIRECTDRAW lpdd, LPDDSURFACEDESC lpddsd) { HRESULT res; - OutTraceP("GetDisplayMode(D): PROXED lpdd=%x\n"); + OutTraceP("GetDisplayMode(D): PROXED lpdd=%x lpddsd=%x\n", lpdd, lpddsd); res=(*pGetDisplayMode)(lpdd, lpddsd); if(res) OutTraceP("GetDisplayMode(D): ERROR res=%x(%s)\n", res, ExplainDDError(res)); else{ @@ -958,6 +969,27 @@ HRESULT WINAPI extGetDisplayModeProxy(LPDIRECTDRAW lpdd, LPDDSURFACEDESC lpddsd) return res; } +HRESULT WINAPI extGetDisplayMode1Proxy(LPDIRECTDRAW lpdd, LPDDSURFACEDESC lpddsd) +{ + return extGetDisplayModeProxy(pGetDisplayMode1, lpdd, lpddsd); +} + +HRESULT WINAPI extGetDisplayMode2Proxy(LPDIRECTDRAW lpdd, LPDDSURFACEDESC lpddsd) +{ + return extGetDisplayModeProxy(pGetDisplayMode2, lpdd, lpddsd); +} + +HRESULT WINAPI extGetDisplayMode4Proxy(LPDIRECTDRAW lpdd, LPDDSURFACEDESC2 lpddsd) +{ + return extGetDisplayModeProxy((GetDisplayMode_Type)pGetDisplayMode4, lpdd, (LPDDSURFACEDESC)lpddsd); +} + +HRESULT WINAPI extGetDisplayMode7Proxy(LPDIRECTDRAW lpdd, LPDDSURFACEDESC lpddsd) +{ + return extGetDisplayModeProxy((GetDisplayMode_Type)pGetDisplayMode7, lpdd, (LPDDSURFACEDESC)lpddsd); +} + + HRESULT WINAPI extGetGDISurfaceProxy(LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE *w) { int res; @@ -973,30 +1005,50 @@ HRESULT WINAPI extSetCooperativeLevelProxy(void *lpdd, HWND hwnd, DWORD dwflags) HRESULT res; OutTraceP("SetCooperativeLevel(D): PROXED lpdd=%x hwnd=%x dwFlags=%x(%s)\n", lpdd, hwnd, dwflags,ExplainCoopFlags(dwflags)); - res=(*pSetCooperativeLevel)(lpdd, hwnd, dwflags); + res=(*pSetCooperativeLevel1)(lpdd, hwnd, dwflags); if (res) OutTraceP("SetCooperativeLevel(D): ERROR res=%x(%s)\n", res, ExplainDDError(res)); return res; } -HRESULT WINAPI extSetDisplayMode2Proxy(LPDIRECTDRAW lpdd, - DWORD dwwidth, DWORD dwheight, DWORD dwbpp, DWORD dwrefreshrate, DWORD dwflags) +static HRESULT WINAPI extSetDisplayModeProxy(int dxversion, LPDIRECTDRAW lpdd, + DWORD dwwidth, DWORD dwheight, DWORD dwbpp, DWORD dwRefreshRate, DWORD dwflags) { HRESULT res; - OutTraceP("SetDisplayMode(2): PROXED lpdd=%x WxH=(%dx%d) bpp=%d refresh=%x dwFlags=%x\n", - lpdd, dwwidth, dwheight, dwbpp, dwrefreshrate, dwflags); - res=(pSetDisplayMode2)(lpdd, dwwidth, dwheight, dwbpp, dwrefreshrate, dwflags); - if (res) OutTraceP("SetDisplayMode(2): ERROR res=%x(%s)\n", res, ExplainDDError(res)); + char sExtra[81]; + if(IsTraceP){ + if(dxversion>1) sprintf(sExtra, " refresh=%x dwFlags=%x", dwRefreshRate, dwflags); + OutTraceP("SetDisplayMode(%d): PROXED lpdd=%x WxH=(%dx%d) bpp=%d%s\n", + lpdd, dwwidth, dwheight, dwbpp, (dxversion>1)?sExtra : ""); + } + switch(dxversion){ + default: + case 1: res=(*pSetDisplayMode1)(lpdd, dwwidth, dwheight, dwbpp); break; + case 2: res=(*pSetDisplayMode2)(lpdd, dwwidth, dwheight, dwbpp, dwRefreshRate, dwflags); break; + case 4: res=(*pSetDisplayMode4)(lpdd, dwwidth, dwheight, dwbpp, dwRefreshRate, dwflags); break; + case 7: res=(*pSetDisplayMode7)(lpdd, dwwidth, dwheight, dwbpp, dwRefreshRate, dwflags); break; + } + if (res) OutTraceP("SetDisplayMode(%d): ERROR res=%x(%s)\n", dxversion, res, ExplainDDError(res)); return res; } -HRESULT WINAPI extSetDisplayMode1Proxy(LPDIRECTDRAW lpdd, - DWORD dwwidth, DWORD dwheight, DWORD dwbpp) +HRESULT WINAPI extSetDisplayMode1Proxy(LPDIRECTDRAW lpdd, DWORD dwwidth, DWORD dwheight, DWORD dwbpp) { - HRESULT res; - OutTraceP("SetDisplayMode(1): PROXED lpdd=%x WxH=(%dx%d) bpp=%d\n", lpdd, dwwidth, dwheight, dwbpp); - res=(pSetDisplayMode1)(lpdd, dwwidth, dwheight, dwbpp); - if (res) OutTraceP("SetDisplayMode(1): ERROR res=%x(%s)\n", res, ExplainDDError(res)); - return res; + return extSetDisplayModeProxy(1, lpdd, dwwidth, dwheight, dwbpp, 0, 0); +} + +HRESULT WINAPI extSetDisplayMode2Proxy(LPDIRECTDRAW lpdd, DWORD dwwidth, DWORD dwheight, DWORD dwbpp, DWORD dwrefreshrate, DWORD dwflags) +{ + return extSetDisplayModeProxy(2, lpdd, dwwidth, dwheight, dwbpp, dwrefreshrate, dwflags); +} + +HRESULT WINAPI extSetDisplayMode4Proxy(LPDIRECTDRAW lpdd, DWORD dwwidth, DWORD dwheight, DWORD dwbpp, DWORD dwrefreshrate, DWORD dwflags) +{ + return extSetDisplayModeProxy(4, lpdd, dwwidth, dwheight, dwbpp, dwrefreshrate, dwflags); +} + +HRESULT WINAPI extSetDisplayMode7Proxy(LPDIRECTDRAW lpdd, DWORD dwwidth, DWORD dwheight, DWORD dwbpp, DWORD dwrefreshrate, DWORD dwflags) +{ + return extSetDisplayModeProxy(7, lpdd, dwwidth, dwheight, dwbpp, dwrefreshrate, dwflags); } HRESULT WINAPI extTestCooperativeLevelProxy(LPDIRECTDRAW lpdd) @@ -1743,9 +1795,30 @@ static void HookDDSessionProxy(LPDIRECTDRAW *lplpdd, int dxVersion) // IDIrectDraw::FlipToGDISurface SetHook((void *)(**(DWORD **)lplpdd + 40), extFlipToGDISurfaceProxy, (void **)&pFlipToGDISurface, "FlipToGDISurface(D)"); // IDIrectDraw::GetCaps - SetHook((void *)(**(DWORD **)lplpdd + 44), extGetCapsD, (void **)&pGetCapsD, "GetCaps(D)"); // IDIrectDraw::GetDisplayMode - SetHook((void *)(**(DWORD **)lplpdd + 48), extGetDisplayModeProxy, (void **)&pGetDisplayMode, "GetDisplayMode(D)"); + // IDIrectDraw::SetDisplayMode + switch(dxVersion) { + case 1: + SetHook((void *)(**(DWORD **)lplpdd + 44), extGetCaps1D, (void **)&pGetCaps1D, "GetCaps(D1)"); + SetHook((void *)(**(DWORD **)lplpdd + 48), extGetDisplayMode1Proxy, (void **)&pGetDisplayMode1, "GetDisplayMode(D1)"); + SetHook((void *)(**(DWORD **)lplpdd + 84), extSetDisplayMode1Proxy, (void **)&pSetDisplayMode1, "SetDisplayMode(D1)"); + break; + case 2: + SetHook((void *)(**(DWORD **)lplpdd + 44), extGetCaps2D, (void **)&pGetCaps2D, "GetCaps(D2)"); + SetHook((void *)(**(DWORD **)lplpdd + 48), extGetDisplayMode2Proxy, (void **)&pGetDisplayMode2, "GetDisplayMode(D2)"); + SetHook((void *)(**(DWORD **)lplpdd + 84), extSetDisplayMode2Proxy, (void **)&pSetDisplayMode2, "SetDisplayMode(D2)"); + break; + case 4: + SetHook((void *)(**(DWORD **)lplpdd + 44), extGetCaps4D, (void **)&pGetCaps4D, "GetCaps(D4)"); + SetHook((void *)(**(DWORD **)lplpdd + 48), extGetDisplayMode4Proxy, (void **)&pGetDisplayMode4, "GetDisplayMode(D4)"); + SetHook((void *)(**(DWORD **)lplpdd + 84), extSetDisplayMode4Proxy, (void **)&pSetDisplayMode4, "SetDisplayMode(D4)"); + break; + case 7: + SetHook((void *)(**(DWORD **)lplpdd + 44), extGetCaps7D, (void **)&pGetCaps7D, "GetCaps(D7)"); + SetHook((void *)(**(DWORD **)lplpdd + 48), extGetDisplayMode7Proxy, (void **)&pGetDisplayMode7, "GetDisplayMode(D7)"); + SetHook((void *)(**(DWORD **)lplpdd + 84), extSetDisplayMode7Proxy, (void **)&pSetDisplayMode7, "SetDisplayMode(D7)"); + break; + } // IDIrectDraw::GetFourCCCodes SetHook((void *)(**(DWORD **)lplpdd + 52), extGetFourCCCodesProxy, (void **)&pGetFourCCCodes, "GetFourCCCodes(D)"); // IDIrectDraw::GetGDISurface @@ -1773,14 +1846,7 @@ static void HookDDSessionProxy(LPDIRECTDRAW *lplpdd, int dxVersion) SetHook((void *)(**(DWORD **)lplpdd + 108), extGetDeviceIdentifierProxy, (void **)&pGetDeviceIdentifier, "GetDeviceIdentifier(D)"); } // IDIrectDraw::SetCooperativeLevel - SetHook((void *)(**(DWORD **)lplpdd + 80), extSetCooperativeLevelProxy, (void **)&pSetCooperativeLevel, "SetCooperativeLevel(D)"); - // IDIrectDraw::SetDisplayMode - if (dxVersion > 1){ - SetHook((void *)(**(DWORD **)lplpdd + 84), extSetDisplayMode2Proxy, (void **)&pSetDisplayMode2, "SetDisplayMode(D2)"); - } - else { - SetHook((void *)(**(DWORD **)lplpdd + 84), extSetDisplayMode1Proxy, (void **)&pSetDisplayMode1, "SetDisplayMode(D1)"); - } + SetHook((void *)(**(DWORD **)lplpdd + 80), extSetCooperativeLevelProxy, (void **)&pSetCooperativeLevel1, "SetCooperativeLevel(D)"); #if 0 // IDIrectDraw::WaitForVerticalBlank SetHook((void *)(**(DWORD **)lplpdd + 88), extWaitForVerticalBlankProxy, (void **)&pWaitForVerticalBlank, "WaitForVerticalBlank(D)"); diff --git a/dll/ddproxy.h b/dll/ddproxy.h index f24bc84..4d0070c 100644 --- a/dll/ddproxy.h +++ b/dll/ddproxy.h @@ -60,7 +60,10 @@ extern HRESULT WINAPI extGetSurfaceDesc4Proxy(LPDIRECTDRAWSURFACE2, LPDDSURFACED extern ULONG WINAPI extAddRefDProxy(LPDIRECTDRAW); extern ULONG WINAPI extCompactProxy(LPDIRECTDRAW); extern HRESULT WINAPI extEnumDisplayModesProxy(LPDIRECTDRAW, DWORD, LPDDSURFACEDESC, LPVOID, LPDDENUMMODESCALLBACK); -extern HRESULT WINAPI extGetCapsD(LPDIRECTDRAW, LPDDCAPS, LPDDCAPS); +extern HRESULT WINAPI extGetCaps1D(LPDIRECTDRAW, LPDDCAPS, LPDDCAPS); +extern HRESULT WINAPI extGetCaps2D(LPDIRECTDRAW, LPDDCAPS, LPDDCAPS); +extern HRESULT WINAPI extGetCaps4D(LPDIRECTDRAW, LPDDCAPS, LPDDCAPS); +extern HRESULT WINAPI extGetCaps7D(LPDIRECTDRAW, LPDDCAPS, LPDDCAPS); extern HRESULT WINAPI extGetFourCCCodesProxy(LPDIRECTDRAW, LPDWORD, LPDWORD); extern HRESULT WINAPI extGetMonitorFrequencyProxy(LPDIRECTDRAW, LPDWORD); extern HRESULT WINAPI extGetScanLineProxy(LPDIRECTDRAW, LPDWORD); diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index 76003df..311df0b 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -46,14 +46,22 @@ HRESULT WINAPI extCreateSurface4(LPDIRECTDRAW, DDSURFACEDESC2 *, LPDIRECTDRAWSUR HRESULT WINAPI extCreateSurface7(LPDIRECTDRAW, DDSURFACEDESC2 *, LPDIRECTDRAWSURFACE *, void *); HRESULT WINAPI extDuplicateSurface(LPDIRECTDRAW, LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE *); HRESULT WINAPI extFlipToGDISurface(LPDIRECTDRAW); -HRESULT WINAPI extGetDisplayMode(LPDIRECTDRAW, LPDDSURFACEDESC); +HRESULT WINAPI extGetDisplayMode1(LPDIRECTDRAW, LPDDSURFACEDESC); +HRESULT WINAPI extGetDisplayMode2(LPDIRECTDRAW, LPDDSURFACEDESC); +HRESULT WINAPI extGetDisplayMode4(LPDIRECTDRAW, LPDDSURFACEDESC2); +HRESULT WINAPI extGetDisplayMode7(LPDIRECTDRAW, LPDDSURFACEDESC2); HRESULT WINAPI extGetGDISurface(LPDIRECTDRAW, LPDIRECTDRAWSURFACE *); HRESULT WINAPI extEnumDisplayModes1(LPDIRECTDRAW, DWORD, LPDDSURFACEDESC, LPVOID, LPDDENUMMODESCALLBACK); HRESULT WINAPI extEnumDisplayModes4(LPDIRECTDRAW, DWORD, LPDDSURFACEDESC2, LPVOID, LPDDENUMMODESCALLBACK2); HRESULT WINAPI extInitialize(LPDIRECTDRAW, FAR GUID *); -HRESULT WINAPI extSetCooperativeLevel(void *, HWND, DWORD); +HRESULT WINAPI extSetCooperativeLevel1(LPDIRECTDRAW, HWND, DWORD); +HRESULT WINAPI extSetCooperativeLevel2(LPDIRECTDRAW, HWND, DWORD); +HRESULT WINAPI extSetCooperativeLevel4(LPDIRECTDRAW, HWND, DWORD); +HRESULT WINAPI extSetCooperativeLevel7(LPDIRECTDRAW, HWND, DWORD); HRESULT WINAPI extSetDisplayMode1(LPDIRECTDRAW, DWORD, DWORD, DWORD); HRESULT WINAPI extSetDisplayMode2(LPDIRECTDRAW, DWORD, DWORD, DWORD, DWORD, DWORD); +HRESULT WINAPI extSetDisplayMode4(LPDIRECTDRAW, DWORD, DWORD, DWORD, DWORD, DWORD); +HRESULT WINAPI extSetDisplayMode7(LPDIRECTDRAW, DWORD, DWORD, DWORD, DWORD, DWORD); HRESULT WINAPI extWaitForVerticalBlank(LPDIRECTDRAW, DWORD, HANDLE); /*** Added in the V2 Interface ***/ HRESULT WINAPI extGetAvailableVidMem2(LPDIRECTDRAW, LPDDSCAPS, LPDWORD, LPDWORD); @@ -62,7 +70,10 @@ HRESULT WINAPI extGetAvailableVidMem4(LPDIRECTDRAW, LPDDSCAPS, LPDWORD, LPDWORD) HRESULT WINAPI extTestCooperativeLevel(LPDIRECTDRAW); // STDMETHOD(StartModeTest)(THIS_ LPSIZE, DWORD, DWORD ) PURE; // STDMETHOD(EvaluateMode)(THIS_ DWORD, DWORD * ) PURE; -HRESULT WINAPI extGetCapsD(LPDIRECTDRAW, LPDDCAPS, LPDDCAPS); +HRESULT WINAPI extGetCaps1D(LPDIRECTDRAW, LPDDCAPS, LPDDCAPS); +HRESULT WINAPI extGetCaps2D(LPDIRECTDRAW, LPDDCAPS, LPDDCAPS); +HRESULT WINAPI extGetCaps4D(LPDIRECTDRAW, LPDDCAPS, LPDDCAPS); +HRESULT WINAPI extGetCaps7D(LPDIRECTDRAW, LPDDCAPS, LPDDCAPS); // DirectDrawSurface HRESULT WINAPI extQueryInterfaceS(void *, REFIID, LPVOID *); @@ -149,8 +160,14 @@ EnumDisplayModes4_Type pEnumDisplayModes4; EnumSurfaces1_Type pEnumSurfaces1; EnumSurfaces4_Type pEnumSurfaces4; FlipToGDISurface_Type pFlipToGDISurface; -GetCapsD_Type pGetCapsD; -GetDisplayMode_Type pGetDisplayMode; +GetCapsD_Type pGetCaps1D; +GetCapsD_Type pGetCaps2D; +GetCapsD_Type pGetCaps4D; +GetCapsD_Type pGetCaps7D; +GetDisplayMode_Type pGetDisplayMode1; +GetDisplayMode_Type pGetDisplayMode2; +GetDisplayMode4_Type pGetDisplayMode4; +GetDisplayMode4_Type pGetDisplayMode7; GetFourCCCodes_Type pGetFourCCCodes; GetGDISurface_Type pGetGDISurface; GetMonitorFrequency_Type pGetMonitorFrequency; @@ -158,9 +175,14 @@ GetScanLine_Type pGetScanLine; GetVerticalBlankStatus_Type pGetVerticalBlankStatus; Initialize_Type pInitialize; RestoreDisplayMode_Type pRestoreDisplayMode; -SetCooperativeLevel_Type pSetCooperativeLevel; +SetCooperativeLevel_Type pSetCooperativeLevel1; +SetCooperativeLevel_Type pSetCooperativeLevel2; +SetCooperativeLevel_Type pSetCooperativeLevel4; +SetCooperativeLevel_Type pSetCooperativeLevel7; SetDisplayMode1_Type pSetDisplayMode1; SetDisplayMode2_Type pSetDisplayMode2; +SetDisplayMode2_Type pSetDisplayMode4; +SetDisplayMode2_Type pSetDisplayMode7; WaitForVerticalBlank_Type pWaitForVerticalBlank; GetSurfaceFromDC_Type pGetSurfaceFromDC; GetAvailableVidMem_Type pGetAvailableVidMem; @@ -298,6 +320,20 @@ DWORD gdwRefreshRate; #define MAXREFRESHDELAYCOUNT 20 int iRefreshDelays[MAXREFRESHDELAYCOUNT]={16, 17}; int iRefreshDelayCount=2; +int lpddHookedVersion(LPDIRECTDRAW); + +static HRESULT myGetDisplayMode(LPDIRECTDRAW lpdd, LPDDSURFACEDESC lpdds) +{ + HRESULT res; + switch(lpddHookedVersion(lpdd)){ + case 1: res=(*pGetDisplayMode1)(lpdd, lpdds); break; + case 2: res=(*pGetDisplayMode2)(lpdd, lpdds); break; + case 4: res=(*pGetDisplayMode4)(lpdd, (LPDDSURFACEDESC2)lpdds); break; + case 7: res=(*pGetDisplayMode7)(lpdd, (LPDDSURFACEDESC2)lpdds); break; + default: res=(*pGetDisplayMode1)(lpdd, lpdds); break; + } + return res; +} void SetVSyncDelays(LPDIRECTDRAW lpdd) { @@ -306,11 +342,7 @@ void SetVSyncDelays(LPDIRECTDRAW lpdd) memset(&ddsdRefreshRate, 0, sizeof(ddsdRefreshRate)); ddsdRefreshRate.dwSize = sizeof(DDSURFACEDESC); - res=(*pGetDisplayMode)(lpdd, (LPDDSURFACEDESC)&ddsdRefreshRate); - if(res==DDERR_GENERIC){ // handling Win8 missing support for old ddraw interface - ddsdRefreshRate.dwSize = sizeof(DDSURFACEDESC2); - res=(*pGetDisplayMode)(lpdd, (LPDDSURFACEDESC)&ddsdRefreshRate); - } + res=myGetDisplayMode(lpdd, (LPDDSURFACEDESC)&ddsdRefreshRate); if(res) return; dxw.SetVSyncDelays(ddsdRefreshRate.dwRefreshRate); } @@ -490,11 +522,7 @@ void InitDDScreenParameters(LPDIRECTDRAW lpdd) HRESULT res; DDSURFACEDESC2 ddsd; ddsd.dwSize=sizeof(DDSURFACEDESC); - res=(*pGetDisplayMode)(lpdd, (LPDDSURFACEDESC)&ddsd); - if(res==DDERR_GENERIC){ // Win8 missing support for old ddraw interfaces - ddsd.dwSize=sizeof(DDSURFACEDESC2); - res=(*pGetDisplayMode)(lpdd, (LPDDSURFACEDESC)&ddsd); - } + res=myGetDisplayMode(lpdd, (LPDDSURFACEDESC)&ddsd); if(res){ OutTraceE("GetDisplayMode: ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return; @@ -1027,20 +1055,39 @@ void HookDDSession(LPDIRECTDRAW *lplpdd, int dxversion) // IDIrectDraw::FlipToGDISurface SetHook((void *)(**(DWORD **)lplpdd + 40), extFlipToGDISurface, (void **)&pFlipToGDISurface, "FlipToGDISurface(D)"); // IDIrectDraw::GetCaps - SetHook((void *)(**(DWORD **)lplpdd + 44), extGetCapsD, (void **)&pGetCapsD, "GetCaps(D)"); + // IDIrectDraw::SetCooperativeLevel // IDIrectDraw::GetDisplayMode - SetHook((void *)(**(DWORD **)lplpdd + 48), extGetDisplayMode, (void **)&pGetDisplayMode, "GetDisplayMode(D)"); + // IDIrectDraw::SetDisplayMode + switch(dxversion) { + case 1: + SetHook((void *)(**(DWORD **)lplpdd + 44), extGetCaps1D, (void **)&pGetCaps1D, "GetCaps(D1)"); + SetHook((void *)(**(DWORD **)lplpdd + 48), extGetDisplayMode1, (void **)&pGetDisplayMode1, "GetDisplayMode(D1)"); + SetHook((void *)(**(DWORD **)lplpdd + 80), extSetCooperativeLevel1, (void **)&pSetCooperativeLevel1, "SetCooperativeLevel(D1)"); + SetHook((void *)(**(DWORD **)lplpdd + 84), extSetDisplayMode1, (void **)&pSetDisplayMode1, "SetDisplayMode(D1)"); + break; + case 2: + SetHook((void *)(**(DWORD **)lplpdd + 44), extGetCaps2D, (void **)&pGetCaps2D, "GetCaps(D2)"); + SetHook((void *)(**(DWORD **)lplpdd + 48), extGetDisplayMode2, (void **)&pGetDisplayMode2, "GetDisplayMode(D2)"); + SetHook((void *)(**(DWORD **)lplpdd + 80), extSetCooperativeLevel2, (void **)&pSetCooperativeLevel2, "SetCooperativeLevel(D2)"); + SetHook((void *)(**(DWORD **)lplpdd + 84), extSetDisplayMode2, (void **)&pSetDisplayMode2, "SetDisplayMode(D2)"); + break; + case 4: + SetHook((void *)(**(DWORD **)lplpdd + 44), extGetCaps4D, (void **)&pGetCaps4D, "GetCaps(D4)"); + SetHook((void *)(**(DWORD **)lplpdd + 48), extGetDisplayMode4, (void **)&pGetDisplayMode4, "GetDisplayMode(D4)"); + SetHook((void *)(**(DWORD **)lplpdd + 80), extSetCooperativeLevel4, (void **)&pSetCooperativeLevel4, "SetCooperativeLevel(D4)"); + SetHook((void *)(**(DWORD **)lplpdd + 84), extSetDisplayMode4, (void **)&pSetDisplayMode4, "SetDisplayMode(D4)"); + break; + case 7: + SetHook((void *)(**(DWORD **)lplpdd + 44), extGetCaps7D, (void **)&pGetCaps7D, "GetCaps(D7)"); + SetHook((void *)(**(DWORD **)lplpdd + 48), extGetDisplayMode7, (void **)&pGetDisplayMode7, "GetDisplayMode(D7)"); + SetHook((void *)(**(DWORD **)lplpdd + 80), extSetCooperativeLevel7, (void **)&pSetCooperativeLevel7, "SetCooperativeLevel(D7)"); + SetHook((void *)(**(DWORD **)lplpdd + 84), extSetDisplayMode7, (void **)&pSetDisplayMode7, "SetDisplayMode(D7)"); + break; + } // IDIrectDraw::GetGDISurface SetHook((void *)(**(DWORD **)lplpdd + 56), extGetGDISurface, (void **)&pGetGDISurface, "GetGDISurface(D)"); // IDIrectDraw::Initialize SetHook((void *)(**(DWORD **)lplpdd + 72), extInitialize, (void **)&pInitialize, "Initialize(D)"); - // IDIrectDraw::SetCooperativeLevel - SetHook((void *)(**(DWORD **)lplpdd + 80), extSetCooperativeLevel, (void **)&pSetCooperativeLevel, "SetCooperativeLevel(D)"); - // IDIrectDraw::SetDisplayMode - if (dxversion > 1) - SetHook((void *)(**(DWORD **)lplpdd + 84), extSetDisplayMode2, (void **)&pSetDisplayMode2, "SetDisplayMode(D2)"); - else - SetHook((void *)(**(DWORD **)lplpdd + 84), extSetDisplayMode1, (void **)&pSetDisplayMode1, "SetDisplayMode(D1)"); // IDIrectDraw::WaitForVerticalBlank SetHook((void *)(**(DWORD **)lplpdd + 88), extWaitForVerticalBlank, (void **)&pWaitForVerticalBlank, "WaitForVerticalBlank(D)"); // IDIrectDraw::GetAvailableVidMem @@ -1525,7 +1572,7 @@ static void HandleCapsD(char *sLabel, LPDDCAPS c) OutTraceDDRAW("GetCaps(%s): FIXED VidMemTotal=%x VidMemFree=%x\n", sLabel, c->dwVidMemTotal, c->dwVidMemFree); } -HRESULT WINAPI extGetCapsD(LPDIRECTDRAW lpdd, LPDDCAPS c1, LPDDCAPS c2) +HRESULT WINAPI extGetCapsD(int dxversion, GetCapsD_Type pGetCapsD, LPDIRECTDRAW lpdd, LPDDCAPS c1, LPDDCAPS c2) { HRESULT res; OutTraceDDRAW("GetCaps(D): lpdd=%x %s %s\n", lpdd, c1?"c1":"NULL", c2?"c2":"NULL"); @@ -1563,6 +1610,23 @@ HRESULT WINAPI extGetCapsD(LPDIRECTDRAW lpdd, LPDDCAPS c1, LPDDCAPS c2) return res; } +HRESULT WINAPI extGetCaps1D(LPDIRECTDRAW lpdd, LPDDCAPS c1, LPDDCAPS c2) +{ + return extGetCapsD(1, pGetCaps1D, lpdd, c1, c2); +} +HRESULT WINAPI extGetCaps2D(LPDIRECTDRAW lpdd, LPDDCAPS c1, LPDDCAPS c2) +{ + return extGetCapsD(2, pGetCaps2D, lpdd, c1, c2); +} +HRESULT WINAPI extGetCaps4D(LPDIRECTDRAW lpdd, LPDDCAPS c1, LPDDCAPS c2) +{ + return extGetCapsD(4, pGetCaps4D, lpdd, c1, c2); +} +HRESULT WINAPI extGetCaps7D(LPDIRECTDRAW lpdd, LPDDCAPS_DX7 c1, LPDDCAPS_DX7 c2) +{ + return extGetCapsD(7, pGetCaps7D, lpdd, (LPDDCAPS)c1, (LPDDCAPS)c2); +} + HRESULT WINAPI extDirectDrawCreate(GUID FAR *lpguid, LPDIRECTDRAW FAR *lplpdd, IUnknown FAR *pu) { HRESULT res; @@ -1997,12 +2061,16 @@ HRESULT WINAPI extSetDisplayMode(int version, LPDIRECTDRAW lpdd, ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT | DDSD_REFRESHRATE; ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB; - res=(*pGetDisplayMode)(lpdd, (LPDDSURFACEDESC)&ddsd); - if(res==DDERR_GENERIC){ // handling Win8 missing support for old ddraw interface - ddsd.dwSize = sizeof(DDSURFACEDESC2); - res=(*pGetDisplayMode)(lpdd, (LPDDSURFACEDESC)&ddsd); + switch(version){ + default: + case 1: res=(*pGetDisplayMode1)(lpdd, (LPDDSURFACEDESC)&ddsd); break; + case 2: res=(*pGetDisplayMode2)(lpdd, (LPDDSURFACEDESC)&ddsd); break; + case 4: res=(*pGetDisplayMode4)(lpdd, &ddsd); break; + case 7: res=(*pGetDisplayMode7)(lpdd, &ddsd); break; } - + + OutTraceB("SetDisplayMode: detected screen size=(%dx%d)\n", ddsd.dwWidth, ddsd.dwHeight); + if(dxw.Windowize){ if(!IsChangeDisplaySettingsHotPatched){ dwwidth = ddsd.dwWidth; @@ -2016,11 +2084,13 @@ HRESULT WINAPI extSetDisplayMode(int version, LPDIRECTDRAW lpdd, dwbpp = ddsd.ddpfPixelFormat.dwRGBBitCount; } - if (version==1) - res = (*pSetDisplayMode1)(lpdd, dwwidth, dwheight, dwbpp); - else - res = (*pSetDisplayMode2)(lpdd, dwwidth, dwheight, dwbpp, ddsd.dwRefreshRate, 0); - + switch(version){ + default: + case 1: res=(*pSetDisplayMode1)(lpdd, dwwidth, dwheight, dwbpp); break; + case 2: res=(*pSetDisplayMode2)(lpdd, dwwidth, dwheight, dwbpp, ddsd.dwRefreshRate, 0); break; + case 4: res=(*pSetDisplayMode4)(lpdd, dwwidth, dwheight, dwbpp, ddsd.dwRefreshRate, 0); break; + case 7: res=(*pSetDisplayMode7)(lpdd, dwwidth, dwheight, dwbpp, ddsd.dwRefreshRate, 0); break; + } if(res) OutTraceE("SetDisplayMode: error=%x\n", res); SetVSyncDelays(lpdd); @@ -2031,21 +2101,29 @@ HRESULT WINAPI extSetDisplayMode(int version, LPDIRECTDRAW lpdd, return DD_OK; } -HRESULT WINAPI extSetDisplayMode2(LPDIRECTDRAW lpdd, - DWORD dwwidth, DWORD dwheight, DWORD dwbpp, DWORD dwrefreshrate, DWORD dwflags) -{ - return extSetDisplayMode(2, lpdd, dwwidth, dwheight, dwbpp, dwrefreshrate, dwflags); -} - -HRESULT WINAPI extSetDisplayMode1(LPDIRECTDRAW lpdd, - DWORD dwwidth, DWORD dwheight, DWORD dwbpp) +HRESULT WINAPI extSetDisplayMode1(LPDIRECTDRAW lpdd, DWORD dwwidth, DWORD dwheight, DWORD dwbpp) { return extSetDisplayMode(1, lpdd, dwwidth, dwheight, dwbpp, 0, 0); } -HRESULT WINAPI extGetDisplayMode(LPDIRECTDRAW lpdd, LPDDSURFACEDESC lpddsd) +HRESULT WINAPI extSetDisplayMode2(LPDIRECTDRAW lpdd, DWORD dwwidth, DWORD dwheight, DWORD dwbpp, DWORD dwrefreshrate, DWORD dwflags) { - OutTraceDDRAW("GetDisplayMode: lpdd=%x lpddsd=%x\n", lpdd, lpddsd); + return extSetDisplayMode(2, lpdd, dwwidth, dwheight, dwbpp, dwrefreshrate, dwflags); +} + +HRESULT WINAPI extSetDisplayMode4(LPDIRECTDRAW lpdd, DWORD dwwidth, DWORD dwheight, DWORD dwbpp, DWORD dwrefreshrate, DWORD dwflags) +{ + return extSetDisplayMode(4, lpdd, dwwidth, dwheight, dwbpp, dwrefreshrate, dwflags); +} + +HRESULT WINAPI extSetDisplayMode7(LPDIRECTDRAW lpdd, DWORD dwwidth, DWORD dwheight, DWORD dwbpp, DWORD dwrefreshrate, DWORD dwflags) +{ + return extSetDisplayMode(7, lpdd, dwwidth, dwheight, dwbpp, dwrefreshrate, dwflags); +} + +HRESULT WINAPI extGetDisplayMode(GetDisplayMode_Type pGetDisplayMode, LPDIRECTDRAW lpdd, LPDDSURFACEDESC lpddsd) +{ + OutTraceDDRAW("GetDisplayMode(D1): lpdd=%x lpddsd=%x\n", lpdd, lpddsd); (*pGetDisplayMode)(lpdd, lpddsd); if(dxw.dwFlags1 & EMULATESURFACE) { @@ -2075,19 +2153,54 @@ HRESULT WINAPI extGetDisplayMode(LPDIRECTDRAW lpdd, LPDDSURFACEDESC lpddsd) OutTraceDDRAW("GetDisplayMode: returning size=(%dx%d) %s\n", lpddsd->dwWidth, lpddsd->dwHeight, DumpPixelFormat((LPDDSURFACEDESC2)lpddsd)); - return 0; + return DD_OK; } +HRESULT WINAPI extGetDisplayMode1(LPDIRECTDRAW lpdd, LPDDSURFACEDESC lpddsd) +{ + return extGetDisplayMode(pGetDisplayMode1, lpdd, lpddsd); +} -HRESULT WINAPI extSetCooperativeLevel(void *lpdd, HWND hwnd, DWORD dwflags) +HRESULT WINAPI extGetDisplayMode2(LPDIRECTDRAW lpdd, LPDDSURFACEDESC lpddsd) +{ + return extGetDisplayMode(pGetDisplayMode2, lpdd, lpddsd); +} + +HRESULT WINAPI extGetDisplayMode4(LPDIRECTDRAW lpdd, LPDDSURFACEDESC2 lpddsd) +{ + return extGetDisplayMode((GetDisplayMode_Type)pGetDisplayMode4, lpdd, (LPDDSURFACEDESC)lpddsd); +} + +HRESULT WINAPI extGetDisplayMode7(LPDIRECTDRAW lpdd, LPDDSURFACEDESC2 lpddsd) +{ + return extGetDisplayMode((GetDisplayMode_Type)pGetDisplayMode7, lpdd, (LPDDSURFACEDESC)lpddsd); +} + +HRESULT WINAPI extSetCooperativeLevel(int dxversion, SetCooperativeLevel_Type pSetCooperativeLevel, LPDIRECTDRAW 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)); + OutTraceDDRAW("SetCooperativeLevel(D%d): lpdd=%x hwnd=%x dwFlags=%x(%s)\n", + dxversion, lpdd, hwnd, dwflags,ExplainCoopFlags(dwflags)); - InitDDScreenParameters((LPDIRECTDRAW)lpdd); + DDSURFACEDESC2 ddsd; + switch(dxversion){ + default: + case 1: ddsd.dwSize=sizeof(DDSURFACEDESC); res=(*pGetDisplayMode1)(lpdd, (LPDDSURFACEDESC)&ddsd); break; + case 2: ddsd.dwSize=sizeof(DDSURFACEDESC); res=(*pGetDisplayMode2)(lpdd, (LPDDSURFACEDESC)&ddsd); break; + case 4: ddsd.dwSize=sizeof(DDSURFACEDESC2); res=(*pGetDisplayMode4)(lpdd, &ddsd); break; + case 7: ddsd.dwSize=sizeof(DDSURFACEDESC2); res=(*pGetDisplayMode7)(lpdd, &ddsd); break; + } + if(res){ + OutTraceE("SetCooperativeLevel: GetDisplayMode ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + return res; + } + + OutTraceDW("InitDDScreenParameters: Actual size=(%dx%d)%s\n", ddsd.dwWidth, ddsd.dwHeight, DumpPixelFormat((LPDDSURFACEDESC2)&ddsd)); + dxw.ActualPixelFormat=ddsd.ddpfPixelFormat; + if(dxw.VirtualPixelFormat.dwRGBBitCount==0) dxw.VirtualPixelFormat=ddsd.ddpfPixelFormat; + SetBltTransformations(); if(dxw.Windowize){ if (dwflags & DDSCL_FULLSCREEN){ @@ -2159,6 +2272,26 @@ HRESULT WINAPI extSetCooperativeLevel(void *lpdd, HWND hwnd, DWORD dwflags) return res; } +HRESULT WINAPI extSetCooperativeLevel1(LPDIRECTDRAW lpdd, HWND hwnd, DWORD dwflags) +{ + return extSetCooperativeLevel(1, pSetCooperativeLevel1, lpdd, hwnd, dwflags); +} + +HRESULT WINAPI extSetCooperativeLevel2(LPDIRECTDRAW lpdd, HWND hwnd, DWORD dwflags) +{ + return extSetCooperativeLevel(2, pSetCooperativeLevel2, lpdd, hwnd, dwflags); +} + +HRESULT WINAPI extSetCooperativeLevel4(LPDIRECTDRAW lpdd, HWND hwnd, DWORD dwflags) +{ + return extSetCooperativeLevel(4, pSetCooperativeLevel4, lpdd, hwnd, dwflags); +} + +HRESULT WINAPI extSetCooperativeLevel7(LPDIRECTDRAW lpdd, HWND hwnd, DWORD dwflags) +{ + return extSetCooperativeLevel(7, pSetCooperativeLevel7, lpdd, hwnd, dwflags); +} + static void FixSurfaceCaps(LPDDSURFACEDESC2 lpddsd, int dxversion) { // rules of thumb: @@ -3845,7 +3978,6 @@ HRESULT WINAPI extSetEntries(LPDIRECTDRAWPALETTE lpddp, DWORD dwflags, DWORD dws if(IsDebug) dxw.DumpPalette(dwcount, &lpentries[dwstart]); if((dxw.dwFlags1 & EMULATESURFACE) && (lpDDP == lpddp)){ - res = DD_OK; OutTraceDW("SetEntries: update PRIMARY palette lpDDP=%x\n", lpddp); if ((dwstart + dwcount > 256) || (dwstart<0)){ dwcount=256; @@ -3862,11 +3994,12 @@ HRESULT WINAPI extSetEntries(LPDIRECTDRAWPALETTE lpddp, DWORD dwflags, DWORD dws // v2.03.10: do not blit also in case of GDI mode if ((dxw.dwFlags1 & EMULATESURFACE) && !(dxw.dwFlags2 & NOPALETTEUPDATE) && !(dxw.dwFlags5 & GDIMODE)) dxw.ScreenRefresh(); } - else { - res = (*pSetEntries)(lpddp, dwflags, dwstart, dwcount, lpentries); - if(res) OutTraceE("SetEntries: ERROR res=%x(%s)\n", res, ExplainDDError(res)); - else OutTraceDDRAW("SetEntries: OK\n"); - } + + // this part (setentry against all surfaces, including virtual primary) can be necessary whenever the game uses mixed access to the + // screen (like ddraw & GDI) and is necessary on "Road Rash". + res = (*pSetEntries)(lpddp, dwflags, dwstart, dwcount, lpentries); + if(res) OutTraceE("SetEntries: ERROR res=%x(%s)\n", res, ExplainDDError(res)); + else OutTraceDDRAW("SetEntries: OK\n"); return res; } @@ -4502,13 +4635,9 @@ HRESULT WINAPI extEnumDisplayModes(EnumDisplayModes1_Type pEnumDisplayModes, LPD DDSURFACEDESC2 EmuDesc; memset(&EmuDesc, 0, sizeof(EmuDesc)); EmuDesc.dwSize = sizeof(DDSURFACEDESC); // using release 1 type .... - res=(*pGetDisplayMode)(lpdd, (LPDDSURFACEDESC)&EmuDesc); - if(res==DDERR_GENERIC){ // Win8 missing support for old ddraw interface - EmuDesc.dwSize = sizeof(DDSURFACEDESC2); // using release 2 type .... - res=(*pGetDisplayMode)(lpdd, (LPDDSURFACEDESC)&EmuDesc); - } + res=myGetDisplayMode(lpdd, (LPDDSURFACEDESC)&EmuDesc); if(res){ - OutTraceE("GetDisplayMode(D): ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + OutTraceE("EnumDisplayModes(D): GetDisplayMode ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; } NewContext_Type NewContext; diff --git a/dll/dinput.cpp b/dll/dinput.cpp index 43cf6d9..c404502 100644 --- a/dll/dinput.cpp +++ b/dll/dinput.cpp @@ -1,6 +1,8 @@ #define DIRECTINPUT_VERSION 0x800 #define _CRT_SECURE_NO_WARNINGS +#define RECOVERINPUTLOST TRUE // to become a flag? + #include #include #include "dxwnd.h" @@ -179,10 +181,10 @@ HRESULT WINAPI extDirectInputCreateEx(HINSTANCE hinst, DWORD dwversion, REFIID r OutTraceE("DirectInputCreateEx: ERROR err=%x(%s)\n", res, ExplainDDError(res)); return res; } - SetHook((void *)(**(DWORD **)ppvout + 12), extDICreateDevice, (void **)&pDICreateDevice, "CreateDevice(I)"); - SetHook((void *)(**(DWORD **)ppvout + 16), extDIEnumDevices, (void **)&pDIEnumDevices, "EnumDevices(I)"); - if(dwversion > 700) - SetHook((void *)(**(DWORD **)ppvout + 36), extDICreateDeviceEx, (void **)&pDICreateDeviceEx, "DICreateDeviceEx(I)"); + SetHook((void *)(**(DWORD **)ppvout + 12), extDICreateDevice, (void **)&pDICreateDevice, "CreateDevice(I7)"); + SetHook((void *)(**(DWORD **)ppvout + 16), extDIEnumDevices, (void **)&pDIEnumDevices, "EnumDevices(I7)"); + if(dwversion >= 700) + SetHook((void *)(**(DWORD **)ppvout + 36), extDICreateDeviceEx, (void **)&pDICreateDeviceEx, "CreateDeviceEx(I7)"); return 0; } @@ -197,11 +199,22 @@ HRESULT WINAPI extDIQueryInterface(void * lpdi, REFIID riid, LPVOID *obp) if(res) return res; switch(riid.Data1){ - case 0x5944E662: //DirectInput2A - case 0x5944E663: //DirectInput2W + case 0x89521360: //DirectInputA + case 0x89521361: //DirectInputW SetHook((void *)(**(DWORD **)obp + 12), extDICreateDevice, (void **)&pDICreateDevice, "CreateDevice(I)"); SetHook((void *)(**(DWORD **)obp + 16), extDIEnumDevices, (void **)&pDIEnumDevices, "EnumDevices(I)"); break; + case 0x5944E662: //DirectInput2A + case 0x5944E663: //DirectInput2W + SetHook((void *)(**(DWORD **)obp + 12), extDICreateDevice, (void **)&pDICreateDevice, "CreateDevice(I2)"); + SetHook((void *)(**(DWORD **)obp + 16), extDIEnumDevices, (void **)&pDIEnumDevices, "EnumDevices(I2)"); + break; + case 0x9A4CB684: //IDirectInput7A + case 0x9A4CB685: //IDirectInput7W + SetHook((void *)(**(DWORD **)obp + 12), extDICreateDevice, (void **)&pDICreateDevice, "CreateDevice(I7)"); + SetHook((void *)(**(DWORD **)obp + 16), extDIEnumDevices, (void **)&pDIEnumDevices, "EnumDevices(I7)"); + SetHook((void *)(**(DWORD **)obp + 36), extDICreateDeviceEx, (void **)&pDICreateDeviceEx, "CreateDeviceEx(I7)"); + break; } return 0; } @@ -403,6 +416,17 @@ HRESULT WINAPI extGetDeviceState(LPDIRECTINPUTDEVICE lpdid, DWORD cbdata, LPDIMO OutTraceDW("GetDeviceState(I): did=%x cbData=%i,%i\n", lpdid, cbdata, dxw.bActive); res = (*pGetDeviceState)(lpdid, cbdata, lpvdata); + + if ((res == DIERR_INPUTLOST) && RECOVERINPUTLOST){ + OutTraceE("GetDeviceState(I) recovering DIERR_INPUTLOST\n"); + res = (*pDISetCooperativeLevel)(lpdid, dxw.GethWnd(), DISCL_NONEXCLUSIVE | DISCL_FOREGROUND); + if(res) OutTraceE("GetDeviceState(I): SetCooperativeLevel ERROR: err=%x(%s)\n", res, ExplainDDError(res)); + res = (*pAcquire)(lpdid); + if(res) OutTraceE("GetDeviceState(I): Acquire ERROR: err=%x(%s)\n", res, ExplainDDError(res)); + if(dxw.dwFlags1 & CLIPCURSOR) dxw.SetClipCursor(); + res = (*pGetDeviceState)(lpdid, cbdata, lpvdata); + } + switch(res){ case DI_OK: break; @@ -419,14 +443,29 @@ HRESULT WINAPI extGetDeviceState(LPDIRECTINPUTDEVICE lpdid, DWORD cbdata, LPDIMO if( cbdata == sizeof(DIMOUSESTATE) || cbdata == sizeof(DIMOUSESTATE2) // || cbdata == sizeof(DIJOYSTATE) || cbdata == sizeof(DIJOYSTATE2) ){ + int iMaxX, iMaxY, iMinX, iMinY; + if(dxw.dwFlags1 & MODIFYMOUSE){ + iMinX = iCurMinX ? iCurMinX : 0; + iMaxX = iCurMaxX ? iCurMaxX : dxw.GetScreenWidth(); + iMinY = iCurMinY ? iCurMinY : 0; + iMaxY = iCurMaxY ? iCurMaxY : dxw.GetScreenHeight(); + } + else { + RECT WinRect = dxw.GetMainWindow(); + iMinX = iCurMinX ? iCurMinX : WinRect.left; + iMaxX = iCurMaxX ? iCurMaxX : WinRect.right; + iMinY = iCurMinY ? iCurMinY : WinRect.top; + iMaxY = iCurMaxY ? iCurMaxY : WinRect.bottom; + } + OutTraceB("GetDeviceState(I): CLIP (%d,%d)-(%d,%d)\n", iMinX, iMinY, iMaxX, iMaxY); GetMousePosition((int *)&p.x, (int *)&p.y); lpvdata->lX = p.x; lpvdata->lY = p.y; if(!dxw.bDInputAbs){ - if(p.x < iCurMinX) p.x = iCurMinX; - if(p.x > iCurMaxX) p.x = iCurMaxX; - if(p.y < iCurMinY) p.y = iCurMinY; - if(p.y > iCurMaxY) p.y = iCurMaxY; + if(p.x < iMinX) p.x = iMinX; + if(p.x > iMaxX) p.x = iMaxX; + if(p.y < iMinY) p.y = iMinY; + if(p.y > iMaxY) p.y = iMaxY; lpvdata->lX = p.x - iCursorX; lpvdata->lY = p.y - iCursorY; iCursorX = p.x; @@ -607,10 +646,12 @@ void ToggleAcquiredDevices(BOOL flag) if(lpDIDSysMouse) (*pAcquire)(lpDIDSysMouse); if(lpDIDKeyboard) (*pAcquire)(lpDIDKeyboard); if(lpDIDJoystick) (*pAcquire)(lpDIDJoystick); + if (dxw.dwFlags1 & CLIPCURSOR) dxw.SetClipCursor(); } if(!flag && pUnacquire){ if(lpDIDSysMouse) (*pUnacquire)(lpDIDSysMouse); if(lpDIDKeyboard) (*pUnacquire)(lpDIDKeyboard); if(lpDIDJoystick) (*pUnacquire)(lpDIDJoystick); + if (dxw.dwFlags1 & CLIPCURSOR) dxw.EraseClipCursor(); } } diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 6249cbd..babb6a7 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -1222,12 +1222,18 @@ void HookInit(TARGETMAP *target, HWND hwnd) if(IsTraceDW){ char sInfo[1024]; + OSVERSIONINFO osinfo; strcpy(sInfo, ""); if(hwnd) sprintf(sInfo, " hWnd=%x(hdc=%x) dxw.hParentWnd=%x(hdc=%x) desktop=%x(hdc=%x)", hwnd, GetDC(hwnd), dxw.hParentWnd, GetDC(dxw.hParentWnd), GetDesktopWindow(), GetDC(GetDesktopWindow())); OutTrace("HookInit: path=\"%s\" module=\"%s\" dxversion=%s pos=(%d,%d) size=(%d,%d)%s\n", target->path, target->module, dxversions[dxw.dwTargetDDVersion], target->posx, target->posy, target->sizx, target->sizy, sInfo); + osinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + if(GetVersionEx(&osinfo)){ + OutTrace("OS=(%d.%d) build=%d platform=%d service pack=%s\n", + osinfo.dwMajorVersion, osinfo.dwMinorVersion, osinfo.dwPlatformId, osinfo.dwPlatformId, osinfo.szCSDVersion); + } if (dxw.dwFlags4 & LIMITSCREENRES) OutTrace("HookInit: max resolution=%s\n", (dxw.MaxScreenRes<6)?Resolutions[dxw.MaxScreenRes]:"unknown"); } diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index 483f90f..2dc6f5f 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -452,10 +452,15 @@ void dxwCore::SetClipCursor() OutTraceDW("SetClipCursor: ASSERT hWnd==NULL\n"); return; } - if(!(*pGetClientRect)(hWnd, &Rect)) + // check for errors to avoid setting random clip regions + if(!(*pGetClientRect)(hWnd, &Rect)){ OutTraceE("GetClientRect: ERROR err=%d at %d\n", GetLastError(), __LINE__); - if(!(*pClientToScreen)(hWnd, &UpLeftCorner)) + return; + } + if(!(*pClientToScreen)(hWnd, &UpLeftCorner)){ OutTraceE("ClientToScreen: ERROR err=%d at %d\n", GetLastError(), __LINE__); + return ; + } Rect.left+=UpLeftCorner.x; Rect.right+=UpLeftCorner.x; Rect.top+=UpLeftCorner.y; @@ -782,6 +787,19 @@ void dxwCore::UnmapWindow(LPRECT rect) rect->bottom= ((rect->bottom - upleft.y) * (int)dwScreenHeight) / client.bottom; } +RECT dxwCore::GetMainWindow() +{ + RECT client; + POINT upleft = {0,0}; + (*pGetClientRect)(hWnd, &client); + (*pClientToScreen)(hWnd, &upleft); + client.left += upleft.x; + client.right += upleft.x; + client.top += upleft.y; + client.bottom += upleft.y; + return client; +} + void dxwCore::UnmapWindow(LPPOINT point) { RECT client; diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp index f576e69..7312e1b 100644 --- a/dll/dxwcore.hpp +++ b/dll/dxwcore.hpp @@ -78,6 +78,7 @@ public: // methods void MapWindow(int *, int *, int *, int *); void UnmapWindow(LPRECT); void UnmapWindow(LPPOINT); + RECT GetMainWindow(void); void FixWorkarea(LPRECT); RECT GetScreenRect(void); RECT GetUnmappedScreenRect(); diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 4c9cb01..987aaa4 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.49" +#define VERSION "2.03.50" #define DDTHREADLOCK 1 //#define LOCKTHREADS diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 16184da77a428310401b544f206955c7d42d90b7..0f47bf7451f2ea4fa6b03acb9ff71c42b02b3cfe 100644 GIT binary patch delta 27357 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 delta 6455 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 diff --git a/dll/dxwnd.vs2008.vcproj b/dll/dxwnd.vs2008.vcproj index f060b2b..1825348 100644 --- a/dll/dxwnd.vs2008.vcproj +++ b/dll/dxwnd.vs2008.vcproj @@ -502,6 +502,10 @@ RelativePath=".\dxwcore.hpp" > + + diff --git a/dll/glhook.h b/dll/glhook.h index c270bb5..82b1efc 100644 --- a/dll/glhook.h +++ b/dll/glhook.h @@ -2,6 +2,7 @@ extern void HookOpenGLLibs(HMODULE, char *); +typedef GLenum (WINAPI *glGetError_Type)(); typedef void (WINAPI *glViewport_Type)(GLint, GLint, GLsizei, GLsizei); typedef void (WINAPI *glScissor_Type)(GLint, GLint, GLsizei, GLsizei); typedef void (WINAPI *glGetIntegerv_Type)(GLenum, GLint *); @@ -17,6 +18,7 @@ typedef BOOL (WINAPI *wglMakeCurrent_Type)(HDC, HGLRC); typedef void (WINAPI *glTexImage2D_Type)(GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const GLvoid *); typedef void (WINAPI *glPixelZoom_Type)(GLfloat, GLfloat); +extern GLenum WINAPI extglGetError(); extern void WINAPI extglViewport(GLint, GLint, GLsizei, GLsizei); extern void WINAPI extglScissor(GLint, GLint, GLsizei, GLsizei); extern void WINAPI extglGetIntegerv(GLenum, GLint *); @@ -45,6 +47,7 @@ extern void WINAPI extglPixelZoom(GLfloat, GLfloat); #endif // GDI32.dll: +DXWEXTERN glGetError_Type pglGetError; DXWEXTERN glViewport_Type pglViewport; DXWEXTERN glScissor_Type pglScissor; DXWEXTERN glGetIntegerv_Type pglGetIntegerv; diff --git a/dll/hddraw.h b/dll/hddraw.h index 3ac8b6d..d5fc7aa 100644 --- a/dll/hddraw.h +++ b/dll/hddraw.h @@ -44,6 +44,7 @@ typedef HRESULT (WINAPI *EnumSurfaces4_Type)(LPDIRECTDRAW, DWORD, LPDDSURFACEDES typedef HRESULT (WINAPI *FlipToGDISurface_Type)(LPDIRECTDRAW); typedef HRESULT (WINAPI *GetCapsD_Type)(LPDIRECTDRAW, LPDDCAPS, LPDDCAPS); typedef HRESULT (WINAPI *GetDisplayMode_Type)(LPDIRECTDRAW, LPDDSURFACEDESC); +typedef HRESULT (WINAPI *GetDisplayMode4_Type)(LPDIRECTDRAW, LPDDSURFACEDESC2); typedef HRESULT (WINAPI *GetFourCCCodes_Type)(LPDIRECTDRAW, LPDWORD, LPDWORD); typedef HRESULT (WINAPI *GetGDISurface_Type)(LPDIRECTDRAW, LPDIRECTDRAWSURFACE *); typedef HRESULT (WINAPI *GetMonitorFrequency_Type)(LPDIRECTDRAW, LPDWORD); diff --git a/dll/opengl.cpp b/dll/opengl.cpp index a6d284a..b53e7eb 100644 --- a/dll/opengl.cpp +++ b/dll/opengl.cpp @@ -25,6 +25,7 @@ //glDrawPixels_Type pglDrawPixels = NULL; static HookEntry_Type Hooks[]={ + {HOOK_IAT_CANDIDATE, "glGetError", NULL, (FARPROC *)&pglGetError, (FARPROC)extglGetError}, {HOOK_IAT_CANDIDATE, "glViewport", NULL, (FARPROC *)&pglViewport, (FARPROC)extglViewport}, {HOOK_IAT_CANDIDATE, "glScissor", NULL, (FARPROC *)&pglScissor, (FARPROC)extglScissor}, {HOOK_IAT_CANDIDATE, "glGetIntegerv", NULL, (FARPROC *)&pglGetIntegerv, (FARPROC)&extglGetIntegerv}, @@ -113,6 +114,13 @@ void HookOpenGLLibs(HMODULE module, char *customlib) return; } +GLenum WINAPI extglGetError() +{ + // to avoid dependencies on opengl32.dll + if (pglGetError) return (*pglGetError)(); + return GL_NO_ERROR; +} + void WINAPI extglViewport(GLint x, GLint y, GLsizei width, GLsizei height) { RECT client; @@ -485,7 +493,7 @@ void WINAPI extglDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum width, height, format, ExplainDrawPixelsFormat(format), type, data); (*pglDrawPixels)(width, height, format, type, data); - if ((glerr=glGetError())!= GL_NO_ERROR) OutTrace("GLERR %d ad %d\n", glerr, __LINE__); + if ((glerr=extglGetError())!= GL_NO_ERROR) OutTrace("GLERR %d ad %d\n", glerr, __LINE__); return; } #endif @@ -503,6 +511,6 @@ void WINAPI extglPixelZoom(GLfloat xfactor, GLfloat yfactor) OutTraceDW("glPixelZoom: FIXED x,y factor=(%f,%f)\n", xfactor, yfactor); } (*pglPixelZoom)(xfactor, yfactor); - if ((glerr=glGetError())!= GL_NO_ERROR) OutTrace("GLERR %d ad %d\n", glerr, __LINE__); + if ((glerr=extglGetError())!= GL_NO_ERROR) OutTrace("GLERR %d ad %d\n", glerr, __LINE__); return; } diff --git a/dll/user32.cpp b/dll/user32.cpp index 6fc1c26..ba7697c 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -1530,6 +1530,8 @@ static HWND WINAPI extCreateWindowCommon( (*pShowWindow)(hwnd, SW_MAXIMIZE); } + if(dxw.dwFlags1 & CLIPCURSOR) dxw.SetClipCursor(); + OutTraceDW("%s: ret=%x\n", ApiName, hwnd); return hwnd; } @@ -1671,33 +1673,25 @@ LRESULT WINAPI extCallWindowProcW(WNDPROC lpPrevWndFunc, HWND hwnd, UINT Msg, WP LRESULT WINAPI extDefWindowProcA(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) { // v2.02.30: fix (Imperialism II): apply to main window only !!! + // v2.03.50: fix - do clip cursor only after the window has got focus HRESULT res; - res = (HRESULT)-1; if(hwnd == dxw.GethWnd()) res=FixWindowProc("DefWindowProcA", hwnd, Msg, wParam, &lParam); - + if (res==(HRESULT)-1) res = (*pDefWindowProcA)(hwnd, Msg, wParam, lParam); if((Msg == WM_SETFOCUS) && (dxw.dwFlags1 & CLIPCURSOR)) dxw.SetClipCursor(); - - if (res==(HRESULT)-1) - return (*pDefWindowProcA)(hwnd, Msg, wParam, lParam); - else - return res; + return res; } LRESULT WINAPI extDefWindowProcW(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) { // v2.02.30: fix (Imperialism II): apply to main window only !!! + // v2.03.50: fix - do clip cursor only after the window has got focus HRESULT res; - res = (HRESULT)-1; if(hwnd == dxw.GethWnd()) res=FixWindowProc("DefWindowProcW", hwnd, Msg, wParam, &lParam); - + if (res==(HRESULT)-1) res = (*pDefWindowProcW)(hwnd, Msg, wParam, lParam); if((Msg == WM_SETFOCUS) && (dxw.dwFlags1 & CLIPCURSOR)) dxw.SetClipCursor(); - - if (res==(HRESULT)-1) - return (*pDefWindowProcW)(hwnd, Msg, wParam, lParam); - else - return res; + return res; } static int HandleRect(char *ApiName, void *pFun, HDC hdc, const RECT *lprc, HBRUSH hbr) diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index 0319b046fbe39e8f6d2236e4e7a05127ecce3bfb..35348943a8ac741b21baa68758d3acece22297b6 100644 GIT binary patch delta 22242 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 F{|8+bxby%3 delta 3679 zcmZu!dr(tX8b9X-c}bNj2qq+iM{##m%u5JZrNLYw5=czKL#swtL|m;@gODV*bx0zi|wXs^jR{t8^`Grsa=0R)UKrh$E&7=+T}T+w%QVEmx-aa zvPNi{slBwGkX%AYIjJS3*am~c_?Hj^NsbY|=>MMve!7rSTu?*`C~?^Rl`gwu$#P;g z6&4yvA*bx3Q}l_PG7&4MY<4@xW>N%~Gp4r}bJkN`#o0o#fMa)C^?E z>(T@_g{G^i?aTNeudPOu21;X$M&jY5l+y2WREl1w!!CNbW+Gm$+3RYn>{t{h&BUh+ zu#4UbAD^DpXd%^Hkd`aFW>%w>)NocRa;o1WdaEl#iHk@rwLvYV~^V z3CaG&PM4QY%3Meq;N`4z%?2(@b1t=c{N=c!JVOy_q_E~%+Wd`N_liD`SmyBhJkk}h zT8!iml;C3HN%A?C|+6~Wgb@O^cMxU+JUuknxNyE)%vR`3qaLHYqwvb*d;D=QDKCF2q zJ?((vv77DOQAiF_(2vi^?^86qg$}WF_8~} z=B29+;X1fjY9>}^v5>=xwaVoaLxJWKMuFZ*PaB}bZ*zP7X1jl}tIFqbIlaV4jzN1~ zCOr$u|c!imnzz}MS%DAe15+MQPvI216yy_Cv%{vJ5gHl(PJU{&WFS$q;W(OIO3 zy1>JCW+~7fFz)?CiL?&x?Nes632a>oYJtODWpdbE@TjX?M%_@|Eu&bkDi=2p-aL{D z*Sn|5CLjFL{aYDTLvfE>B?NmCVPB6vtU}5DL>P|1ZTlxf;(nd1UqHNczgEUi5qC%6 z1-+ADI0ElP9M`M(|BQHvf@uTn>YWviMmNA$5vVcnOYf0HVJLxJY!YU?#NQ7lj_Dls zW0R1RSFR$Y52;`<2A>Wt8j>eG*u+yp9;?{J1gc*0Z^ZgZVeflU-bQ2$v67yk#Nw{d zA5#n==VMu05>@AoAeA&(@=n5M4>v^S?Ly}9WOngo%v+3CYcMJ7JsjmNh$rOfl(5dC z^xt4!Um8ib#AxAY~@5fQzyBO=rE39WWRmV<2?{GdlV8Q-YjPcmYE-s?#hMy7$ z>0KC(aV#pvYsmDKh4tf6`pGy#?#ud#C_NEt_|nC8R%0$5dhgVRV|^0k-HnXiAJ$Jr z>AlGOMb<62o47|2`zz^g!_Y6BTgc&Zi3NhJd&q-z#K3E}sk|Q!m!CHq| z@im;xY2?ojvo`GW(y}|g4`-3)|Enx${_=aab9}-)d-p%X<^wM@4{=?pBA!j%CZq~G zp0Gt!P*0W8o_!K7F@cM!)+EXnOcQ3tN$P0?O$b5@){MUpLJQXa!bGRElx@nHaL?YH zA9jE6LiZrorLvMjnHx(en;y@jiwOW|jz5;<8Ur9qFQ=&%xfOU_^`t&G$ z4~`#M86MvmrFUUv&8x!tgJ0|Mqyqz_`zaf*$I^=NOW{0%_VoykAxNpGY;+@nSd4SC mk+LIO5J*4Q@TIbUmp1MO&g|}W+=pfXK|bEGZz-@w?f(HL#q{(5 diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index 5232184d54d182a312f87511317f908c10f58922..ab24fcc71d5ae6e626c158056a4b0e9bc70cee05 100644 GIT binary patch delta 2297 zcmbtVZ%|ZK6u)=(?PC#yWkFcx;x3z7$bzw7&Eh$aeaV00a~KPU=b9Lu5Lwoem66@2Y)?qU6wxD! zN>5IfH;CJb=Mw+oqlfGh)7QcR*GOMNlz10>DPc**>O>P)c?`+1vw;R|)hf3TG@FG!9T9rcUCPUZB(~Rw8j*G_=x)#B1En+_z(op)kgJ&5N z-A{8I9CTr_KNYt#Y*hA4>>~$1zwdyrUq$f2c*GYZm?=QCG*x5#e5LWZ+h$7_UmRV7 z6#aRkAtLIE97D@LWmlPp)Hf6U32onM`7Q4CXW*YN6DEpWVAWulxFQE1*7@>EBNSpTIux?82}Z^n2>0_xsz;%e_gG!Hf4 z;IOEb1J`sn_H?+=Hsrzn!iC5lE^g}_Q|XQ}W{yUoeo9d^(Eab+pz;m0voX4Zz`N8T ziZ|{QS?m-+QgIe_r=hXSiss?VGZ_uVrn4@<1- z4s4UeY9y9Jc3UO3OJW&>)kKVq##fBe{b3 z28lUI{)rrkwOeAs`5uzRIv_ET*~27@TD~GNC&@2KyLPJtmm=xq!gOK2jHpL$hlq<# zU}$Y$jL9k$n@`SMw9>x$IClChR(a;^_=DaMhhHZW9`cFAOt%r;BodgQ+eG3DOiNwt z&m|IBRLMZth!sOZJ#j1c`ID`&q=^`Ct7{DppsOz30~$iQzNa3h!y3@XavHC;&*w1pQyTC3`=9~!H-8AbLI3~& delta 3492 zcmcImZA_cj6~5Pg{bC>?wjsu$j%|#gbPWXa6-Y`#5}KyQ5Yti-ftR8*$1W~1F_(Y4yLVVbhk25hBrmY(KEn$nA z$TrW$@@Qx2v{rDYxD*1NdV^NW4hHo=u#(DJqKXI-)kF=kj;JGE=70Q%XrSImtj9;D z65m#8EyVrAHsS$dJMkd#HjyaLnw1#w>d@kj#K!CsQkQ1(%NM-LrdK(wMkLepus=6! z(P?3wx40eD5})M$+H_oUdGWFOcd=4L&0jO+sJ;4!Nhn@5Yg4YxP=@*qA%rQ}S3O;1 z2{l70QAgZG?su=&I{r5M*Ez*|*;kw3Sj79-R~utbY+hlKxaMj?%(m6=cg7a6=5okL z*r`}Kj@lz=u~+H&B+q8!Q+o*SWRL^W)1--{o(>oHZ>gne$i zrSZ`thabb)LN8f6mT}~mJCJ)UX)T0P!d4KL1NhLB&j8%ip7oZh^kb^Tc6>k#h;Oop zwy?MwSY%05hY{H&)GbMc) z-kK}LlNj_m4PTSn?Q43-A)j+J71wFlRot1{v} zg*pK)#G=d@MS<7S|&hiW6ks3uX(0i~&sg4H#(b@iXW${EhQCrhx zZuvXJ6mgZ9Bz{7u)BIh^Y2v5E&xmWpd&JL)Ul6m2Rdr*IO<%CUCmWWm&zjoB-w|Wo%foX% zas&e<{8IB0x7%L4Z|^A2IF&AimooHMQu?bYIi8ZQr{u+yOr+$SDfu?#W#S#;N{XAr z#cyqrzvb_dq2At0C%0RqJ$=w7jt=d}(xtjQx28GFyx56fYHM)x`#W^0Zv7qUq1-Xf z*-M5E7q8rlnbm%Hd~R&)_a#2QS|rW2q7gE_k|(W0HsUYgn&HziY-#f|WX(9%l1Gvi z&hb3Nd0_cR)R+sEo&a|J(2wfCf~`6znos-S@%V?&T+^kx>hnpys1+IAamQ_f!pgFdxpUZJ{hyP2YlTaLX*hMoEtt;=0qPkx{# zQGN(?>@L2;+fyFb^6$w?EyLouyRy}d80KtYW40TU<*>C|HM%3uqd*m;DE zBD+)4l+r0gPl{7^(UiU?!%pd{?ai>;m(mYp*ePALuTvT!urB!>n#2*DJFSW`nIWbQ zCz+kFw@0Ey^=(zM+CvKGNLi{w-KU$DVunPy{MflE37jXDo z0p2gs@X%^d{zr>=Oz@Wf6JHI^@$<@_?QTw~+FDBGx4^T3dtjO@ z!tFL6Zl3Fw2e7&Q0a!Z&vI4<)4>Pq-MljUhWLht*HwQ)bz zcK~ygHGQxc6*Bw@(sRl=WwgI8L{Bb z|5s2>9v{v-if8}pS6FZv+w4Sh%}y!t$JQ>R3Nwn=ICsWTQ0zy0$b~~;E$yV4-zJU+ z+N2GCU#)^Nj-A8@m;4gVBV%YD56g9E`gVs581eC#{;Ul%mhg<$D$me<)rY<-ZurMC mmvu><+gpl>*01m(W<}p~1&BN!GV^_lch|JZEMuMako7+W&Y=nb