diff --git a/Include/dxwnd.h b/Include/dxwnd.h index 9c9655b..3ea6c87 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -64,7 +64,7 @@ #define TIMESTRETCH 0x00010000 // make system time stretchable #define HOOKOPENGL 0x00020000 // Hook OpenGL calls #define WALLPAPERMODE 0x00040000 // mouse events are discarded (good for screensaver-like) -#define SHOWHWCURSOR 0x00080000 // mouse events are discarded (good for screensaver-like) +#define SHOWHWCURSOR 0x00080000 // enable hardware cursor #define HOOKGDI 0x00100000 // Hook GDI functions #define SHOWFPSOVERLAY 0x00200000 // shows FPS value to status win / log / screen overlay #define FAKEVERSION 0x00400000 // pretends the platvorm is a given window version / subversion diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 82a5525..07abbc0 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cf9c7d5fd45f8f880656efab5c5db5ef3a0a8e74942d2b2418bf5a49f8fab39b +oid sha256:c96cb2622942095b2b952937cc60ce9ba524aaf8921ddfc68088c370d79d2ff1 size 426496 diff --git a/build/dxwnd.ini b/build/dxwnd.ini index b3f5bec..5367e19 100644 --- a/build/dxwnd.ini +++ b/build/dxwnd.ini @@ -1,15 +1,15 @@ [target] -title0=Ancient Evil (DEMO) -path0=D:\Games\Ancient Evil (Demo)\aecsc-demo.exe +title0=007 NightFire +path0=D:\Games\007_NightFire\Bond.exe module0= opengllib0= ver0=0 coord0=0 -flag0=203440160 -flagg0=134217744 +flag0=134234150 +flagg0=1207959552 flagh0=20 -flagi0=0 -tflag0=259 +flagi0=4 +tflag0=0 initx0=0 inity0=0 minx0=0 @@ -22,17 +22,17 @@ sizx0=800 sizy0=600 maxfps0=0 initts0=0 -title1=Duckman -path1=D:\Games\Duckman\DUCKMAN.EXE +title1=101 The Airborne Invasion of Normandy +path1=D:\Games\101air\101.exe module1= opengllib1= ver1=0 coord1=0 -flag1=134217762 -flagg1=1209008128 +flag1=134234146 +flagg1=134217728 flagh1=20 -flagi1=4 -tflag1=259 +flagi1=0 +tflag1=192 initx1=0 inity1=0 minx1=0 @@ -45,17 +45,17 @@ sizx1=800 sizy1=600 maxfps1=0 initts1=0 -title2=Dungeon Keeper 2 (GOG) -path2=D:\Games\Dungeon Keeper 2 (GOG)\DKII.EXE +title2=A10 Cuba +path2=D:\Games\A10\A10Cuba.exe module2= opengllib2= ver2=0 coord2=0 -flag2=136331298 -flagg2=1241513984 +flag2=671096866 +flagg2=1207959568 flagh2=20 -flagi2=0 -tflag2=259 +flagi2=4 +tflag2=2 initx2=0 inity2=0 minx2=0 @@ -68,17 +68,17 @@ sizx2=800 sizy2=600 maxfps2=0 initts2=0 -title3=Empire Earth -path3=D:\Games\Empire Earth\Empire Earth.exe +title3=Actua Soccer 3 +path3=D:\Games\ActuaSoccer3\SOCCER3D.EXE module3= opengllib3= ver3=0 coord3=0 -flag3=687866016 -flagg3=201326848 -flagh3=65620 -flagi3=0 -tflag3=263 +flag3=671088674 +flagg3=1207959552 +flagh3=20 +flagi3=4 +tflag3=0 initx3=0 inity3=0 minx3=0 @@ -91,17 +91,17 @@ sizx3=800 sizy3=600 maxfps3=0 initts3=0 -title4=Grand Prix World -path4=D:\Games\Grand Prix World\gpw.exe +title4=Age of Empires III +path4=D:\Games\Age of Empires III\age3.exe module4= opengllib4= ver4=0 coord4=0 -flag4=134217762 -flagg4=1207959680 -flagh4=84 -flagi4=4 -tflag4=0 +flag4=1753358370 +flagg4=134217728 +flagh4=20 +flagi4=0 +tflag4=2 initx4=0 inity4=0 minx4=0 @@ -114,17 +114,17 @@ sizx4=800 sizy4=600 maxfps4=0 initts4=0 -title5=Hearts of Iron 2 -path5=D:\Games\Hearts of Iron 2\HoI2.exe +title5=Ancient Evil (DEMO) +path5=D:\Games\Ancient Evil (Demo)\aecsc-demo.exe module5= opengllib5= ver5=0 -coord5=2 -flag5=939526179 -flagg5=1207959568 -flagh5=32788 -flagi5=2 -tflag5=2 +coord5=0 +flag5=203440160 +flagg5=134217744 +flagh5=20 +flagi5=0 +tflag5=258 initx5=0 inity5=0 minx5=0 @@ -137,17 +137,17 @@ sizx5=800 sizy5=600 maxfps5=0 initts5=0 -title6=Heroes of Might and Magic IV -path6=D:\Games\Heroes of Might and Magic IV\heroes4.exe +title6=Beavis & Butthead Do U. +path6=D:\Games\B_b\BEAVIS.EXE module6= opengllib6= ver6=0 -coord6=2 -flag6=671350818 -flagg6=1207959568 -flagh6=-2147418092 -flagi6=1 -tflag6=259 +coord6=0 +flag6=671090722 +flagg6=1207959552 +flagh6=32788 +flagi6=0 +tflag6=2 initx6=0 inity6=0 minx6=0 @@ -160,17 +160,17 @@ sizx6=800 sizy6=600 maxfps6=0 initts6=0 -title7=Motocross Madness (DEMO) -path7=D:\Games\Motocross Madness Trial\mcm.exe +title7=Black & White +path7=D:\Games\Black & White\runblack.exe module7= opengllib7= ver7=0 -coord7=0 -flag7=134217760 -flagg7=1207959552 +coord7=1 +flag7=679477280 +flagg7=1207959568 flagh7=20 -flagi7=0 -tflag7=0 +flagi7=4 +tflag7=258 initx7=0 inity7=0 minx7=0 @@ -183,17 +183,17 @@ sizx7=800 sizy7=600 maxfps7=0 initts7=0 -title8=Praetorians -path8=D:\games\Praetorians\Praetorians.exe +title8=Bunnies must die +path8=D:\Games\Bunnies must die\bmd.exe module8= opengllib8= -ver8=0 +ver8=1 coord8=0 -flag8=134217760 -flagg8=1207959552 -flagh8=20 +flag8=142606370 +flagg8=1744830465 +flagh8=65556 flagi8=4 -tflag8=3 +tflag8=258 initx8=0 inity8=0 minx8=0 @@ -206,17 +206,17 @@ sizx8=800 sizy8=600 maxfps8=0 initts8=0 -title9=Project Nomads (DEMO) -path9=D:\Games\Project Nomads Demo\bin\win32\nomads.exe +title9=Carmageddon 2 (GLIDE) +path9=D:\Games\Carmageddon_2\carma2_HW.exe module9= opengllib9= -ver9=8 +ver9=0 coord9=0 -flag9=-1476394974 -flagg9=1207959808 -flagh9=4 -flagi9=0 -tflag9=274 +flag9=134217730 +flagg9=1208025088 +flagh9=20 +flagi9=12 +tflag9=0 initx9=0 inity9=0 minx9=0 @@ -229,17 +229,17 @@ sizx9=800 sizy9=600 maxfps9=0 initts9=0 -title10=Rayman 2 Demo -path10=D:\Games\Rayman2Demo\Rayman2Demo.exe +title10=Carmageddon 2 (SW) +path10=D:\Games\Carmageddon_2\carma2_SW.exe module10= opengllib10= -ver10=7 +ver10=0 coord10=0 -flag10=402653219 +flag10=671088674 flagg10=1208025088 -flagh10=2097172 -flagi10=0 -tflag10=259 +flagh10=33562644 +flagi10=12 +tflag10=0 initx10=0 inity10=0 minx10=0 @@ -251,18 +251,18 @@ posy10=50 sizx10=800 sizy10=600 maxfps10=0 -initts10=4 -title11=Shadows of the Empire (DEMO) -path11=D:\Games\Shadows of the Empire\shadows.exe +initts10=0 +title11=Cave Story +path11=D:\Games\Cave Story\Doukutsu.exe module11= opengllib11= ver11=0 -coord11=2 -flag11=134479906 -flagg11=1207959568 -flagh11=33554452 -flagi11=0 -tflag11=274 +coord11=0 +flag11=134217762 +flagg11=1207959552 +flagh11=20 +flagi11=4 +tflag11=0 initx11=0 inity11=0 minx11=0 @@ -275,17 +275,17 @@ sizx11=800 sizy11=600 maxfps11=0 initts11=0 -title12=StarCraft -path12=D:\Games\Starcraft\StarCraft.exe +title12=Crimson Skies +path12=D:\Games\Crimson_Skies\crimson.exe module12= opengllib12= -ver12=0 +ver12=7 coord12=0 -flag12=134217762 -flagg12=134283264 +flag12=134234148 +flagg12=1207959552 flagh12=20 -flagi12=8 -tflag12=64 +flagi12=4 +tflag12=258 initx12=0 inity12=0 minx12=0 @@ -298,17 +298,17 @@ sizx12=800 sizy12=600 maxfps12=0 initts12=0 -title13=Tomb Raider 4 (DEMO) -path13=D:\Games\Tomb Raider - The Last Revelation (Demo)\tomb4.exe +title13=Daikatana +path13=D:\Games\Daikatana\daikatana.exe module13= opengllib13= -ver13=7 +ver13=12 coord13=0 -flag13=134217760 -flagg13=1207959552 +flag13=269492742 +flagg13=537002497 flagh13=20 flagi13=0 -tflag13=258 +tflag13=2 initx13=0 inity13=0 minx13=0 @@ -321,17 +321,17 @@ sizx13=800 sizy13=600 maxfps13=0 initts13=0 -title14=Tomb Raider II -path14=D:\Games\Tomb Raider II\Tomb2.exe +title14=Devastation +path14=D:\Games\Devastation\System\Devastation.exe module14= opengllib14= ver14=0 coord14=0 -flag14=671088674 -flagg14=1207959552 -flagh14=20 -flagi14=0 -tflag14=0 +flag14=167772198 +flagg14=1209008128 +flagh14=65556 +flagi14=2 +tflag14=322 initx14=0 inity14=0 minx14=0 @@ -340,21 +340,21 @@ maxx14=0 maxy14=0 posx14=50 posy14=50 -sizx14=800 -sizy14=600 +sizx14=320 +sizy14=240 maxfps14=0 initts14=0 -title15=Tomb Raider II Gold (DEMO) -path15=D:\Games\Tomb Raider II Gold (Demo)\Tomb2.exe +title15=Doom Shareware for Windows 95 +path15=D:\Games\Doom Shareware for Windows 95\Doom95.exe module15= opengllib15= ver15=0 coord15=2 -flag15=671088674 -flagg15=1224736784 +flag15=134217762 +flagg15=1207959568 flagh15=20 flagi15=0 -tflag15=258 +tflag15=0 initx15=0 inity15=0 minx15=0 @@ -367,17 +367,17 @@ sizx15=800 sizy15=600 maxfps15=0 initts15=0 -title16=Tomb Raider III -path16=D:\Games\Tomb Raider III\tomb3.exe +title16=Duckman +path16=D:\Games\Duckman\DUCKMAN.EXE module16= opengllib16= ver16=0 -coord16=2 -flag16=134217760 -flagg16=1241514000 +coord16=0 +flag16=134217762 +flagg16=1209008128 flagh16=20 -flagi16=0 -tflag16=322 +flagi16=4 +tflag16=258 initx16=0 inity16=0 minx16=0 @@ -390,17 +390,17 @@ sizx16=800 sizy16=600 maxfps16=0 initts16=0 -title17=Virtua Fighter 2 (DEMO) -path17=D:\Games\vf2_demo\VF2DEMO.EXE +title17=Dungeon Keeper 2 (GOG) +path17=D:\Games\Dungeon Keeper 2 (GOG)\DKII.EXE module17= opengllib17= ver17=0 coord17=0 -flag17=939524131 -flagg17=1207959664 +flag17=136331298 +flagg17=1241513984 flagh17=20 flagi17=0 -tflag17=1 +tflag17=258 initx17=0 inity17=0 minx17=0 @@ -413,17 +413,17 @@ sizx17=800 sizy17=600 maxfps17=0 initts17=0 -title18=Virtua Fighter PC -path18=D:\Games\Virtua Fighter\VFPC.EXE +title18=Empire Earth +path18=D:\Games\Empire Earth\Empire Earth.exe module18= opengllib18= ver18=0 coord18=0 -flag18=402653218 -flagg18=1224736784 -flagh18=33562644 +flag18=-1459617632 +flagg18=201326848 +flagh18=84 flagi18=0 -tflag18=291 +tflag18=262 initx18=0 inity18=0 minx18=0 @@ -432,21 +432,21 @@ maxx18=0 maxy18=0 posx18=50 posy18=50 -sizx18=800 -sizy18=600 +sizx18=0 +sizy18=0 maxfps18=0 initts18=0 -title19=Warcraft 2 Battlenet Ed -path19=D:\Games\Warcraft 2 Battlenet Ed\Warcraft II BNE.exe +title19=F-16 Fighting Falcon +path19=D:\Games\F16\f1695.exe module19= opengllib19= ver19=0 coord19=0 -flag19=134217762 -flagg19=1210122240 -flagh19=148 -flagi19=12 -tflag19=0 +flag19=134217826 +flagg19=1209008128 +flagh19=20 +flagi19=4 +tflag19=258 initx19=0 inity19=0 minx19=0 @@ -459,17 +459,17 @@ sizx19=800 sizy19=600 maxfps19=0 initts19=0 -title20=Wargasm -path20=D:\Games\Wargasm\tank.exe +title20=Fate +path20=D:\Games\Fate\Fate.exe module20= opengllib20= ver20=0 -coord20=2 -flag20=687865888 -flagg20=1207959568 -flagh20=65556 -flagi20=0 -tflag20=2 +coord20=0 +flag20=134217762 +flagg20=1207959552 +flagh20=20 +flagi20=4 +tflag20=0 initx20=0 inity20=0 minx20=0 @@ -482,17 +482,17 @@ sizx20=800 sizy20=600 maxfps20=0 initts20=0 -title21=Warlords Battlecry II (DEMO) -path21=D:\Games\Warlords Battlecry II Demo\Battlecry II Demo.exe +title21=Grand Prix Legends +path21=D:\Games\gpl\gpl.exe module21= opengllib21= ver21=0 -coord21=2 -flag21=134217762 -flagg21=1207959568 -flagh21=22 -flagi21=0 -tflag21=258 +coord21=0 +flag21=679485472 +flagg21=1207959552 +flagh21=20 +flagi21=4 +tflag21=0 initx21=0 inity21=0 minx21=0 @@ -505,17 +505,17 @@ sizx21=800 sizy21=600 maxfps21=0 initts21=0 -title22=Whiteout -path22=D:\Games\Whiteout\Whiteout.exe +title22=Grand Prix World +path22=D:\Games\Grand Prix World\gpw.exe module22= opengllib22= ver22=0 coord22=0 -flag22=402653216 -flagg22=1207959552 -flagh22=20 -flagi22=0 -tflag22=64 +flag22=134217762 +flagg22=1207959680 +flagh22=84 +flagi22=4 +tflag22=0 initx22=0 inity22=0 minx22=0 @@ -524,21 +524,21 @@ maxx22=0 maxy22=0 posx22=50 posy22=50 -sizx22=640 -sizy22=480 +sizx22=800 +sizy22=600 maxfps22=0 initts22=0 -title23=Wildfire -path23=D:\Games\Wildfire\Wildfire.exe +title23=GTA 3 +path23=D:\Games\GTA3\gta3.exe module23= opengllib23= ver23=0 coord23=0 -flag23=-1476392958 -flagg23=1210122240 +flag23=134217762 +flagg23=1207959552 flagh23=20 -flagi23=12 -tflag23=0 +flagi23=4 +tflag23=258 initx23=0 inity23=0 minx23=0 @@ -551,17 +551,17 @@ sizx23=800 sizy23=600 maxfps23=0 initts23=0 -title24=Worms Pinball -path24=D:\Games\Worms Pinball\WPIB.exe +title24=Hearts of Iron 2 +path24=D:\Games\Hearts of Iron 2\HoI2.exe module24= opengllib24= ver24=0 coord24=2 -flag24=679477282 -flagg24=1744830480 -flagh24=20 -flagi24=4 -tflag24=259 +flag24=939526179 +flagg24=1207959568 +flagh24=32788 +flagi24=2 +tflag24=2 initx24=0 inity24=0 minx24=0 @@ -574,17 +574,17 @@ sizx24=800 sizy24=600 maxfps24=0 initts24=0 -title25=Zanzarah -path25=D:\Games\Zanzarah\System\zanthp.exe +title25=Heroes of Might and Magic IV +path25=D:\Games\Heroes of Might and Magic IV\heroes4.exe module25= opengllib25= ver25=0 -coord25=0 -flag25=679477280 -flagg25=1207959552 -flagh25=20 -flagi25=0 -tflag25=0 +coord25=2 +flag25=671350818 +flagg25=1207959568 +flagh25=-2147418092 +flagi25=1 +tflag25=258 initx25=0 inity25=0 minx25=0 @@ -597,17 +597,17 @@ sizx25=800 sizy25=600 maxfps25=0 initts25=0 -title26=Zax the Alien Hunter (DEMO) -path26=D:\Games\ZaxDemo\Zax.exe +title26=Hitman - Codename 47 +path26=D:\Games\Hitman - Codename 47\Hitman.Exe module26= opengllib26= -ver26=0 -coord26=2 -flag26=-2011168734 -flagg26=1209008144 +ver26=1 +coord26=0 +flag26=134234144 +flagg26=1207959808 flagh26=20 -flagi26=0 -tflag26=258 +flagi26=4 +tflag26=2 initx26=0 inity26=0 minx26=0 @@ -620,14 +620,14 @@ sizx26=800 sizy26=600 maxfps26=0 initts26=0 -title27=ZPC Zero Population Count -path27=D:\Games\ZPC\ZPC.EXE +title27=Hitman 2 Silent Assassin +path27=D:\Games\Hitman 2 Silent Assassin\hitman2.exe module27= opengllib27= ver27=0 -coord27=0 -flag27=134217762 -flagg27=1207959552 +coord27=2 +flag27=134234150 +flagg27=1207959568 flagh27=20 flagi27=4 tflag27=0 @@ -643,8 +643,836 @@ sizx27=800 sizy27=600 maxfps27=0 initts27=0 +title28=Homeworld 2 +path28=D:\Games\Homeworld2\Bin\Release\Homeworld2.exe +module28= +opengllib28= +ver28=0 +coord28=0 +flag28=671154178 +flagg28=134217728 +flagh28=285 +flagi28=0 +tflag28=0 +initx28=0 +inity28=0 +minx28=0 +miny28=0 +maxx28=0 +maxy28=0 +posx28=50 +posy28=50 +sizx28=800 +sizy28=600 +maxfps28=0 +initts28=0 +title29=Imperialism +path29=D:\Games\Imperialism\Imperialism.exe +module29= +opengllib29= +ver29=0 +coord29=0 +flag29=-1467998174 +flagg29=1209008128 +flagh29=20 +flagi29=4 +tflag29=0 +initx29=0 +inity29=0 +minx29=0 +miny29=0 +maxx29=0 +maxy29=0 +posx29=50 +posy29=50 +sizx29=800 +sizy29=600 +maxfps29=0 +initts29=0 +title30=Imperialism II +path30=D:\Games\Imperialism 2\imperialism II.exe +module30= +opengllib30= +ver30=0 +coord30=0 +flag30=679485474 +flagg30=1209008128 +flagh30=20 +flagi30=4 +tflag30=0 +initx30=0 +inity30=0 +minx30=0 +miny30=0 +maxx30=0 +maxy30=0 +posx30=50 +posy30=50 +sizx30=800 +sizy30=600 +maxfps30=0 +initts30=0 +title31=International Football 2000 +path31=D:\Games\International Football 2000\MSIF2000.ICD +module31= +opengllib31= +ver31=0 +coord31=0 +flag31=150994976 +flagg31=1207959552 +flagh31=20 +flagi31=4 +tflag31=258 +initx31=0 +inity31=0 +minx31=0 +miny31=0 +maxx31=0 +maxy31=0 +posx31=50 +posy31=50 +sizx31=800 +sizy31=600 +maxfps31=0 +initts31=0 +title32=Jet Moto +path32=D:\Games\Jet_Moto\JETMOTO.EXE +module32= +opengllib32= +ver32=0 +coord32=0 +flag32=671088674 +flagg32=1207959568 +flagh32=20 +flagi32=0 +tflag32=0 +initx32=0 +inity32=0 +minx32=0 +miny32=0 +maxx32=0 +maxy32=0 +posx32=50 +posy32=50 +sizx32=800 +sizy32=600 +maxfps32=0 +initts32=0 +title33=Kiss Psycho Circus +path33=D:\Games\Kiss\client.exe +module33= +opengllib33= +ver33=0 +coord33=0 +flag33=134234148 +flagg33=1207959808 +flagh33=20 +flagi33=0 +tflag33=2 +initx33=0 +inity33=0 +minx33=0 +miny33=0 +maxx33=0 +maxy33=0 +posx33=50 +posy33=50 +sizx33=800 +sizy33=600 +maxfps33=0 +initts33=0 +title34=Kohan II Kings of War +path34=D:\Games\Kohan II Kings of War\k2.exe +module34= +opengllib34= +ver34=0 +coord34=0 +flag34=134217762 +flagg34=1207959552 +flagh34=20 +flagi34=4 +tflag34=0 +initx34=0 +inity34=0 +minx34=0 +miny34=0 +maxx34=0 +maxy34=0 +posx34=50 +posy34=50 +sizx34=800 +sizy34=600 +maxfps34=0 +initts34=0 +title35=L.E.D. Wars (not working) +path35=D:\Games\l.e.d._wars\LED.EXE +module35= +opengllib35= +ver35=0 +coord35=0 +flag35=713039906 +flagg35=1207959569 +flagh35=65556 +flagi35=4 +tflag35=258 +initx35=0 +inity35=0 +minx35=0 +miny35=0 +maxx35=0 +maxy35=0 +posx35=50 +posy35=50 +sizx35=800 +sizy35=600 +maxfps35=0 +initts35=0 +title36=Land of the Dead +path36=D:\Games\Land of the Dead\System\LOTD.exe +module36= +opengllib36= +ver36=0 +coord36=2 +flag36=134217766 +flagg36=1207959568 +flagh36=20 +flagi36=0 +tflag36=64 +initx36=0 +inity36=0 +minx36=0 +miny36=0 +maxx36=0 +maxy36=0 +posx36=50 +posy36=50 +sizx36=800 +sizy36=600 +maxfps36=0 +initts36=0 +title37=Last Bronx +path37=D:\Games\Last_Bronx\LB.EXE +module37= +opengllib37= +ver37=0 +coord37=0 +flag37=134217762 +flagg37=1207963648 +flagh37=20 +flagi37=4 +tflag37=0 +initx37=0 +inity37=0 +minx37=0 +miny37=0 +maxx37=0 +maxy37=0 +posx37=50 +posy37=50 +sizx37=800 +sizy37=600 +maxfps37=20 +initts37=4 +title38=LEGOŽ Marvel Super Heroes Demo +path38=C:\Program Files (x86)\Warner Bros. Interactive Entertainment\LEGOŽ Marvel Super Heroes Demo\LEGOMarvelDemo.exe +module38= +opengllib38= +ver38=0 +coord38=0 +flag38=134217762 +flagg38=1207959552 +flagh38=20 +flagi38=4 +tflag38=0 +initx38=0 +inity38=0 +minx38=0 +miny38=0 +maxx38=0 +maxy38=0 +posx38=50 +posy38=50 +sizx38=800 +sizy38=600 +maxfps38=0 +initts38=0 +title39=Lords of the Realm 2 +path39=D:\Games\Lords of the Realm 2\LORDS2.EXE +module39= +opengllib39= +ver39=0 +coord39=0 +flag39=134217762 +flagg39=1209008128 +flagh39=65556 +flagi39=4 +tflag39=0 +initx39=0 +inity39=0 +minx39=0 +miny39=0 +maxx39=0 +maxy39=0 +posx39=50 +posy39=50 +sizx39=800 +sizy39=600 +maxfps39=0 +initts39=0 +title40=Magic & Mayhem +path40=D:\Games\Magic_&_Mayhem\Chaos.exe +module40= +opengllib40= +ver40=0 +coord40=0 +flag40=134217762 +flagg40=1207959552 +flagh40=20 +flagi40=4 +tflag40=0 +initx40=0 +inity40=0 +minx40=0 +miny40=0 +maxx40=0 +maxy40=0 +posx40=50 +posy40=50 +sizx40=800 +sizy40=600 +maxfps40=0 +initts40=0 +title41=Motocross Madness (DEMO) +path41=D:\Games\Motocross Madness Trial\mcm.exe +module41= +opengllib41= +ver41=0 +coord41=0 +flag41=134217760 +flagg41=1207959552 +flagh41=20 +flagi41=0 +tflag41=0 +initx41=0 +inity41=0 +minx41=0 +miny41=0 +maxx41=0 +maxy41=0 +posx41=50 +posy41=50 +sizx41=800 +sizy41=600 +maxfps41=0 +initts41=0 +title42=Pandemonium 2 (GLIDE) +path42=D:\Games\Pandemonium 2\pandy.exe +module42= +opengllib42= +ver42=0 +coord42=0 +flag42=134217762 +flagg42=1207959552 +flagh42=20 +flagi42=4 +tflag42=0 +initx42=0 +inity42=0 +minx42=0 +miny42=0 +maxx42=0 +maxy42=0 +posx42=50 +posy42=50 +sizx42=800 +sizy42=600 +maxfps42=0 +initts42=0 +title43=Praetorians +path43=D:\games\Praetorians\Praetorians.exe +module43= +opengllib43= +ver43=0 +coord43=2 +flag43=134217760 +flagg43=1209008144 +flagh43=22 +flagi43=4 +tflag43=2 +initx43=0 +inity43=0 +minx43=0 +miny43=0 +maxx43=0 +maxy43=0 +posx43=50 +posy43=50 +sizx43=800 +sizy43=600 +maxfps43=0 +initts43=0 +title44=Praetorians (DEMO) +path44=D:\Games\Praetorians Demo\Praetorians.exe +module44= +opengllib44= +ver44=0 +coord44=0 +flag44=134217760 +flagg44=1207959552 +flagh44=65556 +flagi44=4 +tflag44=2 +initx44=0 +inity44=0 +minx44=0 +miny44=0 +maxx44=0 +maxy44=0 +posx44=50 +posy44=50 +sizx44=800 +sizy44=600 +maxfps44=0 +initts44=0 +title45=Project Nomads (DEMO) +path45=D:\Games\Project Nomads Demo\bin\win32\nomads.exe +module45= +opengllib45= +ver45=8 +coord45=0 +flag45=-1476394974 +flagg45=1207959808 +flagh45=4 +flagi45=0 +tflag45=274 +initx45=0 +inity45=0 +minx45=0 +miny45=0 +maxx45=0 +maxy45=0 +posx45=50 +posy45=50 +sizx45=800 +sizy45=600 +maxfps45=0 +initts45=0 +title46=Rayman 2 Demo +path46=D:\Games\Rayman2Demo\Rayman2Demo.exe +module46= +opengllib46= +ver46=7 +coord46=0 +flag46=402653219 +flagg46=1208025088 +flagh46=2097172 +flagi46=0 +tflag46=258 +initx46=0 +inity46=0 +minx46=0 +miny46=0 +maxx46=0 +maxy46=0 +posx46=50 +posy46=50 +sizx46=800 +sizy46=600 +maxfps46=0 +initts46=4 +title47=Shadows of the Empire (DEMO) +path47=D:\Games\Shadows of the Empire\shadows.exe +module47= +opengllib47= +ver47=0 +coord47=2 +flag47=134479906 +flagg47=1207959568 +flagh47=33554452 +flagi47=0 +tflag47=274 +initx47=0 +inity47=0 +minx47=0 +miny47=0 +maxx47=0 +maxy47=0 +posx47=50 +posy47=50 +sizx47=800 +sizy47=600 +maxfps47=0 +initts47=0 +title48=StarCraft +path48=D:\Games\Starcraft\StarCraft.exe +module48= +opengllib48= +ver48=0 +coord48=0 +flag48=134217762 +flagg48=134283264 +flagh48=20 +flagi48=8 +tflag48=64 +initx48=0 +inity48=0 +minx48=0 +miny48=0 +maxx48=0 +maxy48=0 +posx48=50 +posy48=50 +sizx48=800 +sizy48=600 +maxfps48=0 +initts48=0 +title49=Tomb Raider 4 (DEMO) +path49=D:\Games\Tomb Raider - The Last Revelation (Demo)\tomb4.exe +module49= +opengllib49= +ver49=7 +coord49=0 +flag49=134217760 +flagg49=1207959552 +flagh49=20 +flagi49=0 +tflag49=258 +initx49=0 +inity49=0 +minx49=0 +miny49=0 +maxx49=0 +maxy49=0 +posx49=50 +posy49=50 +sizx49=800 +sizy49=600 +maxfps49=0 +initts49=0 +title50=Tomb Raider II +path50=D:\Games\Tomb Raider II\Tomb2.exe +module50= +opengllib50= +ver50=0 +coord50=0 +flag50=671088674 +flagg50=1207959552 +flagh50=20 +flagi50=0 +tflag50=0 +initx50=0 +inity50=0 +minx50=0 +miny50=0 +maxx50=0 +maxy50=0 +posx50=50 +posy50=50 +sizx50=800 +sizy50=600 +maxfps50=0 +initts50=0 +title51=Tomb Raider II Gold (DEMO) +module51= +opengllib51= +title52=Tomb Raider III +module52= +opengllib52= +path51=D:\Games\Tomb Raider II Gold (Demo)\Tomb2.exe +ver51=0 +coord51=2 +flag51=671088674 +flagg51=1224736784 +flagh51=20 +flagi51=0 +tflag51=258 +initx51=0 +inity51=0 +minx51=0 +miny51=0 +maxx51=0 +maxy51=0 +posx51=50 +posy51=50 +sizx51=800 +sizy51=600 +maxfps51=0 +initts51=0 +path52=D:\Games\Tomb Raider III\tomb3.exe +ver52=0 +coord52=2 +flag52=134217760 +flagg52=1241514000 +flagh52=20 +flagi52=0 +tflag52=322 +initx52=0 +inity52=0 +minx52=0 +miny52=0 +maxx52=0 +maxy52=0 +posx52=50 +posy52=50 +sizx52=800 +sizy52=600 +maxfps52=0 +initts52=0 +title53=Virtua Fighter 2 (DEMO) +path53=D:\Games\vf2_demo\VF2DEMO.EXE +module53= +opengllib53= +ver53=0 +coord53=0 +flag53=939524131 +flagg53=1207959664 +flagh53=20 +flagi53=0 +tflag53=0 +initx53=0 +inity53=0 +minx53=0 +miny53=0 +maxx53=0 +maxy53=0 +posx53=50 +posy53=50 +sizx53=800 +sizy53=600 +maxfps53=0 +initts53=0 +title54=Virtua Fighter PC +path54=D:\Games\Virtua Fighter\VFPC.EXE +module54= +opengllib54= +ver54=0 +coord54=0 +flag54=402653218 +flagg54=1224736784 +flagh54=33562644 +flagi54=0 +tflag54=258 +initx54=0 +inity54=0 +minx54=0 +miny54=0 +maxx54=0 +maxy54=0 +posx54=50 +posy54=50 +sizx54=800 +sizy54=600 +maxfps54=0 +initts54=0 +title55=Warcraft 2 Battlenet Ed +path55=D:\Games\Warcraft 2 Battlenet Ed\Warcraft II BNE.exe +module55= +opengllib55= +ver55=0 +coord55=0 +flag55=134217762 +flagg55=1210122240 +flagh55=148 +flagi55=12 +tflag55=0 +initx55=0 +inity55=0 +minx55=0 +miny55=0 +maxx55=0 +maxy55=0 +posx55=50 +posy55=50 +sizx55=800 +sizy55=600 +maxfps55=0 +initts55=0 +title56=Wargasm +path56=D:\Games\Wargasm\tank.exe +module56= +opengllib56= +ver56=0 +coord56=2 +flag56=687865888 +flagg56=1207959568 +flagh56=65556 +flagi56=0 +tflag56=2 +initx56=0 +inity56=0 +minx56=0 +miny56=0 +maxx56=0 +maxy56=0 +posx56=50 +posy56=50 +sizx56=800 +sizy56=600 +maxfps56=0 +initts56=0 +title57=Warlords Battlecry II (DEMO) +path57=D:\Games\Warlords Battlecry II Demo\Battlecry II Demo.exe +module57= +opengllib57= +ver57=0 +coord57=2 +flag57=134217762 +flagg57=1207959568 +flagh57=22 +flagi57=0 +tflag57=258 +initx57=0 +inity57=0 +minx57=0 +miny57=0 +maxx57=0 +maxy57=0 +posx57=50 +posy57=50 +sizx57=800 +sizy57=600 +maxfps57=0 +initts57=0 +title58=Whiteout +path58=D:\Games\Whiteout\Whiteout.exe +module58= +opengllib58= +ver58=0 +coord58=0 +flag58=402653217 +flagg58=1207959552 +flagh58=20 +flagi58=0 +tflag58=66 +initx58=0 +inity58=0 +minx58=0 +miny58=0 +maxx58=0 +maxy58=0 +posx58=50 +posy58=50 +sizx58=640 +sizy58=480 +maxfps58=0 +initts58=0 +title59=Wildfire +path59=D:\Games\Wildfire\Wildfire.exe +module59= +opengllib59= +ver59=0 +coord59=0 +flag59=-1476392958 +flagg59=1210122240 +flagh59=20 +flagi59=12 +tflag59=0 +initx59=0 +inity59=0 +minx59=0 +miny59=0 +maxx59=0 +maxy59=0 +posx59=50 +posy59=50 +sizx59=800 +sizy59=600 +maxfps59=0 +initts59=0 +title60=Worms Pinball +path60=D:\Games\Worms Pinball\WPIB.exe +module60= +opengllib60= +ver60=0 +coord60=2 +flag60=679477282 +flagg60=1744830480 +flagh60=20 +flagi60=4 +tflag60=258 +initx60=0 +inity60=0 +minx60=0 +miny60=0 +maxx60=0 +maxy60=0 +posx60=50 +posy60=50 +sizx60=800 +sizy60=600 +maxfps60=0 +initts60=0 +title61=Zanzarah +path61=D:\Games\Zanzarah\System\zanthp.exe +module61= +opengllib61= +ver61=0 +coord61=0 +flag61=679477280 +flagg61=1207959552 +flagh61=20 +flagi61=0 +tflag61=0 +initx61=0 +inity61=0 +minx61=0 +miny61=0 +maxx61=0 +maxy61=0 +posx61=50 +posy61=50 +sizx61=800 +sizy61=600 +maxfps61=0 +initts61=0 +title62=Zax the Alien Hunter (DEMO) +path62=D:\Games\ZaxDemo\Zax.exe +module62= +opengllib62= +ver62=0 +coord62=2 +flag62=-2011168734 +flagg62=1209008144 +flagh62=20 +flagi62=0 +tflag62=258 +initx62=0 +inity62=0 +minx62=0 +miny62=0 +maxx62=0 +maxy62=0 +posx62=50 +posy62=50 +sizx62=800 +sizy62=600 +maxfps62=0 +initts62=0 +title63=ZPC Zero Population Count +path63=D:\Games\ZPC\ZPC.EXE +module63= +opengllib63= +ver63=0 +coord63=0 +flag63=134217762 +flagg63=1207959552 +flagh63=20 +flagi63=4 +tflag63=0 +initx63=0 +inity63=0 +minx63=0 +miny63=0 +maxx63=0 +maxy63=0 +posx63=50 +posy63=50 +sizx63=800 +sizy63=600 +maxfps63=0 +initts63=0 [window] -posx=1177 -posy=268 +posx=1360 +posy=603 sizx=497 sizy=410 diff --git a/build/exports/007 NightFire.dxw b/build/exports/007 NightFire.dxw index 1fde1e2..b22a450 100644 --- a/build/exports/007 NightFire.dxw +++ b/build/exports/007 NightFire.dxw @@ -5,11 +5,11 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=134234146 -flagg0=134217728 -flagh0=65556 -flagi0=0 -tflag0=67 +flag0=134234150 +flagg0=1207959552 +flagh0=20 +flagi0=4 +tflag0=0 initx0=0 inity0=0 minx0=0 diff --git a/build/exports/A10 Cuba.dxw b/build/exports/A10 Cuba.dxw new file mode 100644 index 0000000..1446a8f --- /dev/null +++ b/build/exports/A10 Cuba.dxw @@ -0,0 +1,24 @@ +[target] +title0=A10 Cuba +path0=D:\Games\A10\A10Cuba.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=671096866 +flagg0=1207959568 +flagh0=20 +flagi0=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 diff --git a/build/exports/Actua Soccer 3.dxw b/build/exports/Actua Soccer 3.dxw new file mode 100644 index 0000000..d912d17 --- /dev/null +++ b/build/exports/Actua Soccer 3.dxw @@ -0,0 +1,24 @@ +[target] +title0=Actua Soccer 3 +path0=D:\Games\ActuaSoccer3\SOCCER3D.EXE +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=671088674 +flagg0=1207959552 +flagh0=20 +flagi0=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 diff --git a/build/exports/Age of Empires III.dxw b/build/exports/Age of Empires III.dxw index c1efb73..229b1b7 100644 --- a/build/exports/Age of Empires III.dxw +++ b/build/exports/Age of Empires III.dxw @@ -5,7 +5,7 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=-394125278 +flag0=1753358370 flagg0=134217728 flagh0=20 flagi0=0 diff --git a/build/exports/Beavis & Butthead Do U..dxw b/build/exports/Beavis & Butthead Do U..dxw new file mode 100644 index 0000000..ea24f57 --- /dev/null +++ b/build/exports/Beavis & Butthead Do U..dxw @@ -0,0 +1,24 @@ +[target] +title0=Beavis & Butthead Do U. +path0=D:\Games\B_b\BEAVIS.EXE +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=671090722 +flagg0=1207959552 +flagh0=32788 +flagi0=0 +tflag0=3 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 diff --git a/build/exports/Black & White.dxw b/build/exports/Black & White.dxw new file mode 100644 index 0000000..5d0aee6 --- /dev/null +++ b/build/exports/Black & White.dxw @@ -0,0 +1,24 @@ +[target] +title0=Black & White +path0=D:\Games\Black & White\runblack.exe +module0= +opengllib0= +ver0=0 +coord0=1 +flag0=679477280 +flagg0=1207959568 +flagh0=20 +flagi0=4 +tflag0=259 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 diff --git a/build/exports/Carmageddon 2 (GLIDE).dxw b/build/exports/Carmageddon 2 (GLIDE).dxw new file mode 100644 index 0000000..d5dbd86 --- /dev/null +++ b/build/exports/Carmageddon 2 (GLIDE).dxw @@ -0,0 +1,24 @@ +[target] +title0=Carmageddon 2 (GLIDE) +path0=D:\Games\Carmageddon_2\carma2_HW.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=134217730 +flagg0=1208025088 +flagh0=20 +flagi0=12 +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 diff --git a/build/exports/Carmageddon 2 (SW).dxw b/build/exports/Carmageddon 2 (SW).dxw new file mode 100644 index 0000000..a94d107 --- /dev/null +++ b/build/exports/Carmageddon 2 (SW).dxw @@ -0,0 +1,24 @@ +[target] +title0=Carmageddon 2 (SW) +path0=D:\Games\Carmageddon_2\carma2_SW.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=671088674 +flagg0=1208025088 +flagh0=33562644 +flagi0=12 +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 diff --git a/build/exports/Cave Story.dxw b/build/exports/Cave Story.dxw new file mode 100644 index 0000000..32eed40 --- /dev/null +++ b/build/exports/Cave Story.dxw @@ -0,0 +1,24 @@ +[target] +title0=Cave Story +path0=D:\Games\Cave Story\Doukutsu.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=134217762 +flagg0=1207959552 +flagh0=20 +flagi0=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 diff --git a/build/exports/Crimson Skies.dxw b/build/exports/Crimson Skies.dxw new file mode 100644 index 0000000..8563189 --- /dev/null +++ b/build/exports/Crimson Skies.dxw @@ -0,0 +1,24 @@ +[target] +title0=Crimson Skies +path0=D:\Games\Crimson_Skies\crimson.exe +module0= +opengllib0= +ver0=7 +coord0=0 +flag0=134234148 +flagg0=1207959552 +flagh0=20 +flagi0=4 +tflag0=259 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 diff --git a/build/exports/Devastation.dxw b/build/exports/Devastation.dxw index d42a274..c550573 100644 --- a/build/exports/Devastation.dxw +++ b/build/exports/Devastation.dxw @@ -5,9 +5,9 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=134217762 +flag0=134217766 flagg0=1207959552 -flagh0=16 +flagh0=65556 flagi0=0 tflag0=67 initx0=0 diff --git a/build/exports/Doom Shareware for Windows 95.dxw b/build/exports/Doom Shareware for Windows 95.dxw index e29750c..4a7a3ab 100644 --- a/build/exports/Doom Shareware for Windows 95.dxw +++ b/build/exports/Doom Shareware for Windows 95.dxw @@ -6,7 +6,7 @@ opengllib0= ver0=0 coord0=0 flag0=134217762 -flagg0=134217728 +flagg0=1207959552 flagh0=20 flagi0=0 tflag0=0 diff --git a/build/exports/F-16 Fighting Falcon.dxw b/build/exports/F-16 Fighting Falcon.dxw new file mode 100644 index 0000000..87569a2 --- /dev/null +++ b/build/exports/F-16 Fighting Falcon.dxw @@ -0,0 +1,24 @@ +[target] +title0=F-16 Fighting Falcon +path0=D:\Games\F16\f1695.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=134217826 +flagg0=1209008128 +flagh0=20 +flagi0=4 +tflag0=259 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 diff --git a/build/exports/Fate.dxw b/build/exports/Fate.dxw new file mode 100644 index 0000000..e626576 --- /dev/null +++ b/build/exports/Fate.dxw @@ -0,0 +1,24 @@ +[target] +title0=Fate +path0=D:\Games\Fate\Fate.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=134217762 +flagg0=1207959552 +flagh0=20 +flagi0=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 diff --git a/build/exports/Hitman - Codename 47.dxw b/build/exports/Hitman - Codename 47.dxw new file mode 100644 index 0000000..ad7a6a8 --- /dev/null +++ b/build/exports/Hitman - Codename 47.dxw @@ -0,0 +1,24 @@ +[target] +title0=Hitman - Codename 47 +path0=D:\Games\Hitman - Codename 47\Hitman.Exe +module0= +opengllib0= +ver0=1 +coord0=0 +flag0=134234144 +flagg0=1207959808 +flagh0=20 +flagi0=4 +tflag0=3 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 diff --git a/build/exports/Hitman 2 Silent Assassin.dxw b/build/exports/Hitman 2 Silent Assassin.dxw new file mode 100644 index 0000000..ac86038 --- /dev/null +++ b/build/exports/Hitman 2 Silent Assassin.dxw @@ -0,0 +1,24 @@ +[target] +title0=Hitman 2 Silent Assassin +path0=D:\Games\Hitman 2 Silent Assassin\hitman2.exe +module0= +opengllib0= +ver0=0 +coord0=2 +flag0=134234150 +flagg0=1207959568 +flagh0=20 +flagi0=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 diff --git a/build/exports/Homeworld 2.dxw b/build/exports/Homeworld 2.dxw index 9aa9229..93d4459 100644 --- a/build/exports/Homeworld 2.dxw +++ b/build/exports/Homeworld 2.dxw @@ -5,9 +5,9 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=671088642 +flag0=671154178 flagg0=134217728 -flagh0=477 +flagh0=285 flagi0=0 tflag0=0 initx0=0 diff --git a/build/exports/Imperialism II.dxw b/build/exports/Imperialism II.dxw new file mode 100644 index 0000000..9bbb3eb --- /dev/null +++ b/build/exports/Imperialism II.dxw @@ -0,0 +1,24 @@ +[target] +title0=Imperialism II +path0=D:\Games\Imperialism 2\imperialism II.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=679485474 +flagg0=1209008128 +flagh0=20 +flagi0=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 diff --git a/build/exports/International Football 2000.dxw b/build/exports/International Football 2000.dxw new file mode 100644 index 0000000..e3b9a31 --- /dev/null +++ b/build/exports/International Football 2000.dxw @@ -0,0 +1,24 @@ +[target] +title0=International Football 2000 +path0=D:\Games\International Football 2000\MSIF2000.ICD +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=150994976 +flagg0=1207959552 +flagh0=20 +flagi0=4 +tflag0=259 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 diff --git a/build/exports/Kiss Psycho Circus.dxw b/build/exports/Kiss Psycho Circus.dxw index 79f48c5..0bd3cd6 100644 --- a/build/exports/Kiss Psycho Circus.dxw +++ b/build/exports/Kiss Psycho Circus.dxw @@ -5,11 +5,11 @@ module0= opengllib0= ver0=0 coord0=0 -flag0=134217760 -flagg0=1207959552 +flag0=134234148 +flagg0=1207959808 flagh0=20 flagi0=0 -tflag0=67 +tflag0=3 initx0=0 inity0=0 minx0=0 diff --git a/build/exports/Pandemonium 2 (GLIDE).dxw b/build/exports/Pandemonium 2 (GLIDE).dxw new file mode 100644 index 0000000..e0034d1 --- /dev/null +++ b/build/exports/Pandemonium 2 (GLIDE).dxw @@ -0,0 +1,24 @@ +[target] +title0=Pandemonium 2 (GLIDE) +path0=D:\Games\Pandemonium 2\pandy.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=134217762 +flagg0=1207959552 +flagh0=20 +flagi0=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 diff --git a/build/issues.txt b/build/issues.txt index bc5aa3c..c163985 100644 --- a/build/issues.txt +++ b/build/issues.txt @@ -1,3 +1,3 @@ Ancient Evil: working both in emulated / direct mode, but in emulated mode the cursor is not visible. -Whiteout: handling of IMultiMediaStream COM interface for intro movie window handling for ddraw8 games - see WildFire with keep aspect ratio & client area +"devastation" intro movie - bad cooordinates \ No newline at end of file diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 6e3a2dd..040864a 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -295,7 +295,7 @@ fix: recovered window destruction fix: proper handling of MIPMAP and LOCALVIDMEM surfaces fix: color depth handling - now when the program terminates the desktop is brought to the original color depth -v2.02.45 +v2.02.44 Improved debug logging for all palette operations fixed a bugged log causing the crash of Empire Earth in debug mode added show time stretching flag - preliminary version. Some code cleaning as well. @@ -307,4 +307,8 @@ added interception for CoCreateInstance following cases: case 0x49c47ce5: Module="amstream"; Class="CLSID_AMMultiMediaStream"; preliminary (proxed) interception for "GetActiveWindow" and "GetForegroundWindow" - \ No newline at end of file +v2.02.45 +A small fix for ddraw 7 games that makes Praetorians playable, though with some problems! + +v2.02.46 +Fixed handling of user32 CreateDialogIndirectParam call to avoid processing in non fullscreen mode - fix necessary to start "Crimson Skies". diff --git a/dll/ddraw - Copia.cpp b/dll/ddraw - Copia.cpp deleted file mode 100644 index ca67772..0000000 --- a/dll/ddraw - Copia.cpp +++ /dev/null @@ -1,4559 +0,0 @@ -// to do: duplicate EnumSurfaces(D) handling -// fix Unlock duplicate hook in Judge Dredd Pinball - -#define _CRT_SECURE_NO_WARNINGS -#define INITGUID - -#include -#include -#include "dxwnd.h" -#include "dxhook.h" -#include "ddrawi.h" -#include "dxwcore.hpp" -#include "stdio.h" -#include "hddraw.h" -#include "ddproxy.h" -#include "dxhelper.h" -#include "syslibs.h" - - -// DirectDraw API -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); - -// DirectDraw -HRESULT WINAPI extQueryInterfaceD(void *, REFIID, LPVOID *); -ULONG WINAPI extReleaseD(LPDIRECTDRAW); - /*** IDirectDraw methods ***/ -HRESULT WINAPI extCreateClipper(LPDIRECTDRAW, DWORD, LPDIRECTDRAWCLIPPER FAR* , IUnknown FAR*); -HRESULT WINAPI extCreatePalette(LPDIRECTDRAW, DWORD, LPPALETTEENTRY, LPDIRECTDRAWPALETTE *, IUnknown *); -HRESULT WINAPI extCreateSurface1(LPDIRECTDRAW, DDSURFACEDESC *, LPDIRECTDRAWSURFACE *, void *); -HRESULT WINAPI extCreateSurface2(LPDIRECTDRAW, DDSURFACEDESC *, LPDIRECTDRAWSURFACE *, void *); -HRESULT WINAPI extCreateSurface4(LPDIRECTDRAW, DDSURFACEDESC2 *, LPDIRECTDRAWSURFACE *, void *); -HRESULT WINAPI extCreateSurface7(LPDIRECTDRAW, DDSURFACEDESC2 *, LPDIRECTDRAWSURFACE *, void *); -HRESULT WINAPI extDuplicateSurface(LPDIRECTDRAW, LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE *); -HRESULT WINAPI extFlipToGDISurface(LPDIRECTDRAW); -HRESULT WINAPI extGetDisplayMode(LPDIRECTDRAW, LPDDSURFACEDESC); -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 extSetDisplayMode1(LPDIRECTDRAW, DWORD, DWORD, DWORD); -HRESULT WINAPI extSetDisplayMode2(LPDIRECTDRAW, DWORD, DWORD, DWORD, DWORD, DWORD); -HRESULT WINAPI extWaitForVerticalBlank(LPDIRECTDRAW, DWORD, HANDLE); - /*** Added in the V4 Interface ***/ -HRESULT WINAPI extTestCooperativeLevel(LPDIRECTDRAW); -// STDMETHOD(StartModeTest)(THIS_ LPSIZE, DWORD, DWORD ) PURE; -// STDMETHOD(EvaluateMode)(THIS_ DWORD, DWORD * ) PURE; -HRESULT WINAPI extGetCapsD(LPDIRECTDRAW, LPDDCAPS, LPDDCAPS); - - -// DirectDrawSurface -HRESULT WINAPI extQueryInterfaceS(void *, REFIID, LPVOID *); -HRESULT WINAPI extReleaseS(LPDIRECTDRAWSURFACE); - - /*** IDirectDrawSurface methods ***/ -HRESULT WINAPI extAddAttachedSurface(LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE); -HRESULT WINAPI extBlt(LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT, DWORD, LPDDBLTFX); -HRESULT WINAPI extBltFast(LPDIRECTDRAWSURFACE, DWORD, DWORD, LPDIRECTDRAWSURFACE, LPRECT, DWORD); -HRESULT WINAPI extDeleteAttachedSurface(LPDIRECTDRAWSURFACE, DWORD, LPDIRECTDRAWSURFACE); -HRESULT WINAPI extEnumAttachedSurfaces(LPDIRECTDRAWSURFACE, LPVOID, LPDDENUMSURFACESCALLBACK); -HRESULT WINAPI extFlip(LPDIRECTDRAWSURFACE, LPDIRECTDRAWSURFACE, DWORD); -HRESULT WINAPI extGetAttachedSurface1(LPDIRECTDRAWSURFACE, DDSCAPS *, LPDIRECTDRAWSURFACE *); -HRESULT WINAPI extGetAttachedSurface3(LPDIRECTDRAWSURFACE, DDSCAPS *, LPDIRECTDRAWSURFACE *); -HRESULT WINAPI extGetAttachedSurface4(LPDIRECTDRAWSURFACE, DDSCAPS *, LPDIRECTDRAWSURFACE *); -HRESULT WINAPI extGetAttachedSurface7(LPDIRECTDRAWSURFACE, DDSCAPS *, LPDIRECTDRAWSURFACE *); -HRESULT WINAPI extGetCaps1S(LPDIRECTDRAWSURFACE, LPDDSCAPS); -HRESULT WINAPI extGetCaps2S(LPDIRECTDRAWSURFACE, LPDDSCAPS); -HRESULT WINAPI extGetCaps3S(LPDIRECTDRAWSURFACE, LPDDSCAPS); -HRESULT WINAPI extGetCaps4S(LPDIRECTDRAWSURFACE, LPDDSCAPS2); -HRESULT WINAPI extGetCaps7S(LPDIRECTDRAWSURFACE, LPDDSCAPS2); -HRESULT WINAPI extGetColorKey(LPDIRECTDRAWSURFACE, DWORD, LPDDCOLORKEY); -HRESULT WINAPI extGetDC(LPDIRECTDRAWSURFACE, HDC FAR *); -HRESULT WINAPI extGetPalette(LPDIRECTDRAWSURFACE, LPDIRECTDRAWPALETTE *); -HRESULT WINAPI extGetPixelFormat(LPDIRECTDRAWSURFACE, LPDDPIXELFORMAT); -HRESULT WINAPI extGetSurfaceDesc1(LPDIRECTDRAWSURFACE lpdds, LPDDSURFACEDESC lpddsd); -HRESULT WINAPI extGetSurfaceDesc2(LPDIRECTDRAWSURFACE2 lpdds, LPDDSURFACEDESC2 lpddsd); -HRESULT WINAPI extGetSurfaceDesc7(LPDIRECTDRAWSURFACE2 lpdds, LPDDSURFACEDESC2 lpddsd); -// STDMETHOD(Initialize)(THIS_ LPDIRECTDRAW, LPDDSURFACEDESC2) PURE; -HRESULT WINAPI extLock(LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, DWORD, HANDLE); -HRESULT WINAPI extLockDir(LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, DWORD, HANDLE); -HRESULT WINAPI extReleaseDC(LPDIRECTDRAWSURFACE, HDC); -HRESULT WINAPI extSetClipper(LPDIRECTDRAWSURFACE, LPDIRECTDRAWCLIPPER); -HRESULT WINAPI extSetColorKey(LPDIRECTDRAWSURFACE, DWORD, LPDDCOLORKEY); -HRESULT WINAPI extSetPalette(LPDIRECTDRAWSURFACE, LPDIRECTDRAWPALETTE); -HRESULT WINAPI extUnlock4(LPDIRECTDRAWSURFACE, LPRECT); -HRESULT WINAPI extUnlock1(LPDIRECTDRAWSURFACE, LPVOID); -HRESULT WINAPI extUnlockDir4(LPDIRECTDRAWSURFACE, LPRECT); -HRESULT WINAPI extUnlockDir1(LPDIRECTDRAWSURFACE, LPVOID); - -HRESULT WINAPI extCreateSurface(int, CreateSurface_Type, LPDIRECTDRAW, DDSURFACEDESC2 *, LPDIRECTDRAWSURFACE *, void *); - -// DirectDrawClipper -HRESULT WINAPI extReleaseC(LPDIRECTDRAWCLIPPER); - -// DirectDrawPalette -HRESULT WINAPI extReleaseP(LPDIRECTDRAWPALETTE); -// STDMETHOD(Initialize)(THIS_ LPDIRECTDRAW, DWORD, LPPALETTEENTRY) PURE; -HRESULT WINAPI extSetEntries(LPDIRECTDRAWPALETTE, DWORD, DWORD, DWORD, LPPALETTEENTRY); - -// GammaRamp -HRESULT WINAPI extDDSetGammaRamp(LPDIRECTDRAWSURFACE, DWORD, LPDDGAMMARAMP); -HRESULT WINAPI extDDGetGammaRamp(LPDIRECTDRAWSURFACE, DWORD, LPDDGAMMARAMP); - - -HDC WINAPI extGDIGetDC(HWND); -HDC WINAPI extGDIGetWindowDC(HWND); -int WINAPI extGDIReleaseDC(HWND, HDC); - -/* DirectDraw APIs */ -DirectDrawCreate_Type pDirectDrawCreate = NULL; -DirectDrawCreateEx_Type pDirectDrawCreateEx = NULL; -DirectDrawEnumerate_Type pDirectDrawEnumerate = NULL; -DirectDrawEnumerateEx_Type pDirectDrawEnumerateEx = NULL; - -/* DirectDraw hook pointers */ -QueryInterface_Type pQueryInterfaceD; -AddRefD_Type pAddRefD; -ReleaseD_Type pReleaseD; -Compact_Type pCompact; -CreateClipper_Type pCreateClipper=NULL; -CreatePalette_Type pCreatePalette; -CreateSurface1_Type pCreateSurface1; -CreateSurface1_Type pCreateSurface2; -CreateSurface1_Type pCreateSurface3; -CreateSurface2_Type pCreateSurface4; -CreateSurface2_Type pCreateSurface7; -DuplicateSurface_Type pDuplicateSurface; -EnumDisplayModes1_Type pEnumDisplayModes1; -EnumDisplayModes4_Type pEnumDisplayModes4; -EnumSurfaces1_Type pEnumSurfaces1; -EnumSurfaces4_Type pEnumSurfaces4; -FlipToGDISurface_Type pFlipToGDISurface; -GetCapsD_Type pGetCapsD; -GetDisplayMode_Type pGetDisplayMode; -GetFourCCCodes_Type pGetFourCCCodes; -GetGDISurface_Type pGetGDISurface; -GetMonitorFrequency_Type pGetMonitorFrequency; -GetScanLine_Type pGetScanLine; -GetVerticalBlankStatus_Type pGetVerticalBlankStatus; -Initialize_Type pInitialize; -RestoreDisplayMode_Type pRestoreDisplayMode; -SetCooperativeLevel_Type pSetCooperativeLevel; -SetDisplayMode1_Type pSetDisplayMode1; -SetDisplayMode2_Type pSetDisplayMode2; -WaitForVerticalBlank_Type pWaitForVerticalBlank; -GetSurfaceFromDC_Type pGetSurfaceFromDC; -GetAvailableVidMem_Type pGetAvailableVidMem; -RestoreAllSurfaces_Type pRestoreAllSurfaces; -TestCooperativeLevel_Type pTestCooperativeLevel; -GetDeviceIdentifier_Type pGetDeviceIdentifier; - -/* DirectDrawSurface hook pointers */ -QueryInterface_Type pQueryInterfaceS; -AddRefS_Type pAddRefS; -ReleaseS_Type pReleaseS; -AddAttachedSurface_Type pAddAttachedSurface; -AddOverlayDirtyRect_Type pAddOverlayDirtyRect; -Blt_Type pBlt; -BltBatch_Type pBltBatch; -BltFast_Type pBltFast; -DeleteAttachedSurface_Type pDeleteAttachedSurface; -EnumAttachedSurfaces_Type pEnumAttachedSurfaces; -EnumOverlayZOrders_Type pEnumOverlayZOrders; -Flip_Type pFlip; -GetAttachedSurface_Type pGetAttachedSurface1; -GetAttachedSurface_Type pGetAttachedSurface3; -GetAttachedSurface_Type pGetAttachedSurface4; -GetAttachedSurface_Type pGetAttachedSurface7; -GetBltStatus_Type pGetBltStatus; -GetCapsS_Type pGetCaps1S; -GetCapsS_Type pGetCaps2S; -GetCapsS_Type pGetCaps3S; -GetCaps2S_Type pGetCaps4S; -GetCaps2S_Type pGetCaps7S; -GetClipper_Type pGetClipper; -GetColorKey_Type pGetColorKey; -GetDC_Type pGetDC; -GetFlipStatus_Type pGetFlipStatus; -GetOverlayPosition_Type pGetOverlayPosition; -GetPalette_Type pGetPalette; -GetPixelFormat_Type pGetPixelFormat; -GetSurfaceDesc_Type pGetSurfaceDesc1; -GetSurfaceDesc2_Type pGetSurfaceDesc4; -GetSurfaceDesc2_Type pGetSurfaceDesc7; -//Initialize -IsLost_Type pIsLost; -Lock_Type pLock; -ReleaseDC_Type pReleaseDC; -Restore_Type pRestore; -SetClipper_Type pSetClipper; -SetColorKey_Type pSetColorKey; -SetOverlayPosition_Type pSetOverlayPosition; -SetPalette_Type pSetPalette; -Unlock1_Type pUnlock1; -Unlock4_Type pUnlock4; -UpdateOverlay_Type pUpdateOverlay; -UpdateOverlayDisplay_Type pUpdateOverlayDisplay; -UpdateOverlayZOrder_Type pUpdateOverlayZOrder; - -/* DirectDrawClipper hook pointers */ -QueryInterface_Type pQueryInterfaceC; -AddRefC_Type pAddRefC; -ReleaseC_Type pReleaseC; -GetClipList_Type pGetClipList; -GetHWnd_Type pGetHWnd; -InitializeC_Type pInitializeC; -IsClipListChanged_Type pIsClipListChanged; -SetClipList_Type pSetClipList; -SetHWnd_Type pSetHWnd; - -/* DirectDrawPalette hook pointers */ -QueryInterfaceP_Type pQueryInterfaceP; -AddRefP_Type pAddRefP; -ReleaseP_Type pReleaseP; - /*** IDirectDrawPalette methods ***/ -GetCapsP_Type pGetCapsP; -GetEntries_Type pGetEntries; -// STDMETHOD(Initialize)(THIS_ LPDIRECTDRAW, DWORD, LPPALETTEENTRY) PURE; -SetEntries_Type pSetEntries; - -// GammaRamp -GammaRamp_Type pDDGetGammaRamp; -GammaRamp_Type pDDSetGammaRamp; - -// ddraw global variables, constants & so on - -#define MAXBACKBUFFERS 4 - -LPDIRECTDRAWSURFACE lpDDSEmu_Prim=NULL; -LPDIRECTDRAWSURFACE lpDDSEmu_Back=NULL; -LPDIRECTDRAWSURFACE lpDDSBack=NULL; -LPDIRECTDRAWSURFACE lpDDZBuffer=NULL; -LPDIRECTDRAWSURFACE lpDDTexture=NULL; -// v2.1.87: lpPrimaryDD is the DIRECTDRAW object to which the primary surface and all -// the service objects (emulated backbuffer, emulater primary, ....) are attached. -LPDIRECTDRAW lpPrimaryDD=NULL; -LPDIRECTDRAW lpBackBufferDD=NULL; -int iBakBufferVersion; -LPDIRECTDRAWPALETTE lpDDP=NULL; - -// v2.02.37: globals to store requested main surface capabilities -DDSURFACEDESC2 DDSD_Prim; -DDSURFACEDESC2 DDSD_Back; -DDSURFACEDESC2 DDSD_ZBuffer; - -DWORD DDZBufferCaps; -DWORD PaletteEntries[256]; -DWORD *Palette16BPP = NULL; -void *EmuScreenBuffer = NULL; // to implement pitch bug fix -DWORD rPitch = 0; -LPVOID rSurface = NULL; -static void SetPixFmt(LPDDSURFACEDESC2); -static void GetPixFmt(LPDDSURFACEDESC2); - -static HookEntry_Type ddHooks[]={ - {"DirectDrawCreate", (FARPROC)NULL, (FARPROC *)&pDirectDrawCreate, (FARPROC)extDirectDrawCreate}, - {"DirectDrawCreateEx", (FARPROC)NULL, (FARPROC *)&pDirectDrawCreateEx, (FARPROC)extDirectDrawCreateEx}, - {"DirectDrawEnumerateA", (FARPROC)NULL, (FARPROC *)&pDirectDrawEnumerate, (FARPROC)extDirectDrawEnumerate}, - {"DirectDrawEnumerateExA", (FARPROC)NULL, (FARPROC *)&pDirectDrawEnumerateEx, (FARPROC)extDirectDrawEnumerateEx}, - //{"DirectDrawEnumerateW", (FARPROC)NULL, (FARPROC *)&pDirectDrawEnumerateW, (FARPROC)extDirectDrawCreate}, - //{"DirectDrawEnumerateExW", (FARPROC)NULL, (FARPROC *)&pDirectDrawEnumerateExW, (FARPROC)extDirectDrawCreate}, - {0, NULL, 0, 0} // terminator -}; - -FARPROC Remap_ddraw_ProcAddress(LPCSTR proc, HMODULE hModule) -{ - FARPROC addr; - if (addr=RemapLibrary(proc, hModule, ddHooks)) return addr; - return NULL; -} - -/* ------------------------------------------------------------------------------ */ -// auxiliary (static) functions -/* ------------------------------------------------------------------------------ */ - -static void Stopper(char *s, int line) -{ - char sMsg[81]; - sprintf(sMsg,"break: \"%s\"", s); - MessageBox(0, sMsg, "break", MB_OK | MB_ICONEXCLAMATION); -} - -//#define STOPPER_TEST // comment out to eliminate -#ifdef STOPPER_TEST -#define STOPPER(s) Stopper(s, __LINE__) -#else -#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 size=%d flags=%x(%s) BPP=%d", - lpddsd->dwSize, 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; -} - -static void LogSurfaceAttributes(LPDDSURFACEDESC lpddsd, char *label, int line) -{ - if(!IsTraceD) return; - OutTrace("SurfaceDesc: %s Flags=%x(%s)", - label, - lpddsd->dwFlags, ExplainFlags(lpddsd->dwFlags)); - if (lpddsd->dwFlags & DDSD_BACKBUFFERCOUNT) OutTrace(" BackBufferCount=%d", lpddsd->dwBackBufferCount); - if (lpddsd->dwFlags & DDSD_WIDTH) OutTrace(" Width=%d", lpddsd->dwWidth); - if (lpddsd->dwFlags & DDSD_HEIGHT) OutTrace(" Height=%d", lpddsd->dwHeight); - if (lpddsd->dwFlags & DDSD_PITCH) OutTrace(" Pitch=%d", lpddsd->lPitch); - if (lpddsd->dwFlags & DDSD_MIPMAPCOUNT) OutTrace(" MipMapCount=%d", lpddsd->dwMipMapCount); - if (lpddsd->dwFlags & DDSD_CAPS) { - OutTrace(" Caps=%x(%s)", lpddsd->ddsCaps.dwCaps, ExplainDDSCaps(lpddsd->ddsCaps.dwCaps)); - if(lpddsd->dwSize==sizeof(DDSURFACEDESC2)){ - LPDDSURFACEDESC2 lpddsd2=(LPDDSURFACEDESC2)lpddsd; - OutTrace(" Caps2=%x(%s)", lpddsd2->ddsCaps.dwCaps2, ExplainDDSCaps2(lpddsd2->ddsCaps.dwCaps2)); - OutTrace(" Caps3=%x(%s)", lpddsd2->ddsCaps.dwCaps3, ExplainDDSCaps3(lpddsd2->ddsCaps.dwCaps3)); - } - } - if (lpddsd->dwFlags & DDSD_CKDESTBLT ) OutTrace(" CKDestBlt=(%x,%x)", lpddsd->ddckCKDestBlt.dwColorSpaceLowValue, lpddsd->ddckCKDestBlt.dwColorSpaceHighValue); - if (lpddsd->dwFlags & DDSD_CKDESTOVERLAY ) OutTrace(" CKDestOverlay=(%x,%x)", lpddsd->ddckCKDestOverlay.dwColorSpaceLowValue, lpddsd->ddckCKDestOverlay.dwColorSpaceHighValue); - if (lpddsd->dwFlags & DDSD_CKSRCBLT ) OutTrace(" CKSrcBlt=(%x,%x)", lpddsd->ddckCKSrcBlt.dwColorSpaceLowValue, lpddsd->ddckCKSrcBlt.dwColorSpaceHighValue); - if (lpddsd->dwFlags & DDSD_CKSRCOVERLAY ) OutTrace(" CKSrcOverlay=(%x,%x)", lpddsd->ddckCKSrcOverlay.dwColorSpaceLowValue, lpddsd->ddckCKSrcOverlay.dwColorSpaceHighValue); - if (lpddsd->dwFlags & DDSD_PIXELFORMAT ) OutTrace("%s", DumpPixelFormat((LPDDSURFACEDESC2)lpddsd)); - if (lpddsd->dwFlags & DDSD_LPSURFACE) OutTrace(" Surface=%x", lpddsd->lpSurface); - OutTrace("\n"); -} - -static void DumpPixFmt(LPDDSURFACEDESC2 lpdds) -{ - OutTraceD("PixelFormat: lpddsd=%x %s\n", DumpPixelFormat(lpdds)); -} - -static void DumpSurfaceAttributes(LPDDSURFACEDESC lpddsd, char *label, int line) -{ - if(!IsDebug) return; - LogSurfaceAttributes(lpddsd, label, line); -} - -static void DescribeSurface(LPDIRECTDRAWSURFACE lpdds, int dxversion, char *label, int line) -{ - DDSURFACEDESC2 ddsd; - HRESULT res; - int dwSize = (dxversion<4)?sizeof(DDSURFACEDESC):sizeof(DDSURFACEDESC2); - memset(&ddsd, 0, dwSize); - ddsd.dwSize = dwSize; - if(dxversion<4){ - if (pGetSurfaceDesc1) - res=(*pGetSurfaceDesc1)(lpdds, (LPDDSURFACEDESC)&ddsd); - else - res=lpdds->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd); - } - else if(dxversion<7){ - if (pGetSurfaceDesc4) - res=(*pGetSurfaceDesc4)((LPDIRECTDRAWSURFACE2)lpdds, (LPDDSURFACEDESC2)&ddsd); - else - res=lpdds->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd); - } - else { - if (pGetSurfaceDesc7) - res=(*pGetSurfaceDesc7)((LPDIRECTDRAWSURFACE2)lpdds, &ddsd); - else - res=lpdds->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd); - } - if(res)return; - OutTrace("Surface %s: ddsd=%x dxversion=%d ", label, lpdds, dxversion); - LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, label, line); -} - -/* ------------------------------------------------------------------------------ */ -// auxiliary (static) functions for palette handling -/* ------------------------------------------------------------------------------ */ - -BOOL isPaletteUpdated; - -void mySetPalette(int dwstart, int dwcount, LPPALETTEENTRY lpentries) -{ - int i; - extern DXWNDSTATUS *pStatus; - - OutTraceD("mySetPalette DEBUG: BPP=%d GBitMask=%x count=%d\n", - dxw.ActualPixelFormat.dwRGBBitCount, dxw.ActualPixelFormat.dwGBitMask, dwcount); - - if(IsDebug){ - int idx; - OutTraceD("PaletteEntries: start=%d count=%d ", dwstart, dwcount); - for(idx=0; idxPalette[dwstart+idx]= lpentries[idx]; - - if (dxw.dwFlags3 & RGB2YUV){ - int idx; - for(idx=0; idx255) Y=255; - if (U<0) U=0; if(U>255) U=255; - if (V<0) V=0; if(V>255) V=255; - lpentries[dwstart+idx].peRed = (BYTE)Y; - lpentries[dwstart+idx].peGreen = (BYTE)U; - lpentries[dwstart+idx].peBlue = (BYTE)V; - } - } - - if (dxw.dwFlags3 & YUV2RGB){ - int idx; - for(idx=0; idx255) Y=255; - if (U<0) U=0; if(U>255) U=255; - if (V<0) V=0; if(V>255) V=255; - lpentries[dwstart+idx].peRed = (BYTE)Y; - lpentries[dwstart+idx].peGreen = (BYTE)U; - lpentries[dwstart+idx].peBlue = (BYTE)V; - } - } - - // actually, it should be like this: R/G/B = (red * 0.30) + (green * 0.59) + (blue * 0.11) - // (http://www.codeproject.com/Articles/66253/Converting-Colors-to-Gray-Shades) - - if (dxw.dwFlags3 & BLACKWHITE){ - for(i = 0; i < dwcount; i ++){ - DWORD grayscale; - //grayscale = ((DWORD)lpentries[i].peRed + (DWORD)lpentries[i].peGreen + (DWORD)lpentries[i].peBlue) / 3; - grayscale = (((DWORD)lpentries[i].peRed * 30) + ((DWORD)lpentries[i].peGreen * 59) + ((DWORD)lpentries[i].peBlue) * 11) / 100; - lpentries[i].peRed = lpentries[i].peGreen = lpentries[i].peBlue = (BYTE)grayscale; - } - } - - switch (dxw.ActualPixelFormat.dwRGBBitCount){ - case 32: - for(i = 0; i < dwcount; i ++){ - PaletteEntries[i + dwstart] = - (((DWORD)lpentries[i].peRed) << 16) + (((DWORD)lpentries[i].peGreen) << 8) + ((DWORD)lpentries[i].peBlue); - } - break; - case 16: - for(i = 0; i < dwcount; i ++){ - PaletteEntries[i + dwstart] = (dxw.ActualPixelFormat.dwGBitMask == 0x03E0) ? - (((DWORD)lpentries[i].peRed & 0xF8) << 8) + (((DWORD)lpentries[i].peGreen & 0xFC) << 3) + (((DWORD)lpentries[i].peBlue &0xF8) >> 3) - : - (((DWORD)lpentries[i].peRed & 0xF8) << 8) + (((DWORD)lpentries[i].peGreen & 0xF8) << 3) + (((DWORD)lpentries[i].peBlue &0xF8) >> 3); - } - break; - default: - OutTraceD("ASSERT: unsupported Color BPP=%d\n", dxw.ActualPixelFormat.dwRGBBitCount); - break; - } - - isPaletteUpdated = TRUE; -} - -void InitDDScreenParameters(LPDIRECTDRAW lpdd) -{ - HRESULT res; - DDSURFACEDESC ddsd; - ddsd.dwSize=sizeof(DDSURFACEDESC); - if(res=(*pGetDisplayMode)(lpdd, &ddsd)){ - OutTraceE("GetDisplayMode: ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - return; - } - - OutTraceD("InitDDScreenParameters: Actual %s\n", DumpPixelFormat((LPDDSURFACEDESC2)&ddsd)); - dxw.ActualPixelFormat=ddsd.ddpfPixelFormat; - if(dxw.VirtualPixelFormat.dwRGBBitCount==0) dxw.VirtualPixelFormat=ddsd.ddpfPixelFormat; - SetBltTransformations(); - return; -} - -void InitDSScreenParameters(LPDIRECTDRAWSURFACE lpdds) -{ - HRESULT res; - DDPIXELFORMAT p; - DDSURFACEDESC2 ddsd; - p.dwSize=sizeof(DDPIXELFORMAT); - if(res=(*pGetPixelFormat)(lpdds, &p)){ - OutTraceE("GetPixelFormat: ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - return; - } - - ddsd.ddpfPixelFormat = p; - OutTraceD("InitDSScreenParameters: Actual %s\n", DumpPixelFormat(&ddsd)); - dxw.ActualPixelFormat=p; - SetBltTransformations(); - return; -} - -void InitScreenParameters() -{ - DEVMODE CurrDevMode; - static int DoOnce = FALSE; - - if(DoOnce) return; - DoOnce = TRUE; - - // set default VGA mode 800x600 - // should I make it configurable ? (640x480, 800x600, 1024x768) - dxw.SetScreenSize(); // 800 x 600 by default - GetHookInfo()->Height=(short)dxw.GetScreenHeight(); - GetHookInfo()->Width=(short)dxw.GetScreenWidth(); - GetHookInfo()->ColorDepth=0; // unknown - GetHookInfo()->DXVersion=0; // unknown - GetHookInfo()->isLogging=(dxw.dwTFlags & OUTTRACE); - - if(!EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &CurrDevMode)){ - OutTraceE("EnumDisplaySettings: ERROR err=%d at %d\n", GetLastError(), __LINE__); - return; - } - memset(&dxw.ActualPixelFormat, 0, sizeof(DDPIXELFORMAT)); - // initialize to default null values, but dwRGBBitCount - dxw.ActualPixelFormat.dwRGBBitCount=CurrDevMode.dmBitsPerPel; - dxw.VirtualPixelFormat.dwRGBBitCount=CurrDevMode.dmBitsPerPel; // until set differently - OutTraceD("InitScreenParameters: RGBBitCount=%d\n", CurrDevMode.dmBitsPerPel); - SetBltTransformations(); - - return; -} - -void FixPixelFormat(int ColorDepth, DDPIXELFORMAT *pf) -{ - pf->dwFlags = DDPF_RGB; - switch(ColorDepth){ - case 8: - pf->dwFlags |= DDPF_PALETTEINDEXED8; - pf->dwRGBBitCount = 8; - pf->dwRBitMask = 0; - pf->dwGBitMask = 0; - pf->dwBBitMask = 0; - pf->dwRGBAlphaBitMask = 0x0000; - break; - case 16: - pf->dwRGBBitCount = 16; - if (dxw.dwFlags1 & USERGB565){ - pf->dwRBitMask = 0xf800; - pf->dwGBitMask = 0x07e0; - pf->dwBBitMask = 0x001f; - pf->dwRGBAlphaBitMask = 0x0000; - } - else { - if(!(dxw.dwFlags4 & NOALPHACHANNEL)) pf->dwFlags |= DDPF_ALPHAPIXELS; // v2.02.33,40 - pf->dwRBitMask = 0x7c00; - pf->dwGBitMask = 0x03e0; - pf->dwBBitMask = 0x001f; - pf->dwRGBAlphaBitMask = 0x8000; - } - break; - case 24: - pf->dwRGBBitCount = 24; - pf->dwRBitMask = 0x00FF0000; - pf->dwGBitMask = 0x0000FF00; - pf->dwBBitMask = 0x000000FF; - pf->dwRGBAlphaBitMask = 0x00000000; - break; - case 32: - if(!(dxw.dwFlags4 & NOALPHACHANNEL)) pf->dwFlags |= DDPF_ALPHAPIXELS; // v2.02.33 - pf->dwRGBBitCount = 32; - pf->dwRBitMask = 0x00FF0000; - pf->dwGBitMask = 0x0000FF00; - pf->dwBBitMask = 0x000000FF; - pf->dwRGBAlphaBitMask = 0xFF000000; - break; - } -} - -int HookDirectDraw(HMODULE module, int version) -{ - HINSTANCE hinst; - void *tmp; - const GUID dd7 = {0x15e65ec0,0x3b9c,0x11d2,0xb9,0x2f,0x00,0x60,0x97,0x97,0xea,0x5b}; - - if(dxw.dwFlags2 & SETCOMPATIBILITY){ - typedef HRESULT (WINAPI *SetAppCompatData_Type)(DWORD, DWORD); - SetAppCompatData_Type pSetAppCompatData; - HRESULT res; - - hinst=LoadLibrary("ddraw.dll"); - pSetAppCompatData=(SetAppCompatData_Type)(*pGetProcAddress)(hinst, "SetAppCompatData"); - if(pSetAppCompatData) { - res=(*pSetAppCompatData)(2, 0); - OutTraceD("HookDirectDraw: SetAppCompatData(2,0) ret=%x(%s)\n", res, ExplainDDError(res)); - } - FreeLibrary(hinst); - } - - OutTraceB("HookDirectDraw version=%d\n", version); //GHO - switch(version){ - case 0: // automatic - tmp = HookAPI(module, "ddraw.dll", NULL, "DirectDrawCreate", extDirectDrawCreate); - if(tmp) pDirectDrawCreate = (DirectDrawCreate_Type)tmp; - tmp = HookAPI(module, "ddraw.dll", NULL, "DirectDrawCreateEx", extDirectDrawCreateEx); - if(tmp) pDirectDrawCreateEx = (DirectDrawCreateEx_Type)tmp; - tmp = HookAPI(module, "ddraw.dll", NULL, "DirectDrawEnumerateA", extDirectDrawEnumerate); - if(tmp) pDirectDrawEnumerate = (DirectDrawEnumerate_Type)tmp; - tmp = HookAPI(module, "ddraw.dll", NULL, "DirectDrawEnumerateExA", extDirectDrawEnumerateEx); - if(tmp) pDirectDrawEnumerateEx = (DirectDrawEnumerateEx_Type)tmp; - break; - case 1: - case 2: - case 3: - case 5: - case 6: - hinst = LoadLibrary("ddraw.dll"); - pDirectDrawEnumerate = - (DirectDrawEnumerate_Type)GetProcAddress(hinst, "DirectDrawEnumerateA"); - pDirectDrawCreate = - (DirectDrawCreate_Type)GetProcAddress(hinst, "DirectDrawCreate"); - if(pDirectDrawCreate){ - LPDIRECTDRAW lpdd; - BOOL res; - HookAPI(module, "ddraw.dll", pDirectDrawCreate, "DirectDrawCreate", extDirectDrawCreate); - HookAPI(module, "ddraw.dll", pDirectDrawEnumerate, "DirectDrawEnumerateA", extDirectDrawEnumerate); - res=extDirectDrawCreate(0, &lpdd, 0); - if (res){ - OutTraceE("DirectDrawCreate: ERROR res=%x(%s)\n", res, ExplainDDError(res)); - } - lpdd->Release(); - } - break; - case 7: - hinst = LoadLibrary("ddraw.dll"); - pDirectDrawEnumerate = - (DirectDrawEnumerate_Type)GetProcAddress(hinst, "DirectDrawEnumerateA"); - pDirectDrawEnumerateEx = - (DirectDrawEnumerateEx_Type)GetProcAddress(hinst, "DirectDrawEnumerateExA"); - pDirectDrawCreate = - (DirectDrawCreate_Type)GetProcAddress(hinst, "DirectDrawCreate"); - if(pDirectDrawCreate){ - LPDIRECTDRAW lpdd; - BOOL res; - HookAPI(module, "ddraw.dll", pDirectDrawCreate, "DirectDrawCreate", extDirectDrawCreate); - HookAPI(module, "ddraw.dll", pDirectDrawEnumerate, "DirectDrawEnumerateA", extDirectDrawEnumerate); - HookAPI(module, "ddraw.dll", pDirectDrawEnumerateEx, "DirectDrawEnumerateExA", extDirectDrawEnumerateEx); - res=extDirectDrawCreate(0, &lpdd, 0); - if (res) OutTraceE("DirectDrawCreate: ERROR res=%x(%s)\n", res, ExplainDDError(res)); - lpdd->Release(); - } - pDirectDrawCreateEx = - (DirectDrawCreateEx_Type)GetProcAddress(hinst, "DirectDrawCreateEx"); - if(pDirectDrawCreateEx){ - LPDIRECTDRAW lpdd; - BOOL res; - HookAPI(module, "ddraw.dll", pDirectDrawCreateEx, "DirectDrawCreateEx", extDirectDrawCreateEx); - res=extDirectDrawCreateEx(0, &lpdd, dd7, 0); - if (res) OutTraceE("DirectDrawCreateEx: ERROR res=%x(%s)\n", res, ExplainDDError(res)); - lpdd->Release(); - } - break; - } - - if(pDirectDrawCreate || pDirectDrawCreateEx) return 1; - return 0; -} - -Unlock4_Type pUnlockMethod(LPDIRECTDRAWSURFACE lpdds) -{ - char sMsg[81]; - void * extUnlock; - __try{ // v2.02.31: catch some possible exception (i.e. Abomination in EMULATION mode) - extUnlock=(void *)*(DWORD *)(*(DWORD *)lpdds + 128); - } - __except (EXCEPTION_EXECUTE_HANDLER){ - OutTraceE("Exception at %d\n",__LINE__); - return (Unlock4_Type)pUnlock1; - }; - if(extUnlock==(void *)extUnlock1) return (Unlock4_Type)pUnlock1; - if(extUnlock==(void *)extUnlock4) return (Unlock4_Type)pUnlock4; - if(extUnlock==(void *)extUnlockDir1) return (Unlock4_Type)pUnlock1; - if(extUnlock==(void *)extUnlockDir4) return (Unlock4_Type)pUnlock4; - sprintf_s(sMsg, 80, "pUnlockMethod: pUnlock(%x) can't match %x\n", lpdds, extUnlock); - OutTraceD(sMsg); - if (IsAssertEnabled) MessageBox(0, sMsg, "pUnlockMethod", MB_OK | MB_ICONEXCLAMATION); - if (pUnlock4) return pUnlock4; - return (Unlock4_Type)pUnlock1; -} - -CreateSurface2_Type pCreateSurfaceMethod(LPDIRECTDRAWSURFACE lpdds) -{ - char sMsg[81]; - void * extUnlock; - extUnlock=(void *)*(DWORD *)(*(DWORD *)lpdds + 128); - if(extUnlock==(void *)extUnlock1) return (CreateSurface2_Type)pCreateSurface1; - if(extUnlock==(void *)extUnlock4) return (CreateSurface2_Type)pCreateSurface4; - if(extUnlock==(void *)extUnlockDir1) return (CreateSurface2_Type)pCreateSurface1; - if(extUnlock==(void *)extUnlockDir4) return (CreateSurface2_Type)pCreateSurface4; - sprintf_s(sMsg, 80, "pCreateSurfaceMethod: pUnlock(%x) can't match %x\n", lpdds, extUnlock); - OutTraceD(sMsg); - if (IsAssertEnabled) MessageBox(0, sMsg, "pCreateSurfaceMethod", MB_OK | MB_ICONEXCLAMATION); - if (pCreateSurface4) return pCreateSurface4; - return (CreateSurface2_Type)pCreateSurface1; -} - -int SurfaceDescrSize(LPDIRECTDRAWSURFACE lpdds) -{ - char sMsg[81]; - void * extUnlock; - extUnlock=(void *)*(DWORD *)(*(DWORD *)lpdds + 128); - if(extUnlock==(void *)extUnlock1) return sizeof(DDSURFACEDESC); - if(extUnlock==(void *)extUnlock4) return sizeof(DDSURFACEDESC2); - if(extUnlock==(void *)extUnlockDir1) return sizeof(DDSURFACEDESC); - if(extUnlock==(void *)extUnlockDir4) return sizeof(DDSURFACEDESC2); - sprintf_s(sMsg, 80, "pCreateSurfaceMethod: pUnlock(%x) can't match %x\n", lpdds, extUnlock); - OutTraceD(sMsg); - if (IsAssertEnabled) MessageBox(0, sMsg, "SurfaceDescrSize", MB_OK | MB_ICONEXCLAMATION); - return sizeof(DDSURFACEDESC); -} - -int lpddsHookedVersion(LPDIRECTDRAWSURFACE lpdds) -{ - char sMsg[81]; - void * extGetCaps; - - __try{ - extGetCaps=(void *)*(DWORD *)(*(DWORD *)lpdds + 56); - } - __except (EXCEPTION_EXECUTE_HANDLER){ - extGetCaps=NULL; - }; - if(extGetCaps==(void *)extGetCaps1S) return 1; - if(extGetCaps==(void *)extGetCaps2S) return 2; - if(extGetCaps==(void *)extGetCaps3S) return 3; - if(extGetCaps==(void *)extGetCaps4S) return 4; - if(extGetCaps==(void *)extGetCaps7S) return 7; - sprintf_s(sMsg, 80, "lpddsHookedVersion(%x) can't match %x\n", lpdds, extGetCaps); - OutTraceD(sMsg); - if (IsAssertEnabled) MessageBox(0, sMsg, "lpddsHookedVersion", MB_OK | MB_ICONEXCLAMATION); - return 0; -} - -int lpddHookedVersion(LPDIRECTDRAW lpdd) -{ - char sMsg[81]; - void * extCreateSurface; - - __try{ - extCreateSurface=(void *)*(DWORD *)(*(DWORD *)lpdd + 24); - } - __except (EXCEPTION_EXECUTE_HANDLER){ - extCreateSurface=NULL; - }; - if(extCreateSurface==(void *)extCreateSurface7) return 7; - if(extCreateSurface==(void *)extCreateSurface4) return 4; - if(extCreateSurface==(void *)extCreateSurface2) return 2; - if(extCreateSurface==(void *)extCreateSurface1) return 1; - sprintf_s(sMsg, 80, "lpddHookedVersion(%x) can't match %x\n", lpdd, extCreateSurface); - OutTraceD(sMsg); - if (IsAssertEnabled) MessageBox(0, sMsg, "lpddHookedVersion", MB_OK | MB_ICONEXCLAMATION); - return 0; -} - -/* ------------------------------------------------------------------ */ - -// SetPixFmt: builds a pixel format descriptor when no one is specified, starting from the color depth, the current -// desktop pixel format (when the color depth is the same) or the config flags - -static void SetPixFmt(LPDDSURFACEDESC2 lpdd) -{ - OutTraceD("SetPixFmt: BPP=%d Use565=%d NoAlpha=%d\n", - dxw.VirtualPixelFormat.dwRGBBitCount, - dxw.dwFlags1 & USERGB565 ? 1:0, - dxw.dwFlags4 & NOALPHACHANNEL ? 1:0); - - memset(&lpdd->ddpfPixelFormat,0,sizeof(DDPIXELFORMAT)); - lpdd->ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); - - switch (dxw.VirtualPixelFormat.dwRGBBitCount) - { - case 8: - case 16: - case 24: - case 32: - FixPixelFormat(dxw.VirtualPixelFormat.dwRGBBitCount, &lpdd->ddpfPixelFormat); - break; - default: - OutTraceE("CreateSurface ERROR: Unsupported resolution ColorBPP=%d\n", dxw.VirtualPixelFormat.dwRGBBitCount); - break; - } - - - // remember current virtual settings - dxw.VirtualPixelFormat=lpdd->ddpfPixelFormat; - OutTraceD("SetPixFmt: %s\n", DumpPixelFormat(lpdd)); -} - -// retrieves the stored pixel format - -static void GetPixFmt(LPDDSURFACEDESC2 lpdd) -{ - lpdd->ddpfPixelFormat = dxw.VirtualPixelFormat; - OutTraceD("GetPixFmt: %s\n", DumpPixelFormat(lpdd)); -} - -/* ------------------------------------------------------------------ */ -// hook query functions that determines the object versioning .... -/* ------------------------------------------------------------------ */ - -int Set_dwSize_From_Surface(LPDIRECTDRAWSURFACE lpdds) -{ - int dxversion; - if (lpdds==NULL || - lpdds==lpDDSEmu_Prim || - lpdds==lpDDSEmu_Back - ) - dxversion=lpddHookedVersion(lpPrimaryDD); // v2.01.87-v2.02.31 fix - else - dxversion=lpddsHookedVersion(lpdds); - - return (dxversion < 4) ? sizeof(DDSURFACEDESC) : sizeof(DDSURFACEDESC2); -} - -int Set_dwSize_From_DDraw(LPDIRECTDRAW lpdd) -{ - return (lpddHookedVersion(lpdd) < 4) ? sizeof(DDSURFACEDESC) : sizeof(DDSURFACEDESC2); -} - -static void HookDDSession(LPDIRECTDRAW *lplpdd, int dxversion) -{ - OutTraceD("Hooking directdraw session dd=%x dxversion=%d thread_id=%x\n", - *lplpdd, dxversion, GetCurrentThreadId()); - - // IDIrectDraw::QueryInterface - SetHook((void *)(**(DWORD **)lplpdd), extQueryInterfaceD, (void **)&pQueryInterfaceD, "QueryInterface(D)"); - // IDIrectDraw::Release - SetHook((void *)(**(DWORD **)lplpdd + 8), extReleaseD, (void **)&pReleaseD, "Release(D)"); - // IDIrectDraw::CreateClipper - SetHook((void *)(**(DWORD **)lplpdd + 16), extCreateClipper, (void **)&pCreateClipper, "CreateClipper(D)"); - // IDIrectDraw::CreatePalette - SetHook((void *)(**(DWORD **)lplpdd + 20), extCreatePalette, (void **)&pCreatePalette, "CreatePalette(D)"); - // IDIrectDraw::CreateSurface - switch(dxversion) { - case 1: - SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateSurface1, (void **)&pCreateSurface1, "CreateSurface(S1)"); - break; - case 2: - SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateSurface2, (void **)&pCreateSurface2, "CreateSurface(S2)"); - break; - case 4: - SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateSurface4, (void **)&pCreateSurface4, "CreateSurface(S4)"); - break; - case 7: - SetHook((void *)(**(DWORD **)lplpdd + 24), extCreateSurface7, (void **)&pCreateSurface7, "CreateSurface(S7)"); - break; - } - // IDIrectDraw::DuplicateSurface - SetHook((void *)(**(DWORD **)lplpdd + 28), extDuplicateSurface, (void **)&pDuplicateSurface, "DuplicateSurface(D)"); - // IDIrectDraw::EnumDisplayModes - switch(dxversion) { - case 1: - case 2: - SetHook((void *)(**(DWORD **)lplpdd + 32), extEnumDisplayModes1, (void **)&pEnumDisplayModes1, "EnumDisplayModes(D1)"); - break; - case 4: - case 7: - SetHook((void *)(**(DWORD **)lplpdd + 32), extEnumDisplayModes4, (void **)&pEnumDisplayModes4, "EnumDisplayModes(D4)"); - break; - } - // IDIrectDraw::FlipToGDISurface - SetHook((void *)(**(DWORD **)lplpdd + 40), extFlipToGDISurface, (void **)&pFlipToGDISurface, "FlipToGDISurface(D)"); - // IDIrectDraw::GetDisplayMode - SetHook((void *)(**(DWORD **)lplpdd + 48), extGetDisplayMode, (void **)&pGetDisplayMode, "GetDisplayMode(D)"); - // 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::TestCooperativeLevel - if (dxversion >= 4) - SetHook((void *)(**(DWORD **)lplpdd + 104), extTestCooperativeLevel, (void **)&pTestCooperativeLevel, "TestCooperativeLevel(D)"); - - if (!(dxw.dwTFlags & OUTPROXYTRACE)) return; - // Just proxed ... - - // IDIrectDraw::AddRef - SetHook((void *)(**(DWORD **)lplpdd + 4), extAddRefDProxy, (void **)&pAddRefD, "AddRef(D)"); - // IDIrectDraw::Compact - SetHook((void *)(**(DWORD **)lplpdd + 12), extCompactProxy, (void **)&pCompact, "Compact(D)"); - // IDIrectDraw::EnumSurfaces - if (dxversion < 4) - SetHook((void *)(**(DWORD **)lplpdd + 36), extEnumSurfacesProxy1, (void **)&pEnumSurfaces1, "EnumSurfaces(D1)"); - else - SetHook((void *)(**(DWORD **)lplpdd + 36), extEnumSurfacesProxy4, (void **)&pEnumSurfaces4, "EnumSurfaces(D4)"); - // IDIrectDraw::GetCaps - SetHook((void *)(**(DWORD **)lplpdd + 44), extGetCapsD, (void **)&pGetCapsD, "GetCaps(D)"); - // IDIrectDraw::GetFourCCCodes - SetHook((void *)(**(DWORD **)lplpdd + 52), extGetFourCCCodesProxy, (void **)&pGetFourCCCodes, "GetFourCCCodes(D)"); - // IDIrectDraw::GetMonitorFrequency - SetHook((void *)(**(DWORD **)lplpdd + 60), extGetMonitorFrequencyProxy, (void **)&pGetMonitorFrequency, "GetMonitorFrequency(D)"); - // IDIrectDraw::GetScanLine - SetHook((void *)(**(DWORD **)lplpdd + 64), extGetScanLineProxy, (void **)&pGetScanLine, "GetScanLine(D)"); - // IDIrectDraw::GetVerticalBlankStatus - SetHook((void *)(**(DWORD **)lplpdd + 68), extGetVerticalBlankStatusProxy, (void **)&pGetVerticalBlankStatus, "GetVerticalBlankStatus(D)"); - // IDIrectDraw::RestoreDisplayMode - SetHook((void *)(**(DWORD **)lplpdd + 76), extRestoreDisplayModeProxy, (void **)&pRestoreDisplayMode, "RestoreDisplayMode(D)"); - // IDIrectDraw::GetAvailableVidMem - if (dxversion >= 2) - SetHook((void *)(**(DWORD **)lplpdd + 92), extGetAvailableVidMemProxy, (void **)&pGetAvailableVidMem, "GetAvailableVidMem(D)"); - if (dxversion >= 4){ - // IDIrectDraw::GetSurfaceFromDC - SetHook((void *)(**(DWORD **)lplpdd + 96), extGetSurfaceFromDCProxy, (void **)&pGetSurfaceFromDC, "GetSurfaceFromDC(D)"); - // IDIrectDraw::RestoreAllSurfaces - SetHook((void *)(**(DWORD **)lplpdd + 100), extRestoreAllSurfacesProxy, (void **)&pRestoreAllSurfaces, "RestoreAllSurfaces(D)"); - // IDIrectDraw::GetDeviceIdentifier - SetHook((void *)(**(DWORD **)lplpdd + 108), extGetDeviceIdentifierProxy, (void **)&pGetDeviceIdentifier, "GetDeviceIdentifier(D)"); - } -} - -static void HookDDClipper(LPDIRECTDRAWCLIPPER FAR* lplpDDClipper) -{ - OutTraceD("Hooking directdraw clipper dd=%x\n", *lplpDDClipper); - - // IDirectDrawClipper::Release - SetHook((void *)(**(DWORD **)lplpDDClipper + 8), extReleaseC, (void **)&pReleaseC, "Release(C)"); - - if (!(dxw.dwTFlags & OUTPROXYTRACE)) return; - // Just proxed ... - - // IDirectDrawClipper::QueryInterface - SetHook((void *)(**(DWORD **)lplpDDClipper), extQueryInterfaceCProxy, (void **)&pQueryInterfaceC, "QueryInterface(C)"); - // IDirectDrawClipper::AddRef - SetHook((void *)(**(DWORD **)lplpDDClipper + 4), extAddRefCProxy, (void **)&pAddRefC, "AddRef(C)"); - // IDirectDrawClipper::GetClipList - SetHook((void *)(**(DWORD **)lplpDDClipper + 12), extGetClipListProxy, (void **)&pGetClipList, "GetClipList(C)"); - // IDirectDrawClipper::GetHWnd - SetHook((void *)(**(DWORD **)lplpDDClipper + 16), extGetHWndProxy, (void **)&pGetHWnd, "GetHWnd(C)"); - // IDirectDrawClipper::Initialize - SetHook((void *)(**(DWORD **)lplpDDClipper + 20), extInitializeCProxy, (void **)&pInitializeC, "Initialize(C)"); - // IDirectDrawClipper::IsClipListChanged - SetHook((void *)(**(DWORD **)lplpDDClipper + 24), extIsClipListChangedProxy, (void **)&pIsClipListChanged, "IsClipListChanged(C)"); - // IDirectDrawClipper::SetClipList - SetHook((void *)(**(DWORD **)lplpDDClipper + 28), extSetClipListProxy, (void **)&pSetClipList, "SetClipList(C)"); - // IDirectDrawClipper::SetHWnd - SetHook((void *)(**(DWORD **)lplpDDClipper + 32), extSetHWndProxy, (void **)&pSetHWnd, "SetHWnd(C)"); - - return; -} - -static void HookDDPalette(LPDIRECTDRAWPALETTE FAR* lplpDDPalette) -{ - OutTraceD("Hooking directdraw palette dd=%x\n", *lplpDDPalette); - - /*** IDirectDrawPalette methods ***/ - // IDirectDrawPalette::Release - SetHook((void *)(**(DWORD **)lplpDDPalette + 8), extReleaseP, (void **)&pReleaseP, "Release(P)"); - // IDirectDrawPalette::SetEntries - SetHook((void *)(**(DWORD **)lplpDDPalette + 24), extSetEntries, (void **)&pSetEntries, "SetEntries(P)"); - - if (!(dxw.dwTFlags & OUTPROXYTRACE)) return; - - // IDirectDrawPalette::QueryInterface - SetHook((void *)(**(DWORD **)lplpDDPalette), extQueryInterfacePProxy, (void **)&pQueryInterfaceP, "QueryInterface(P)"); - // IDirectDrawPalette::AddRef - SetHook((void *)(**(DWORD **)lplpDDPalette + 4), extAddRefPProxy, (void **)&pAddRefP, "AddRef(P)"); - // IDirectDrawPalette::GetCaps - SetHook((void *)(**(DWORD **)lplpDDPalette + 12), extGetCapsPProxy, (void **)&pGetCapsP, "GetCaps(P)"); - // IDirectDrawPalette::GetEntries - SetHook((void *)(**(DWORD **)lplpDDPalette + 16), extGetEntriesProxy, (void **)&pGetEntries, "GetEntries(P)"); - - return; -} - -static void HookDDSurfacePrim(LPDIRECTDRAWSURFACE *lplpdds, int dxversion) -{ - OutTraceD("Hooking surface as primary dds=%x dxversion=%d thread_id=%x\n", - *lplpdds, dxversion, GetCurrentThreadId()); - - // IDirectDrawSurface::Query - SetHook((void *)(**(DWORD **)lplpdds), extQueryInterfaceS, (void **)&pQueryInterfaceS, "QueryInterface(S)"); - // IDirectDrawSurface::Release - SetHook((void *)(**(DWORD **)lplpdds + 8), extReleaseS, (void **)&pReleaseS, "Release(S)"); - // IDirectDrawSurface::AddAttachedSurface - SetHook((void *)(**(DWORD **)lplpdds + 12), extAddAttachedSurface, (void **)&pAddAttachedSurface, "AddAttachedSurface(S)"); - // IDirectDrawSurface::Blt - SetHook((void *)(**(DWORD **)lplpdds + 20), extBlt, (void **)&pBlt, "Blt(S)"); - // IDirectDrawSurface::BltFast - SetHook((void *)(**(DWORD **)lplpdds + 28), extBltFast, (void **)&pBltFast, "BltFast(S)"); - // IDirectDrawSurface::DeleteAttachedSurface - SetHook((void *)(**(DWORD **)lplpdds + 32), extDeleteAttachedSurface, (void **)&pDeleteAttachedSurface, "DeleteAttachedSurface(S)"); - // IDirectDrawSurface::EnumAttachedSurfaces - SetHook((void *)(**(DWORD **)lplpdds + 36), extEnumAttachedSurfaces, (void **)&pEnumAttachedSurfaces, "EnumAttachedSurfaces(S)"); - // IDirectDrawSurface::Flip - SetHook((void *)(**(DWORD **)lplpdds + 44), extFlip, (void **)&pFlip, "Flip(S)"); - // IDirectDrawSurface::GetAttachedSurface - switch(dxversion) { - case 1: - case 2: - SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface1, (void **)&pGetAttachedSurface1, "GetAttachedSurface(S1)"); - break; - case 3: - SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface3, (void **)&pGetAttachedSurface3, "GetAttachedSurface(S3)"); - break; - case 4: - SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface4, (void **)&pGetAttachedSurface4, "GetAttachedSurface(S4)"); - break; - case 7: - SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface7, (void **)&pGetAttachedSurface7, "GetAttachedSurface(S7)"); - break; - } - // IDirectDrawSurface::GetCaps - switch(dxversion) { - case 1: - SetHook((void *)(**(DWORD **)lplpdds + 56), extGetCaps1S, (void **)&pGetCaps1S, "GetCaps(S1)"); - break; - case 2: - SetHook((void *)(**(DWORD **)lplpdds + 56), extGetCaps2S, (void **)&pGetCaps2S, "GetCaps(S2)"); - break; - case 3: - SetHook((void *)(**(DWORD **)lplpdds + 56), extGetCaps3S, (void **)&pGetCaps3S, "GetCaps(S3)"); - break; - case 4: - SetHook((void *)(**(DWORD **)lplpdds + 56), extGetCaps4S, (void **)&pGetCaps4S, "GetCaps(S4)"); - break; - case 7: - SetHook((void *)(**(DWORD **)lplpdds + 56), extGetCaps7S, (void **)&pGetCaps7S, "GetCaps(S7)"); - break; - } - // IDirectDrawSurface::GetColorKey - SetHook((void *)(**(DWORD **)lplpdds + 64), extGetColorKey, (void **)&pGetColorKey, "GetColorKey(S)"); - // IDirectDrawSurface::GetPalette - SetHook((void *)(**(DWORD **)lplpdds + 80), extGetPalette, (void **)&pGetPalette, "GetPalette(S)"); - // IDirectDrawSurface::GetPixelFormat - SetHook((void *)(**(DWORD **)lplpdds + 84), extGetPixelFormat, (void **)&pGetPixelFormat, "GetPixelFormat(S)"); - // IDirectDrawSurface::GetSurfaceDesc - switch(dxversion) { - case 1: - case 2: - case 3: - SetHook((void *)(**(DWORD **)lplpdds + 88), extGetSurfaceDesc1, (void **)&pGetSurfaceDesc1, "GetSurfaceDesc(S1)"); - break; - case 4: - SetHook((void *)(**(DWORD **)lplpdds + 88), extGetSurfaceDesc2, (void **)&pGetSurfaceDesc4, "GetSurfaceDesc(S4)"); - break; - case 7: - SetHook((void *)(**(DWORD **)lplpdds + 88), extGetSurfaceDesc7, (void **)&pGetSurfaceDesc7, "GetSurfaceDesc(S7)"); - break; - } - // IDirectDrawSurface::SetClipper - SetHook((void *)(**(DWORD **)lplpdds + 112), extSetClipper, (void **)&pSetClipper, "SetClipper(S)"); - // IDirectDrawSurface::SetColorKey - SetHook((void *)(**(DWORD **)lplpdds + 116), extSetColorKey, (void **)&pSetColorKey, "SetColorKey(S)"); - // IDirectDrawSurface::SetPalette - SetHook((void *)(**(DWORD **)lplpdds + 124), extSetPalette, (void **)&pSetPalette, "SetPalette(S)"); - // IDirectDrawSurface::GetDC - SetHook((void *)(**(DWORD **)lplpdds + 68), extGetDC, (void **)&pGetDC, "GetDC(S)"); - // IDirectDrawSurface::ReleaseDC - SetHook((void *)(**(DWORD **)lplpdds + 104), extReleaseDC, (void **)&pReleaseDC, "ReleaseDC(S)"); - if (dxw.dwFlags1 & (EMULATESURFACE|EMULATEBUFFER)){ - // IDirectDrawSurface::Lock - SetHook((void *)(**(DWORD **)lplpdds + 100), extLock, (void **)&pLock, "Lock(S)"); - // IDirectDrawSurface::Unlock - if (dxversion < 4) - SetHook((void *)(**(DWORD **)lplpdds + 128), extUnlock1, (void **)&pUnlock1, "Unlock(S1)"); - else - SetHook((void *)(**(DWORD **)lplpdds + 128), extUnlock4, (void **)&pUnlock4, "Unlock(S4)"); - } - else { - // IDirectDrawSurface::Lock - SetHook((void *)(**(DWORD **)lplpdds + 100), extLockDir, (void **)&pLock, "Lock(S)"); - // IDirectDrawSurface::Unlock - if (dxversion < 4) - SetHook((void *)(**(DWORD **)lplpdds + 128), extUnlockDir1, (void **)&pUnlock1, "Unlock(S1)"); - else - SetHook((void *)(**(DWORD **)lplpdds + 128), extUnlockDir4, (void **)&pUnlock4, "Unlock(S4)"); - } - - if (!(dxw.dwTFlags & OUTPROXYTRACE)) return; - - // Just proxed ... - - // IDirectDrawSurface::AddRef - SetHook((void *)(**(DWORD **)lplpdds + 4), extAddRefSProxy, (void **)&pAddRefS, "AddRef(S)"); - // IDirectDrawSurface::AddOverlayDirtyRect - SetHook((void *)(**(DWORD **)lplpdds + 16), extAddOverlayDirtyRectProxy, (void **)&pAddOverlayDirtyRect, "AddOverlayDirtyRect(S)"); - // IDirectDrawSurface::BltBatch - SetHook((void *)(**(DWORD **)lplpdds + 24), extBltBatchProxy, (void **)&pBltBatch, "BltBatch(S)"); - // IDirectDrawSurface::EnumOverlayZOrders - SetHook((void *)(**(DWORD **)lplpdds + 40), extEnumOverlayZOrdersProxy, (void **)&pEnumOverlayZOrders, "EnumOverlayZOrders(S)"); - // IDirectDrawSurface::GetBltStatus - SetHook((void *)(**(DWORD **)lplpdds + 52), extGetBltStatusProxy, (void **)&pGetBltStatus, "GetBltStatus(S)"); - // IDirectDrawSurface::GetClipper - SetHook((void *)(**(DWORD **)lplpdds + 60), extGetClipperProxy, (void **)&pGetClipper, "GetClipper(S)"); - // IDirectDrawSurface::GetFlipStatus - SetHook((void *)(**(DWORD **)lplpdds + 72), extGetFlipStatusProxy, (void **)&pGetFlipStatus, "GetFlipStatus(S)"); - // IDirectDrawSurface::GetOverlayPosition - SetHook((void *)(**(DWORD **)lplpdds + 76), extGetOverlayPositionProxy, (void **)&pGetOverlayPosition, "GetOverlayPosition(S)"); - // IDirectDrawSurface::IsLost - SetHook((void *)(**(DWORD **)lplpdds + 96), extIsLostProxy, (void **)&pIsLost, "IsLost(S)"); - // IDirectDrawSurface::Restore - SetHook((void *)(**(DWORD **)lplpdds + 108), extRestoreProxy, (void **)&pRestore, "Restore(S)"); - // IDirectDrawSurface::SetOverlayPosition - SetHook((void *)(**(DWORD **)lplpdds + 120), extSetOverlayPositionProxy, (void **)&pSetOverlayPosition, "SetOverlayPosition(S)"); - // IDirectDrawSurface::UpdateOverlay - SetHook((void *)(**(DWORD **)lplpdds + 132), extUpdateOverlayProxy, (void **)&pUpdateOverlay, "UpdateOverlay(S)"); - // IDirectDrawSurface::UpdateOverlayDisplay - SetHook((void *)(**(DWORD **)lplpdds + 136), extUpdateOverlayDisplayProxy, (void **)&pUpdateOverlayDisplay, "UpdateOverlayDisplay(S)"); - // IDirectDrawSurface::UpdateOverlayZOrder - SetHook((void *)(**(DWORD **)lplpdds + 140), extUpdateOverlayZOrderProxy, (void **)&pUpdateOverlayZOrder, "UpdateOverlayZOrder(S)"); -} - -static void HookDDSurfaceGeneric(LPDIRECTDRAWSURFACE *lplpdds, int dxversion) -{ - OutTraceD("Hooking surface as generic dds=%x dxversion=%d thread_id=%x\n", - *lplpdds, dxversion, GetCurrentThreadId()); - - // IDirectDrawSurface::QueryInterface - SetHook((void *)(**(DWORD **)lplpdds), extQueryInterfaceS, (void **)&pQueryInterfaceS, "QueryInterface(S)"); - // IDirectDrawSurface::Release - SetHook((void *)(**(DWORD **)lplpdds + 8), extReleaseS, (void **)&pReleaseS, "Release(S)"); - // IDirectDrawSurface::AddAttachedSurface - SetHook((void *)(**(DWORD **)lplpdds + 12), extAddAttachedSurface, (void **)&pAddAttachedSurface, "AddAttachedSurface(S)"); - // IDirectDrawSurface::Flip - SetHook((void *)(**(DWORD **)lplpdds + 44), extFlip, (void **)&pFlip, "Flip(S)"); - // IDirectDrawSurface::Blt - SetHook((void *)(**(DWORD **)lplpdds + 20), extBlt, (void **)&pBlt, "Blt(S)"); - // IDirectDrawSurface::BltFast - SetHook((void *)(**(DWORD **)lplpdds + 28), extBltFast, (void **)&pBltFast, "BltFast(S)"); - // IDirectDrawSurface::DeleteAttachedSurface - SetHook((void *)(**(DWORD **)lplpdds + 32), extDeleteAttachedSurface, (void **)&pDeleteAttachedSurface, "DeleteAttachedSurface(S)"); - // IDirectDrawSurface::GetAttachedSurface - switch(dxversion) { - case 1: - case 2: - SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface1, (void **)&pGetAttachedSurface1, "GetAttachedSurface(S1)"); - break; - case 3: - SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface3, (void **)&pGetAttachedSurface3, "GetAttachedSurface(S3)"); - break; - case 4: - SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface4, (void **)&pGetAttachedSurface4, "GetAttachedSurface(S4)"); - break; - case 7: - SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface7, (void **)&pGetAttachedSurface7, "GetAttachedSurface(S7)"); - break; - } - // IDirectDrawSurface::GetCaps - switch(dxversion) { - case 1: - SetHook((void *)(**(DWORD **)lplpdds + 56), extGetCaps1S, (void **)&pGetCaps1S, "GetCaps(S1)"); - break; - case 2: - SetHook((void *)(**(DWORD **)lplpdds + 56), extGetCaps2S, (void **)&pGetCaps2S, "GetCaps(S2)"); - break; - case 3: - SetHook((void *)(**(DWORD **)lplpdds + 56), extGetCaps3S, (void **)&pGetCaps3S, "GetCaps(S3)"); - break; - case 4: - SetHook((void *)(**(DWORD **)lplpdds + 56), extGetCaps4S, (void **)&pGetCaps4S, "GetCaps(S4)"); - break; - case 7: - SetHook((void *)(**(DWORD **)lplpdds + 56), extGetCaps7S, (void **)&pGetCaps7S, "GetCaps(S7)"); - break; - } - // IDirectDrawSurface::GetDC - SetHook((void *)(**(DWORD **)lplpdds + 68), extGetDC, (void **)&pGetDC, "GetDC(S)"); // IDirectDrawSurface::GetSurfaceDesc - // IDirectDrawSurface::GetSurfaceDesc - if (dxversion < 4) { - SetHook((void *)(**(DWORD **)lplpdds + 88), extGetSurfaceDesc1, (void **)&pGetSurfaceDesc1, "GetSurfaceDesc(S1)"); - } - else { - SetHook((void *)(**(DWORD **)lplpdds + 88), extGetSurfaceDesc2, (void **)&pGetSurfaceDesc4, "GetSurfaceDesc(S4)"); - } - // IDirectDrawSurface::ReleaseDC - SetHook((void *)(**(DWORD **)lplpdds + 104), extReleaseDC, (void **)&pReleaseDC, "ReleaseDC(S)"); - - if (dxw.dwFlags1 & (EMULATESURFACE|EMULATEBUFFER)){ - // IDirectDrawSurface::Lock - SetHook((void *)(**(DWORD **)lplpdds + 100), extLock, (void **)&pLock, "Lock(S)"); - // IDirectDrawSurface::Unlock - if (dxversion < 4) - SetHook((void *)(**(DWORD **)lplpdds + 128), extUnlock1, (void **)&pUnlock1, "Unlock(S1)"); - else - SetHook((void *)(**(DWORD **)lplpdds + 128), extUnlock4, (void **)&pUnlock4, "Unlock(S4)"); - } - else { - // IDirectDrawSurface::Lock - SetHook((void *)(**(DWORD **)lplpdds + 100), extLockDir, (void **)&pLock, "Lock(S)"); - // IDirectDrawSurface::Unlock - if (dxversion < 4) - SetHook((void *)(**(DWORD **)lplpdds + 128), extUnlockDir1, (void **)&pUnlock1, "Unlock(S1)"); - else - SetHook((void *)(**(DWORD **)lplpdds + 128), extUnlockDir4, (void **)&pUnlock4, "Unlock(S4)"); - } - - if (!(dxw.dwTFlags & OUTPROXYTRACE)) return; - - // just proxed .... - - // IDirectDrawSurface::AddRef - SetHook((void *)(**(DWORD **)lplpdds + 4), extAddRefSProxy, (void **)&pAddRefS, "AddRef(S)"); - // IDirectDrawSurface::AddOverlayDirtyRect - SetHook((void *)(**(DWORD **)lplpdds + 16), extAddOverlayDirtyRectProxy, (void **)&pAddOverlayDirtyRect, "AddOverlayDirtyRect(S)"); - // IDirectDrawSurface::BltBatch - SetHook((void *)(**(DWORD **)lplpdds + 24), extBltBatchProxy, (void **)&pBltBatch, "BltBatch(S)"); - // IDirectDrawSurface::EnumAttachedSurfaces - SetHook((void *)(**(DWORD **)lplpdds + 36), extEnumAttachedSurfaces, (void **)&pEnumAttachedSurfaces, "EnumAttachedSurfaces(S)"); - // IDirectDrawSurface::EnumOverlayZOrders - SetHook((void *)(**(DWORD **)lplpdds + 40), extEnumOverlayZOrdersProxy, (void **)&pEnumOverlayZOrders, "EnumOverlayZOrders(S)"); - // IDirectDrawSurface::GetBltStatus - SetHook((void *)(**(DWORD **)lplpdds + 52), extGetBltStatusProxy, (void **)&pGetBltStatus, "GetBltStatus(S)"); - // IDirectDrawSurface::GetClipper - SetHook((void *)(**(DWORD **)lplpdds + 60), extGetClipperProxy, (void **)&pGetClipper, "GetClipper(S)"); - // IDirectDrawSurface::GetFlipStatus - SetHook((void *)(**(DWORD **)lplpdds + 72), extGetFlipStatusProxy, (void **)&pGetFlipStatus, "GetFlipStatus(S)"); - // IDirectDrawSurface::GetOverlayPosition - SetHook((void *)(**(DWORD **)lplpdds + 76), extGetOverlayPositionProxy, (void **)&pGetOverlayPosition, "GetOverlayPosition(S)"); - // IDirectDrawSurface::IsLost - SetHook((void *)(**(DWORD **)lplpdds + 96), extIsLostProxy, (void **)&pIsLost, "IsLost(S)"); - // IDirectDrawSurface::Lock - SetHook((void *)(**(DWORD **)lplpdds + 100), extLock, (void **)&pLock, "Lock(S)"); - // IDirectDrawSurface::Restore - SetHook((void *)(**(DWORD **)lplpdds + 108), extRestoreProxy, (void **)&pRestore, "Restore(S)"); - // IDirectDrawSurface::SetOverlayPosition - SetHook((void *)(**(DWORD **)lplpdds + 120), extSetOverlayPositionProxy, (void **)&pSetOverlayPosition, "SetOverlayPosition(S)"); - // IDirectDrawSurface::Unlock - if (dxversion < 4) - SetHook((void *)(**(DWORD **)lplpdds + 128), extUnlock1, (void **)&pUnlock1, "Unlock(S1)"); - else - SetHook((void *)(**(DWORD **)lplpdds + 128), extUnlock4, (void **)&pUnlock4, "Unlock(S4)"); - // IDirectDrawSurface::UpdateOverlay - SetHook((void *)(**(DWORD **)lplpdds + 132), extUpdateOverlayProxy, (void **)&pUpdateOverlay, "UpdateOverlay(S)"); - // IDirectDrawSurface::UpdateOverlayDisplay - SetHook((void *)(**(DWORD **)lplpdds + 136), extUpdateOverlayDisplayProxy, (void **)&pUpdateOverlayDisplay, "UpdateOverlayDisplay(S)"); - // IDirectDrawSurface::UpdateOverlayZOrder - SetHook((void *)(**(DWORD **)lplpdds + 140), extUpdateOverlayZOrderProxy, (void **)&pUpdateOverlayZOrder, "UpdateOverlayZOrder(S)"); -} - -/* ------------------------------------------------------------------------------ */ -// CleanRect: -// takes care of a corrupted RECT struct where some elements are not valid pointers. -// In this case, the whole RECT * variable is set to NULL, a value that is interpreted -// by directdraw functions as the whole surface area. -/* ------------------------------------------------------------------------------ */ - -static void CleanRect(RECT **lprect, int line) -{ - __try { - // normally unharmful statements - if(*lprect){ - int i; - i=(*lprect)->bottom; - i=(*lprect)->top; - i=(*lprect)->left; - i=(*lprect)->right; - } - } - __except(EXCEPTION_EXECUTE_HANDLER){ - OutTraceE("Rectangle exception caught at %d: invalid RECT\n", __LINE__); - if(IsAssertEnabled) MessageBox(0, "Rectangle exception", "CleanRect", MB_OK | MB_ICONEXCLAMATION); - *lprect=NULL; - } -} - -static void MaskCapsD(LPDDCAPS c1, LPDDCAPS c2) -{ - FILE *capfile; - //char sBuf[80+1]; - char token[20+1]; - DWORD val; - OutTraceD("MaskCaps\n"); - capfile=fopen("dxwnd.cap", "r"); - if(!capfile) return; - while(TRUE){ - if(fscanf(capfile, "%s=%x", token, &val)!=2) break; - if(!strcmp(token, "dwCaps")) c1->dwCaps &= val; - if(!strcmp(token, "dwCaps2")) c1->dwCaps2 &= val; - if(!strcmp(token, "dwCKeyCaps")) c1->dwCKeyCaps &= val; - if(!strcmp(token, "dwFXCaps")) c1->dwFXCaps &= val; - } - OutTraceD("MaskCaps(D-HW): caps=%x(%s) caps2=%x(%s) fxcaps=%x(%s) fxalphacaps=%x(%s) keycaps=%x(%s)\n", - c1->dwCaps, ExplainDDDCaps(c1->dwCaps), - c1->dwCaps2, ExplainDDDCaps2(c1->dwCaps2), - c1->dwFXCaps, ExplainDDFXCaps(c1->dwFXCaps), - c1->dwFXAlphaCaps, ExplainDDFXALPHACaps(c1->dwFXAlphaCaps), - c1->dwCKeyCaps, ExplainDDCKeyCaps(c1->dwCKeyCaps)); - fclose(capfile); -} - -/* ------------------------------------------------------------------------------ */ -// directdraw method hooks -/* ------------------------------------------------------------------------------ */ - -HRESULT WINAPI extGetCapsD(LPDIRECTDRAW lpdd, LPDDCAPS c1, LPDDCAPS c2) -{ - HRESULT res; - OutTraceD("GetCaps(D): PROXED lpdd=%x\n", lpdd); - res=(*pGetCapsD)(lpdd, c1, c2); - if(res) - OutTraceE("GetCaps(D): ERROR res=%x(%s)\n", res, ExplainDDError(res)); - else { - if (c1) OutTraceD("GetCaps(D-HW): caps=%x(%s) caps2=%x(%s) palcaps=%x(%s) fxcaps=%x(%s) fxalphacaps=%x(%s) keycaps=%x(%s)\n", - c1->dwCaps, ExplainDDDCaps(c1->dwCaps), - c1->dwCaps2, ExplainDDDCaps2(c1->dwCaps2), - c1->dwPalCaps, ExplainDDPalCaps(c1->dwPalCaps), - c1->dwFXCaps, ExplainDDFXCaps(c1->dwFXCaps), - c1->dwFXAlphaCaps, ExplainDDFXALPHACaps(c1->dwFXAlphaCaps), - c1->dwCKeyCaps, ExplainDDCKeyCaps(c1->dwCKeyCaps)); - if (c2) OutTraceD("GetCaps(D-SW): caps=%x(%s) caps2=%x(%s) palcaps=%x(%s) fxcaps=%x(%s) fxalphacaps=%x(%s) keycaps=%x(%s)\n", - c2->dwCaps, ExplainDDDCaps(c2->dwCaps), - c2->dwCaps2, ExplainDDDCaps2(c2->dwCaps2), - c2->dwPalCaps, ExplainDDPalCaps(c2->dwPalCaps), - c2->dwFXCaps, ExplainDDFXCaps(c2->dwFXCaps), - c2->dwFXAlphaCaps, ExplainDDFXALPHACaps(c2->dwFXAlphaCaps), - c2->dwCKeyCaps, ExplainDDCKeyCaps(c2->dwCKeyCaps)); - } - - if((dxw.dwFlags3 & FORCESHEL) && c1) { - DDCAPS_DX7 swcaps; // DDCAPS_DX7 because it is the bigger in size - int size; - size=c1->dwSize; - if (!c2) { - memset(&swcaps, 0, sizeof(DDCAPS_DX7)); - swcaps.dwSize=size; - c2=&swcaps; - res=(*pGetCapsD)(lpdd, NULL, c2); - } - //DWORD AlphaCaps; - //AlphaCaps=c1->dwFXAlphaCaps; - memcpy((void *)c1, (void *)c2, size); - //c1->dwFXAlphaCaps=AlphaCaps; - } - - if((dxw.dwFlags3 & CAPMASK) && c1 && c2) MaskCapsD(c1, c2); - - return res; -} - -HRESULT WINAPI extDirectDrawCreate(GUID FAR *lpguid, LPDIRECTDRAW FAR *lplpdd, IUnknown FAR *pu) -{ - HRESULT res; - GUID FAR *lpPrivGuid = lpguid; - - OutTraceD("DirectDrawCreate: guid=%x(%s)\n", lpguid, ExplainGUID(lpguid)); - - if(!pDirectDrawCreate){ // not hooked yet.... - HINSTANCE hinst; - hinst = LoadLibrary("ddraw.dll"); - pDirectDrawCreate = - (DirectDrawCreate_Type)GetProcAddress(hinst, "DirectDrawCreate"); - if(pDirectDrawCreate) - HookAPI(NULL, "ddraw.dll", pDirectDrawCreate, "DirectDrawCreate", extDirectDrawCreate); - else{ - char sMsg[81]; - sprintf_s(sMsg, 80, "DirectDrawCreate hook failed: error=%d\n", GetLastError()); - OutTraceD(sMsg); - if(IsAssertEnabled) MessageBox(0, sMsg, "Hook", MB_OK | MB_ICONEXCLAMATION); - return DDERR_GENERIC; // is there a better one? - } - } - - if((dxw.dwFlags3 & FORCESHEL) && (lpguid==NULL)) lpPrivGuid=(GUID FAR *)DDCREATE_EMULATIONONLY; - - res = (*pDirectDrawCreate)(lpPrivGuid, lplpdd, pu); - if(res) { - OutTraceE("DirectDrawCreate: ERROR res=%x(%s)\n", res, ExplainDDError(res)); - return res; - } - - if(dxw.dwFlags3 & COLORFIX) (*((DDRAWI_DIRECTDRAW_INT **)lplpdd))->lpLcl->dwAppHackFlags |= 0x800; - - dxw.dwDDVersion=1; - char *mode; - switch ((DWORD)lpPrivGuid){ - case 0: mode="NULL"; break; - case DDCREATE_HARDWAREONLY: mode="DDCREATE_HARDWAREONLY"; break; - case DDCREATE_EMULATIONONLY: mode="DDCREATE_EMULATIONONLY"; break; - default: - switch (*(DWORD *)lpguid){ - case 0x6C14DB80: dxw.dwDDVersion=1; mode="IID_IDirectDraw"; break; - case 0xB3A6F3E0: dxw.dwDDVersion=2; mode="IID_IDirectDraw2"; break; - case 0x9c59509a: dxw.dwDDVersion=4; mode="IID_IDirectDraw4"; break; - case 0x15e65ec0: dxw.dwDDVersion=7; mode="IID_IDirectDraw7"; break; - default: mode="unknown"; break; - } - break; - } - OutTraceD("DirectDrawCreate: lpdd=%x guid=%s DDVersion=%d\n", *lplpdd, mode, dxw.dwDDVersion); - - HookDDSession(lplpdd, dxw.dwDDVersion); - - if(IsDebug && (dxw.dwTFlags & OUTPROXYTRACE)){ - DDCAPS DriverCaps, EmulCaps; - memset(&DriverCaps, 0, sizeof(DriverCaps)); - DriverCaps.dwSize=sizeof(DriverCaps); - memset(&EmulCaps, 0, sizeof(EmulCaps)); - EmulCaps.dwSize=sizeof(EmulCaps); - (LPDIRECTDRAW)(*lplpdd)->GetCaps(&DriverCaps, &EmulCaps); - //OutTrace("DirectDrawCreate: drivercaps=%x(%s) emulcaps=%x(%s)\n", DriverCaps.ddsCaps, "???", EmulCaps.ddsCaps, "???"); - } - - return 0; -} - -HRESULT WINAPI extDirectDrawCreateEx(GUID FAR *lpguid, - LPDIRECTDRAW FAR *lplpdd, REFIID iid, IUnknown FAR *pu) -{ - HRESULT res; - GUID FAR *lpPrivGuid = lpguid; - - OutTraceD("DirectDrawCreateEx: guid=%x(%s) refiid=%x\n", lpguid, ExplainGUID(lpguid), iid); - - // v2.1.70: auto-hooking (just in case...) - if(!pDirectDrawCreateEx){ // not hooked yet.... - HINSTANCE hinst; - hinst = LoadLibrary("ddraw.dll"); - if(!hinst){ - OutTraceE("LoadLibrary ERROR err=%d at %d\n", GetLastError(), __LINE__); - } - pDirectDrawCreateEx = - (DirectDrawCreateEx_Type)GetProcAddress(hinst, "DirectDrawCreateEx"); - if(pDirectDrawCreateEx) - HookAPI(NULL, "ddraw.dll", pDirectDrawCreateEx, "DirectDrawCreateEx", extDirectDrawCreateEx); - else{ - char sMsg[81]; - sprintf_s(sMsg, 80, "DirectDrawCreateEx hook failed: error=%d\n", GetLastError()); - OutTraceD(sMsg); - if(IsAssertEnabled) MessageBox(0, sMsg, "Hook", MB_OK | MB_ICONEXCLAMATION); - return DDERR_GENERIC; // is there a better one? - } - } - - if((dxw.dwFlags3 & FORCESHEL) && (lpguid==NULL)) lpPrivGuid=(GUID FAR *)DDCREATE_EMULATIONONLY; - - res = (*pDirectDrawCreateEx)(lpPrivGuid, lplpdd, iid, pu); - if (res){ - OutTraceD("DirectDrawCreateEx: res=%x(%s)\n",res, ExplainDDError(res)); - return res; - } - - if(dxw.dwFlags3 & COLORFIX) (*((DDRAWI_DIRECTDRAW_INT **)lplpdd))->lpLcl->dwAppHackFlags |= 0x800; - - dxw.dwDDVersion=7; - char *mode; - switch ((DWORD)lpPrivGuid){ - case 0: mode="NULL"; break; - case DDCREATE_HARDWAREONLY: mode="DDCREATE_HARDWAREONLY"; break; - case DDCREATE_EMULATIONONLY: mode="DDCREATE_EMULATIONONLY"; break; - default: - switch (*(DWORD *)lpguid){ - case 0x6C14DB80: dxw.dwDDVersion=1; mode="IID_IDirectDraw"; break; - case 0xB3A6F3E0: dxw.dwDDVersion=2; mode="IID_IDirectDraw2"; break; - case 0x9c59509a: dxw.dwDDVersion=4; mode="IID_IDirectDraw4"; break; - case 0x15e65ec0: dxw.dwDDVersion=7; mode="IID_IDirectDraw7"; break; - default: mode="unknown"; break; - } - break; - } - OutTraceD("DirectDrawCreateEx: lpdd=%x guid=%s DDVersion=%d\n", *lplpdd, mode, dxw.dwDDVersion); - - HookDDSession(lplpdd,dxw.dwDDVersion); - - return 0; -} - -HRESULT WINAPI extInitialize(LPDIRECTDRAW lpdd, GUID FAR *lpguid) -{ - HRESULT res; - GUID FAR *lpPrivGuid = lpguid; - - OutTraceD("Initialize: lpdd=%x guid=%x(%s)\n", lpdd, lpguid, ExplainGUID(lpguid)); - - if((dxw.dwFlags3 & FORCESHEL) && (lpguid==NULL)) lpPrivGuid=(GUID FAR *)DDCREATE_EMULATIONONLY; - - res=(*pInitialize)(lpdd, lpPrivGuid); - - if(dxw.dwFlags3 & COLORFIX) (((DDRAWI_DIRECTDRAW_INT *)lpdd))->lpLcl->dwAppHackFlags |= 0x800; - - if(res) OutTraceE("Initialize ERROR: res=%x(%s)\n", res, ExplainDDError(res)); - return res; -} - -HRESULT WINAPI extQueryInterfaceD(void *lpdd, REFIID riid, LPVOID *obp) -{ - HRESULT res; - unsigned int dwLocalDDVersion; - unsigned int dwLocalD3DVersion; - - res = (*pQueryInterfaceD)(lpdd, riid, obp); - OutTraceD("QueryInterface(D): lpdd=%x REFIID=%x(%s) obp=%x ret=%x at %d\n", - lpdd, riid.Data1, ExplainGUID((GUID *)&riid), *obp, res, __LINE__); - - if(res) return res; - - dwLocalDDVersion=0; - dwLocalD3DVersion=0; - switch(riid.Data1){ - case 0x6C14DB80: //DirectDraw1 - dwLocalDDVersion = 1; - break; - case 0xB3A6F3E0: //DirectDraw2 - dwLocalDDVersion = 2; - break; - case 0x9c59509a: //DirectDraw4 - dwLocalDDVersion = 4; - break; - case 0x15e65ec0: //DirectDraw7 - dwLocalDDVersion = 7; - break; - case 0x3BBA0080: //Direct3D - dwLocalD3DVersion = 1; - break; - case 0x6aae1ec1: //Direct3D2 - dwLocalD3DVersion = 5; - break; - case 0xbb223240: //Direct3D3 - dwLocalD3DVersion = 6; - break; - case 0xf5049e77: //Direct3D7 - dwLocalD3DVersion = 7; - break; - } - if (! *obp) { - OutTraceD("QueryInterface(D): Interface for DX version %d not found\n", dwLocalDDVersion); - return(0); - } - if(dwLocalDDVersion) OutTraceD("QueryInterface(D): Got interface for DX version %d\n", dwLocalDDVersion); - if(dwLocalD3DVersion) OutTraceD("QueryInterface(D): Got interface for D3D version %d\n", dwLocalD3DVersion); - - if (dwLocalDDVersion > dxw.dwMaxDDVersion) { - *obp = NULL; - OutTraceD("QueryInterface(D): lpdd=%x REFIID=%x obp=(NULL) ret=%x at %d\n", - lpdd, riid.Data1, res, __LINE__); - return(0); - } - - switch (dwLocalDDVersion){ - case 1: // you never know .... - case 2: - case 4: - // it's not supposed to be written for DDVersion==7, but it works .... - case 7: - dxw.dwDDVersion=dwLocalDDVersion; - HookDDSession((LPDIRECTDRAW *)obp, dxw.dwDDVersion); - break; - } - - extern void HookDirect3DSession(LPDIRECTDRAW *, int); - switch (dwLocalD3DVersion){ - case 1: - case 5: - case 6: - case 7: - HookDirect3DSession((LPDIRECTDRAW *)obp, dwLocalD3DVersion); - break; - } - - OutTraceD("QueryInterface(D): lpdd=%x REFIID=%x obp=%x DDVersion=%d ret=0\n", - lpdd, riid.Data1, *obp, dxw.dwDDVersion); - - return 0; -} - -// some unhandled interfaces in emulation mode: -// REFIID={84e63de0-46aa-11cf-816f-0000c020156e}: IID_IDirect3DHALDevice - -HRESULT WINAPI extQueryInterfaceS(void *lpdds, REFIID riid, LPVOID *obp) -{ - HRESULT res; - BOOL IsPrim; - BOOL IsBack; - BOOL IsGammaRamp; - unsigned int dwLocalDDVersion; - - OutTraceD("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); - IsGammaRamp=FALSE; - - dwLocalDDVersion=0; - switch(riid.Data1){ - case 0x6C14DB81: - dwLocalDDVersion = 1; - break; - case 0x57805885: //DDSurface2 - WIP (Dark Reign) - dwLocalDDVersion = 2; - break; - case 0xDA044E00: //DDSurface3 - dwLocalDDVersion = 3; - break; - case 0x0B2B8630: - dwLocalDDVersion = 4; - break; - case 0x06675a80: - dwLocalDDVersion = 7; - break; - case 0x84e63de0: - if (dxw.dwFlags3 & DISABLEHAL){ // IID_IDirect3DHALDevice - Dark Vengeance - // this is odd: this piece of code returns the very same error code returned by the actual - // QueryInterface call, but avoid a memory corruption and makes the game working.... - // there must be something wrong behind it. - OutTraceD("QueryInterface: suppress IID_IDirect3DHALDevice interface res=DDERR_GENERIC\n"); - return DDERR_GENERIC; - } - break; - case 0xA4665C60: // IID_IDirect3DRGBDevice - OutTraceD("QueryInterface: IID_IDirect3DRGBDevice\n"); - break; - case 0xF2086B20: // IID_IDirect3DRampDevice - OutTraceD("QueryInterface: IID_IDirect3DRampDevice\n"); - break; - case 0x881949a1: // IID_IDirect3DMMXDevice - OutTraceD("QueryInterface: IID_IDirect3DMMXDevice\n"); - break; - case 0x4B9F0EE0: - OutTraceD("QueryInterface: IID_IDirectDrawColorControl\n"); - break; - case 0x69C11C3E: - OutTraceD("QueryInterface: IID_IDirectDrawGammaControl\n"); - IsGammaRamp=TRUE; - break; - } - - if (dwLocalDDVersion > dxw.dwMaxDDVersion) { - *obp = NULL; - OutTraceD("QueryInterface(S): DDVersion=%d SUPPRESSED lpdds=%x(%s) REFIID=%x obp=(NULL) ret=0 at %d\n", - dwLocalDDVersion, lpdds, IsPrim?"":"(PRIM)", riid.Data1, __LINE__); - return(0); - } - - res = (*pQueryInterfaceS)(lpdds, riid, obp); - - if(res) // added trace - { - OutTraceD("QueryInterface(S): ERROR lpdds=%x%s REFIID=%x obp=%x ret=%x(%s) at %d\n", - lpdds, IsPrim?"(PRIM)":"", riid.Data1, *obp, res, ExplainDDError(res), __LINE__); - return res; - } - - if (! *obp) { - OutTraceD("QueryInterface(S): Interface for DX version %d not found\n", dwLocalDDVersion); - return(0); - } - - // added trace - OutTraceD("QueryInterface(S): lpdds=%x%s REFIID=%x obp=%x DDVersion=%d ret=0\n", - lpdds, IsPrim?"(PRIM)":"", riid.Data1, *obp, dwLocalDDVersion); - - switch (dwLocalDDVersion){ - case 1: // added for The Sims - case 2: - case 3: - case 4: - case 7: - dxw.dwDDVersion=dwLocalDDVersion; - if(IsPrim){ - OutTraceD("QueryInterface(S): primary=%x new=%x\n", lpdds, *obp); - dxw.MarkPrimarySurface((LPDIRECTDRAWSURFACE)*obp); - HookDDSurfacePrim((LPDIRECTDRAWSURFACE *)obp, dxw.dwDDVersion); - } - else{ - if(IsBack) dxw.MarkBackBufferSurface((LPDIRECTDRAWSURFACE)*obp); - else dxw.MarkRegularSurface((LPDIRECTDRAWSURFACE)*obp); - // v2.02.13: seems that hooking inconditionally gives troubles. What is the proper safe hook condition? - HookDDSurfaceGeneric((LPDIRECTDRAWSURFACE *)obp, dxw.dwDDVersion); - } - break; - } - - if(IsGammaRamp){ - // IDirectDrawGammaControl::GetGammaRamp - SetHook((void *)(**(DWORD **)obp + 12), extDDGetGammaRamp, (void **)&pDDGetGammaRamp, "GetGammaRamp(G)"); - // IDirectDrawGammaControl::SetGammaRamp - SetHook((void *)(**(DWORD **)obp + 16), extDDSetGammaRamp, (void **)&pDDSetGammaRamp, "SetGammaRamp(G)"); - } - - if((lpdds == lpDDSBack) && dwLocalDDVersion) { - // assume that you always use the newer interface version, if available. - if(dwLocalDDVersion > (UINT)iBakBufferVersion){ - OutTraceD("QueryInterface(S): switching backbuffer %x -> %x\n", lpDDSBack, *obp); - lpDDSBack = (LPDIRECTDRAWSURFACE)*obp; - iBakBufferVersion = dwLocalDDVersion; - } - } - - return 0; -} - -HRESULT WINAPI extSetDisplayMode(int version, LPDIRECTDRAW lpdd, - DWORD dwwidth, DWORD dwheight, DWORD dwbpp, DWORD dwrefreshrate, DWORD dwflags) -{ - DDSURFACEDESC2 ddsd; - HRESULT res = 0; - - if(IsTraceD){ - OutTrace("SetDisplayMode: version=%d dwWidth=%i dwHeight=%i dwBPP=%i", - version, dwwidth, dwheight, dwbpp); - if (version==2) OutTrace(" dwRefresh=%i dwFlags=%x\n", dwrefreshrate, dwflags); - else OutTrace("\n"); - } - - dxw.SetScreenSize(dwwidth, dwheight); - GetHookInfo()->Height=(short)dxw.GetScreenHeight(); - GetHookInfo()->Width=(short)dxw.GetScreenWidth(); - AdjustWindowFrame(dxw.GethWnd(), dwwidth, dwheight); - - if(dxw.dwFlags1 & EMULATESURFACE){ - // in EMULATESURFACE mode, let SetPixFmt decide upon the PixelFormat - dxw.VirtualPixelFormat.dwRGBBitCount = dwbpp; - memset(&ddsd, 0, sizeof(ddsd)); - ddsd.dwSize=sizeof(ddsd); - SetPixFmt(&ddsd); - SetBltTransformations(); - OutTraceD("SetDisplayMode: mode=EMULATE %s ret=OK\n", DumpPixelFormat(&ddsd)); - return DD_OK; - } - - OutTraceD("SetDisplayMode: mode=STANDARD BPP=%d\n", dwbpp); - dxw.ActualPixelFormat.dwRGBBitCount = dwbpp; - - ZeroMemory(&ddsd, sizeof(ddsd)); - ddsd.dwSize = Set_dwSize_From_DDraw(lpdd); - ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT | DDSD_REFRESHRATE; - ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); - ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB; - - (*pGetDisplayMode)(lpdd, (LPDDSURFACEDESC)&ddsd); - if (version==1) - res = (*pSetDisplayMode1)(lpdd, ddsd.dwWidth, ddsd.dwHeight, dwbpp); - else - res = (*pSetDisplayMode2)(lpdd, ddsd.dwWidth, ddsd.dwHeight, dwbpp, ddsd.dwRefreshRate, 0); - - OutTraceD("SetDisplayMode: fixing colordepth current=%d required=%d size=(%dx%d)\n", - ddsd.ddpfPixelFormat.dwRGBBitCount, dwbpp, ddsd.dwWidth, ddsd.dwHeight); - - return 0; -} - -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) -{ - return extSetDisplayMode(1, lpdd, dwwidth, dwheight, dwbpp, 0, 0); -} - -HRESULT WINAPI extGetDisplayMode(LPDIRECTDRAW lpdd, LPDDSURFACEDESC lpddsd) -{ - OutTraceD("GetDisplayMode\n"); - - (*pGetDisplayMode)(lpdd, lpddsd); - if(dxw.dwFlags1 & EMULATESURFACE) { - GetPixFmt((LPDDSURFACEDESC2)lpddsd); - if(!lpddsd->ddpfPixelFormat.dwFlags) SetPixFmt((LPDDSURFACEDESC2)lpddsd); - } - lpddsd->dwWidth = dxw.GetScreenWidth(); - lpddsd->dwHeight = dxw.GetScreenHeight(); - - // v2.1.96: fake screen color depth - if(dxw.dwFlags2 & (INIT8BPP|INIT16BPP)){ // v2.02.32 fix - if(dxw.dwFlags2 & INIT8BPP) FixPixelFormat(8, &lpddsd->ddpfPixelFormat); - if(dxw.dwFlags2 & INIT16BPP) FixPixelFormat(16, &lpddsd->ddpfPixelFormat); - OutTraceD("GetDisplayMode: fix RGBBitCount=%d\n", lpddsd->ddpfPixelFormat.dwRGBBitCount); - } - - //OutTraceD("GetDisplayMode: returning WxH=(%dx%d) PixelFormat Flags=%x(%s) RGBBitCount=%d RGBAmask=(%x,%x,%x,%x) Caps=%x(%s)\n", - // lpddsd->dwWidth, lpddsd->dwHeight, - // lpddsd->ddpfPixelFormat.dwFlags, ExplainPixelFormatFlags(lpddsd->ddpfPixelFormat.dwFlags), - // lpddsd->ddpfPixelFormat.dwRGBBitCount, - // lpddsd->ddpfPixelFormat.dwRBitMask, lpddsd->ddpfPixelFormat.dwGBitMask, lpddsd->ddpfPixelFormat.dwBBitMask, - // lpddsd->ddpfPixelFormat.dwRGBAlphaBitMask, - // lpddsd->ddsCaps.dwCaps, ExplainDDSCaps(lpddsd->ddsCaps.dwCaps)); - - OutTraceD("GetDisplayMode: returning size=(%dx%d) %s\n", lpddsd->dwWidth, lpddsd->dwHeight, DumpPixelFormat((LPDDSURFACEDESC2)lpddsd)); - - return 0; -} - -void FixWindowFrame(HWND hwnd) -{ - LONG nOldStyle; - - OutTraceD("FixWindowFrame: hwnd=%x\n", hwnd); - - nOldStyle=(*pGetWindowLong)(hwnd, GWL_STYLE); - if (!nOldStyle){ - OutTraceE("GetWindowLong ERROR %d at %d\n",GetLastError(),__LINE__); - return; - } - - OutTraceD("FixWindowFrame: style=%x(%s)\n",nOldStyle,ExplainStyle(nOldStyle)); - - // fix style - if (!(*pSetWindowLong)(hwnd, GWL_STYLE, WS_OVERLAPPEDWINDOW)){ - OutTraceE("SetWindowLong ERROR %d at %d\n",GetLastError(),__LINE__); - return; - } - // fix exstyle - if (!(*pSetWindowLong)(hwnd, GWL_EXSTYLE, 0)){ - OutTraceE("SetWindowLong ERROR %d at %d\n",GetLastError(),__LINE__); - return; - } - - // ShowWindow retcode means in no way an error code! Better ignore it. - (*pShowWindow)(hwnd, SW_RESTORE); - return; -} - -HRESULT WINAPI extSetCooperativeLevel(void *lpdd, HWND hwnd, DWORD dwflags) -{ - HRESULT res; - - OutTraceD("SetCooperativeLevel: hwnd=%x dwFlags=%x(%s)\n", - hwnd, dwflags,ExplainCoopFlags(dwflags)); - - InitDDScreenParameters((LPDIRECTDRAW)lpdd); - - if (dwflags & DDSCL_FULLSCREEN){ - // v2.01.82 fix: - // WARN: Tomb Raider 4 demo is setting cooperative level against hwnd 0 (desktop) - // so in this case better use the registered hWnd value. Same as GP500, who uses - // the desktop window handle. - // v2.02.31 fix: - // Hooligans - Storm over Europe wants to set cooperative level NORMAL to hwnd 0 - // that is legitimate, but setting against desktop window gives an error code - so - // the zero hwnd redirection had to be moved within the FULLSCREEN if case. - if(dxw.IsRealDesktop(hwnd)){ - OutTraceD("SetCooperativeLevel: desktop hwnd=%x -> %x\n", hwnd, dxw.GethWnd()); - hwnd=dxw.GethWnd(); - } - 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) FixWindowFrame(hwnd); - } - else{ - RECT client; - (*pGetClientRect)(hwnd, &client); - // 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); - } - if(res) - OutTraceE("SetCooperativeLevel: ERROR err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - - GetHookInfo()->IsFullScreen=dxw.IsFullScreen(); - - // WARN: GP500 was setting cooperative level against the desktop! This can be partially - // intercepted by hooking the GetDesktopWindow() call, but in windowed mode this can't be - // done, so better repeat the check here. - - if ((res==DD_OK) && (hwnd!=NULL)){ - if (hwnd==(*pGetDesktopWindow)()){ - OutTraceE("SetCooperativeLevel: attempt to work on desktop window\n"); - } - else - dxw.SethWnd(hwnd); // save the good one - } - - return res; -} - -#define FIX_FLAGSMASK (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PITCH|DDSD_PIXELFORMAT|DDSD_ZBUFFERBITDEPTH|DDSD_TEXTURESTAGE) - -void FixSurfaceCapsAnalytic(LPDDSURFACEDESC2 lpddsd, int dxversion) -{ - switch (lpddsd->dwFlags & FIX_FLAGSMASK){ - //case 0: - // switch (lpddsd->ddsCaps.dwCaps){ - // case 0: - // // Star Force Deluxe - // lpddsd->dwFlags = DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT; - // lpddsd->ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY; - // lpddsd->dwHeight = dxw.GetScreenHeight(); - // lpddsd->dwWidth = dxw.GetScreenWidth(); - // GetPixFmt(lpddsd); - // return; - // break; - // } - // break; - case DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT|DDSD_TEXTURESTAGE: - // Ancient Evil: - // dwFlags: DDSD_CAPS+HEIGHT+WIDTH+PIXELFORMAT+TEXTURESTAGE - // dwCaps1: DDSCAPS_OFFSCREENPLAIN+SYSTEMMEMORY+TEXTURE - // dwCaps2: DDSCAPS2_TEXTUREMANAGE - GetPixFmt(lpddsd); - return; - break; - case DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_ZBUFFERBITDEPTH: - switch (lpddsd->ddsCaps.dwCaps){ - case DDSCAPS_VIDEOMEMORY|DDSCAPS_ZBUFFER: - // Dungeon Keeper II - return; - break; - case DDSCAPS_SYSTEMMEMORY|DDSCAPS_ZBUFFER: - // "Star Wars Shadows of the Empire" through d3d - return; - break; - } - break; - case DDSD_CAPS|DDSD_WIDTH: - switch (lpddsd->ddsCaps.dwCaps){ - case DDSCAPS_SYSTEMMEMORY: - return; - break; - case DDSCAPS_VIDEOMEMORY: - return; - break; - case DDSCAPS_SYSTEMMEMORY|DDSCAPS_RESERVED2: - // Martian Gothic - return; - break; - case DDSCAPS_VIDEOMEMORY|DDSCAPS_RESERVED2: - // Martian Gothic - return; - break; - case DDSCAPS_VIDEOMEMORY|DDSCAPS_WRITEONLY|DDSCAPS_RESERVED2: - // Empire Earth - return; - break; - } - break; - case DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH: - switch (lpddsd->ddsCaps.dwCaps){ - case DDSCAPS_BACKBUFFER|DDSCAPS_SYSTEMMEMORY: - // Vangers - lpddsd->ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY; - return; - break; - case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_3DDEVICE|DDSCAPS_VIDEOMEMORY: - // Bunnies must die - lpddsd->ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN|DDSCAPS_3DDEVICE|DDSCAPS_SYSTEMMEMORY; // NOT WORKING - return; - break; - case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_VIDEOMEMORY: - // Alien Nations, Heroes of Might & Magic IV --- troublesome!!!! - lpddsd->dwFlags = (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT); - lpddsd->ddsCaps.dwCaps = (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY); - GetPixFmt(lpddsd); - return; - break; - case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY: - // Cave Story, HoMM3 - lpddsd->dwFlags |= DDSD_PIXELFORMAT; - GetPixFmt(lpddsd); - return; - break; - case DDSCAPS_SYSTEMMEMORY: - // Magic & Mayhem - lpddsd->dwFlags |= DDSD_PIXELFORMAT; - lpddsd->ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN; - GetPixFmt(lpddsd); - return; - break; - case DDSCAPS_OFFSCREENPLAIN: - // Cave Story, Magic & Mayhem - lpddsd->dwFlags |= DDSD_PIXELFORMAT; - lpddsd->ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN; - GetPixFmt(lpddsd); - return; - break; - case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_3DDEVICE: - // Nightmare Ned - lpddsd->dwFlags |= DDSD_PIXELFORMAT; - GetPixFmt(lpddsd); - return; - break; - case DDSCAPS_SYSTEMMEMORY|DDSCAPS_3DDEVICE: - // Actua Soccer 3 - lpddsd->dwFlags |= DDSD_PIXELFORMAT; - GetPixFmt(lpddsd); - return; - break; - case DDSCAPS_VIDEOMEMORY|DDSCAPS_3DDEVICE: - // Actua Soccer 3 - lpddsd->dwFlags |= DDSD_PIXELFORMAT; - lpddsd->ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY|DDSCAPS_3DDEVICE; - GetPixFmt(lpddsd); - return; - break; - case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_3DDEVICE|DDSCAPS_SYSTEMMEMORY: - // Nightmare Ned, The Sims ??? - lpddsd->dwFlags |= DDSD_PIXELFORMAT; - GetPixFmt(lpddsd); - return; - break; - } - break; - case DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PITCH: - switch (lpddsd->ddsCaps.dwCaps){ - case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY: - // Airline Tycoon Evolution - return; - break; - //case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY|DDSCAPS_3DDEVICE: - // OutTrace("FixSurfaceCaps: ??? (Dungeon Keeper D3D)\n"); - // break; - } - break; - case DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT: - switch (lpddsd->ddsCaps.dwCaps){ - case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_3DDEVICE|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM: - // Empire Earth - // tbd - // try - lpddsd->ddsCaps.dwCaps = (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_3DDEVICE|DDSCAPS_SYSTEMMEMORY); - // eotry - return; - break; - case DDSCAPS_OFFSCREENPLAIN: - // Submarine titans (8BPP) - lpddsd->ddsCaps.dwCaps = (DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); - GetPixFmt(lpddsd); - return; - break; - case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY: - // Duckman, HoM&M4, Beavis & Butthead do U. - // unsetting the Pixel Format may cause the backbuffer to be created with DDPF_ALPHAPIXELS flag on - // and some generic surface with DDPF_ALPHAPIXELS off, so that blitting is unsupported. - // But it seems impossible to get HOMM4 to cope with Beavis & Butthead!!! - if(!(dxw.dwFlags3 & NOPIXELFORMAT)) GetPixFmt(lpddsd); - return; - break; - case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_VIDEOMEMORY: - // Dungeon Keeper II GOG release (intro screen): doesn't like calling GetPixFmt!!! - // it requests a DDPF_FOURCC surface with fourcc="YYYY" that should not be overridden? - // - // need not to be configurable until we get a different case. - // it works both on VIDEOMEMORY or SYSTEMMEMORY. The latter should be more stable. - // v2.02.41: don't alter FOURCC pixel formats - if(lpddsd->ddpfPixelFormat.dwFlags & DDPF_FOURCC) return; - lpddsd->ddsCaps.dwCaps = (DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); - return; - break; - case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM: - // Empire Earth - lpddsd->ddsCaps.dwCaps = (DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); - return; - break; - case DDSCAPS_COMPLEX|DDSCAPS_TEXTURE|DDSCAPS_MIPMAP: - // Empire Earth: flags = DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT|DDSD_MIPMAPCOUNT - return; - break; - case DDSCAPS_SYSTEMMEMORY|DDSCAPS_ZBUFFER: - // the Sims - return; - break; - case DDSCAPS_SYSTEMMEMORY|DDSCAPS_TEXTURE: - // Wargames Direct3D hw acceleration - // Star Wars Shadows of the Empire in RGB HEL mode - return; - break; - case DDSCAPS_TEXTURE: - // Empire Earth - return; - break; - case DDSCAPS_VIDEOMEMORY|DDSCAPS_ZBUFFER: - // Martian Gothic - lpddsd->ddsCaps.dwCaps = (DDSCAPS_SYSTEMMEMORY|DDSCAPS_ZBUFFER); // working ???? - return; - break; - case DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM|DDSCAPS_ZBUFFER: - // Rayman 2 - lpddsd->ddsCaps.dwCaps = (DDSCAPS_SYSTEMMEMORY|DDSCAPS_ZBUFFER); // working ???? - return; - break; - case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY|DDSCAPS_3DDEVICE: - // Premier Manager 98 - GetPixFmt(lpddsd); - return; - break; - case DDSCAPS_OVERLAY|DDSCAPS_VIDEOMEMORY: // NOT WORKING - // Bunnies must die (not the horny ones!) - lpddsd->ddsCaps.dwCaps = DDSCAPS_OVERLAY|DDSCAPS_SYSTEMMEMORY; - return; - break; - case DDSCAPS_SYSTEMMEMORY: - // Star Force Deluxe - lpddsd->ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY; - // GetPixFmt(lpddsd); - return; - break; - case DDSCAPS_TEXTURE|DDSCAPS_VIDEOMEMORY|DDSCAPS_ALLOCONLOAD: - // Star Wars Shadows of the Empire - // seems to work both with/without GetPixFmt, but doesn't like DDSCAPS_SYSTEMMEMORY textures. - // Setting GetPixFmt makes bad alpha transparencies! - // DDSCAPS_VIDEOMEMORY doesn't work with HEL only! Better switch to DDSCAPS_SYSTEMMEMORY. - if (dxw.dwFlags3 & FORCESHEL) lpddsd->ddsCaps.dwCaps = (DDSCAPS_TEXTURE|DDSCAPS_SYSTEMMEMORY|DDSCAPS_ALLOCONLOAD); - return; - break; - } - break; - case DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PITCH|DDSD_PIXELFORMAT: - switch (lpddsd->ddsCaps.dwCaps){ - case DDSCAPS_SYSTEMMEMORY: - // Wargames - lpddsd->ddsCaps.dwCaps = (DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); - GetPixFmt(lpddsd); - //lpddsd->dwFlags = DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PITCH; // turn DDSD_PIXELFORMAT off - return; - break; - case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_VIDEOMEMORY: - // A10 Cuba - lpddsd->ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY; // DDSCAPS_OFFSCREENPLAIN|DDSCAPS_VIDEOMEMORY working as well... - return; - break; - } - break; - - } - - if(dxw.dwFlags3 & SURFACEWARN){ - char sMsg[512]; - sprintf(sMsg, "Flags=%x(%s) Caps=%x(%s)", lpddsd->dwFlags, ExplainFlags(lpddsd->dwFlags), lpddsd->ddsCaps.dwCaps, ExplainDDSCaps(lpddsd->ddsCaps.dwCaps)); - MessageBox(0, sMsg, "FixSurfaceCaps unmanaged setting", MB_OK | MB_ICONEXCLAMATION); - } -} - -static void FixSurfaceCaps(LPDDSURFACEDESC2 lpddsd, int dxversion) -{ - // To do: fix Dungeon Keeper II - - // rules of thumb: - // 1) always get rid of DDSCAPS_VIDEOMEMORY & DDSCAPS_LOCALVIDMEM caps - // 2) always add DDSCAPS_SYSTEMMEMORY caps - // 3) DDSCAPS_SYSTEMMEMORY is supported from dxversion 4 - // 4) if DDSD_CAPS is not set, ignore caps - // 5) ignore DDSD_CKSRCBLT, .... - // 6) setting a different pixel format in memory requires DDSCAPS_OFFSCREENPLAIN capability - // 7) DDSD_TEXTURESTAGE surfaces may need to adjust fixel format (....???) - // 8) Generic surfaces are mapped to SYSTEMMEMORY and set to primary surface PixelFormat - // 9) When pixelformat is unspecified, be sure to pick the right one (with or without alphapixels?) - - if(!(lpddsd->dwFlags & DDSD_CAPS)) lpddsd->ddsCaps.dwCaps = 0; - - OutTraceD("FixSurfaceCaps: Flags=%x(%s) Caps=%x(%s)\n", - lpddsd->dwFlags, ExplainFlags(lpddsd->dwFlags), lpddsd->ddsCaps.dwCaps, ExplainDDSCaps(lpddsd->ddsCaps.dwCaps)); - - if(dxw.dwFlags3 & ANALYTICMODE) return FixSurfaceCapsAnalytic(lpddsd, dxversion); - - if((lpddsd->dwFlags & (DDSD_WIDTH|DDSD_HEIGHT)) == DDSD_WIDTH) { - // buffer surface - no changes - return; - } - if((lpddsd->dwFlags & (DDSD_PIXELFORMAT|DDSD_TEXTURESTAGE)) == (DDSD_PIXELFORMAT|DDSD_TEXTURESTAGE)){ - // textures, set proper color depth and make no further changes - GetPixFmt(lpddsd); - return; - } - if((lpddsd->dwFlags & DDSD_CAPS) && (lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER)) { // z-buffer surface - set to memory - lpddsd->ddsCaps.dwCaps = (DDSCAPS_SYSTEMMEMORY|DDSCAPS_ZBUFFER); - return; - } - if((lpddsd->dwFlags & DDSD_CAPS) && (lpddsd->ddsCaps.dwCaps & DDSCAPS_3DDEVICE)) { // 3DDEVICE: enforce PIXELFORMAT on MEMORY - lpddsd->dwFlags |= DDSD_PIXELFORMAT; - lpddsd->ddsCaps.dwCaps = (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY|DDSCAPS_3DDEVICE); - GetPixFmt(lpddsd); - return; - } - //// DDSCAPS_ALLOCONLOAD on VIDEOMEMORY can't be done when HAL is disabled - it returns DDERR_NODIRECTDRAWHW error - //if((lpddsd->dwFlags & DDSD_CAPS) && - // ((lpddsd->ddsCaps.dwCaps & (DDSCAPS_TEXTURE|DDSCAPS_ALLOCONLOAD))==(DDSCAPS_TEXTURE|DDSCAPS_ALLOCONLOAD))) { - // if (dxw.dwFlags3 & FORCESHEL) lpddsd->ddsCaps.dwCaps = (DDSCAPS_TEXTURE|DDSCAPS_SYSTEMMEMORY|DDSCAPS_ALLOCONLOAD); - // return; - //} - // DDSCAPS_TEXTURE surfaces must be left untouched, unless you set FORCESHEL: in this case switch VIDEOMEMORY to SYSTEMMEMORY - if((lpddsd->dwFlags & DDSD_CAPS) && (lpddsd->ddsCaps.dwCaps & DDSCAPS_TEXTURE)){ - if (dxw.dwFlags3 & FORCESHEL) { - lpddsd->ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY; - lpddsd->ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; - } - // no further changes... - return; - } - - if(lpddsd->dwFlags & DDSD_ZBUFFERBITDEPTH){ - lpddsd->dwFlags &= ~DDSD_PIXELFORMAT; - } - - // v2.02.41: don't alter FOURCC pixel formats - if((lpddsd->dwFlags & DDSD_PIXELFORMAT) && (lpddsd->ddpfPixelFormat.dwFlags & DDPF_FOURCC)) return; - -#if 0 - // v2.02.43: don't alter MIPMAP surfaces - if((lpddsd->dwFlags & DDSD_MIPMAPCOUNT) && (lpddsd->ddsCaps.dwCaps & DDSCAPS_MIPMAP)) { - //GetPixFmt(lpddsd); - return; - } -#endif - -#if 0 - // HoM&M3/4 fix.... - if(((lpddsd->dwFlags & (DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT)) == (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH)) && - ((lpddsd->ddsCaps.dwCaps & ~(DDSCAPS_SYSTEMMEMORY|DDSCAPS_VIDEOMEMORY) == DDSCAPS_OFFSCREENPLAIN)){ - //lpddsd->ddsCaps.dwCaps = 0; - lpddsd->dwFlags = (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT); - lpddsd->ddsCaps.dwCaps = (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY); - GetPixFmt(lpddsd); - return; - } -#endif - // default case: adjust pixel format - OutTraceB("FixSurfaceCaps: suppress DDSCAPS_VIDEOMEMORY case\n"); - lpddsd->dwFlags |= (DDSD_CAPS|DDSD_PIXELFORMAT); - lpddsd->ddsCaps.dwCaps &= ~(DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); // v2.02.43 - lpddsd->ddsCaps.dwCaps |= (DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); - if(!(dxw.dwFlags3 & NOPIXELFORMAT)) GetPixFmt(lpddsd); - return; -} - -static void ClearSurfaceDesc(void *ddsd, int dxversion) -{ - int size; - size = (dxversion < 4) ? sizeof(DDSURFACEDESC) : sizeof(DDSURFACEDESC2); - memset(ddsd, 0, size); // Clean all - ((LPDDSURFACEDESC)ddsd)->dwSize = size; -} - -static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) -{ - DDSURFACEDESC2 ddsd; - HRESULT res; - - // emulated primary surface - memcpy((void *)&ddsd, lpddsd, lpddsd->dwSize); - - // handle the surface attributes before the ddsd.dwFlags gets updated: - // if a surface desc is NOT specified, build one - if(!(ddsd.dwFlags & DDSD_PIXELFORMAT)) SetPixFmt((LPDDSURFACEDESC2)&ddsd); - // then save it - dxw.VirtualPixelFormat = ddsd.ddpfPixelFormat; - - OutTraceD("DDSD_PIXELFORMAT: color=%d flags=%x\n", dxw.VirtualPixelFormat.dwRGBBitCount, dxw.VirtualPixelFormat.dwFlags); - ddsd.dwFlags &= ~(DDSD_BACKBUFFERCOUNT|DDSD_REFRESHRATE); - ddsd.dwFlags |= (DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT); - ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); - // DDSCAPS_OFFSCREENPLAIN seems required to support the palette in memory surfaces - ddsd.ddsCaps.dwCaps |= (DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); - ddsd.dwWidth = dxw.GetScreenWidth(); - ddsd.dwHeight = dxw.GetScreenHeight(); - - // create Primary surface - DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]" , __LINE__); - res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); - if(res){ - if (res==DDERR_PRIMARYSURFACEALREADYEXISTS){ - LPDIRECTDRAWSURFACE lpPrim; - OutTraceE("CreateSurface: CreateSurface DDERR_PRIMARYSURFACEALREADYEXISTS workaround\n"); - (*pGetGDISurface)(lpPrimaryDD, &lpPrim); - while ((*pReleaseS)(lpPrim)); - res = (*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); - } - /* fall through */ - if(res){ - OutTraceE("CreateSurface: ERROR on DDSPrim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); - return res; - } - } - - OutTraceD("CreateSurface: created PRIMARY DDSPrim=%x\n", *lplpdds); - if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSPrim", __LINE__); - HookDDSurfacePrim(lplpdds, dxversion); - - if(lpDDSEmu_Prim==NULL){ - ClearSurfaceDesc((void *)&ddsd, dxversion); - ddsd.dwFlags = DDSD_CAPS; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; - DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[EmuPrim]" , __LINE__); - - res=(*pCreateSurface)(lpdd, &ddsd, &lpDDSEmu_Prim, 0); - if(res==DDERR_PRIMARYSURFACEALREADYEXISTS){ - OutTraceD("CreateSurface: ASSERT DDSEmu_Prim already exists\n"); - res=(*pGetGDISurface)(lpdd, &lpDDSEmu_Prim); // ok only if the previous surface has the good properties!!! - (*pReleaseS)(lpDDSEmu_Prim); - } - if(res){ - OutTraceE("CreateSurface: ERROR on DDSEmu_Prim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); - return res; - } - OutTraceD("CreateSurface: created new DDSEmu_Prim=%x\n",lpDDSEmu_Prim); - if(IsDebug) DescribeSurface(lpDDSEmu_Prim, dxversion, "DDSEmu_Prim", __LINE__); - InitDSScreenParameters(lpDDSEmu_Prim); - dxw.MarkRegularSurface(lpDDSEmu_Prim); - // can't hook lpDDSEmu_Prim as generic, since the Flip method is unimplemented for a PRIMARY surface! - // better avoid it or hook just useful methods. - //if (dxw.dwTFlags & OUTPROXYTRACE) HookDDSurfaceGeneric(&lpDDSEmu_Prim, dxw.dwDDVersion); - } - - if(lpDDSEmu_Back==NULL){ - ClearSurfaceDesc((void *)&ddsd, dxversion); - ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; - ddsd.dwWidth = dxw.GetScreenWidth(); - ddsd.dwHeight = dxw.GetScreenHeight(); - DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[EmuBack]" , __LINE__); - - res=(*pCreateSurface)(lpdd, &ddsd, &lpDDSEmu_Back, 0); - if(res){ - OutTraceE("CreateSurface: CreateSurface ERROR on DDSEmuBack : res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); - return res; - } - OutTraceD("CreateSurface: created new DDSEmu_Back=%x\n", lpDDSEmu_Back); - if(IsDebug) DescribeSurface(lpDDSEmu_Back, dxversion, "DDSEmu_Back", __LINE__); - dxw.MarkRegularSurface(lpDDSEmu_Back); - if (dxw.dwTFlags & OUTPROXYTRACE) HookDDSurfaceGeneric(&lpDDSEmu_Back, dxversion); - } - - return DD_OK; -} - -static HRESULT BuildPrimaryDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) -{ - DDSURFACEDESC2 ddsd; - HRESULT res; - - // genuine primary surface - memcpy((void *)&ddsd, lpddsd, lpddsd->dwSize); - ddsd.dwFlags &= ~(DDSD_WIDTH|DDSD_HEIGHT|DDSD_BACKBUFFERCOUNT|DDSD_REFRESHRATE|DDSD_PIXELFORMAT); - ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_FLIP|DDSCAPS_COMPLEX); - - // create Primary surface - DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]" , __LINE__); - res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); - if(res){ - if (res==DDERR_PRIMARYSURFACEALREADYEXISTS){ - LPDIRECTDRAWSURFACE lpPrim; - OutTraceE("CreateSurface: CreateSurface DDERR_PRIMARYSURFACEALREADYEXISTS workaround\n"); - (*pGetGDISurface)(lpPrimaryDD, &lpPrim); - while ((*pReleaseS)(lpPrim)); - res = (*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); - } - /* fall through */ - if(res){ - OutTraceE("CreateSurface: ERROR on DDSPrim res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); - return res; - } - } - - OutTraceD("CreateSurface: created PRIMARY DDSPrim=%x\n", *lplpdds); - if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSPrim", __LINE__); - - if(dxw.dwFlags1 & EMULATEBUFFER){ - lpDDSEmu_Prim = *lplpdds; - dxw.MarkRegularSurface(lpDDSEmu_Prim); - - ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS; - // warning: can't create zero sized backbuffer surface !!!! - ddsd.dwWidth = dxw.GetScreenWidth(); - ddsd.dwHeight = dxw.GetScreenHeight(); - ddsd.ddsCaps.dwCaps = 0; - if (dxversion >= 4) ddsd.ddsCaps.dwCaps |= DDSCAPS_OFFSCREENPLAIN; - DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Dir FixBuf]" , __LINE__); - res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); - if(res){ - OutTraceE("CreateSurface: ERROR on DDSPrim res=%x(%s) at %d\n",res, ExplainDDError(res), __LINE__); - return res; - } - OutTraceD("CreateSurface: created FIX DDSPrim=%x\n", *lplpdds); - if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSPrim(2)", __LINE__); - } - - HookDDSurfacePrim(lplpdds, dxversion); - if(dxw.dwFlags1 & CLIPCURSOR) dxw.SetClipCursor(); - - return DD_OK; -} - -static HRESULT BuildBackBufferEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) -{ - DDSURFACEDESC2 ddsd; - HRESULT res; - - // create BackBuffer surface - memcpy(&ddsd, lpddsd, lpddsd->dwSize); - ddsd.dwFlags &= ~(DDSD_WIDTH|DDSD_HEIGHT|DDSD_BACKBUFFERCOUNT|DDSD_REFRESHRATE); - ddsd.dwFlags |= (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT); - ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_BACKBUFFER|DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); - // DDSCAPS_OFFSCREENPLAIN seems required to support the palette in memory surfaces - ddsd.ddsCaps.dwCaps |= (DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); - ddsd.dwWidth = dxw.GetScreenWidth(); - ddsd.dwHeight = dxw.GetScreenHeight(); - GetPixFmt(&ddsd); - - DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Backbuf]" , __LINE__); - res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); - if(res) { - OutTraceE("CreateSurface ERROR: res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); - return res; - } - - OutTraceD("CreateSurface: created BACK DDSBack=%x\n", *lplpdds); - if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSBack", __LINE__); - HookDDSurfaceGeneric(lplpdds, dxversion); // added !!! - lpBackBufferDD = lpdd; // v2.02.31 - iBakBufferVersion=dxversion; // v2.02.31 - - return DD_OK; -} - -static HRESULT BuildBackBufferDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) -{ - DDSURFACEDESC2 ddsd; - HRESULT res; - - // create BackBuffer surface - // ClearSurfaceDesc((void *)&ddsd, dxversion); - memcpy(&ddsd, lpddsd, lpddsd->dwSize); - ddsd.dwFlags &= ~(DDSD_WIDTH|DDSD_HEIGHT|DDSD_BACKBUFFERCOUNT|DDSD_REFRESHRATE|DDSD_PIXELFORMAT); - ddsd.dwFlags |= (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH); - ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX); - //ddsd.ddsCaps.dwCaps|=DDSCAPS_SYSTEMMEMORY; - if (dxversion >= 4) ddsd.ddsCaps.dwCaps |= DDSCAPS_OFFSCREENPLAIN; - ddsd.dwWidth = dxw.GetScreenWidth(); - ddsd.dwHeight = dxw.GetScreenHeight(); - if (dxw.dwFlags2 & BACKBUFATTACH) { - LPDIRECTDRAWSURFACE lpPrim; - DDSURFACEDESC2 prim; - (*pGetGDISurface)(lpPrimaryDD, &lpPrim); - memset(&prim, 0, sizeof(DDSURFACEDESC2)); - prim.dwSize = (dxversion >= 4) ? sizeof(DDSURFACEDESC2) : sizeof(DDSURFACEDESC); - res=lpPrim->GetSurfaceDesc((DDSURFACEDESC *)&prim); - (*pReleaseS)(lpPrim); - ddsd.dwWidth = prim.dwWidth; - ddsd.dwHeight = prim.dwHeight; - OutTraceD("BMX FIX: res=%x(%s) wxh=(%dx%d)\n", res, ExplainDDError(res),ddsd.dwWidth, ddsd.dwHeight); - } - DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Backbuf]" , __LINE__); - res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); - if(res) { - if ((dxw.dwFlags1 & SWITCHVIDEOMEMORY) && (res==DDERR_OUTOFVIDEOMEMORY)){ - OutTraceD("CreateSurface: CreateSurface DDERR_OUTOFVIDEOMEMORY ERROR at %d, retry in SYSTEMMEMORY\n", __LINE__); - ddsd.ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY; // try ... - ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; // try ... - res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); - } - if(res){ - OutTraceE("CreateSurface ERROR: res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - return res; - } - } - - OutTraceD("CreateSurface: created BACK DDSBack=%x\n", *lplpdds); - if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSBack", __LINE__); - HookDDSurfaceGeneric(lplpdds, dxversion); // added !!! - lpBackBufferDD = lpdd; // v2.02.31 - iBakBufferVersion=dxversion; // v2.02.31 - - return DD_OK; -} - -static HRESULT BuildGenericEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) -{ - DDSURFACEDESC2 ddsd; - HRESULT res; - - memcpy(&ddsd, lpddsd, lpddsd->dwSize); // Copy over .... - FixSurfaceCaps(&ddsd, dxversion); - - DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Emu Generic]" , __LINE__); - res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, pu); - if (res) { - OutTraceE("CreateSurface: ERROR on Emu_Generic res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - return res; - } - - OutTraceD("CreateSurface: created Emu_Generic dds=%x\n", *lplpdds); - if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSEmu_Generic", __LINE__); - // diagnostic hooks .... - HookDDSurfaceGeneric(lplpdds, dxversion); - - return DD_OK; -} - -static HRESULT BuildGenericDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurface, LPDDSURFACEDESC2 lpddsd, int dxversion, LPDIRECTDRAWSURFACE *lplpdds, void *pu) -{ - HRESULT res; - - DumpSurfaceAttributes((LPDDSURFACEDESC)lpddsd, "[Dir Generic]" , __LINE__); - - res = (*pCreateSurface)(lpdd, lpddsd, lplpdds, 0); - if(res){ - if ((dxw.dwFlags1 & SWITCHVIDEOMEMORY) && (res==DDERR_OUTOFVIDEOMEMORY)){ - OutTraceD("CreateSurface ERROR: res=%x(%s) at %d, retry\n", res, ExplainDDError(res), __LINE__); - lpddsd->ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY; - lpddsd->ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; - res = (*pCreateSurface)(lpdd, lpddsd, lplpdds, 0); - } - if(res){ - OutTraceE("CreateSurface: CreateSurface ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - return res; - } - } - OutTraceD("CreateSurface: created GENERIC surface dds=%x flags=%x(%s) caps=%x(%s)\n", - *lplpdds, lpddsd->dwFlags, ExplainFlags(lpddsd->dwFlags), lpddsd->ddsCaps.dwCaps, ExplainDDSCaps(lpddsd->ddsCaps.dwCaps)); - - // hooks .... - HookDDSurfaceGeneric(lplpdds, dxversion); - - OutTraceD("CreateSurface: created lpdds=%x type=Generic ret=%x\n", *lplpdds, res); - if(IsDebug) DescribeSurface(*lplpdds, dxversion, "Generic", __LINE__); //v2.02.44 bug fix - - return DD_OK; -} - -static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreateSurface, LPDIRECTDRAW lpdd, DDSURFACEDESC2 *lpddsd, - LPDIRECTDRAWSURFACE *lplpdds, void *pu) -{ - HRESULT res; - DDSURFACEDESC2 ddsd; - LPDIRECTDRAWSURFACE lpDDSPrim; - DWORD CurFlags; - int TargetSize; - typedef HRESULT (*BuildSurface_Type)(LPDIRECTDRAW, CreateSurface_Type, LPDDSURFACEDESC2, int, LPDIRECTDRAWSURFACE *, void *); - BuildSurface_Type BuildPrimary; - BuildSurface_Type BuildBackBuffer; - BuildSurface_Type BuildGeneric; - - if (dxw.dwFlags1 & EMULATESURFACE){ - BuildPrimary = BuildPrimaryEmu; - BuildBackBuffer = BuildBackBufferEmu; - BuildGeneric = BuildGenericEmu; - } - else { - BuildPrimary = BuildPrimaryDir; - BuildBackBuffer = BuildBackBufferDir; - BuildGeneric = BuildGenericDir; - } - - if(IsTraceD){ - OutTrace("CreateSurface: Version=%d lpdd=%x ", dxversion, lpdd); - LogSurfaceAttributes((LPDDSURFACEDESC)lpddsd, "[CreateSurface]", __LINE__); - } - - // check for lpddsd->dwSize value - TargetSize=(dxversion<4)?sizeof(DDSURFACEDESC):sizeof(DDSURFACEDESC2); - if(lpddsd->dwSize != TargetSize){ - char sMsg[81]; - sprintf_s(sMsg,80, "CreateSurface: ASSERT bad dwSize=%d dxversion=%d\n", - lpddsd->dwSize, dxversion); - OutTraceD(sMsg); - if(IsAssertEnabled) MessageBox(0, sMsg, "CreateSurface", MB_OK | MB_ICONEXCLAMATION); - return DDERR_INVALIDPARAMS; - } - - //GHO workaround (needed for WarWind, Rogue Spear): - if (lpddsd->dwFlags && !(lpddsd->dwFlags & 0x1)){ - OutTraceD("CreateSurface: fixing illegal dwFlags value: %x -> %x\n", - lpddsd->dwFlags, lpddsd->dwFlags+1); - lpddsd->dwFlags++; - } - - memcpy(&ddsd, lpddsd, lpddsd->dwSize); // Copy - - // v2.02.38: this is odd: in "Star Force Deluxe" there is no PRIMARY surface, but a surface with - // 0 flags and 0 capabilities serves for this purpose. Is it a side-effect of old ddraw releases? - if((dxversion == 1) && (ddsd.dwFlags == 0)){ // Star Force Deluxe - ddsd.dwFlags = DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH; - ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; - //if(dxw.VirtualPixelFormat.dwRGBBitCount == 8) ddsd.ddsCaps.dwCaps |= DDSCAPS_PALETTE; - } - - // creation of the primary surface.... - if(ddsd.dwFlags & DDSD_CAPS && ddsd.ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE){ - GetHookInfo()->Height=(short)dxw.GetScreenHeight(); - GetHookInfo()->Width=(short)dxw.GetScreenWidth(); - GetHookInfo()->ColorDepth=(short)dxw.VirtualPixelFormat.dwRGBBitCount; - GetHookInfo()->DXVersion=dxversion; - lpPrimaryDD = lpdd; // v2.1.87 - memcpy(&DDSD_Prim, lpddsd, sizeof(DDSD_Prim)); // v2.02.37 - - // beware of the different behaviour between older and newer directdraw releases... - if(dxversion >= 4){ - if (lpDDSEmu_Back) while(lpDDSEmu_Back->Release()); - if (lpDDSEmu_Prim) while(lpDDSEmu_Prim->Release()); - if (ddsd.dwFlags & DDSD_BACKBUFFERCOUNT) { // Praetorians !!!! - if (lpDDSBack) while(lpDDSBack->Release()); - lpBackBufferDD = NULL; - } - } - lpDDSEmu_Back=NULL; - lpDDSEmu_Prim=NULL; - - int BBCount=0; // or 1 ?? - if (ddsd.dwFlags & DDSD_BACKBUFFERCOUNT) BBCount=ddsd.dwBackBufferCount; - if ((BBCount > 0) && (iBakBufferVersion < 4)){ - lpDDSBack=NULL; - OutTraceD("CreateSurface: backbuffer cleared - BackBufferCount=%d\n", BBCount); - } - - if (BBCount > MAXBACKBUFFERS){ - char sMsg[81]; - sprintf_s(sMsg, 80, "CreateSurface: BackBufferCount=%d\n", BBCount); - OutTraceD(sMsg); - if (IsAssertEnabled) MessageBox(0, sMsg, "CreateSurface", MB_OK | MB_ICONEXCLAMATION); - // recover ... - BBCount = MAXBACKBUFFERS; - } - - // build emulated primary surface, real primary and backbuffer surfaces - CurFlags=ddsd.dwFlags; - res=BuildPrimary(lpdd, pCreateSurface, lpddsd, dxversion, lplpdds, NULL); - if(res) return res; - lpDDSPrim = *lplpdds; - dxw.MarkPrimarySurface(lpDDSPrim); - - if (BBCount){ - // build emulated backbuffer surface - res=BuildBackBuffer(lpdd, pCreateSurface, lpddsd, dxversion, &lpDDSBack, NULL); - if(res) return res; - dxw.MarkBackBufferSurface(lpDDSBack); - - // V2.1.85/V2.2.34: tricky !!!! - // When a real backbuffer is created, it has a reference to its frontbuffer. - // some games (Monopoly 3D) may depend on this setting - i.e. they could close - // the exceeding references - so this is better be replicated adding an initial - // reference to the zero count. But you don't have to do this if the backbuffer - // is created independently by the primary surface. - lpDDSBack->AddRef(); // should it be repeated BBCount times???? - } - - if(IsTraceD){ - OutTrace("CreateSurface: created DDSPrim=%x DDSBack=%x", lpDDSPrim, lpDDSBack); - if(dxw.dwFlags1 & (EMULATESURFACE|EMULATEBUFFER)) OutTrace(" DDSEmu_Prim=%x", lpDDSEmu_Prim); - if(dxw.dwFlags1 & EMULATESURFACE) OutTrace(" DDSEmu_Back=%x", lpDDSEmu_Back); - OutTrace("\n"); - } - - // rebuild the clipper area - if(dxw.dwFlags1 & CLIPCURSOR) dxw.SetClipCursor(); - return DD_OK; - } - - // a request for a separate (not complex) backbuffer to attach later on, maybe. - if ((ddsd.dwFlags & DDSD_CAPS) && (ddsd.ddsCaps.dwCaps & DDSCAPS_BACKBUFFER)){ - if (lpDDSBack) { - OutTraceD("CreateSurface: returning current DDSBack=%x\n", lpDDSBack); - *lplpdds = lpDDSBack; - return DD_OK; - } - - res=BuildBackBuffer(lpdd, pCreateSurface, lpddsd, dxversion, lplpdds, NULL); - lpDDSBack = *lplpdds; - dxw.MarkBackBufferSurface(lpDDSBack); - return res; - } - - // if nothing else, it's a generic/zbuffer surface - - if(lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER) { - lpDDZBuffer=*lplpdds; - DDZBufferCaps = lpddsd->ddsCaps.dwCaps; - OutTraceD("CreateSurface: lpDDZBuffer=%x save ZBUFFER caps=%x(%s)\n", lpDDZBuffer, DDZBufferCaps, ExplainDDSCaps(DDZBufferCaps)); - } - - res=BuildGeneric(lpdd, pCreateSurface, lpddsd, dxversion, lplpdds, pu); - if(!res) dxw.MarkRegularSurface(*lplpdds); - - return res; -} - - -HRESULT WINAPI extCreateSurface1(LPDIRECTDRAW lpdd, DDSURFACEDESC *lpddsd, LPDIRECTDRAWSURFACE *lplpdds, void *pu) -{ - return extCreateSurface(1, (CreateSurface_Type)pCreateSurface1, lpdd, (DDSURFACEDESC2 *)lpddsd, lplpdds, pu); -} - -HRESULT WINAPI extCreateSurface2(LPDIRECTDRAW lpdd, DDSURFACEDESC *lpddsd, LPDIRECTDRAWSURFACE *lplpdds, void *pu) -{ - return extCreateSurface(2, (CreateSurface_Type)pCreateSurface2, lpdd, (DDSURFACEDESC2 *)lpddsd, lplpdds, pu); -} - -HRESULT WINAPI extCreateSurface4(LPDIRECTDRAW lpdd, DDSURFACEDESC2 *lpddsd, LPDIRECTDRAWSURFACE *lplpdds, void *pu) -{ - return extCreateSurface(4, (CreateSurface_Type)pCreateSurface4, lpdd, (DDSURFACEDESC2 *)lpddsd, lplpdds, pu); -} - -HRESULT WINAPI extCreateSurface7(LPDIRECTDRAW lpdd, DDSURFACEDESC2 *lpddsd, LPDIRECTDRAWSURFACE *lplpdds, void *pu) -{ - return extCreateSurface(7, (CreateSurface_Type)pCreateSurface7, lpdd, (DDSURFACEDESC2 *)lpddsd, lplpdds, pu); -} - - -HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGetAttachedSurface, - LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS lpddsc, LPDIRECTDRAWSURFACE *lplpddas) -{ - HRESULT res; - BOOL IsPrim; - BOOL IsBack; - - IsPrim=dxw.IsAPrimarySurface(lpdds); - IsBack=dxw.IsABackBufferSurface(lpdds); - OutTraceD("GetAttachedSurface(%d): lpdds=%x%s caps=%x(%s)\n", - dxversion, lpdds, (IsPrim?"(PRIM)":(IsBack ? "(BACK)":"")), lpddsc->dwCaps, ExplainDDSCaps(lpddsc->dwCaps)); - -#if 0 - if(lpddsc->dwCaps & DDSCAPS_MIPMAP){ - OutTraceD("GetAttachedSurface: emulate MIPMAP capability\n"); - lpddsc->dwCaps &= ~DDSCAPS_MIPMAP; - } -#endif - - // if not primary, just proxy the method - - // v2.1.81: fix to make "Silver" working: if the primary surface was created with - // backbuffercount == 2, the game expects some more surface to be attached to - // the attached backbuffer. Since there would be no use for it, just return - // the attached backbuffer itself. Makes Silver working, anyway.... - // beware: "Snowboard Racer" fails if you return an attached surface anyhow! There, - // the primary surface was created with back buffer count == 1. - - // this is yet to be proven utility..... - if (IsBack && (lpddsc->dwCaps & DDSCAPS_ZBUFFER) && lpDDZBuffer){ - *lplpddas = lpDDZBuffer; - OutTraceD("GetAttachedSurface(%d): emulating ZBUFFER attach on BACKBUFFER lpddsadd=%x\n", dxversion, *lplpddas); - return 0; - } - - if (IsBack && (DDSD_Prim.dwBackBufferCount > 1)){ - *lplpddas = lpDDSBack; - OutTraceD("GetAttachedSurface(%d): DOUBLEBUFFER attached=%x\n", dxversion, *lplpddas); - return 0; - } - - // on primary surface return the lpDDSBack surface coming from either an explicit - // AddAttachedSurface, or a primary complex surface creation otherwise.... - - if(IsPrim && (lpddsc->dwCaps & (DDSCAPS_BACKBUFFER|DDSCAPS_FLIP))) { // v2.02.42 added DDSCAPS_FLIP for Empire Earth - if (lpDDSBack) { - *lplpddas = lpDDSBack; - OutTraceD("GetAttachedSurface(%d): BACKBUFFER attached=%x\n", dxversion, *lplpddas); - return 0; - } - else { - *lplpddas = NULL; - OutTraceD("GetAttachedSurface(%d): no attached BACKBUFFER\n", dxversion); - return DDERR_NOTFOUND; - } - } - - // proxy the call... - - res=(*pGetAttachedSurface)(lpdds, lpddsc, lplpddas); - if(res) - OutTraceE("GetAttachedSurface(%d): ERROR res=%x(%s) at %d\n", dxversion, res, ExplainDDError(res), __LINE__); - else - OutTraceD("GetAttachedSurface(%d): attached=%x\n", dxversion, *lplpddas); - return res; - -} - -HRESULT WINAPI extGetAttachedSurface1(LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS lpddsc, LPDIRECTDRAWSURFACE *lplpddas) -{ - return extGetAttachedSurface(1, pGetAttachedSurface1, lpdds, lpddsc, lplpddas); -} - -HRESULT WINAPI extGetAttachedSurface3(LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS lpddsc, LPDIRECTDRAWSURFACE *lplpddas) -{ - return extGetAttachedSurface(3, pGetAttachedSurface3, lpdds, lpddsc, lplpddas); -} - -HRESULT WINAPI extGetAttachedSurface4(LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS lpddsc, LPDIRECTDRAWSURFACE *lplpddas) -{ - return extGetAttachedSurface(4, pGetAttachedSurface4, lpdds, lpddsc, lplpddas); -} - -HRESULT WINAPI extGetAttachedSurface7(LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS lpddsc, LPDIRECTDRAWSURFACE *lplpddas) -{ - return extGetAttachedSurface(7, pGetAttachedSurface7, lpdds, lpddsc, lplpddas); -} - -static void BlitError(HRESULT res, LPRECT lps, LPRECT lpd, int line) -{ - OutTraceE("Blt: ERROR %x(%s) at %d", res, ExplainDDError(res), line); - if (res==DDERR_INVALIDRECT){ - if (lps) - OutTraceE(" src=(%d,%d)-(%d,%d)",lps->left, lps->top, lps->right, lps->bottom); - else - OutTraceE(" src=(NULL)"); - if (lpd) - OutTraceE(" dest=(%d,%d)-(%d,%d)",lpd->left, lpd->top, lpd->right, lpd->bottom); - else - OutTraceE(" dest=(NULL)"); - } - OutTraceE("\n"); - return; -} - -static void BlitTrace(char *label, LPRECT lps, LPRECT lpd, int line) -{ - extern HANDLE hTraceMutex; - WaitForSingleObject(hTraceMutex, INFINITE); - OutTrace("Blt: %s", label); - if (lps) - OutTrace(" src=(%d,%d)-(%d,%d)",lps->left, lps->top, lps->right, lps->bottom); - else - OutTrace(" src=(NULL)"); - if (lpd) - OutTrace(" dest=(%d,%d)-(%d,%d)",lpd->left, lpd->top, lpd->right, lpd->bottom); - else - OutTrace(" dest=(NULL)"); - OutTrace(" at %d\n", line); - ReleaseMutex(hTraceMutex); - return; -} - -HRESULT WINAPI sBlt(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, - LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPDDBLTFX lpddbltfx, BOOL isFlipping) -{ - RECT emurect, destrect; - POINT p = {0, 0}; - HRESULT res; - BOOL ToPrim, FromPrim, ToScreen, FromScreen; - //CkArg arg; - - ToPrim=dxw.IsAPrimarySurface(lpdds); - FromPrim=dxw.IsAPrimarySurface(lpddssrc); - ToScreen=ToPrim && !(dxw.dwFlags1 & EMULATESURFACE); - FromScreen=FromPrim && !(dxw.dwFlags1 & EMULATESURFACE); - - CleanRect(&lpdestrect,__LINE__); - CleanRect(&lpsrcrect,__LINE__); - - // log - if(IsTraceD){ - char sLog[256]; - char sInfo[128]; - sprintf(sLog, "%s: dest=%x%s src=%x%s dwFlags=%x(%s)", - api, lpdds, (ToPrim ? "(PRIM)":""), lpddssrc, (FromPrim ? "(PRIM)":""), dwflags, ExplainBltFlags(dwflags)); - if (lpdestrect) - sprintf(sInfo, " destrect=(%d,%d)-(%d,%d)", lpdestrect->left, lpdestrect->top, lpdestrect->right, lpdestrect->bottom); - else - sprintf(sInfo, " destrect=(NULL)"); - strcat(sLog, sInfo); - if (lpsrcrect) - sprintf(sInfo, " srcrect=(%d,%d)-(%d,%d)", lpsrcrect->left, lpsrcrect->top, lpsrcrect->right, lpsrcrect->bottom); - else - sprintf(sInfo, " srcrect=(NULL)"); - strcat(sLog, sInfo); - if(lpddbltfx){ - if (dwflags & DDBLT_COLORFILL){ - sprintf(sInfo, " ddbltfx.FillColor=%x", lpddbltfx->dwFillColor); - strcat(sLog, sInfo); - } - if (dwflags & DDBLT_KEYDESTOVERRIDE){ - sprintf(sInfo, " ddbltfx.DestColorkey=%x", lpddbltfx->ddckDestColorkey); - strcat(sLog, sInfo); - } - if (dwflags & DDBLT_KEYSRCOVERRIDE){ - sprintf(sInfo, " ddbltfx.SrcColorkey=%x", lpddbltfx->ddckSrcColorkey); - strcat(sLog, sInfo); - } - if (dwflags & DDBLT_ROP){ - sprintf(sInfo, " ddbltfx.ROP=%x", lpddbltfx->dwROP); - strcat(sLog, sInfo); - } - if (dwflags & DDBLT_DEPTHFILL){ - sprintf(sInfo, " ddbltfx.FillDepth=%x", lpddbltfx->dwFillDepth); - strcat(sLog, sInfo); - } - } - strcat(sLog,"\n"); - OutTrace(sLog); - } - - // debug suppressions - if(ToPrim){ - if(isFlipping){ - if(dxw.dwFlags3 & NODDRAWFLIP) return DD_OK; - } - else { - if(dxw.dwFlags3 & NODDRAWBLT) return DD_OK; - } - } - -#ifdef ONEPIXELFIX - if (lpdestrect){ - if ((lpdestrect->top == 0) && (lpdestrect->bottom == dxw.GetScreenHeight() -1)) lpdestrect->bottom = dxw.GetScreenHeight(); - if ((lpdestrect->left == 0) && (lpdestrect->right == dxw.GetScreenWidth() -1)) lpdestrect->right = dxw.GetScreenWidth(); - } - if (lpsrcrect){ - if ((lpsrcrect->top == 0) && (lpsrcrect->bottom == dxw.GetScreenHeight() -1)) lpsrcrect->bottom = dxw.GetScreenHeight(); - if ((lpsrcrect->left == 0) && (lpsrcrect->right == dxw.GetScreenWidth() -1)) lpsrcrect->right = dxw.GetScreenWidth(); - } -#endif - -#define FIXBIGGERRECT 1 -#if FIXBIGGERRECT - if(ToPrim && lpdestrect){ - if((DWORD)lpdestrect->top < 0) lpdestrect->top = 0; - if((DWORD)lpdestrect->left < 0) lpdestrect->left = 0; - if((DWORD)lpdestrect->bottom > dxw.GetScreenHeight()) lpdestrect->bottom = dxw.GetScreenHeight(); - if((DWORD)lpdestrect->right > dxw.GetScreenWidth()) lpdestrect->right = dxw.GetScreenWidth(); - } -#endif - - // blit to non primary surface - - if(!ToPrim){ - //RECT srcrect, winrect; - RECT srcrect; - // make a working copy of srcrect if not NULL - if (lpsrcrect){ - srcrect=*lpsrcrect; - } - // when blitting from a primary surface on screen (that is in non emulated mode), correct offsets - // You should take account also for scaled primary surfaces, but that would be a hard task: - // a reduced primary surface (in not-emulated mode) would bring quality loss!!! - // v2.1.83: BLITFROMBACKBUFFER mode, let you chose to blit from backbuffer, where the surface size - // is fixed no matter how the window/primary surface is scaled. - // In "The Sims" there is no quality loss, but some scrolling artifact. - if(lpsrcrect && FromScreen){ - if(lpDDSBack && (dxw.dwFlags1 & BLITFROMBACKBUFFER)){ - lpddssrc=lpDDSBack; - srcrect=dxw.GetScreenRect(); - } - else{ - srcrect=dxw.MapWindowRect(lpsrcrect); - } - } - - if (IsDebug) BlitTrace("NOPRIM", lpsrcrect, lpdestrect, __LINE__); - res= (*pBlt)(lpdds, lpdestrect, lpddssrc, lpsrcrect ? &srcrect : NULL, dwflags, lpddbltfx); - // Blitting compressed data may work to screen surfaces only. In this case, it may be worth - // trying blitting directly to lpDDSEmu_Prim: it makes DK2 intro movies working. - // Wrong guess!!! The cause was not compression, but simply a pixelformat mismatch. Better - // configure things properly and avoid this branch. - switch(res){ - case DDERR_UNSUPPORTED: - if (dxw.dwFlags1 & EMULATESURFACE){ - RECT targetrect; - if (IsDebug) BlitTrace("UNSUPP", lpsrcrect ? &srcrect : NULL, lpdestrect, __LINE__); - targetrect=*lpdestrect; - dxw.MapWindowRect(&targetrect); - res=(*pBlt)(lpDDSEmu_Prim, &targetrect, lpddssrc, lpsrcrect ? &srcrect : NULL, dwflags, lpddbltfx); - } - break; - case DDERR_SURFACEBUSY: - (*pUnlockMethod(lpdds))(lpdds, NULL); - if (lpddssrc) (*pUnlockMethod(lpddssrc))(lpddssrc, NULL); - if (IsDebug) BlitTrace("BUSY", lpsrcrect ? &srcrect : NULL, lpdestrect, __LINE__); - res=(*pBlt)(lpdds, lpdestrect, lpddssrc, lpsrcrect ? &srcrect : NULL, dwflags|DDBLT_WAIT, lpddbltfx); - break; - default: - break; - } - if (res) BlitError(res, &srcrect, lpdestrect, __LINE__); - if(IsDebug) { - DescribeSurface(lpdds, 0, "[DST]" , __LINE__); - if (lpddssrc) DescribeSurface(lpddssrc, 0, "[SRC]" , __LINE__); // lpddssrc could be NULL!!! - } - if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=0; - return res; - } - - // Blit to primary surface - - if(dxw.HandleFPS()) return DD_OK; - - destrect=dxw.MapWindowRect(lpdestrect); - //OutTrace("DESTRECT=(%d,%d)-(%d,%d)\n", destrect.left, destrect.top, destrect.right, destrect.bottom); - - if(!(dxw.dwFlags1 & (EMULATESURFACE|EMULATEBUFFER))){ - res=0; - // blit only when source and dest surface are different. Should make ScreenRefresh faster. - if (lpdds != lpddssrc) { - if (dxw.dwFlags2 & SHOWFPSOVERLAY) dxw.ShowFPS(lpddssrc); - if (1) dxw.ShowTimeStretching(lpddssrc); - if (IsDebug) BlitTrace("PRIM-NOEMU", lpsrcrect, &destrect, __LINE__); - res= (*pBlt)(lpdds, &destrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); - } - if(res){ - BlitError(res, lpsrcrect, &destrect, __LINE__); - // Try to handle HDC lock concurrency.... - if(res==DDERR_SURFACEBUSY){ - (*pUnlockMethod(lpdds))(lpdds, NULL); - if (IsDebug) BlitTrace("BUSY", lpsrcrect, &destrect, __LINE__); - res= (*pBlt)(lpdds, &destrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); - if (res) BlitError(res, lpsrcrect, &destrect, __LINE__); - } - - if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=0; - } - - return res; - } - - // ... else blitting on emulated surface - // Blit/Flip to emulated primary surface - - if(!lpddssrc) { - if (isFlipping){ - // handle the flipping chain ... - lpddssrc=lpDDSBack; - OutTraceD("Flip: setting flip chain to lpdds=%x\n", lpddssrc); - } - } - - if (lpdestrect){ - emurect=*lpdestrect; - } - else{ - // emurect: emulated rect is full surface (dwWidth x dwHeight) - emurect.left = 0; - emurect.top = 0; - emurect.right = dxw.GetScreenWidth(); - emurect.bottom = dxw.GetScreenHeight(); - } - - res=0; - // blit only when source and dest surface are different. Should make ScreenRefresh faster. - if (lpdds != lpddssrc){ - if (IsDebug) BlitTrace("SRC2EMU", &emurect, &destrect, __LINE__); - res=(*pBlt)(lpdds, &emurect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); - } - - if (res) { - BlitError(res, lpsrcrect, &emurect, __LINE__); - DescribeSurface(lpdds, 0, "[DST]" , __LINE__); - if (lpddssrc) DescribeSurface(lpddssrc, 0, "[SRC]" , __LINE__); // lpddssrc could be NULL!!! - /* - Dungeon Keeper II intro movies bug .... - it seems that you can't blit from compressed or different surfaces in memory, - while the operation COULD be supported to video. As a mater of fact, it DOES - work on my PC. - */ - if(res==DDERR_UNSUPPORTED){ - if (dxw.dwFlags2 & SHOWFPSOVERLAY) dxw.ShowFPS(lpddssrc); - if (1) dxw.ShowTimeStretching(lpddssrc); - if (IsDebug) BlitTrace("UNSUPP", &emurect, &destrect, __LINE__); - res=(*pBlt)(lpDDSEmu_Prim, &destrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); - if (res) BlitError(res, lpsrcrect, &destrect, __LINE__); - } - - // Try to handle HDC lock concurrency.... - if(res==DDERR_SURFACEBUSY){ - res=(*pUnlockMethod(lpddssrc))(lpddssrc, NULL); - if(res) OutTraceE("Unlock ERROR: err=%x(%s)\n", res, ExplainDDError(res)); - if (IsDebug) BlitTrace("BUSY", &emurect, &destrect, __LINE__); - res=(*pBlt)(lpdds, &emurect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); - if (res) BlitError(res, lpsrcrect, &destrect, __LINE__); - } - - if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=0; - return res; - } - - LPDIRECTDRAWSURFACE lpDDSSource; - - if(dxw.dwFlags1 & EMULATESURFACE){ - res=(*pEmuBlt)(lpDDSEmu_Back, &emurect, lpdds, &emurect, DDBLT_WAIT, 0); - if(res==DDERR_SURFACEBUSY){ - (*pUnlockMethod(lpdds))(lpdds, NULL); - (*pUnlockMethod(lpDDSEmu_Back))(lpDDSEmu_Back, NULL); - res=(*pEmuBlt)(lpDDSEmu_Back, &emurect, lpdds, &emurect, DDBLT_WAIT, 0); - } - if(res) { - if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=0; - return res; - } - lpDDSSource = lpDDSEmu_Back; - } - else{ - lpDDSSource = lpdds; - } - - if (dxw.dwFlags2 & SHOWFPSOVERLAY) dxw.ShowFPS(lpDDSSource); - if (1) dxw.ShowTimeStretching(lpDDSSource); - if (IsDebug) BlitTrace("BACK2PRIM", &emurect, &destrect, __LINE__); - res=(*pBlt)(lpDDSEmu_Prim, &destrect, lpDDSSource, &emurect, DDBLT_WAIT, 0); - - if (res) BlitError(res, &emurect, &destrect, __LINE__); - if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=0; - if (IsDebug) OutTrace("%s: done ret=%x at %d\n", api, res, __LINE__); - return res; -} - -HRESULT WINAPI extFlip(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc, DWORD dwflags) -{ - BOOL IsPrim; - HRESULT res; - - IsPrim=dxw.IsAPrimarySurface(lpdds); - OutTraceD("Flip: lpdds=%x%s, src=%x, flags=%x(%s)\n", - lpdds, IsPrim?"(PRIM)":"", lpddssrc, dwflags, ExplainFlipFlags(dwflags)); - - if (!IsPrim){ - if(lpddssrc){ - //return 0; - res=(*pFlip)(lpdds, lpddssrc, dwflags); - } - else{ - LPDIRECTDRAWSURFACE lpddsAttached; - DDSCAPS ddsc; - DDSURFACEDESC2 sd; - - sd.dwSize=Set_dwSize_From_Surface(lpdds); - res=lpdds->GetSurfaceDesc((DDSURFACEDESC *)&sd); - if (res) OutTraceD("Flip: GetSurfaceDesc res=%x at %d\n",res, __LINE__); - - // replace these CAPS (good for seven kingdoms II) with same as lpdds surface - //ddsc.dwCaps=DDSCAPS_OFFSCREENPLAIN+DDSCAPS_SYSTEMMEMORY; - ddsc.dwCaps=sd.ddsCaps.dwCaps; - - res=lpdds->GetAttachedSurface(&ddsc, &lpddsAttached); - if(res){ - OutTraceE("Flip: GetAttachedSurface ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - return res; - } - res=sBlt("Flip", lpdds, NULL, lpddsAttached, NULL, DDBLT_WAIT, 0, TRUE); - if(res){ - OutTraceE("Flip: Blt ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - return res; - } - } - if(res) OutTraceE("Flip: ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - return res; - } - - // emulation to primary surface Flip - you can't flip to window surfaces, - // so you have to replace it with Blt operations. - - if((dwflags & DDFLIP_WAIT) || (dxw.dwFlags1 & SAVELOAD)) lpPrimaryDD->WaitForVerticalBlank(DDWAITVB_BLOCKEND , 0); - - if(lpddssrc){ - //res=lpdds->Blt(0, lpddssrc, 0, DDBLT_WAIT, 0); - res=sBlt("Flip", lpdds, NULL, lpddssrc, NULL, DDBLT_WAIT, 0, TRUE); - } - else{ - //v2.02.38: look for a valid BackBuffer surface - if(!lpDDSBack) lpDDSBack=dxw.GetBackBufferSurface(); - if(!lpDDSBack){ - OutTraceE("Flip: no backbuffer\n"); - return DDERR_INVALIDPARAMS; - } - if (dxw.dwFlags2 & BACKBUFATTACH){ - RECT NullArea; - NullArea.left=NullArea.top=0; - NullArea.bottom=dxw.GetScreenHeight(); - NullArea.right=dxw.GetScreenWidth(); - res=sBlt("Flip", lpdds, NULL, lpDDSBack, &NullArea, DDBLT_WAIT, 0, TRUE); - } - else - res=sBlt("Flip", lpdds, NULL, lpDDSBack, NULL, DDBLT_WAIT, 0, TRUE); - } - - if(res) OutTraceE("Flip: Blt ERROR %x(%s)\n", res, ExplainDDError(res)); - return res; -} - -HRESULT WINAPI extBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, - LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPDDBLTFX lpddbltfx) -{ - if ((dxw.dwFlags2 & FULLRECTBLT) && dxw.IsAPrimarySurface(lpdds)){ - lpsrcrect=NULL; - lpdestrect=NULL; - } - - return sBlt("Blt", lpdds, lpdestrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx, FALSE); -} - -HRESULT WINAPI extBltFast(LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, - LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwtrans) -{ - // BltFast is supported just on screen surfaces, so it has to be replaced - // by ordinary Blt operation in EMULATESURFACE mode. - // Mind that screen surface doesn't necessarily mean PRIMARY surfaces! - - RECT srcrect, destrect; - DWORD flags = 0; - DDSURFACEDESC2 ddsd; - HRESULT ret; - BOOL ToPrim, FromPrim; - - ToPrim=dxw.IsAPrimarySurface(lpdds); - FromPrim=dxw.IsAPrimarySurface(lpddssrc); - - CleanRect(&lpsrcrect,__LINE__); - - if(IsTraceD){ - OutTrace("BltFast: dest=%x%s src=%x%s dwTrans=%x(%s) (x,y)=(%d,%d) ", - lpdds, ToPrim?"(PRIM)":"", lpddssrc, FromPrim?"(PRIM)":"", dwtrans, ExplainBltFastFlags(dwtrans), dwx, dwy); - if (lpsrcrect) - OutTrace("srcrect=(%d,%d)-(%d,%d)\n", - lpsrcrect->left, lpsrcrect->top, lpsrcrect->right, lpsrcrect->bottom); - else - OutTrace("srcrect=(NULL)\n"); - } - - // consistency check .... - if (lpsrcrect) - if((lpsrcrect->left >= lpsrcrect->right) || (lpsrcrect->top >= lpsrcrect->bottom)) { - OutTraceD("BltFast: ASSERT bad rect at %d\n", __LINE__); - return 0; - } - - if(dwtrans & DDBLTFAST_WAIT) flags = DDBLT_WAIT; - if(dwtrans & DDBLTFAST_DESTCOLORKEY) flags |= DDBLT_KEYDEST; - if(dwtrans & DDBLTFAST_SRCCOLORKEY) flags |= DDBLT_KEYSRC; - - if ((dxw.dwFlags2 & FULLRECTBLT) && ToPrim){ - return sBlt("BltFast", lpdds, NULL, lpddssrc, lpsrcrect, flags, 0, FALSE); - } - - destrect.left = dwx; - destrect.top = dwy; - if(lpsrcrect){ - destrect.right = destrect.left + lpsrcrect->right - lpsrcrect->left; - destrect.bottom = destrect.top + lpsrcrect->bottom - lpsrcrect->top; - // avoid altering pointed values.... - srcrect=*lpsrcrect; - //ret=lpdds->Blt(&destrect, lpddssrc, &srcrect, flags, 0); - ret=sBlt("BltFast", lpdds, &destrect, lpddssrc, &srcrect, flags, 0, FALSE); - } - else{ - // does it EVER goes through here? NULL is not a valid rect value for BltFast call.... - // yes, forced in FULLRECTBLT mode! - ddsd.dwSize=Set_dwSize_From_Surface(lpddssrc); - ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT; - ret=lpddssrc->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd); - if (ret){ - OutTraceE("BltFast: GetSurfaceDesc ERROR %x at %d\n", ret, __LINE__); - return 0; - } - destrect.right = destrect.left + ddsd.dwWidth; - destrect.bottom = destrect.top + ddsd.dwHeight; - ret=sBlt("BltFast", lpdds, &destrect, lpddssrc, NULL, flags, 0, FALSE); - } - - return ret; -} - -HRESULT WINAPI extWaitForVerticalBlank(LPDIRECTDRAW lpdd, DWORD dwflags, HANDLE hevent) -{ - static DWORD time = 0; - static BOOL step = 0; - DWORD tmp; - if(!(dxw.dwFlags1 & SAVELOAD)) return (*pWaitForVerticalBlank)(lpdd, dwflags, hevent); - tmp = (*pGetTickCount)(); - if((time - tmp) > 32) time = tmp; - (*pSleep)(time - tmp); - if(step) time += 16; - else time += 17; - step ^= 1; - return 0; -} - -#define DDPCAPS_INITIALIZE_LEGACY 0x00000008l - -HRESULT WINAPI extCreatePalette(LPDIRECTDRAW lpdd, DWORD dwflags, LPPALETTEENTRY lpddpa, - LPDIRECTDRAWPALETTE *lplpddp, IUnknown *pu) -{ - HRESULT res; - - OutTraceD("CreatePalette: dwFlags=%x(%s)\n", dwflags, ExplainCreatePaletteFlags(dwflags)); - if(IsDebug && (dwflags & DDPCAPS_8BIT)){ - int idx; - OutTrace("CreatePalette: "); - for(idx=0; idx<256; idx++) OutTrace("(%02x.%02x.%02x)", - lpddpa[idx].peRed, - lpddpa[idx].peGreen, - lpddpa[idx].peBlue ); - OutTrace("\n"); - } - - if (dwflags & ~(DDPCAPS_PRIMARYSURFACE|DDPCAPS_8BIT|DDPCAPS_ALLOW256|DDPCAPS_INITIALIZE_LEGACY)) STOPPER("Palette flags"); - - if(dxw.dwFlags1 & EMULATESURFACE) dwflags &= ~DDPCAPS_PRIMARYSURFACE; - res = (*pCreatePalette)(lpdd, dwflags, lpddpa, lplpddp, pu); - if (res) { - OutTraceE("CreatePalette: ERROR res=%x(%s)\n", res, ExplainDDError(res)); - return res; - } - else OutTraceD("CreatePalette: OK lpddp=%x\n", *lplpddp); - - HookDDPalette(lplpddp); - return 0; -} - -HRESULT WINAPI extGetPalette(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE *lplpddp) -{ - HRESULT res; - - OutTraceD("GetPalette: lpdds=%x\n", lpdds); - - res=(*pGetPalette)(lpdds, lplpddp); - if (res) OutTraceE("GetPalette: ERROR res=%x(%s)\n", res, ExplainDDError(res)); - else OutTraceD("GetPalette: OK\n"); - return res; -} - -HRESULT WINAPI extSetPalette(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE lpddp) -{ - PALETTEENTRY *lpentries; - BOOL isPrim; - HRESULT res; - - isPrim=dxw.IsAPrimarySurface(lpdds); - OutTraceD("SetPalette: lpdds=%x%s lpddp=%x\n", lpdds, isPrim?"(PRIM)":"", lpddp); - - res=(*pSetPalette)(lpdds, lpddp); - res=DD_OK; - if(res)OutTraceE("SetPalette: ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - else OutTraceD("SetPalette: OK\n"); - - if((dxw.dwFlags1 & EMULATESURFACE) && isPrim){ - OutTraceD("SetPalette: register PRIMARY palette lpDDP=%x\n", lpddp); - lpDDP = lpddp; - if(lpddp){ - HRESULT res2; - lpentries = (LPPALETTEENTRY)PaletteEntries; - res2=lpddp->GetEntries(0, 0, 256, lpentries); - if(res2) OutTraceE("SetPalette: GetEntries ERROR res=%x(%s)\n", res2, ExplainDDError(res2)); - mySetPalette(0, 256, lpentries); - } - res=0; - } - - return res; -} - -HRESULT WINAPI extSetEntries(LPDIRECTDRAWPALETTE lpddp, DWORD dwflags, DWORD dwstart, DWORD dwcount, LPPALETTEENTRY lpentries) -{ - HRESULT res; - - OutTraceD("SetEntries: lpddp=%x dwFlags=%x, start=%d, count=%d entries=%x\n", //GHO: added trace infos - lpddp, dwflags, dwstart, dwcount, lpentries); - - res = (*pSetEntries)(lpddp, dwflags, dwstart, dwcount, lpentries); - if(res) OutTraceE("SetEntries: ERROR res=%x(%s)\n", res, ExplainDDError(res)); - else OutTraceD("SetEntries: OK\n"); - - if((dxw.dwFlags1 & EMULATESURFACE) && (lpDDP == lpddp)){ - OutTraceD("SetEntries: update PRIMARY palette lpDDP=%x\n", lpddp); - if ((dwstart + dwcount > 256) || (dwstart<0)){ - dwcount=256; - dwstart=0; - OutTraceD("SetEntries: ASSERT start+count > 256\n"); - } - - mySetPalette(dwstart, dwcount, lpentries); - - // GHO: needed for fixed rect and variable palette animations, - // e.g. dungeon keeper loading screen, Warcraft II splash, ... - // GHO: but refreshing cause flickering when GDI was used without updating the primary surface - // e.g. Tomb Raider 2 intro titles, Virtua Fighter PC, ... - if ((dxw.dwFlags1 & EMULATESURFACE) && !(dxw.dwFlags2 & NOPALETTEUPDATE)) dxw.ScreenRefresh(); - } - return res; -} - -HRESULT WINAPI extSetClipper(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWCLIPPER lpddc) -{ - HRESULT res; - BOOL isPrim; - isPrim=dxw.IsAPrimarySurface(lpdds); - OutTraceD("SetClipper: lpdds=%x%s lpddc=%x\n", lpdds, isPrim?"(PRIM)":"", lpddc); - - // v2.1.84: SUPPRESSCLIPPING flag - improves "Monopoly Edition 3D" where continuous - // clipping ON & OFF affects blitting on primary surface. - if(dxw.dwFlags1 & SUPPRESSCLIPPING) return 0; - - if(dxw.dwFlags1 & (EMULATESURFACE|EMULATEBUFFER)){ - if ((isPrim && lpDDSEmu_Prim) || - ((lpdds == lpDDSBack) && lpDDSEmu_Back)){ - OutTraceD("SetClipper: skip primary/backbuffer lpdds=%x\n", lpdds); - res=0; - } - else - res=(*pSetClipper)(lpdds, lpddc); - } - else - res=(*pSetClipper)(lpdds, lpddc); - - if (res) - OutTraceE("SetClipper: ERROR res=%x(%s)\n", res, ExplainDDError(res)); - return res; -} - -HRESULT WINAPI extLock(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDIRECTDRAWSURFACE lpdds2, DWORD flags, HANDLE hEvent) -{ - HRESULT res; - BOOL IsPrim; - - IsPrim=dxw.IsAPrimarySurface(lpdds); - CleanRect(&lprect, __LINE__); - - if(IsTraceD){ - OutTrace("Lock: lpdds=%x%s flags=%x(%s) lpdds2=%x", - lpdds, (IsPrim ? "(PRIM)":""), flags, ExplainLockFlags(flags), lpdds2); - if (lprect) - OutTrace(" rect=(%d,%d)-(%d,%d)\n", lprect->left, lprect->top, lprect->right, lprect->bottom); - else - OutTrace(" rect=(NULL)\n"); - } - - res=(*pLock)(lpdds, lprect, lpdds2, flags, hEvent); - if(res==DDERR_SURFACEBUSY){ // v70: fix for "Ancient Evil" - (*pUnlockMethod(lpdds))(lpdds, NULL); - res = (*pLock)(lpdds, lprect, lpdds2, flags, hEvent); - OutTraceD("Lock RETRY: ret=%x(%s)\n", res, ExplainDDError(res)); - } - if(res) OutTraceE("Lock ERROR: ret=%x(%s)\n", res, ExplainDDError(res)); - DumpSurfaceAttributes((LPDDSURFACEDESC)lpdds2, "[Locked]" , __LINE__); - if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK; - - // shouldn't happen.... if hooked to non primary surface, just call regular method. - // it happens in "Deadlock 2" backbuffer surface!!! - return res; -} - -LPDIRECTDRAWSURFACE2 lpDDSBuffer = NULL; - -HRESULT WINAPI extLockDir(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDIRECTDRAWSURFACE lpdds2, DWORD flags, HANDLE hEvent) -{ - HRESULT res, res2; - static RECT client; - POINT upleft={0,0}; - LPDIRECTDRAWSURFACE lpDDSPrim; - - // this hooker operates on - // Beware!!! for strange reason, the function gets hooked to ANY surface, also non primary ones!!! - // to find out whether it is the primary or not, using lpdds==lpPrimaryDD->GetGDISurface(&lpDDSPrim); - - if(IsTraceD){ - OutTrace("Lock: lpdds=%x flags=%x(%s) lpdds2=%x", - lpdds, flags, ExplainLockFlags(flags), lpdds2); - if (lprect) - OutTrace(" rect=(%d,%d)-(%d,%d)\n", lprect->left, lprect->top, lprect->right, lprect->bottom); - else - OutTrace(" rect=(NULL)\n"); - } - - // V2.02.43: Empire Earth does some test Lock operations apparently before the primary surface is created - if(lpPrimaryDD){ - lpDDSPrim=0; - res2=(*pGetGDISurface)(lpPrimaryDD, &lpDDSPrim); - if(res2) - OutTraceE("Lock: GetGDISurface ERROR res=%x(%s) at %d\n", res2, ExplainDDError(res2), __LINE__); - else - (*pReleaseS)(lpDDSPrim); - if(lpdds==lpDDSPrim){ - if(dxw.dwFlags1 & LOCKEDSURFACE){ - DDSURFACEDESC2 ddsd; - DDBLTFX fx; - memset(&ddsd, 0, sizeof(ddsd)); - //ddsd.dwSize=SurfaceDescrSize(lpdds); - ddsd.dwSize=sizeof(DDSURFACEDESC); - ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS; - ddsd.dwWidth = dxw.GetScreenWidth(); - ddsd.dwHeight = dxw.GetScreenHeight(); - ddsd.ddsCaps.dwCaps = 0; - //if (SurfaceDescrSize(lpdds)==sizeof(DDSURFACEDESC2)) ddsd.ddsCaps.dwCaps |= DDSCAPS_OFFSCREENPLAIN; - DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Dir FixBuf]" , __LINE__); - res=(*pCreateSurface1)(lpPrimaryDD, (DDSURFACEDESC *)&ddsd, (LPDIRECTDRAWSURFACE *)&lpDDSBuffer, 0); - if(res){ - OutTraceE("CreateSurface: ERROR on DDSBuffer res=%x(%s) at %d\n",res, ExplainDDError(res), __LINE__); - return res; - } - memset(&fx, 0, sizeof(fx)); - fx.dwSize=sizeof(DDBLTFX); - fx.dwFillColor=0; - res=(*pBlt)((LPDIRECTDRAWSURFACE)lpDDSBuffer, NULL, NULL, NULL, DDBLT_WAIT|DDBLT_COLORFILL, &fx); - if(res){ - OutTraceE("Blt: ERROR on DDSBuffer res=%x(%s) at %d\n",res, ExplainDDError(res), __LINE__); - } - lpdds=(LPDIRECTDRAWSURFACE)lpDDSBuffer; - } - else{ - // since it can't scale, at least the updated rect is centered into the window. - (*pGetClientRect)(dxw.GethWnd(), &client); - (*pClientToScreen)(dxw.GethWnd(), &upleft); - if (!lprect) lprect=&client; - OffsetRect(lprect, - upleft.x+(client.right-dxw.GetScreenWidth())/2, - upleft.y+(client.bottom-dxw.GetScreenHeight())/2); - OutTraceD("Lock: NULL rect remapped to (%d,%d)-(%d,%d)\n", - lprect->left, lprect->top, lprect->right, lprect->bottom); - } - } - } - - res=(*pLock)(lpdds, lprect, lpdds2, flags, hEvent); - - if(res) OutTraceE("Lock ERROR: ret=%x(%s)\n", res, ExplainDDError(res)); - DumpSurfaceAttributes((LPDDSURFACEDESC)lpdds2, "[Locked]" , __LINE__); - if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK; - - return res; -} - -HRESULT WINAPI extUnlock(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRAWSURFACE lpdds, LPRECT lprect) -{ - HRESULT res; - //RECT screen, rect; - BOOL IsPrim; - - IsPrim=dxw.IsAPrimarySurface(lpdds); - - if ((dxversion == 4) && lprect) CleanRect(&lprect,__LINE__); - - if(IsTraceD){ - OutTrace("Unlock: lpdds=%x%s ", lpdds, (IsPrim ? "(PRIM)":"")); - if (dxversion == 4){ - if (lprect){ - OutTrace("rect=(%d,%d)-(%d,%d)\n", lprect->left, lprect->top, lprect->right, lprect->bottom); - } - else - OutTrace("rect=(NULL)\n"); - } - else - OutTrace("lpvoid=%x\n", lprect); - } - - res=(*pUnlock)(lpdds, lprect); - if (res) OutTraceE("Unlock ERROR res=%x(%s) at %d\n",res, ExplainDDError(res), __LINE__); - if (IsPrim && res==DD_OK) sBlt("Unlock", lpdds, NULL, lpdds, NULL, NULL, 0, FALSE); - if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=0; - return res; -} - -HRESULT WINAPI extUnlock4(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect) -{ - return extUnlock(4, pUnlock4, lpdds, lprect); -} - -HRESULT WINAPI extUnlock1(LPDIRECTDRAWSURFACE lpdds, LPVOID lpvoid) -{ - return extUnlock(1, (Unlock4_Type)pUnlock1, lpdds, (LPRECT)lpvoid); -} - -HRESULT WINAPI extUnlockDir(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRAWSURFACE lpdds, LPRECT lprect) -{ - HRESULT res; - //RECT screen, rect; - BOOL IsPrim; - LPDIRECTDRAWSURFACE lpDDSPrim; - - IsPrim=dxw.IsAPrimarySurface(lpdds); - - if ((dxversion >= 4) && lprect) CleanRect(&lprect,__LINE__); - - if(IsTraceD){ - OutTrace("Unlock: lpdds=%x%s ", lpdds, (IsPrim ? "(PRIM)":"")); - if (dxversion == 4){ - if (lprect){ - OutTrace("rect=(%d,%d)-(%d,%d)\n", lprect->left, lprect->top, lprect->right, lprect->bottom); - } - else - OutTrace("rect=(NULL)\n"); - } - else - OutTrace("lpvoid=%x\n", lprect); - } - - if(dxw.dwFlags1 & LOCKEDSURFACE){ - (*pGetGDISurface)(lpPrimaryDD, &lpDDSPrim); - if(lpdds==lpDDSPrim){ - RECT client; - POINT upleft={0,0}; - (*pGetClientRect)(dxw.GethWnd(), &client); - (*pClientToScreen)(dxw.GethWnd(), &upleft); - if (!lprect) lprect=&client; - OffsetRect(lprect, upleft.x, upleft.y); - res=(*pUnlock)((LPDIRECTDRAWSURFACE)lpDDSBuffer, lprect); - (*pBlt)(lpdds, lprect, (LPDIRECTDRAWSURFACE)lpDDSBuffer, NULL, DDBLT_WAIT, 0); - if(lpDDSBuffer) (*pReleaseS)((LPDIRECTDRAWSURFACE)lpDDSBuffer); - lpDDSBuffer = NULL; - } - (*pReleaseS)(lpDDSPrim); // to leave a correct refcount - } - - res=(*pUnlock)(lpdds, lprect); - if (res) OutTraceE("Unlock ERROR res=%x(%s) at %d\n",res, ExplainDDError(res), __LINE__); - if (IsPrim && res==DD_OK) sBlt("Unlock", lpdds, NULL, lpdds, NULL, NULL, 0, FALSE); - if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=0; - return res; -} - -HRESULT WINAPI extUnlockDir4(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect) -{ - return extUnlockDir(4, pUnlock4, lpdds, lprect); -} - -HRESULT WINAPI extUnlockDir1(LPDIRECTDRAWSURFACE lpdds, LPVOID lpvoid) -{ - return extUnlockDir(1, (Unlock4_Type)pUnlock1, lpdds, (LPRECT)lpvoid); -} - -/* to do: instead of calling GDI GetDC, try to map GetDC with Lock and -ReleaseDC with Unlock, returning the surface memory ptr (???) as HDC -and avoiding the consistency check performed by surface::GetDC (why -should it bother if the screen is 32BPP and the surface is not??? */ - -HRESULT WINAPI extGetDC(LPDIRECTDRAWSURFACE lpdds, HDC FAR *pHDC) -{ - HRESULT res; - BOOL IsPrim; - - IsPrim=dxw.IsAPrimarySurface(lpdds); - OutTraceD("GetDC: lpdss=%x%s\n",lpdds, IsPrim?"(PRIM)":""); - res=(*pGetDC)(lpdds, pHDC); - - if (res==DDERR_CANTCREATEDC && - (dxw.dwFlags1 & EMULATESURFACE) && - dxw.VirtualPixelFormat.dwRGBBitCount==8) { - // for 8BPP palettized surfaces, connect them to either the ddraw emulated palette or the GDI emulated palette - OutTraceD("GetDC: adding 8BPP palette to surface lpdds=%x\n", lpdds); - if(lpDDP==NULL){ - // should link here to the GDI palette? See Hyperblade.... - dxw.palNumEntries=256; - res=(*pCreatePalette)(lpPrimaryDD, DDPCAPS_ALLOW256|DDPCAPS_8BIT|DDPCAPS_INITIALIZE, dxw.palPalEntry, &lpDDP, NULL); - if (res) { - OutTraceE("GetDC: CreatePalette ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - return res; - } - } - res=(*pSetPalette)(lpdds, lpDDP); - if (res) { - OutTraceE("GetDC: SetPalette ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - return res; - } - // retry .... - res=(*pGetDC)(lpdds, pHDC); - } - - OutTraceD("GetDC: res=%x hdc=%x\n",res, *pHDC); - return res; -} - -HRESULT WINAPI extReleaseDC(LPDIRECTDRAWSURFACE lpdds, HDC FAR hdc) -{ - HRESULT res; - BOOL IsPrim; - - IsPrim=dxw.IsAPrimarySurface(lpdds); - OutTraceD("ReleaseDC: lpdss=%x%s hdc=%x\n",lpdds, IsPrim?"(PRIM)":"", hdc); - res=(*pReleaseDC)(lpdds,hdc); - if((IsPrim) && (dxw.dwFlags1 & EMULATESURFACE)) sBlt("ReleaseDC", lpdds, NULL, lpdds, NULL, 0, NULL, FALSE); - if (res) OutTraceE("ReleaseDC: ERROR res=%x(%s)\n", res, ExplainDDError(res)); - - return res; -} - - -HRESULT WINAPI extFlipToGDISurface(LPDIRECTDRAW lpdd) -{ - //HRESULT res; - - OutTraceD("FlipToGDISurface: lpdd=%x\n", lpdd); - // to revise: so far, it seems the best thing to do is NOTHING, just return 0. - //res=(*pFlipToGDISurface)(lpdd); - //if (res) OutTraceE("FlipToGDISurface: ERROR res=%x(%s), skipping\n", res, ExplainDDError(res)); - // pretend you flipped anyway.... - return 0; -} - -HRESULT WINAPI extGetGDISurface(LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE *w) -{ - int res; - - // v2.02.31: - // in EMULATED mode, should not return the actual ddraw primary surface, but the virtual one. - if(dxw.dwFlags1 & EMULATESURFACE){ - *w=dxw.GetPrimarySurface(); - return DD_OK; - } - - res=(*pGetGDISurface)(lpdd, w); - if (res) { - OutTraceE("GetGDISurface: ERROR lpdd=%x res=%x(%s)\n", lpdd, res, ExplainDDError(res)); - } - else { - OutTraceD("GetGDISurface: PROXED lpdd=%x w=%x\n", lpdd, *w); - } - - return res; -} - -// debug function to dump all video modes queried by the DirectDrav::EnumDisplayModes method - -HRESULT WINAPI EnumModesCallbackDumper(LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID lpContext) -{ - OutTrace("EnumModesCallback:\n"); - OutTrace("\tdwSize=%d\n", lpDDSurfaceDesc->dwSize); - OutTrace("\tdwFlags=%x(%s)\n", lpDDSurfaceDesc->dwFlags, ExplainFlags(lpDDSurfaceDesc->dwFlags)); - OutTrace("\tdwHeight x dwWidth=(%d,%d)\n", lpDDSurfaceDesc->dwHeight, lpDDSurfaceDesc->dwWidth); - OutTrace("\tlPitch=%d\n", lpDDSurfaceDesc->lPitch); - OutTrace("\tdwBackBufferCount=%d\n", lpDDSurfaceDesc->dwBackBufferCount); - OutTrace("\tdwRefreshRate=%d\n", lpDDSurfaceDesc->dwRefreshRate); - OutTrace("\tlpSurface=%x\n", lpDDSurfaceDesc->lpSurface); - OutTrace("\tddpfPixelFormat %s\n", DumpPixelFormat((LPDDSURFACEDESC2)lpDDSurfaceDesc)); - return DDENUMRET_OK; -} - -typedef HRESULT (WINAPI *EnumModesCallback_Type)(LPDDSURFACEDESC, LPVOID); -typedef struct {LPVOID lpContext; EnumModesCallback_Type lpCallback; } NewContext_Type; - -HRESULT WINAPI myEnumModesFilter(LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID lpContext) -{ - if (IsDebug) EnumModesCallbackDumper(lpDDSurfaceDesc, NULL); - - if (dxw.dwFlags1 & PREVENTMAXIMIZE){ - // if PREVENTMAXIMIZE is set, don't let the caller know about forbidden screen settings. - if((lpDDSurfaceDesc->dwHeight > dxw.GetScreenHeight()) || - (lpDDSurfaceDesc->dwWidth > dxw.GetScreenWidth())){ - OutTraceD("EnumDisplayModes: skipping screen size=(%d,%d)\n", lpDDSurfaceDesc->dwHeight, lpDDSurfaceDesc->dwWidth); - return DDENUMRET_OK; - } - } - - // tricky part: in 16BPP color depth let the callback believe that the pixel encoding - // is actually the one implemented in the emulation routines. - // should it fix also the other color depths? - - switch(lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount){ - case 8: - case 16: - case 24: - case 32: - FixPixelFormat(lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount, &lpDDSurfaceDesc->ddpfPixelFormat); - return (*((NewContext_Type *)lpContext)->lpCallback)(lpDDSurfaceDesc, ((NewContext_Type *)lpContext)->lpContext); - break; - } - return DDENUMRET_OK; -} - -HRESULT WINAPI extEnumDisplayModes(EnumDisplayModes1_Type pEnumDisplayModes, LPDIRECTDRAW lpdd, DWORD dwflags, LPDDSURFACEDESC lpddsd, LPVOID lpContext, LPDDENUMMODESCALLBACK cb) -{ - HRESULT res; - OutTraceD("EnumDisplayModes(D): lpdd=%x flags=%x lpddsd=%x callback=%x\n", lpdd, dwflags, lpddsd, cb); - - // note: extEnumDisplayModes serves both the EnumDisplayModes and EnumDisplayModes2 interfaces: - // they differ for the lpddsd argument that should point to either DDSURFACEDESC or DDSURFACEDESC2 - // structures, but unification is possible if the lpddsd->dwSize is properly set and is left untouched. - - if(dxw.dwFlags1 & EMULATESURFACE){ -#if 0 - struct {int w; int h;}SupportedRes[5]= {(320,240),(640,480),(800,600),(1024,1200),(0,0)}; - int SupportedDepths[5]={8,16,24,32,0}; - int ResIdx, DepthIdx, ColorDepth; - DDSURFACEDESC2 EmuDesc; - - //if (1) res=(*pEnumDisplayModes)(lpdd, dwflags, lpddsd, lpContext, EnumModesCallbackDumper); - - EmuDesc.dwRefreshRate = 0; - EmuDesc.ddpfPixelFormat.dwFlags = DDPF_RGB; - if (lpddsd) EmuDesc.dwSize=lpddsd->dwSize; // sizeof either DDSURFACEDESC or DDSURFACEDESC2 !!! - else EmuDesc.dwSize = sizeof(DDSURFACEDESC2); - EmuDesc.dwFlags=DDSD_PIXELFORMAT|DDSD_REFRESHRATE|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PITCH; - for (ResIdx=0; ResIdx<4; ResIdx++){ - EmuDesc.dwHeight=SupportedRes[ResIdx].h; - EmuDesc.dwWidth=SupportedRes[ResIdx].w; - EmuDesc.ddpfPixelFormat.dwSize=sizeof(DDPIXELFORMAT); - EmuDesc.ddpfPixelFormat.dwFlags=DDPF_RGB; - for (DepthIdx=0; DepthIdx<4; DepthIdx++) { - ColorDepth=SupportedDepths[DepthIdx]; - EmuDesc.ddpfPixelFormat.dwRGBBitCount=ColorDepth; - EmuDesc.lPitch=(ColorDepth/8) * SupportedRes[ResIdx].w; - switch (SupportedDepths[DepthIdx]){ - case 8: - EmuDesc.ddpfPixelFormat.dwFlags = DDPF_RGB | DDPF_PALETTEINDEXED8; - break; - case 16: - if (dxw.dwFlags1 & USERGB565){ - EmuDesc.ddpfPixelFormat.dwRBitMask = 0xf800; // Grim Fandango - EmuDesc.ddpfPixelFormat.dwGBitMask = 0x07e0; - EmuDesc.ddpfPixelFormat.dwBBitMask = 0x001f; - EmuDesc.ddpfPixelFormat.dwRGBAlphaBitMask = 0x0000; - } - else { - EmuDesc.ddpfPixelFormat.dwRBitMask = 0x7c00; - EmuDesc.ddpfPixelFormat.dwGBitMask = 0x03e0; - EmuDesc.ddpfPixelFormat.dwBBitMask = 0x001f; - EmuDesc.ddpfPixelFormat.dwRGBAlphaBitMask = 0x8000; - } - break; - case 24: - EmuDesc.ddpfPixelFormat.dwRBitMask = 0x00FF0000; - EmuDesc.ddpfPixelFormat.dwGBitMask = 0x0000FF00; - EmuDesc.ddpfPixelFormat.dwBBitMask = 0x000000FF; - EmuDesc.ddpfPixelFormat.dwRGBAlphaBitMask = 0x00000000; - break; - case 32: - EmuDesc.ddpfPixelFormat.dwRBitMask = 0x00FF0000; - EmuDesc.ddpfPixelFormat.dwGBitMask = 0x0000FF00; - EmuDesc.ddpfPixelFormat.dwBBitMask = 0x000000FF; - EmuDesc.ddpfPixelFormat.dwRGBAlphaBitMask = 0xFF000000; - break; - } - res=(*cb)((LPDDSURFACEDESC)&EmuDesc, lpContext); - if(res==DDENUMRET_CANCEL) break; - } - if(res==DDENUMRET_CANCEL) break; - } - OutTraceD("EnumDisplayModes(D): cycled to res=%d size=(%d,%d)\n", - SupportedDepths[DepthIdx], SupportedRes[ResIdx].w, SupportedRes[ResIdx].h); -#else - NewContext_Type NewContext; - NewContext.lpContext=lpContext; - NewContext.lpCallback=cb; - - res=(*pEnumDisplayModes)(lpdd, dwflags, lpddsd, &NewContext, myEnumModesFilter); -#endif - } - else{ - // proxy the call - res=(*pEnumDisplayModes)(lpdd, dwflags, lpddsd, lpContext, cb); - } - if(res) OutTraceD("EnumDisplayModes(D): ERROR res=%x(%s)\n", res, ExplainDDError(res)); - return res; -} - -HRESULT WINAPI extEnumDisplayModes1(LPDIRECTDRAW lpdd, DWORD dwflags, LPDDSURFACEDESC lpddsd, LPVOID lpContext, LPDDENUMMODESCALLBACK cb) -{ - return extEnumDisplayModes(pEnumDisplayModes1, lpdd, dwflags, lpddsd, lpContext, cb); -} - -HRESULT WINAPI extEnumDisplayModes4(LPDIRECTDRAW lpdd, DWORD dwflags, LPDDSURFACEDESC2 lpddsd, LPVOID lpContext, LPDDENUMMODESCALLBACK2 cb) -{ - return extEnumDisplayModes((EnumDisplayModes1_Type)pEnumDisplayModes4, lpdd, dwflags, (LPDDSURFACEDESC)lpddsd, lpContext, (LPDDENUMMODESCALLBACK)cb); -} - -HRESULT WINAPI extDuplicateSurface(LPDIRECTDRAW lpdd, LPDIRECTDRAWSURFACE s, LPDIRECTDRAWSURFACE *sp) -{ - int res; - res=(*pDuplicateSurface)(lpdd, s, sp); - if (res) - OutTraceE("DuplicateSurface: ERROR dds=%x res=%x(%s)\n", s, res, ExplainDDError(res)); - else - OutTraceD("DuplicateSurface: dds=%x pdds=%x\n", s, *sp); - return res; -} - -HRESULT WINAPI extGetPixelFormat(LPDIRECTDRAWSURFACE lpdds, LPDDPIXELFORMAT p) -{ - DWORD res; - BOOL IsPrim; - - IsPrim=dxw.IsAPrimarySurface(lpdds); - OutTraceD("GetPixelFormat: lpdds=%x%s\n", lpdds, IsPrim?"(PRIM)":""); - res=(*pGetPixelFormat)(lpdds, p); - if(res){ - OutTraceE("GetPixelFormat: ERROR res=%x(%s)\n", res, ExplainDDError(res)); - } - else{ - OutTraceD("GetPixelFormat: Flags=%x(%s) FourCC=%x BitCount=%d RGBA=(%x,%x,%x,%x)\n", - p->dwFlags, ExplainPixelFormatFlags(p->dwFlags), p->dwFourCC, p->dwRGBBitCount, - p->dwRBitMask, p->dwGBitMask, p->dwBBitMask, p->dwRGBAlphaBitMask ); - } - - if ((dxw.dwFlags1 & EMULATESURFACE) && IsPrim){ - p->dwFlags = dxw.VirtualPixelFormat.dwFlags; - p->dwRGBBitCount= dxw.VirtualPixelFormat.dwRGBBitCount; - p->dwRBitMask = dxw.VirtualPixelFormat.dwRBitMask; - p->dwGBitMask = dxw.VirtualPixelFormat.dwGBitMask; - p->dwBBitMask = dxw.VirtualPixelFormat.dwBBitMask; - p->dwRGBAlphaBitMask = dxw.VirtualPixelFormat.dwRGBAlphaBitMask; - OutTraceD("GetPixelFormat: EMULATED BitCount=%d RGBA=(%x,%x,%x,%x)\n", - p->dwRGBBitCount, p->dwRBitMask, p->dwGBitMask, p->dwBBitMask, p->dwRGBAlphaBitMask ); - } - - return res; -} - -#if 0 -static HRESULT WINAPI RestoreAll(LPDIRECTDRAWSURFACE7 lpDDSurface, LPDDSURFACEDESC2 lpDDSurfaceDesc, LPVOID lpContext) -{ - HRESULT res; - //res=lpDDSurface->Restore(); - res=(*pRestore)((LPDIRECTDRAWSURFACE)lpDDSurface); - OutTraceB("TestCooperativeLevel: Restore lpdds=%x res=%x(%s)\n", lpDDSurface, res, ExplainDDError(res)); - (*pReleaseS)((LPDIRECTDRAWSURFACE)lpDDSurface); - if(res) return DDENUMRET_CANCEL; - return DDENUMRET_OK; -} -#endif - -HRESULT WINAPI extTestCooperativeLevel(LPDIRECTDRAW lpdd) -{ - HRESULT res; - res=(*pTestCooperativeLevel)(lpdd); - OutTraceB("TestCooperativeLevel: lpdd=%x res=%x(%s)\n", lpdd, res, ExplainDDError(res)); - if(res==DDERR_WRONGMODE) { -#if 0 - (*pEnumSurfaces4)(lpdd, DDENUMSURFACES_DOESEXIST|DDENUMSURFACES_ALL, NULL, NULL, (LPDDENUMSURFACESCALLBACK2)RestoreAll); - //lpDDSEmu_Prim->Restore(); - //res=(*pEnumSurfaces4)(lpdd, dwflags, lpddsd, lpContext, cb); -#else - res=((LPDIRECTDRAW7)lpdd)->RestoreAllSurfaces(); - if(res) OutTraceE("TestCooperativeLevel: RestoreAllSurfaces ERROR res=%x(%s)\n", res, ExplainDDError(res)); -#endif - } - if(dxw.dwFlags1 & SUPPRESSDXERRORS) return DD_OK; - return res; -} - -HRESULT WINAPI extReleaseS(LPDIRECTDRAWSURFACE lpdds) -{ - HRESULT res; - BOOL IsPrim; - BOOL IsBack; - - IsPrim=dxw.IsAPrimarySurface(lpdds); - IsBack=dxw.IsABackBufferSurface(lpdds); - - res = (*pReleaseS)(lpdds); - - OutTraceD("Release(S): lpdds=%x%s refcount=%d\n", lpdds, IsPrim?"(PRIM)":(IsBack?"(BACK)":""), res); - if (res==0) { // common precondition - // when releasing primary surface, erase clipping region - if(IsPrim && (dxw.dwFlags1 & CLIPCURSOR)) dxw.EraseClipCursor(); - if (dxw.dwFlags1 & EMULATESURFACE) { - if(lpdds==lpDDSEmu_Prim) { - OutTraceD("Release(S): Clearing lpDDSEmu_Prim pointer\n"); - lpDDSEmu_Prim=NULL; - } - if(lpdds==lpDDSEmu_Back) { - OutTraceD("Release(S): Clearing lpDDSEmu_Back pointer\n"); - lpDDSEmu_Back=NULL; - } - if(lpdds==dxw.lpDDSPrimHDC) { - OutTraceD("Release(S): Clearing lpDDSPrimHDC pointer\n"); - dxw.ResetPrimarySurface(); - } - } - if(lpdds==lpDDSBack) { // v2.02.38 - OutTraceD("Release(S): Clearing lpDDSBack pointer\n"); - lpDDSBack = NULL; - } - } - return res; -} - -HRESULT WINAPI extSetColorKey(LPDIRECTDRAWSURFACE lpdds, DWORD flags, LPDDCOLORKEY lpDDColorKey) -{ - HRESULT res; - BOOL IsPrim; - IsPrim=dxw.IsAPrimarySurface(lpdds); - if(IsTraceD){ - OutTrace("SetColorKey: lpdds=%x%s flags=%x(%s) ", - lpdds, (IsPrim ? "(PRIM)" : ""), flags, ExplainColorKeyFlag(flags)); - if (lpDDColorKey) - OutTrace("colors=(L:%x,H:%x)\n",lpDDColorKey->dwColorSpaceLowValue, lpDDColorKey->dwColorSpaceHighValue); - else - OutTrace("colors=(NULL)\n"); - } - - res=(*pSetColorKey)(lpdds, flags, lpDDColorKey); - if(res) OutTraceE("SetColorKey: ERROR flags=%x lpdds=%x res=%x(%s)\n", - flags, lpdds, res, ExplainDDError(res)); - return res; -} - -HRESULT WINAPI extGetColorKey(LPDIRECTDRAWSURFACE lpdds, DWORD flags, LPDDCOLORKEY lpDDColorKey) -{ - HRESULT res; - BOOL IsPrim; - IsPrim=dxw.IsAPrimarySurface(lpdds); - OutTraceD("GetColorKey(S): lpdds=%x%s flags=%x(%s)\n", - lpdds, (IsPrim ? "(PRIM)" : ""), flags, ExplainColorKeyFlag(flags)); - res=(*pGetColorKey)(lpdds, flags, lpDDColorKey); - if(res) - OutTraceE("GetColorKey: ERROR lpdds=%x flags=%x res=%x(%s)\n", lpdds, flags, res, ExplainDDError(res)); - else - OutTraceD("GetColorKey: colors=(L:%x,H:%x)\n", - lpdds, lpDDColorKey->dwColorSpaceLowValue, lpDDColorKey->dwColorSpaceHighValue); - return res; -} - -HRESULT WINAPI extEnumAttachedSurfaces(LPDIRECTDRAWSURFACE lpdds, LPVOID lpContext, LPDDENUMSURFACESCALLBACK lpEnumSurfacesCallback) -{ - HRESULT res; - BOOL IsPrim; - - IsPrim=dxw.IsAPrimarySurface(lpdds); - - OutTraceD("EnumAttachedSurfaces: lpdds=%x%s Context=%x Callback=%x\n", - lpdds, (IsPrim ? "(PRIM)":""), lpContext, lpEnumSurfacesCallback); - - if (IsPrim){ - // A Primary surface has not backbuffer attached surfaces actually, - // so don't rely on ddraw and call the callback function directly. - // Needed to make Nox working. - DDSURFACEDESC2 ddsd; - // first, call hooked function - res=(*pEnumAttachedSurfaces)(lpdds, lpContext, lpEnumSurfacesCallback); - if (res) - OutTraceE("EnumAttachedSurfaces: ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - if(lpDDSBack){ - ddsd.dwSize=Set_dwSize_From_Surface(lpDDSBack); - res=lpDDSBack->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd); - if(res){ - OutTraceE("EnumAttachedSurfaces: GetSurfaceDesc ERROR %x(%s)\n", - res, ExplainDDError(res)); - return res; - } - res=(lpEnumSurfacesCallback)(lpDDSBack, (LPDDSURFACEDESC)&ddsd, lpContext); - OutTraceD("EnumSurfacesCallback: on DDSBack res=%x(%s)\n", res, ExplainDDError(res)); - } - res=0; // for Black Dahlia - } - else { - res=(*pEnumAttachedSurfaces)(lpdds, lpContext, lpEnumSurfacesCallback); - if (res) - OutTraceE("EnumAttachedSurfaces: ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - } - return res; -} - -HRESULT WINAPI extAddAttachedSurface(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddsadd) -{ - HRESULT res; - BOOL IsPrim; - - // You can add backbuffers to primary surfaces to join the flipping chain, but you can't do that - // to an emulated primary surface, and you receive a DDERR_CANNOTATTACHSURFACE error code. - // In that case, it's worth to try to emulate the attach, and since the Flip method is emulated, - // just remember this for further handling in the Flip operation. - // But beware: this holds to BACKBUFFER surfaces only, and NOT for attached ZBUFFERS or similar! - - IsPrim=dxw.IsAPrimarySurface(lpdds); - OutTraceD("AddAttachedSurface: lpdds=%x%s lpddsadd=%x\n", lpdds, IsPrim?"(PRIM)":"", lpddsadd); - //if(!lpddsadd) return DDERR_CANNOTATTACHSURFACE; // to avoid a crash... - res=(*pAddAttachedSurface)(lpdds, lpddsadd); - if (res) { - HRESULT sdres; - DDSURFACEDESC2 sd; - sd.dwSize=Set_dwSize_From_Surface(lpddsadd); - sdres=lpddsadd->GetSurfaceDesc((DDSURFACEDESC *)&sd); - if (sdres) - OutTraceE("AddAttachedSurface: GetSurfaceDesc ERROR res=%x at %d\n", sdres, __LINE__); - else - OutTraceD("AddAttachedSurface: GetSurfaceDesc dwCaps=%x(%s)\n", - sd.ddsCaps.dwCaps, ExplainDDSCaps(sd.ddsCaps.dwCaps)); - if (IsPrim){ - if (sd.ddsCaps.dwCaps & DDSCAPS_BACKBUFFER) - if ((dxw.dwFlags1 & EMULATESURFACE) && (res==DDERR_CANNOTATTACHSURFACE) || - (res==DDERR_NOEXCLUSIVEMODE)) - OutTraceD("AddAttachedSurface: emulating BACKBUFFER attach on PRIMARY\n"); - lpDDSBack=lpddsadd; - if (pAddRefS) (*pAddRefS)(lpdds); - res=DD_OK; - } - else if (lpdds == lpDDSBack) { - // v2.02.13: emulate ZBUFFER attach to backbuffer: do nothing and return OK - // this trick makes at least "Nocturne" work also in emulated mode when hardware acceleration - // is set in the game "Options" menu. - if (sd.ddsCaps.dwCaps & DDSCAPS_ZBUFFER) // DDSCAPS_BACKBUFFER for double buffering ??? - if ((dxw.dwFlags1 & EMULATESURFACE) && (res==DDERR_CANNOTATTACHSURFACE)){ - OutTraceD("AddAttachedSurface: emulating ZBUFFER attach on BACKBUFFER\n"); - if (pAddRefS) (*pAddRefS)(lpdds); - res=DD_OK; - } - } - } - if (res) OutTraceE("AddAttachedSurface: ERROR %x(%s)\n", res, ExplainDDError(res)); - return res; -} - -HRESULT WINAPI extDeleteAttachedSurface(LPDIRECTDRAWSURFACE lpdds, DWORD dwflags, LPDIRECTDRAWSURFACE lpddsdel) -{ - HRESULT res; - OutTraceD("DeleteAttachedSurface: lpdds=%x flags=%x lpddsdel=%x\n", lpdds, dwflags, lpddsdel); - res=(*pDeleteAttachedSurface)(lpdds, dwflags, lpddsdel); - if(res) OutTraceE("DeleteAttachedSurface: ERROR %x(%s)\n", res, ExplainDDError(res)); - if (res && (lpddsdel==lpDDSBack)){ - OutTraceD("DeleteAttachedSurface: emulating surface detach lpdds=%x\n", lpddsdel); - lpDDSBack->Release(); // GHO TRY - lpDDSBack=NULL; - res=0; - } - return res; -} - -HRESULT WINAPI cbDump(LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID lpContext) -{ - OutTraceD("EnumDisplayModes: CALLBACK lpdds=%x Context=%x Caps=%x(%s)\n", - lpDDSurfaceDesc, lpContext, - lpDDSurfaceDesc->ddsCaps.dwCaps, ExplainDDSCaps(lpDDSurfaceDesc->ddsCaps.dwCaps)); - return 1; -} - -HRESULT WINAPI extGetCapsS(int dxInterface, GetCapsS_Type pGetCapsS, LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS caps) -{ - HRESULT res; - BOOL IsPrim, IsBack, IsFixed; - IsPrim=dxw.IsAPrimarySurface(lpdds); - IsBack=dxw.IsABackBufferSurface(lpdds); - IsFixed=FALSE; - OutTraceD("GetCaps(S%d): lpdds=%x%s, lpcaps=%x\n", dxInterface, lpdds, IsPrim?"(PRIM)":"", caps); - res=(*pGetCapsS)(lpdds, caps); - if(res) - OutTraceE("GetCaps(S%d): ERROR %x(%s)\n", dxInterface, res, ExplainDDError(res)); - else - OutTraceD("GetCaps(S%d): lpdds=%x caps=%x(%s)\n", dxInterface, lpdds, caps->dwCaps, ExplainDDSCaps(caps->dwCaps)); - - if (IsPrim) { - OutTraceD("GetCaps(S%d): fixing PRIMARY surface\n", dxInterface); - IsFixed=TRUE; - caps->dwCaps |= DDSD_Prim.ddsCaps.dwCaps; - caps->dwCaps |= DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_FRONTBUFFER|DDSCAPS_VIDEOMEMORY|DDSCAPS_VISIBLE; // primary surfaces must be this way - caps->dwCaps &= ~(DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); // primary surfaces can't be this way - } - - if (IsBack) { - OutTraceD("GetCaps(S%d): fixing BACKBUFFER surface\n", dxInterface); - IsFixed=TRUE; - caps->dwCaps |= (DDSCAPS_BACKBUFFER|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); // you never know.... - caps->dwCaps &= ~(DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); // backbuffer surfaces can't be this way - } - - if ((caps->dwCaps & DDSCAPS_ZBUFFER) || (lpdds == lpDDZBuffer)){ - OutTraceD("GetCaps(S%d): fixing ZBUFFER surface\n", dxInterface); - IsFixed=TRUE; - if (DDZBufferCaps & DDSCAPS_SYSTEMMEMORY){ - caps->dwCaps |= (DDSCAPS_ZBUFFER|DDSCAPS_SYSTEMMEMORY); - caps->dwCaps &= ~(DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); - } - else { - caps->dwCaps |= (DDSCAPS_ZBUFFER|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); - caps->dwCaps &= ~DDSCAPS_SYSTEMMEMORY; - } - } - - if(IsFixed) OutTraceD("GetCaps(S%d): lpdds=%x FIXED caps=%x(%s)\n", dxInterface, lpdds, caps->dwCaps, ExplainDDSCaps(caps->dwCaps)); - return res; -} - -HRESULT WINAPI extGetCaps1S(LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS caps) -{ - return extGetCapsS(1, pGetCaps1S, lpdds, caps); -} -HRESULT WINAPI extGetCaps2S(LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS caps) -{ - return extGetCapsS(2, pGetCaps2S, lpdds, caps); -} -HRESULT WINAPI extGetCaps3S(LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS caps) -{ - return extGetCapsS(3, pGetCaps3S, lpdds, caps); -} -HRESULT WINAPI extGetCaps4S(LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS2 caps) -{ - return extGetCapsS(4, (GetCapsS_Type)pGetCaps4S, lpdds, (LPDDSCAPS)caps); -} -HRESULT WINAPI extGetCaps7S(LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS2 caps) -{ - return extGetCapsS(7, (GetCapsS_Type)pGetCaps7S, lpdds, (LPDDSCAPS)caps); -} - -ULONG WINAPI extReleaseD(LPDIRECTDRAW lpdd) -{ - ULONG ActualRef; - LONG VirtualRef; - int dxversion; - - dxversion=lpddHookedVersion(lpdd); // must be called BEFORE releasing the session!! - OutTraceD("Release(D): lpdd=%x dxversion=%d\n", lpdd, dxversion); - - ActualRef=(*pReleaseD)(lpdd); - VirtualRef=(LONG)ActualRef; - OutTraceD("Release(D): lpdd=%x service_lpdd=%x ref=%d\n", lpdd, lpPrimaryDD, ActualRef); - - if (lpdd == lpPrimaryDD) { // v2.1.87: fix for Dungeon Keeper II - if(dxw.dwFlags4 & FIXREFCOUNTER){ - // v2.02.41: fix the ref counter to sumulate the unwindowed original situation - --VirtualRef; // why ???? - if(lpDDSBack) --VirtualRef; - if(dxw.dwFlags1 & EMULATESURFACE){ - if(lpDDSEmu_Prim) --VirtualRef; - if(lpDDSEmu_Back) --VirtualRef; - } - if(VirtualRef<0) VirtualRef=0; - OutTraceD("Release(D): fixed ref counter %d->%d\n", ActualRef, VirtualRef); - } - if((dxversion<4) && (ActualRef==0)){ - // directdraw old versions automatically free all linked objects when the parent session is closed. - OutTraceD("Release(D): RefCount=0 - service object RESET condition\n"); - lpDDSEmu_Prim=NULL; - lpDDSEmu_Back=NULL; - lpDDP=NULL; - lpPrimaryDD=NULL; // v2.02.31 - if(lpBackBufferDD==lpdd){ - lpBackBufferDD=NULL; - lpDDSBack=NULL; // beware: Silent Hunter II seems to require the backbuffer .... - } - } - } - - // when lpdd session is closed (ref==0) the system restores the default color depth - // so if FORCE16BPP is set, dxwnd must restore the 16BPP value - //extern void SwitchTo16BPP(); - //if((ActualRef==0) && (dxw.dwFlags3 & FORCE16BPP)) SwitchTo16BPP(); - - OutTraceD("Release(D): lpdd=%x ref=%x\n", lpdd, VirtualRef); - return (ULONG)VirtualRef; -} - -HRESULT WINAPI extCreateClipper(LPDIRECTDRAW lpdd, DWORD dwflags, - LPDIRECTDRAWCLIPPER FAR* lplpDDClipper, IUnknown FAR* pUnkOuter) -{ - HRESULT res; - OutTraceD("CreateClipper: lpdd=%x flags=%x\n", lpdd, dwflags); - res=(*pCreateClipper)(lpdd, dwflags, lplpDDClipper, pUnkOuter); - if(res) { - OutTraceE("CreateClipper: ERROR res=%x(%s)\n", lpdd, res, ExplainDDError(res)); - return res; - } - HookDDClipper(lplpDDClipper); - return res; -} - -HRESULT WINAPI extReleaseC(LPDIRECTDRAWCLIPPER lpddClip) -{ - ULONG ref; - - ref = (*pReleaseC)(lpddClip); - - OutTraceD("Release(C): PROXED lpddClip=%x ref=%x\n", lpddClip, ref); - return ref; -} - -HRESULT WINAPI extGetSurfaceDesc(GetSurfaceDesc_Type pGetSurfaceDesc, LPDIRECTDRAWSURFACE lpdds, LPDDSURFACEDESC lpddsd) -{ - HRESULT res; - BOOL IsPrim, IsBack, IsFixed; - IsPrim=dxw.IsAPrimarySurface(lpdds); - IsBack=dxw.IsABackBufferSurface(lpdds); - IsFixed=FALSE; - - if (!pGetSurfaceDesc) { - OutTraceE("GetSurfaceDesc: ERROR no hooked function\n"); - return DDERR_INVALIDPARAMS; - } - - res=(*pGetSurfaceDesc)(lpdds, lpddsd); - OutTraceD("GetSurfaceDesc: %slpdds=%x%s res=%x(%s)\n", - res?"ERROR ":"", lpdds, IsPrim?"(PRIM)":(IsBack?"(BACK)":""), res, ExplainDDError(res)); - if(res) { - OutTraceE("GetSurfaceDesc: ERROR err=%d(%s) at %d\n", res, ExplainDDError(res), __LINE__); - return res; - } - - LogSurfaceAttributes(lpddsd, "GetSurfaceDesc", __LINE__); - - if (IsPrim) { - OutTraceD("GetSurfaceDesc: fixing PRIMARY surface\n"); - IsFixed=TRUE; - if (dxw.dwFlags1 & EMULATESURFACE) lpddsd->ddpfPixelFormat = dxw.VirtualPixelFormat; - lpddsd->ddsCaps.dwCaps |= DDSD_Prim.ddsCaps.dwCaps; - lpddsd->ddsCaps.dwCaps |= (DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_FRONTBUFFER|DDSCAPS_VIDEOMEMORY|DDSCAPS_VISIBLE); // primary surfaces must be this way - lpddsd->ddsCaps.dwCaps &= ~(DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); // primary surfaces can't be this way - lpddsd->dwBackBufferCount=DDSD_Prim.dwBackBufferCount; - lpddsd->dwHeight=dxw.GetScreenHeight(); - lpddsd->dwWidth=dxw.GetScreenWidth(); - } - - if (IsBack) { - OutTraceD("GetSurfaceDesc: fixing BACKBUFFER surface\n"); - IsFixed=TRUE; - lpddsd->ddsCaps.dwCaps |= (DDSCAPS_BACKBUFFER|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); // you never know.... - lpddsd->ddsCaps.dwCaps &= ~(DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN); // primary surfaces can't be this way - } - - if (lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER) { - OutTraceD("GetSurfaceDesc: fixing ZBUFFER surface\n"); - IsFixed=TRUE; - if (DDZBufferCaps & DDSCAPS_SYSTEMMEMORY){ - lpddsd->ddsCaps.dwCaps |= (DDSCAPS_ZBUFFER|DDSCAPS_SYSTEMMEMORY); - lpddsd->ddsCaps.dwCaps &= ~(DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); - } - else { - lpddsd->ddsCaps.dwCaps |= (DDSCAPS_ZBUFFER|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); - lpddsd->ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; - } - } - -#ifdef EXPERIMENTAL_1 - if(1) { - IsFixed=TRUE; - if(lpddsd->ddsCaps.dwCaps & DDSCAPS_BACKBUFFER){ - lpddsd->dwSize = sizeof(DDSURFACEDESC2); - lpddsd->ddsCaps.dwCaps |= DDSCAPS_RESERVED2; - ((LPDDSURFACEDESC2)lpddsd)->ddsCaps.dwCaps2 = DDSCAPS2_RESERVED2; - ((LPDDSURFACEDESC2)lpddsd)->ddsCaps.dwCaps3 = 0; - } - else - if(lpddsd->ddsCaps.dwCaps & DDSCAPS_BACKBUFFER){ - } - else { - lpddsd->ddsCaps.dwCaps |= DDSCAPS_RESERVED2; - ((LPDDSURFACEDESC2)lpddsd)->ddsCaps.dwCaps2 |= DDSCAPS2_RESERVED2; - } - } -#endif - - if(IsFixed) LogSurfaceAttributes(lpddsd, "GetSurfaceDesc [FIXED]", __LINE__); - - return DD_OK; -} - -// Beware: despite the surface version, some game (The Sims!!!) intentionally uses a different dwSize, so that -// you shouldn't reset the value - -HRESULT WINAPI extGetSurfaceDesc1(LPDIRECTDRAWSURFACE lpdds, LPDDSURFACEDESC lpddsd) -{ - if (!lpddsd->dwSize) lpddsd->dwSize = sizeof(DDSURFACEDESC); // enforce correct dwSize value - switch(lpddsd->dwSize){ - case sizeof(DDSURFACEDESC): - if (pGetSurfaceDesc1) return extGetSurfaceDesc(pGetSurfaceDesc1, lpdds, lpddsd); - /**/ if (pGetSurfaceDesc4) return extGetSurfaceDesc((GetSurfaceDesc_Type)pGetSurfaceDesc4, (LPDIRECTDRAWSURFACE)lpdds, (LPDDSURFACEDESC)lpddsd); - break; - case sizeof(DDSURFACEDESC2): - if (pGetSurfaceDesc4) return extGetSurfaceDesc((GetSurfaceDesc_Type)pGetSurfaceDesc4, (LPDIRECTDRAWSURFACE)lpdds, (LPDDSURFACEDESC)lpddsd); - break; - default: - OutTraceD("GetSurfaceDesc: ASSERT - bad dwSize=%d lpdds=%x at %d\n", lpddsd->dwSize, lpdds, __LINE__); - return DDERR_INVALIDOBJECT; - break; - } - OutTraceD("GetSurfaceDesc: ASSERT - missing hook lpdds=%x dwSize=%d(%s) at %d\n", - lpdds, lpddsd->dwSize, lpddsd->dwSize==sizeof(DDSURFACEDESC)?"DDSURFACEDESC":"DDSURFACEDESC2", __LINE__); - return DDERR_INVALIDOBJECT; -} - -HRESULT WINAPI extGetSurfaceDesc2(LPDIRECTDRAWSURFACE2 lpdds, LPDDSURFACEDESC2 lpddsd) -{ - if (!lpddsd->dwSize) lpddsd->dwSize = sizeof(DDSURFACEDESC2); // enforce correct dwSize value - switch(lpddsd->dwSize){ - case sizeof(DDSURFACEDESC): - if (pGetSurfaceDesc1) return extGetSurfaceDesc(pGetSurfaceDesc1, (LPDIRECTDRAWSURFACE)lpdds, (LPDDSURFACEDESC)lpddsd); - break; - case sizeof(DDSURFACEDESC2): - if (pGetSurfaceDesc4) return extGetSurfaceDesc((GetSurfaceDesc_Type)pGetSurfaceDesc4, (LPDIRECTDRAWSURFACE)lpdds, (LPDDSURFACEDESC)lpddsd); - break; - default: - OutTraceD("GetSurfaceDesc: ASSERT - bad dwSize=%d lpdds=%x at %d\n", lpddsd->dwSize, lpdds, __LINE__); - return DDERR_INVALIDOBJECT; - } - OutTraceD("GetSurfaceDesc: ASSERT - missing hook lpdds=%x dwSize=%d(%s) at %d\n", - lpdds, lpddsd->dwSize, lpddsd->dwSize==sizeof(DDSURFACEDESC)?"DDSURFACEDESC":"DDSURFACEDESC2", __LINE__); - return DDERR_INVALIDOBJECT; -} - -HRESULT WINAPI extGetSurfaceDesc7(LPDIRECTDRAWSURFACE2 lpdds, LPDDSURFACEDESC2 lpddsd) -{ - if (!lpddsd->dwSize) lpddsd->dwSize = sizeof(DDSURFACEDESC2); // enforce correct dwSize value - switch(lpddsd->dwSize){ - case sizeof(DDSURFACEDESC): - if (pGetSurfaceDesc1) return extGetSurfaceDesc(pGetSurfaceDesc1, (LPDIRECTDRAWSURFACE)lpdds, (LPDDSURFACEDESC)lpddsd); - break; - case sizeof(DDSURFACEDESC2): - if (pGetSurfaceDesc7) return extGetSurfaceDesc((GetSurfaceDesc_Type)pGetSurfaceDesc7, (LPDIRECTDRAWSURFACE)lpdds, (LPDDSURFACEDESC)lpddsd); - break; - default: - OutTraceD("GetSurfaceDesc: ASSERT - bad dwSize=%d lpdds=%x at %d\n", lpddsd->dwSize, lpdds, __LINE__); - return DDERR_INVALIDOBJECT; - } - OutTraceD("GetSurfaceDesc: ASSERT - missing hook lpdds=%x dwSize=%d(%s) at %d\n", - lpdds, lpddsd->dwSize, lpddsd->dwSize==sizeof(DDSURFACEDESC)?"DDSURFACEDESC":"DDSURFACEDESC2", __LINE__); - return DDERR_INVALIDOBJECT; -} - -HRESULT WINAPI extReleaseP(LPDIRECTDRAWPALETTE lpddPalette) -{ - ULONG ref; - - ref = (*pReleaseP)(lpddPalette); - - OutTraceD("Release(P): lpddPalette=%x ref=%x\n", lpddPalette, ref); - if(lpddPalette==lpDDP && ref==0){ - OutTraceD("Release(P): clearing lpDDP=%x->NULL\n", lpDDP); - lpDDP=NULL; - } - return ref; -} - -BOOL WINAPI DDEnumerateCallbackFilter(GUID *lpGuid, LPSTR lpDriverDescription, LPSTR lpDriverName, LPVOID lpContext) -{ - BOOL res; - typedef struct {LPDDENUMCALLBACK lpCallback; LPVOID lpContext;} Context_Type; - Context_Type *p=(Context_Type *)lpContext; - OutTraceD("DDEnumerateCallback: guid=%x DriverDescription=\"%s\" DriverName=\"%s\" Context=%x\n", - lpGuid, lpDriverDescription, lpDriverName, p->lpContext); - if((lpGuid==NULL) || !(dxw.dwFlags2 & HIDEMULTIMONITOR)) res=(*p->lpCallback)(lpGuid, lpDriverDescription, lpDriverName, p->lpContext); - if((lpGuid==NULL) && (dxw.dwFlags2 & HIDEMULTIMONITOR)) res=FALSE; - OutTraceD("DDEnumerateCallback: res=%x(%s)\n", res, res?"continue":"break"); - return res; -} - -BOOL WINAPI DDEnumerateCallbackExFilter(GUID *lpGuid, LPSTR lpDriverDescription, LPSTR lpDriverName, LPVOID lpContext, HMONITOR hm) -{ - BOOL res; - typedef struct {LPDDENUMCALLBACKEX lpCallback; LPVOID lpContext;} Context_Type; - Context_Type *p=(Context_Type *)lpContext; - OutTraceD("DDEnumerateCallbackEx: guid=%x DriverDescription=\"%s\" DriverName=\"%s\" Context=%x hm=%x\n", - lpGuid, lpDriverDescription, lpDriverName, lpContext, hm); - res=TRUE; - if((lpGuid==NULL) || !(dxw.dwFlags2 & HIDEMULTIMONITOR)) res=(*p->lpCallback)(lpGuid, lpDriverDescription, lpDriverName, p->lpContext, hm); - if((lpGuid==NULL) && (dxw.dwFlags2 & HIDEMULTIMONITOR)) res=FALSE; - OutTraceD("DDEnumerateCallbackEx: res=%x(%s)\n", res, res?"continue":"break"); - return res; -} - -HRESULT WINAPI extDirectDrawEnumerate(LPDDENUMCALLBACK lpCallback, LPVOID lpContext) -{ - HRESULT ret; - OutTraceD("DirectDrawEnumerate: lpCallback=%x lpContext=%x\n", lpCallback, lpContext); - if((dxw.dwFlags2 & HIDEMULTIMONITOR) || (dxw.dwTFlags & OUTDEBUG)){ - struct {LPDDENUMCALLBACK lpCallback; LPVOID lpContext;} myContext; - myContext.lpCallback=lpCallback; - myContext.lpContext=lpContext; - ret=(*pDirectDrawEnumerate)(DDEnumerateCallbackFilter, (LPVOID)&myContext); - } - else - ret=(*pDirectDrawEnumerate)(lpCallback, lpContext); - if(ret) OutTraceE("DirectDrawEnumerate: ERROR res=%x(%s)\n", ret, ExplainDDError(ret)); - return ret; -} - -HRESULT WINAPI extDirectDrawEnumerateEx(LPDDENUMCALLBACKEX lpCallback, LPVOID lpContext, DWORD dwFlags) -{ - HRESULT ret; - OutTraceP("DirectDrawEnumerateEx: lpCallback=%x lpContext=%x Flags=%x(%s)\n", - lpCallback, lpContext, dxw.dwFlags1, ExplainDDEnumerateFlags(dwFlags)); - if((dxw.dwFlags2 & HIDEMULTIMONITOR) || (dxw.dwTFlags & OUTDEBUG)){ - struct {LPDDENUMCALLBACKEX lpCallback; LPVOID lpContext;} myContext; - myContext.lpCallback=lpCallback; - myContext.lpContext=lpContext; - ret=(*pDirectDrawEnumerateEx)(DDEnumerateCallbackExFilter, (LPVOID)&myContext, dwFlags); - } - else - ret=(*pDirectDrawEnumerateEx)(lpCallback, lpContext, dwFlags); - if(ret) OutTraceD("DirectDrawEnumerateEx: ERROR res=%x(%s)\n", ret, ExplainDDError(ret)); - return ret; -} - -HRESULT WINAPI extDDGetGammaRamp(LPDIRECTDRAWSURFACE lpdds, DWORD dwFlags, LPDDGAMMARAMP lpgr) -{ - HRESULT ret; - OutTraceD("GetGammaRamp: dds=%x dwFlags=%x\n", lpdds, dwFlags); - ret=(*pDDGetGammaRamp)(lpdds, dwFlags, lpgr); - if(ret) OutTraceE("GetGammaRamp: ERROR res=%x(%s)\n", ret, ExplainDDError(ret)); - else OutTraceD("GetGammaRamp: RGB=(%x,%x,%x)\n", lpgr->red, lpgr->green, lpgr->blue); - return ret; -} - - HRESULT WINAPI extDDSetGammaRamp(LPDIRECTDRAWSURFACE lpdds, DWORD dwFlags, LPDDGAMMARAMP lpgr) -{ - HRESULT ret; - OutTraceD("GetGammaRamp: dds=%x dwFlags=%x RGB=(%x,%x,%x)\n", lpdds, dwFlags, lpgr->red, lpgr->green, lpgr->blue); - if (dxw.dwFlags2 & DISABLEGAMMARAMP) return DD_OK; - ret=(*pDDSetGammaRamp)(lpdds, dwFlags, lpgr); - if(ret) OutTraceE("GetGammaRamp: ERROR res=%x(%s)\n", ret, ExplainDDError(ret)); - return ret; -} diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index 7c279c1..49ddff8 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -2746,7 +2746,14 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet } #endif - // if not primary, just proxy the method + // this is yet to be proven utility..... + // v2.02.45: No - it prevents "Praetorians" to work!!! -> commented out. + // + //if (IsBack && (lpddsc->dwCaps & DDSCAPS_ZBUFFER) && lpDDZBuffer){ + // *lplpddas = lpDDZBuffer; + // OutTraceD("GetAttachedSurface(%d): emulating ZBUFFER attach on BACKBUFFER lpddsadd=%x\n", dxversion, *lplpddas); + // return 0; + //} // v2.1.81: fix to make "Silver" working: if the primary surface was created with // backbuffercount == 2, the game expects some more surface to be attached to @@ -2755,13 +2762,6 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet // beware: "Snowboard Racer" fails if you return an attached surface anyhow! There, // the primary surface was created with back buffer count == 1. - // this is yet to be proven utility..... - if (IsBack && (lpddsc->dwCaps & DDSCAPS_ZBUFFER) && lpDDZBuffer){ - *lplpddas = lpDDZBuffer; - OutTraceD("GetAttachedSurface(%d): emulating ZBUFFER attach on BACKBUFFER lpddsadd=%x\n", dxversion, *lplpddas); - return 0; - } - if (IsBack && (DDSD_Prim.dwBackBufferCount > 1)){ *lplpddas = lpDDSBack; OutTraceD("GetAttachedSurface(%d): DOUBLEBUFFER attached=%x\n", dxversion, *lplpddas); @@ -3010,8 +3010,7 @@ HRESULT WINAPI sBlt(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, res=0; // blit only when source and dest surface are different. Should make ScreenRefresh faster. if (lpdds != lpddssrc) { - if (dxw.dwFlags2 & SHOWFPSOVERLAY) dxw.ShowFPS(lpddssrc); - if (dxw.dwFlags4 & SHOWTIMESTRETCH) dxw.ShowTimeStretching(lpddssrc); + dxw.ShowOverlay(lpddssrc); if (IsDebug) BlitTrace("PRIM-NOEMU", lpsrcrect, &destrect, __LINE__); res= (*pBlt)(lpdds, &destrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); } @@ -3071,8 +3070,7 @@ HRESULT WINAPI sBlt(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, work on my PC. */ if(res==DDERR_UNSUPPORTED){ - if (dxw.dwFlags2 & SHOWFPSOVERLAY) dxw.ShowFPS(lpddssrc); - if (dxw.dwFlags4 & SHOWTIMESTRETCH) dxw.ShowTimeStretching(lpddssrc); + dxw.ShowOverlay(lpddssrc); if (IsDebug) BlitTrace("UNSUPP", &emurect, &destrect, __LINE__); res=(*pBlt)(lpDDSEmu_Prim, &destrect, lpddssrc, lpsrcrect, dwflags, lpddbltfx); if (res) BlitError(res, lpsrcrect, &destrect, __LINE__); @@ -3110,8 +3108,7 @@ HRESULT WINAPI sBlt(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, lpDDSSource = lpdds; } - if (dxw.dwFlags2 & SHOWFPSOVERLAY) dxw.ShowFPS(lpDDSSource); - if (dxw.dwFlags4 & SHOWTIMESTRETCH) dxw.ShowTimeStretching(lpDDSSource); + dxw.ShowOverlay(lpDDSSource); if (IsDebug) BlitTrace("BACK2PRIM", &emurect, &destrect, __LINE__); res=(*pBlt)(lpDDSEmu_Prim, &destrect, lpDDSSource, &emurect, DDBLT_WAIT, 0); @@ -3301,7 +3298,7 @@ HRESULT WINAPI extCreatePalette(LPDIRECTDRAW lpdd, DWORD dwflags, LPPALETTEENTRY OutTraceD("CreatePalette: dwFlags=%x(%s)\n", dwflags, ExplainCreatePaletteFlags(dwflags)); if(IsDebug && (dwflags & DDPCAPS_8BIT)) dxw.DumpPalette(256, lpddpa); - if (dwflags & ~(DDPCAPS_PRIMARYSURFACE|DDPCAPS_8BIT|DDPCAPS_ALLOW256|DDPCAPS_INITIALIZE_LEGACY)) STOPPER("Palette flags"); + //if (dwflags & ~(DDPCAPS_PRIMARYSURFACE|DDPCAPS_8BIT|DDPCAPS_ALLOW256|DDPCAPS_INITIALIZE_LEGACY)) STOPPER("Palette flags"); if(dxw.dwFlags1 & EMULATESURFACE) dwflags &= ~DDPCAPS_PRIMARYSURFACE; res = (*pCreatePalette)(lpdd, dwflags, lpddpa, lplpddp, pu); diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index c699789..1026b3c 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -917,6 +917,25 @@ void dxwCore::GetSystemTime(LPSYSTEMTIME lpSystemTime) } } +void dxwCore::ShowOverlay() +{ + this->ShowOverlay(GetDC(hWnd)); +} + +void dxwCore::ShowOverlay(LPDIRECTDRAWSURFACE lpdds) +{ + HDC hdc; // the working dc + if (FAILED(lpdds->GetDC(&hdc))) return; + this->ShowOverlay(hdc); + lpdds->ReleaseDC(hdc); +} + +void dxwCore::ShowOverlay(HDC hdc) +{ + if (dwFlags2 & SHOWFPSOVERLAY) ShowFPS(hdc); + if (dwFlags4 & SHOWTIMESTRETCH) ShowTimeStretching(hdc); +} + void dxwCore::ShowFPS() { this->ShowFPS(GetDC(hWnd)); diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp index 8e4da08..b6b8801 100644 --- a/dll/dxwcore.hpp +++ b/dll/dxwcore.hpp @@ -71,8 +71,11 @@ public: // methods void ShowTimeStretching(void); void ShowFPS(HDC); void ShowTimeStretching(HDC); - char *GetTSCaption(int); + void ShowOverlay(); + void ShowOverlay(HDC); + void ShowOverlay(LPDIRECTDRAWSURFACE); char *GetTSCaption(void); + char *GetTSCaption(int); void DoSlow(int); void ShowBanner(HWND); POINT ScreenToClient(POINT); diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 6253cd2..ecc6d89 100644 --- a/dll/dxwnd.cpp +++ b/dll/dxwnd.cpp @@ -24,7 +24,7 @@ along with this program. If not, see . #include "dxwnd.h" #include "dxwcore.hpp" -#define VERSION "2.02.44" +#define VERSION "2.02.46" #define DDTHREADLOCK 1 diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index aa89a03..f126de6 100644 Binary files a/dll/dxwnd.vs2008.suo and b/dll/dxwnd.vs2008.suo differ diff --git a/dll/gdi32.cpp b/dll/gdi32.cpp index 97b7e26..8e2f3a0 100644 --- a/dll/gdi32.cpp +++ b/dll/gdi32.cpp @@ -42,6 +42,7 @@ static HookEntry_Type Hooks[]={ {"StretchDIBits", (FARPROC)StretchDIBits, (FARPROC *)&pStretchDIBits, (FARPROC)extStretchDIBits}, //{"SetDIBitsToDevice", (FARPROC)NULL, (FARPROC *)&pSetDIBitsToDevice, (FARPROC)extSetDIBitsToDevice}, //{"CreateCompatibleBitmap", (FARPROC)NULL, (FARPROC *)&pCreateCompatibleBitmap, (FARPROC)extCreateCompatibleBitmap}, + //{"SetMapMode", (FARPROC)NULL, (FARPROC *)NULL, (FARPROC)extSetMapMode}, {0, NULL, 0, 0} // terminator }; @@ -955,8 +956,7 @@ BOOL WINAPI extGDIBitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nH nHDest= nHeight; dxw.MapClient(&nXDest, &nYDest, &nWDest, &nHDest); res=(*pGDIStretchBlt)(hdcDest, nXDest, nYDest, nWDest, nHDest, hdcSrc, nXSrc, nYSrc, nWidth, nHeight, dwRop); - if (dxw.dwFlags2 & SHOWFPSOVERLAY) dxw.ShowFPS(hdcDest); - if (dxw.dwFlags4 & SHOWTIMESTRETCH) dxw.ShowTimeStretching(hdcDest); + dxw.ShowOverlay(hdcDest); OutTrace("Debug: DC dest=(%d,%d) size=(%d,%d)\n", nXDest, nYDest, nWDest, nHDest); } else if(WindowFromDC(hdcDest)==NULL){ @@ -966,8 +966,7 @@ BOOL WINAPI extGDIBitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nH nHDest= nHeight; dxw.MapWindow(&nXDest, &nYDest, &nWDest, &nHDest); res=(*pGDIStretchBlt)(hdcDest, nXDest, nYDest, nWDest, nHDest, hdcSrc, nXSrc, nYSrc, nWidth, nHeight, dwRop); - if (dxw.dwFlags2 & SHOWFPSOVERLAY) dxw.ShowFPS(hdcDest); - if (dxw.dwFlags4 & SHOWTIMESTRETCH) dxw.ShowTimeStretching(hdcDest); + dxw.ShowOverlay(hdcDest); OutTrace("Debug: NULL dest=(%d,%d) size=(%d,%d)\n", nXDest, nYDest, nWDest, nHDest); } else{ @@ -1004,8 +1003,7 @@ BOOL WINAPI extGDIPatBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nH if (dxw.dwFlags3 & NOGDIBLT) return TRUE; if (dxw.IsFullScreen()){ dxw.MapClient(&nXDest, &nYDest, &nWidth, &nHeight); - if (dxw.dwFlags2 & SHOWFPSOVERLAY) dxw.ShowFPS(hdcDest); - if (dxw.dwFlags4 & SHOWTIMESTRETCH) dxw.ShowTimeStretching(hdcDest); + dxw.ShowOverlay(hdcDest); res=(*pGDIPatBlt)(hdcDest, nXDest, nYDest, nWidth, nHeight, dwRop); } else if(WindowFromDC(hdcDest)==NULL){ @@ -1017,8 +1015,7 @@ BOOL WINAPI extGDIPatBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nH else { res=(*pGDIPatBlt)(hdcDest, nXDest, nYDest, nWidth, nHeight, dwRop); } - if (IsToScreen && (dxw.dwFlags2 & SHOWFPSOVERLAY)) dxw.ShowFPS(hdcDest); - if (IsToScreen && (dxw.dwFlags4 & SHOWTIMESTRETCH)) dxw.ShowTimeStretching(hdcDest); + if (IsToScreen) dxw.ShowOverlay(hdcDest); if(!res) OutTraceE("GDI.PatBlt: ERROR err=%d at %d\n", GetLastError(), __LINE__); return res; @@ -1053,8 +1050,7 @@ BOOL WINAPI extGDIStretchBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, in } res=(*pGDIStretchBlt)(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, nWSrc, nHSrc, dwRop); - if (IsToScreen && (dxw.dwFlags2 & SHOWFPSOVERLAY)) dxw.ShowFPS(hdcDest); - if (IsToScreen && (dxw.dwFlags4 & SHOWTIMESTRETCH)) dxw.ShowTimeStretching(hdcDest); + if (IsToScreen) dxw.ShowOverlay(hdcDest); if(!res) OutTraceE("GDI.StretchBlt: ERROR err=%d at %d\n", GetLastError(), __LINE__); return res; } @@ -1801,6 +1797,14 @@ UINT WINAPI extSetSystemPaletteUse(HDC hdc, UINT uUsage) return SYSPAL_NOSTATIC256; } +#if 0 +int WINAPI extSetMapMode(HDC hdc, int fnMapMode) +{ + OutTraceD("SetMapMode: hdc=%x MapMode=%d\n", hdc, fnMapMode); + return TRUE; +} +#endif + #if 0 // to map: // GetCurrentPositionEx diff --git a/dll/hd3d.cpp b/dll/hd3d.cpp index 7221cec..e63af05 100644 --- a/dll/hd3d.cpp +++ b/dll/hd3d.cpp @@ -523,8 +523,7 @@ HRESULT WINAPI extPresent(void *pd3dd, CONST RECT *pSourceRect, CONST RECT *pDes if (dxw.HandleFPS()) return D3D_OK; // proxy .... res=(*pPresent)(pd3dd, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion); - if (dxw.dwFlags2 & SHOWFPSOVERLAY) dxw.ShowFPS(); - if (dxw.dwFlags4 & SHOWTIMESTRETCH) dxw.ShowTimeStretching(); + dxw.ShowOverlay(); return res; } diff --git a/dll/ole32.cpp b/dll/ole32.cpp index 096b85d..a967f07 100644 --- a/dll/ole32.cpp +++ b/dll/ole32.cpp @@ -10,6 +10,7 @@ extern void HookModule(HMODULE, int); static HookEntry_Type Hooks[]={ {"CoCreateInstance", NULL, (FARPROC *)&pCoCreateInstance, (FARPROC)extCoCreateInstance}, {"CoCreateInstanceEx", NULL, (FARPROC *)&pCoCreateInstanceEx, (FARPROC)extCoCreateInstanceEx}, + {"CoInitialize", NULL, (FARPROC *)&pCoInitialize, (FARPROC)extCoInitialize}, {0, NULL, 0, 0} // terminator }; @@ -28,12 +29,91 @@ FARPROC Remap_ole32_ProcAddress(LPCSTR proc, HMODULE hModule) return NULL; } +// so far, there are 4 additional libraries that could be loaded by meand of a CoCreateInstance call.... + +#define ADDITIONAL_MODULE_COUNT 4 +struct { + BOOL Hooked; + char *ModuleName; +} AddedModules[ADDITIONAL_MODULE_COUNT]= +{ + {FALSE, "quartz"}, + {FALSE, "ddrawex"}, + {FALSE, "amstream"}, + {FALSE, "dplayx"} +}; + +static void HookAdditionalModules() +{ + for(int i=0; i%x\n", *ppv, *(DWORD *)*ppv); + + if (*(DWORD *)&rclsid==*(DWORD *)&CLSID_DirectDraw){ + LPDIRECTDRAW lpOldDDraw; + OutTraceD("CoCreateInstance: CLSID_DirectDraw object\n"); + switch (*(DWORD *)&riid){ + case 0x6C14DB80: + OutTraceD("DirectDrawCreate: IID_DirectDraw RIID\n"); + res=extDirectDrawCreate(NULL, (LPDIRECTDRAW *)&ppv, 0); + if(res)OutTraceD("DirectDrawCreate: res=%x(%s)\n", res, ExplainDDError(res)); + break; + case 0xB3A6F3E0: + OutTraceD("DirectDrawCreate: IID_DirectDraw2 RIID\n"); + res=extDirectDrawCreate(NULL, &lpOldDDraw, 0); + if(res)OutTraceD("DirectDrawCreate: res=%x(%s)\n", res, ExplainDDError(res)); + res=lpOldDDraw->QueryInterface(IID_IDirectDraw2, (LPVOID *)&ppv); + if(res)OutTraceD("QueryInterface: res=%x(%s)\n", res, ExplainDDError(res)); + lpOldDDraw->Release(); + break; + case 0x9c59509a: + OutTraceD("DirectDrawCreate: IID_DirectDraw4 RIID\n"); + res=extDirectDrawCreate(NULL, &lpOldDDraw, 0); + if(res)OutTraceD("DirectDrawCreate: res=%x(%s)\n", res, ExplainDDError(res)); + res=lpOldDDraw->QueryInterface(IID_IDirectDraw4, (LPVOID *)&ppv); + if(res)OutTraceD("QueryInterface: res=%x(%s)\n", res, ExplainDDError(res)); + lpOldDDraw->Release(); + case 0x15e65ec0: + OutTraceD("CoCreateInstance: IID_DirectDraw7 RIID\n"); + res=extDirectDrawCreateEx(NULL, (LPDIRECTDRAW *)&ppv, IID_IDirectDraw7, 0); + if(res)OutTraceD("DirectDrawCreateEx: res=%x(%s)\n", res, ExplainDDError(res)); + break; + case 0xe436ebb3: + break; + } + } + else + if (*(DWORD *)&rclsid==*(DWORD *)&CLSID_DxDiagProvider) res=HookDxDiag(riid, ppv); + + HookAdditionalModules(); + return res; +} HRESULT STDAPICALLTYPE extCoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID FAR* ppv) { @@ -83,26 +163,7 @@ HRESULT STDAPICALLTYPE extCoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, else if (*(DWORD *)&rclsid==*(DWORD *)&CLSID_DxDiagProvider) res=HookDxDiag(riid, ppv); - // hook of library modules loaded by CoCreateInstance without going through LoadLibrary call.... - char *Module=NULL; - char *Class=NULL; - HMODULE hModule=NULL; - switch (*(DWORD *)&rclsid){ - case 0xe436ebb3: Module="quartz"; Class="CLSID_FilterGraph"; break; - case 0x4fd2a832: Module="ddrawex"; Class="CLSID_DirectDrawEx"; break; - case 0x49c47ce5: Module="amstream"; Class="CLSID_AMMultiMediaStream"; break; - } - if(Module){ - hModule=GetModuleHandle(Module); - if(hModule){ - OutTraceD("CoCreateInstance: Class=%s RIID=%x lib=%s handle=%x\n", Class, *(DWORD *)&riid, Module, hModule); - HookModule(hModule, 0); - } - else { - OutTraceE("CoCreateInstance: GetModuleHandle(%s) ERROR err=%d at %d\n", Module, GetLastError(), __LINE__); - } - } - + HookAdditionalModules(); return res; } @@ -176,5 +237,14 @@ HRESULT STDAPICALLTYPE extCoCreateInstanceEx(REFCLSID rclsid, IUnknown *punkOute if (*(DWORD *)&rclsid==*(DWORD *)&CLSID_DxDiagProvider) res=HookDxDiag(riid, ppv); } + HookAdditionalModules(); + return res; +} + +HRESULT WINAPI extCoInitialize(LPVOID pvReserved) +{ + HRESULT res; + OutTraceD("CoInitialize: Reserved=%x\n", pvReserved); + res=(*pCoInitialize)(pvReserved); return res; } diff --git a/dll/opengl.cpp b/dll/opengl.cpp index 1929f22..5c83dfb 100644 --- a/dll/opengl.cpp +++ b/dll/opengl.cpp @@ -219,8 +219,7 @@ void WINAPI extglDrawBuffer(GLenum mode) } } (*pglDrawBuffer)(mode); - if (dxw.dwFlags2 & SHOWFPSOVERLAY) dxw.ShowFPS(); - if (dxw.dwFlags4 & SHOWTIMESTRETCH) dxw.ShowTimeStretching(); + dxw.ShowOverlay(); } void WINAPI extglPolygonMode(GLenum face, GLenum mode) diff --git a/dll/syslibs.h b/dll/syslibs.h index 243bf4c..965b91a 100644 --- a/dll/syslibs.h +++ b/dll/syslibs.h @@ -124,6 +124,7 @@ typedef BOOL (WINAPI *QueryPerformanceCounter_Type)(LARGE_INTEGER *); // ole32.dll: typedef HRESULT (STDAPICALLTYPE *CoCreateInstance_Type)(REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID FAR*); typedef HRESULT (STDAPICALLTYPE *CoCreateInstanceEx_Type)(REFCLSID, IUnknown *, DWORD, COSERVERINFO *, DWORD, MULTI_QI *); +typedef HRESULT (STDAPICALLTYPE *CoInitialize_Type)(LPVOID); // user32.dll: typedef HDC (WINAPI *BeginPaint_Type)(HWND, LPPAINTSTRUCT); @@ -308,6 +309,7 @@ DXWEXTERN QueryPerformanceCounter_Type pQueryPerformanceCounter DXWINITIALIZED; // ole32.dll: DXWEXTERN CoCreateInstance_Type pCoCreateInstance DXWINITIALIZED; DXWEXTERN CoCreateInstanceEx_Type pCoCreateInstanceEx DXWINITIALIZED; +DXWEXTERN CoInitialize_Type pCoInitialize DXWINITIALIZED; // user32.dll: DXWEXTERN BeginPaint_Type pBeginPaint DXWINITIALIZED; @@ -488,6 +490,7 @@ extern BOOL WINAPI extQueryPerformanceCounter(LARGE_INTEGER *); // ole32.dll: extern HRESULT STDAPICALLTYPE extCoCreateInstance(REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID FAR*); extern HRESULT STDAPICALLTYPE extCoCreateInstanceEx(REFCLSID, IUnknown *, DWORD, COSERVERINFO *, DWORD, MULTI_QI *); +extern HRESULT STDAPICALLTYPE extCoInitialize(LPVOID); // user32.dll: extern HDC WINAPI extBeginPaint(HWND, LPPAINTSTRUCT); diff --git a/dll/user32.cpp b/dll/user32.cpp index df44446..228ffb0 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -40,8 +40,8 @@ static HookEntry_Type Hooks[]={ {"SetSysColors", (FARPROC)NULL, (FARPROC *)&pSetSysColors, (FARPROC)extSetSysColors}, {"SetCapture", (FARPROC)NULL, (FARPROC *)&pSetCapture, (FARPROC)extSetCapture}, - {"GetActiveWindow", (FARPROC)NULL, (FARPROC *)&pGetActiveWindow, (FARPROC)extGetActiveWindow}, - {"GetForegroundWindow", (FARPROC)NULL, (FARPROC *)&pGetForegroundWindow, (FARPROC)extGetForegroundWindow}, + //{"GetActiveWindow", (FARPROC)NULL, (FARPROC *)&pGetActiveWindow, (FARPROC)extGetActiveWindow}, + //{"GetForegroundWindow", (FARPROC)NULL, (FARPROC *)&pGetForegroundWindow, (FARPROC)extGetForegroundWindow}, {0, NULL, 0, 0} // terminator }; @@ -919,6 +919,7 @@ int WINAPI extMapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT // should scale the retcode ??? ret=(*pMapWindowPoints)(hWndFrom, hWndTo, lpPoints, cPoints); + OutTraceD("MapWindowPoints: ret=%x (%d,%d)\n", ret, (ret&0xFFFF0000)>>16, ret&0x0000FFFF); return ret; } @@ -1042,7 +1043,8 @@ static HWND WINAPI extCreateWindowCommon( !(dwExStyle & WS_EX_CONTROLPARENT) // Diablo fix && !(dwStyle & WS_CHILD) // Diablo fix - ){ + ) + { RECT screen; POINT upleft = {0,0}; @@ -1142,7 +1144,7 @@ static HWND WINAPI extCreateWindowCommon( return wndh; } - if ((!isValidHandle) && dxw.IsFullScreen()) { + if ((!isValidHandle) && dxw.IsFullScreen()){ dxw.SethWnd(wndh); extern void AdjustWindowPos(HWND, DWORD, DWORD); (*pSetWindowLong)(wndh, GWL_STYLE, (dxw.dwFlags2 & MODALSTYLE) ? 0 : WS_OVERLAPPEDWINDOW); @@ -1195,9 +1197,16 @@ HWND WINAPI extCreateWindowExW( HINSTANCE hInstance, LPVOID lpParam) { - OutTraceD("CreateWindowExW: class=\"%ls\" wname=\"%ls\" pos=(%d,%d) size=(%d,%d) Style=%x(%s) ExStyle=%x(%s)\n", - lpClassName, lpWindowName, x, y, nWidth, nHeight, - dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle)); + if(IsTraceD){ + char xString[20], yString[20]; + if (x==CW_USEDEFAULT) strcpy(xString,"CW_USEDEFAULT"); + else sprintf(xString,"%d", x); + if (y==CW_USEDEFAULT) strcpy(yString,"CW_USEDEFAULT"); + else sprintf(yString,"%d", y); + OutTraceD("CreateWindowExW: class=\"%ls\" wname=\"%ls\" pos=(%s,%s) size=(%d,%d) Style=%x(%s) ExStyle=%x(%s)\n", + lpClassName, lpWindowName, xString, yString, nWidth, nHeight, + dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle)); + } if(IsDebug) OutTrace("CreateWindowExW: DEBUG screen=(%d,%d)\n", dxw.GetScreenWidth(), dxw.GetScreenHeight()); return extCreateWindowCommon("CreateWindowExW", TRUE, dwExStyle, (void *)lpClassName, (void *)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); @@ -1218,9 +1227,16 @@ HWND WINAPI extCreateWindowExA( HINSTANCE hInstance, LPVOID lpParam) { - OutTraceD("CreateWindowExA: class=\"%s\" wname=\"%s\" pos=(%d,%d) size=(%d,%d) Style=%x(%s) ExStyle=%x(%s)\n", - ClassToStr(lpClassName), lpWindowName, x, y, nWidth, nHeight, - dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle)); + if(IsTraceD){ + char xString[20], yString[20]; + if (x==CW_USEDEFAULT) strcpy(xString,"CW_USEDEFAULT"); + else sprintf(xString,"%d", x); + if (y==CW_USEDEFAULT) strcpy(yString,"CW_USEDEFAULT"); + else sprintf(yString,"%d", y); + OutTraceD("CreateWindowExA: class=\"%s\" wname=\"%s\" pos=(%s,%s) size=(%d,%d) Style=%x(%s) ExStyle=%x(%s)\n", + ClassToStr(lpClassName), lpWindowName, xString, yString, nWidth, nHeight, + dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle)); + } if(IsDebug) OutTrace("CreateWindowExA: DEBUG screen=(%d,%d)\n", dxw.GetScreenWidth(), dxw.GetScreenHeight()); return extCreateWindowCommon("CreateWindowExA", false, dwExStyle, (void *)lpClassName, (void *)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); @@ -1614,7 +1630,7 @@ HWND WINAPI extCreateDialogIndirectParam(HINSTANCE hInstance, LPCDLGTEMPLATE lpT isWithinDialog=TRUE; OutTraceD("CreateDialogIndirectParam: hInstance=%x lpTemplate=%s hWndParent=%x lpDialogFunc=%x lParamInit=%x\n", hInstance, "tbd", hWndParent, lpDialogFunc, lParamInit); - if(hWndParent==NULL) hWndParent=dxw.GethWnd(); + if(dxw.IsFullScreen() && hWndParent==NULL) hWndParent=dxw.GethWnd(); RetHWND=(*pCreateDialogIndirectParam)(hInstance, lpTemplate, hWndParent, lpDialogFunc, lParamInit); WhndStackPush(RetHWND, (WNDPROC)lpDialogFunc); diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index 7bb535e..0b20934 100644 Binary files a/host/dxwndhost.vs2008.suo and b/host/dxwndhost.vs2008.suo differ