diff --git a/Include/dxwnd.h b/Include/dxwnd.h index f5a17a9..ff68a31 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -92,6 +92,7 @@ #define EMULATEREGISTRY 0x00000400 // Emulate registry api to read extra keys #define CDROMDRIVETYPE 0x00000800 // Pretends that GetDriveType() always returns DRIVE_CDROM #define NOWINDOWMOVE 0x00001000 // Do not try to update window position & size on D3D rendering +#define DISABLEHAL 0x00002000 // Disable HAL support (IID_IDirect3DHALDevice) // logging Tflags DWORD: #define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general @@ -160,7 +161,7 @@ int EndHook(void); void GetDllVersion(char *); int GetHookStatus(DXWNDSTATUS *); DXWNDSTATUS *GetHookInfo(); -int HookInit(TARGETMAP *, HWND); +void HookInit(TARGETMAP *, HWND); void *SetHook(void *, void *); void SetHook(void *, void *, void **, char *); @@ -189,7 +190,7 @@ LRESULT CALLBACK extWindowProc(HWND, UINT, WPARAM, LPARAM); #define IsTraceE (TRUE) #define IsDebug (dxw.dwTFlags & OUTDEBUG) #define IsAssertEnabled (dxw.dwTFlags & ASSERTDIALOG) -#define STEP OutTrace("STEP at %s:%d\n", __MODULE__, __LINE__) +#define STEP OutTrace("STEP at %s:%d\n", __FILE__, __LINE__) extern void WhndStackPush(HWND, WNDPROC); extern WNDPROC WhndGetWindowProc(HWND ); diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 08406bf..20beb27 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0df4a17760b4266a73aaf34565be1febb6bcf0d2fc0d776ca6aeb7fb6c861e28 -size 365568 +oid sha256:ff5e1a04f90b69aaeac5520885d280a978746c9674a5085725d17d45593af92a +size 378368 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 8355d41..2b35524 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2f9e10ed36d2163eb58084363d6e218f827109487beda4962fd48c59fed8b1e8 +oid sha256:a15a98b4e75ff8b03d04af4bf9b30445a6af7324468d3276316063fede54375a size 524288 diff --git a/build/dxwnd.ini b/build/dxwnd.ini index 33aa286..87e2011 100644 --- a/build/dxwnd.ini +++ b/build/dxwnd.ini @@ -1,11 +1,11 @@ [target] -title0=Carnivores -path0=D:\Games\Carnivores\HUNTSOFT.EXE +title0=101 Airborne Invasion +path0=D:\Games\101air\101.exe module0= opengllib0= ver0=0 coord0=0 -flag0=671088674 +flag0=134217762 flagg0=134217728 flagh0=20 flagi0=0 @@ -22,17 +22,17 @@ sizx0=800 sizy0=600 maxfps0=0 initts0=0 -title1=Crazy Taxy -path1=D:\Games\Crazy_Taxi\Crazy Taxi PC Version\crazy_taxi_pc.exe +title1=688I Hunter Killer +path1=D:\Games\688\688I_HK.EXE module1= opengllib1= ver1=0 -coord1=0 -flag1=671219744 -flagg1=134217728 +coord1=1 +flag1=-938999262 +flagg1=135266304 flagh1=20 flagi1=0 -tflag1=67 +tflag1=3 initx1=0 inity1=0 minx1=0 @@ -41,21 +41,21 @@ maxx1=0 maxy1=0 posx1=50 posy1=50 -sizx1=800 -sizy1=600 +sizx1=1200 +sizy1=900 maxfps1=0 initts1=0 -title2=Duckman -path2=D:\Games\duckman\DUCKMAN.EXE +title2=Abomination the Nemesis Project +path2=D:\Games\Abomination\Abomb.exe module2= opengllib2= ver2=0 coord2=0 flag2=134217762 flagg2=134217728 -flagh2=1044 +flagh2=20 flagi2=0 -tflag2=3 +tflag2=67 initx2=0 inity2=0 minx2=0 @@ -68,17 +68,17 @@ sizx2=800 sizy2=600 maxfps2=0 initts2=0 -title3=Crazy Frog Racer -path3=D:\Games\CrazyFrog\CRAZY.EXE -module3= +title3=Balls of Steel +path3=D:\Games\Balls of Steel\bos.exe +module3=duke.ddp mutation.ddp opengllib3= -ver3=8 +ver3=0 coord3=0 -flag3=134217762 -flagg3=134217729 +flag3=167772192 +flagg3=202375169 flagh3=20 flagi3=0 -tflag3=64 +tflag3=263 initx3=0 inity3=0 minx3=0 @@ -91,17 +91,17 @@ sizx3=800 sizy3=600 maxfps3=0 initts3=0 -title4=Dark Angael -path4=D:\Games\Dark Angael\GAME.EXE +title4=Barrage +path4=D:\Games\Barrage\SRC\BARRAGE.EXE module4= opengllib4= ver4=0 coord4=0 -flag4=134217762 -flagg4=134217728 -flagh4=20 +flag4=142606368 +flagg4=135266304 +flagh4=8212 flagi4=0 -tflag4=0 +tflag4=7 initx4=0 inity4=0 minx4=0 @@ -114,17 +114,17 @@ sizx4=800 sizy4=600 maxfps4=0 initts4=0 -title5=Dark Colony -path5=D:\Games\Dark Colony\DCOLONY\DC.EXE +title5=Carnivores +path5=D:\Games\Carnivores\HUNTSOFT.EXE module5= opengllib5= ver5=0 coord5=0 -flag5=134217762 -flagg5=134217728 +flag5=671088674 +flagg5=135266304 flagh5=20 flagi5=0 -tflag5=0 +tflag5=64 initx5=0 inity5=0 minx5=0 @@ -137,17 +137,17 @@ sizx5=800 sizy5=600 maxfps5=0 initts5=0 -title6=Dark Judgement -path6=D:\Games\Dark Judgement\Dark Judgement.EXE +title6=Crazy Frog Racer +path6=D:\Games\CrazyFrog\CRAZY.EXE module6= opengllib6= -ver6=0 +ver6=8 coord6=0 flag6=134217762 -flagg6=134217728 +flagg6=134217729 flagh6=20 flagi6=0 -tflag6=0 +tflag6=64 initx6=0 inity6=0 minx6=0 @@ -160,17 +160,17 @@ sizx6=800 sizy6=600 maxfps6=0 initts6=0 -title7=Descent 3 -path7=D:\Games\Descent_3\Descent 3.exe +title7=Crazy Taxy +path7=D:\Games\Crazy_Taxi\Crazy Taxi PC Version\crazy_taxi_pc.exe module7= opengllib7= ver7=0 coord7=0 -flag7=134217760 -flagg7=134348801 +flag7=671219744 +flagg7=134217728 flagh7=20 flagi7=0 -tflag7=3 +tflag7=66 initx7=0 inity7=0 minx7=0 @@ -183,13 +183,13 @@ sizx7=800 sizy7=600 maxfps7=0 initts7=0 -title8=Dark Vengeance -path8=D:\Games\dark_vengeance\dv.exe +title8=Dark Angael +path8=D:\Games\Dark Angael\GAME.EXE module8= opengllib8= ver8=0 coord8=0 -flag8=142606368 +flag8=134217762 flagg8=134217728 flagh8=20 flagi8=0 @@ -206,14 +206,14 @@ sizx8=800 sizy8=600 maxfps8=0 initts8=0 -title9=Dweep -path9=D:\Games\dweep\Dweep.exe +title9=Dark Colony +path9=D:\Games\Dark Colony\DCOLONY\DC.EXE module9= opengllib9= ver9=0 coord9=0 -flag9=134234146 -flagg9=134283264 +flag9=134217762 +flagg9=134217728 flagh9=20 flagi9=0 tflag9=0 @@ -228,16 +228,16 @@ posy9=50 sizx9=800 sizy9=600 maxfps9=0 -initts9=2 -title10=Eliminator -path10=D:\Games\eliminat\Eliminator.exe +initts9=0 +title10=Dark Judgement +path10=D:\Games\Dark Judgement\Dark Judgement.EXE module10= opengllib10= ver10=0 coord10=0 -flag10=134217760 +flag10=134217826 flagg10=134217728 -flagh10=1044 +flagh10=20 flagi10=0 tflag10=3 initx10=0 @@ -246,46 +246,46 @@ minx10=0 miny10=0 maxx10=0 maxy10=0 -posx10=800 -posy10=600 -sizx10=400 -sizy10=300 +posx10=50 +posy10=50 +sizx10=800 +sizy10=600 maxfps10=0 initts10=0 -title11=Sims.exe -path11=D:\Games\sims\Sims.exe +title11=Dark Vengeance +path11=D:\Games\dark_vengeance\dv.exe module11= opengllib11= ver11=0 coord11=0 -flag11=134217762 +flag11=142606386 flagg11=134217728 -flagh11=1044 +flagh11=8212 flagi11=0 -tflag11=67 +tflag11=3 initx11=0 inity11=0 minx11=0 miny11=0 -maxx11=0 -maxy11=0 +maxx11=800 +maxy11=600 posx11=50 posy11=50 sizx11=800 sizy11=600 maxfps11=0 initts11=0 -title12=Fighting Forces -path12=D:\Games\Fighting Forces\FFORCE.EXE +title12=Descent 3 +path12=D:\Games\Descent_3\Descent 3.exe module12= opengllib12= ver12=0 coord12=0 flag12=134217760 -flagg12=671088640 -flagh12=2068 +flagg12=134348801 +flagh12=4 flagi12=0 -tflag12=515 +tflag12=0 initx12=0 inity12=0 minx12=0 @@ -298,17 +298,17 @@ sizx12=800 sizy12=600 maxfps12=0 initts12=0 -title13=Final Fighter -path13=D:\Games\Final Fighter\FinalFighter.exe +title13=Descent 3 main +path13=D:\Games\Descent_3\main.exe module13= opengllib13= ver13=0 coord13=0 -flag13=939524128 -flagg13=135266305 -flagh13=20 +flag13=771891232 +flagg13=201457664 +flagh13=8212 flagi13=0 -tflag13=513 +tflag13=3 initx13=0 inity13=0 minx13=0 @@ -321,17 +321,17 @@ sizx13=800 sizy13=600 maxfps13=0 initts13=0 -title14=Gangsters 2 -path14=D:\Games\Gangsters 2\Gangsters2.exe +title14=Duckman +path14=D:\Games\duckman\DUCKMAN.EXE module14= opengllib14= ver14=0 coord14=0 -flag14=134217762 +flag14=402653218 flagg14=134217728 -flagh14=20 +flagh14=1044 flagi14=0 -tflag14=3 +tflag14=2 initx14=0 inity14=0 minx14=0 @@ -344,15 +344,15 @@ sizx14=800 sizy14=600 maxfps14=0 initts14=0 -title15=Hard Truck - Road to Victory -path15=C:\Hard Truck\HTruck.exe +title15=Dweep +path15=D:\Games\dweep\Dweep.exe module15= opengllib15= ver15=0 coord15=0 -flag15=134217760 -flagg15=134217728 -flagh15=2068 +flag15=134234146 +flagg15=134283264 +flagh15=20 flagi15=0 tflag15=0 initx15=0 @@ -366,41 +366,41 @@ posy15=50 sizx15=800 sizy15=600 maxfps15=0 -initts15=0 -title16=Final Odyssey -path16=D:\Games\Final odyssey\FinalOdy.exe +initts15=2 +title16=Eliminator +path16=D:\Games\eliminat\Eliminator.exe module16= opengllib16= ver16=0 coord16=0 flag16=134217760 flagg16=134217728 -flagh16=4 +flagh16=1044 flagi16=0 -tflag16=64 +tflag16=3 initx16=0 inity16=0 minx16=0 miny16=0 maxx16=0 maxy16=0 -posx16=50 -posy16=50 -sizx16=800 -sizy16=600 +posx16=800 +posy16=600 +sizx16=400 +sizy16=300 maxfps16=0 initts16=0 -title17=Gex -path17=D:\Games\gex\GEX.EXE +title17=EMPIRES.EXE +path17=D:\Games\Age of Empires\EMPIRES.EXE module17= opengllib17= ver17=0 coord17=0 -flag17=134217761 +flag17=134217762 flagg17=134217728 flagh17=20 flagi17=0 -tflag17=67 +tflag17=64 initx17=0 inity17=0 minx17=0 @@ -413,17 +413,17 @@ sizx17=800 sizy17=600 maxfps17=0 initts17=0 -title18=Hellcopter -path18=D:\Games\Hellcopter\HCopter.exe +title18=EPIC40K.EXE +path18=D:\Games\war_hammer_final_liberation\EPIC40K.EXE module18= opengllib18= ver18=0 coord18=0 -flag18=134217760 -flagg18=134217728 -flagh18=1044 +flag18=134217762 +flagg18=135266304 +flagh18=20 flagi18=0 -tflag18=513 +tflag18=3 initx18=0 inity18=0 minx18=0 @@ -436,17 +436,17 @@ sizx18=800 sizy18=600 maxfps18=0 initts18=0 -title19=Imperialism II -path19=D:\Games\imperialism_2\imperialism II.exe +title19=Fable - The Lost Chapters +path19=D:\Games\Fable - The Lost Chapters\Fable.exe module19= opengllib19= -ver19=0 -coord19=0 -flag19=671090722 -flagg19=235929600 +ver19=9 +coord19=1 +flag19=134217760 +flagg19=201457672 flagh19=20 flagi19=0 -tflag19=3 +tflag19=258 initx19=0 inity19=0 minx19=0 @@ -455,21 +455,21 @@ maxx19=0 maxy19=0 posx19=50 posy19=50 -sizx19=1200 -sizy19=900 +sizx19=800 +sizy19=600 maxfps19=0 initts19=0 -title20=Fable - The Lost Chapters -path20=D:\Games\Fable - The Lost Chapters\Fable.exe +title20=Fighting Forces +path20=D:\Games\Fighting Forces\FFORCE.EXE module20= opengllib20= -ver20=9 +ver20=0 coord20=0 flag20=134217760 -flagg20=201457664 -flagh20=20 +flagg20=671088640 +flagh20=3092 flagi20=0 -tflag20=259 +tflag20=514 initx20=0 inity20=0 minx20=0 @@ -482,8 +482,491 @@ sizx20=800 sizy20=600 maxfps20=0 initts20=0 +title21=Final Fighter +path21=D:\Games\Final Fighter\FinalFighter.exe +module21= +opengllib21= +ver21=0 +coord21=0 +flag21=939524128 +flagg21=135266305 +flagh21=4 +flagi21=0 +tflag21=512 +initx21=0 +inity21=0 +minx21=0 +miny21=0 +maxx21=0 +maxy21=0 +posx21=50 +posy21=50 +sizx21=800 +sizy21=600 +maxfps21=0 +initts21=0 +title22=Final Odyssey +path22=D:\Games\Final odyssey\FinalOdy.exe +module22= +opengllib22= +ver22=0 +coord22=0 +flag22=134217760 +flagg22=134217728 +flagh22=4 +flagi22=0 +tflag22=64 +initx22=0 +inity22=0 +minx22=0 +miny22=0 +maxx22=0 +maxy22=0 +posx22=50 +posy22=50 +sizx22=800 +sizy22=600 +maxfps22=0 +initts22=0 +title23=Gangsters 2 +path23=D:\Games\Gangsters 2\Gangsters2.exe +module23= +opengllib23= +ver23=0 +coord23=0 +flag23=134217762 +flagg23=134217728 +flagh23=20 +flagi23=0 +tflag23=2 +initx23=0 +inity23=0 +minx23=0 +miny23=0 +maxx23=0 +maxy23=0 +posx23=50 +posy23=50 +sizx23=800 +sizy23=600 +maxfps23=0 +initts23=0 +title24=Gex +path24=D:\Games\gex\GEX.EXE +module24= +opengllib24= +ver24=0 +coord24=0 +flag24=134217761 +flagg24=134217728 +flagh24=20 +flagi24=0 +tflag24=66 +initx24=0 +inity24=0 +minx24=0 +miny24=0 +maxx24=0 +maxy24=0 +posx24=50 +posy24=50 +sizx24=800 +sizy24=600 +maxfps24=0 +initts24=0 +title25=Hard Truck - Road to Victory +path25=C:\Hard Truck\HTruck.exe +module25= +opengllib25= +ver25=0 +coord25=0 +flag25=134217760 +flagg25=134217728 +flagh25=2068 +flagi25=0 +tflag25=0 +initx25=0 +inity25=0 +minx25=0 +miny25=0 +maxx25=0 +maxy25=0 +posx25=50 +posy25=50 +sizx25=800 +sizy25=600 +maxfps25=0 +initts25=0 +title26=Hellcopter +path26=D:\Games\Hellcopter\HCopter.exe +module26= +opengllib26= +ver26=0 +coord26=0 +flag26=134217760 +flagg26=134217728 +flagh26=1044 +flagi26=0 +tflag26=512 +initx26=0 +inity26=0 +minx26=0 +miny26=0 +maxx26=0 +maxy26=0 +posx26=50 +posy26=50 +sizx26=800 +sizy26=600 +maxfps26=0 +initts26=0 +title27=Heroes of Might & Magic 2 Gold +path27=D:\Games\heroes2gold\HEROES2W.EXE +module27= +opengllib27= +ver27=0 +coord27=0 +flag27=134217730 +flagg27=143654912 +flagh27=20 +flagi27=0 +tflag27=770 +initx27=0 +inity27=0 +minx27=0 +miny27=0 +maxx27=0 +maxy27=0 +posx27=50 +posy27=50 +sizx27=800 +sizy27=600 +maxfps27=0 +initts27=0 +title28=Hooligans Storm over Europe +path28=D:\Games\Hooligans\Hooligans.exe +module28= +opengllib28= +ver28=0 +coord28=0 +flag28=134742048 +flagg28=202375168 +flagh28=20 +flagi28=0 +tflag28=259 +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=671621154 +flagg29=135266304 +flagh29=20 +flagi29=0 +tflag29=3 +initx29=0 +inity29=0 +minx29=0 +miny29=0 +maxx29=0 +maxy29=0 +posx29=50 +posy29=50 +sizx29=1200 +sizy29=900 +maxfps29=0 +initts29=0 +title30=Imperialism II +path30=D:\Games\imperialism_2\imperialism II.exe +module30= +opengllib30= +ver30=0 +coord30=1 +flag30=671096866 +flagg30=470810640 +flagh30=52 +flagi30=0 +tflag30=3 +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=Mechwarrior 3 +path31=D:\Games\Mechwarrior 3 (full)\Mech3.exe +module31= +opengllib31= +ver31=0 +coord31=0 +flag31=671096866 +flagg31=134217728 +flagh31=20 +flagi31=0 +tflag31=0 +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=Raiden II +path32=D:\Games\raiden2\RAIDENII.EXE +module32= +opengllib32= +ver32=0 +coord32=1 +flag32=134217762 +flagg32=134217728 +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=Rapanui +path33=D:\Games\Rapanui\Rapanui.exe +module33= +opengllib33= +ver33=0 +coord33=0 +flag33=134217762 +flagg33=134217728 +flagh33=20 +flagi33=0 +tflag33=0 +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=Silent Hunter II (shell) +path34=D:\Games\Silent Hunter II\Shell\Shell.exe +module34= +opengllib34= +ver34=0 +coord34=0 +flag34=402653221 +flagg34=135266304 +flagh34=20 +flagi34=0 +tflag34=3 +initx34=0 +inity34=0 +minx34=0 +miny34=0 +maxx34=800 +maxy34=600 +posx34=50 +posy34=50 +sizx34=800 +sizy34=600 +maxfps34=0 +initts34=0 +title35=Silent Hunter II (sim) +path35=D:\Games\Silent Hunter II\Sim\Sim.exe +module35= +opengllib35= +ver35=0 +coord35=0 +flag35=134217780 +flagg35=134217728 +flagh35=20 +flagi35=0 +tflag35=0 +initx35=400 +inity35=300 +minx35=0 +miny35=0 +maxx35=800 +maxy35=600 +posx35=50 +posy35=50 +sizx35=800 +sizy35=600 +maxfps35=0 +initts35=0 +title36=The Sims +path36=D:\Games\sims\Sims.exe +module36= +opengllib36= +ver36=0 +coord36=0 +flag36=738336800 +flagg36=134217728 +flagh36=1044 +flagi36=0 +tflag36=66 +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=Tomb Raider - The Last Revelation +path37=D:\Games\Tomb Raider - The Last Revelation\tomb4.exe +module37= +opengllib37= +ver37=0 +coord37=0 +flag37=134217826 +flagg37=134217728 +flagh37=20 +flagi37=0 +tflag37=3 +initx37=0 +inity37=0 +minx37=0 +miny37=0 +maxx37=0 +maxy37=0 +posx37=50 +posy37=50 +sizx37=800 +sizy37=600 +maxfps37=0 +initts37=0 +title38=TOMB2.EXE +path38=D:\Games\Tomb Raider 2\TOMB2.EXE +module38= +opengllib38= +ver38=0 +coord38=0 +flag38=134217760 +flagg38=201326592 +flagh38=2068 +flagi38=0 +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=wa.exe +path39=D:\Games\worms_arma\Worms_2_Armageddon\wa.exe +module39= +opengllib39= +ver39=0 +coord39=0 +flag39=713031712 +flagg39=142606336 +flagh39=20 +flagi39=0 +tflag39=3 +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=Western Front +path40=D:\Games\Western Front\wf.exe +module40= +opengllib40= +ver40=0 +coord40=0 +flag40=679477282 +flagg40=134217728 +flagh40=20 +flagi40=0 +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=G-Nome +path41=D:\Games\G-Nome\G-NOME.EXE +module41= +opengllib41= +ver41=0 +coord41=0 +flag41=713031714 +flagg41=134217728 +flagh41=20 +flagi41=0 +tflag41=3 +initx41=0 +inity41=0 +minx41=0 +miny41=0 +maxx41=0 +maxy41=0 +posx41=50 +posy41=50 +sizx41=0 +sizy41=0 +maxfps41=0 +initts41=0 [window] -posx=928 -posy=224 +posx=908 +posy=205 sizx=320 -sizy=455 +sizy=420 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index a4eec11..a4408ae 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -195,3 +195,21 @@ added CoCreateInstanceEx hook - "Final Fighter" seems to be using it, but who kn added "Don't move D3D Rendering Window" window option to make "Fable Lost Chapters" working GUI: updated default values on new entry creation to map most-likely-to-work parameters + +v2.02.31 +CORE: +disabled annoying compilation security warnings +improved advapi32.dll hooking and logging +handling of complex primary surfaces with backbuffer surface inherited from one directdraw session to the following and with different interfaces +fixed SetCooperativeLevel handling in case of WINDOWED mode against desktop hwnd==NULL +fixed GetGDISurface in EMULATED mode +hooked gdi32 API set for Imperialism I & II and 688 Hunter Killer:GetClipBox, Polyline, PolyBezierTo, PolylineTo, PolyDraw, MoveToEx, ArcTo, LineTo, StretchDIBits, SetDIBitsToDevice, SetPixel, Ellipse, Polygon, Arc, CreateEllipticRgn, CreateEllipticRgnIndirect, CreateRectRgn, CreateRectRgnIndirect, CreatePolygonRgn, DrawTextA, DrawTextExA. +fixed gdi32.dll hooking for TextOutA, TabbedTextOutA, Rectangle, BitBlt, PatBlt, StretchBlt, CreateFont, CreateFontIndirect +improved ddraw proxy logging +added / fixed user32.dll API FrameRect, TabbedTextOutA, CloseWindow, DestroyWindow, SendMessageW +opengl: fixed glCreateContext, wglMakeCurrent to make Descent III playable in opengl video mode. +fixed DeferWindowPos hook to make Imperialism II working +fixed SM_CXVIRTUALSCREEN, SM_CYVIRTUALSCREEN properties +fixed window class logging causing program crash +GUI: +added "GDI/Scale font parameters" & "DirectX/Disable HAL support" options \ No newline at end of file diff --git a/dll/advapi.cpp b/dll/advapi.cpp index 72bd84b..7f9444b 100644 --- a/dll/advapi.cpp +++ b/dll/advapi.cpp @@ -1,3 +1,5 @@ +#define _CRT_SECURE_NO_WARNINGS + #include #include "dxwnd.h" #include "dxwcore.hpp" @@ -9,6 +11,7 @@ static HookEntry_Type Hooks[]={ {"RegOpenKeyExA", NULL, (FARPROC *)&pRegOpenKeyEx, (FARPROC)extRegOpenKeyEx}, {"RegCloseKey", NULL, (FARPROC *)&pRegCloseKey, (FARPROC)extRegCloseKey}, {"RegQueryValueExA", NULL, (FARPROC *)&pRegQueryValueEx, (FARPROC)extRegQueryValueEx}, + {"RegCreateKeyA", NULL, (FARPROC *)&pRegCreateKey, (FARPROC)extRegCreateKey}, {"RegCreateKeyExA", NULL, (FARPROC *)&pRegCreateKeyEx, (FARPROC)extRegCreateKeyEx}, {"RegSetValueExA", NULL, (FARPROC *)&pRegSetValueEx, (FARPROC)extRegSetValueEx}, {0, NULL, 0, 0} // terminator @@ -65,7 +68,7 @@ LONG WINAPI extRegOpenKeyEx( if((res==ERROR_SUCCESS) || !(dxw.dwFlags3 & EMULATEREGISTRY)) return res; - *phkResult=HKEY_FAKE; + if(phkResult) *phkResult=HKEY_FAKE; FILE *regf; char sKey[256+1]; sprintf(sKey,"%s\\%s", hKey2String(hKey), lpSubKey); @@ -75,8 +78,8 @@ LONG WINAPI extRegOpenKeyEx( fgets(RegBuf, 256, regf); while (!feof(regf)){ if(RegBuf[0]=='['){ - if(!strncmp(&RegBuf[1],sKey,strlen(sKey)) && RegBuf[strlen(sKey)+1]==']'){ - OutTraceD("RegOpenKeyEx: found fake Key=\"%s\" hkResult=%x\n", sKey, *phkResult); + if((!strncmp(&RegBuf[1],sKey,strlen(sKey))) && (RegBuf[strlen(sKey)+1]==']')){ + OutTrace("RegOpenKeyEx: found fake Key=\"%s\" hkResult=%x\n", sKey, *phkResult); fclose(regf); return ERROR_SUCCESS; } @@ -110,11 +113,11 @@ LONG WINAPI extRegQueryValueEx( case REG_DWORD: OutTrace("Data=0x%x\n", *(DWORD *)lpData); break; case REG_BINARY: { - int i; + DWORD i; unsigned char *p; p = lpData; - OutTrace("Data="); - for(i=0; i<*lpcbData; i++) OutTrace("%02.2X,", *p++); + OutTrace("Data=%02.2X", p++); + for(i=1; i<*lpcbData; i++) OutTrace(",%02.2X", *p++); OutTrace("\n"); } break; @@ -129,7 +132,6 @@ LONG WINAPI extRegQueryValueEx( return res; } - // going through here means we're in EMULATEREGISTRY mode //if(!(dxw.dwFlags3 & EMULATEREGISTRY)) return res; // try emulated registry @@ -221,10 +223,17 @@ LONG WINAPI extRegCloseKey(HKEY hKey) LONG WINAPI extRegSetValueEx(HKEY hKey, LPCTSTR lpValueName, DWORD Reserved, DWORD dwType, const BYTE *lpData, DWORD cbData) { if (IsTraceR){ - OutTrace("RegSetValueEx: hKey=%x Type=%x(%s) cbData=%d\n", hKey, lpValueName, dwType, ExplainRegType(dwType), cbData); + OutTrace("RegSetValueEx: hKey=%x ValueName=\"%s\" Type=%x(%s) cbData=%d ", hKey, lpValueName, dwType, ExplainRegType(dwType), cbData); switch(dwType){ case REG_DWORD: OutTrace("Data=%x\n", *(DWORD *)lpData); break; - case REG_NONE: OutTrace("ValueName=\"%s\"\n", lpData); break; + case REG_NONE: OutTrace("Data=\"%s\"\n", lpData); break; + case REG_BINARY: { + DWORD i; + OutTrace("Data=%02.2X,", *lpData); + for(i=1; i @@ -216,12 +217,13 @@ SetEntries_Type pSetEntries; LPDIRECTDRAWSURFACE lpDDSEmu_Prim=NULL, lpDDSEmu_Back=NULL; LPDIRECTDRAWSURFACE lpDDSBack=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; LPDIRECTDRAWCLIPPER lpDDC=NULL; LPDIRECTDRAWPALETTE lpDDP=NULL; -LPDIRECTDRAW lpDD=NULL; -// v2.1.87: lpServiceDD is the DIRECTDRAW object to which the primary surface and all -// the service objects (emulated backbuffer, emulater primary, ....) are attached. -LPDIRECTDRAW lpServiceDD=NULL; DWORD PaletteEntries[256]; DWORD *Palette16BPP = NULL; void *EmuScreenBuffer = NULL; // to implement pitch bug fix @@ -667,7 +669,13 @@ Unlock4_Type pUnlockMethod(LPDIRECTDRAWSURFACE lpdds) { char sMsg[81]; void * extUnlock; - extUnlock=(void *)*(DWORD *)(*(DWORD *)lpdds + 128); + __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; @@ -743,10 +751,10 @@ int lpddHookedVersion(LPDIRECTDRAW lpdd) __except (EXCEPTION_EXECUTE_HANDLER){ extCreateSurface=NULL; }; - if(extCreateSurface==(void *)extCreateSurface1) return 1; - if(extCreateSurface==(void *)extCreateSurface2) return 2; - if(extCreateSurface==(void *)extCreateSurface4) return 4; 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); @@ -833,7 +841,7 @@ int Set_dwSize_From_Surface(LPDIRECTDRAWSURFACE lpdds) lpdds==lpDDSEmu_Prim || lpdds==lpDDSEmu_Back ) - dxversion=lpddHookedVersion(lpServiceDD); // v2.1.87 fix + dxversion=lpddHookedVersion(lpPrimaryDD); // v2.01.87-v2.02.31 fix else dxversion=lpddsHookedVersion(lpdds); @@ -1282,10 +1290,6 @@ HRESULT WINAPI extGetCapsD(LPDIRECTDRAW lpdd, LPDDCAPS c1, LPDDCAPS c2) OutTraceD("\n"); } - // GHO TRY - // tricky: it seems that this DD method is called using an un-hooked directdraw handle.... - lpDD=lpdd; - return res; } @@ -1337,8 +1341,6 @@ HRESULT WINAPI extDirectDrawCreate(GUID FAR *lpguid, LPDIRECTDRAW FAR *lplpdd, I HookDDSession(lplpdd, dxw.dwDDVersion); - // added v2.1.44 - lpDD = *lplpdd; return 0; } @@ -1420,8 +1422,6 @@ HRESULT WINAPI extDirectDrawCreateEx(GUID FAR *lpguid, HookDDSession(lplpdd,dxw.dwDDVersion); - // added v2.1.44 - lpDD = *lplpdd; return 0; } @@ -1482,6 +1482,9 @@ HRESULT WINAPI extQueryInterfaceD(void *lpdd, REFIID riid, LPVOID *obp) 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; @@ -1507,6 +1510,15 @@ HRESULT WINAPI extQueryInterfaceS(void *lpdds, REFIID riid, LPVOID *obp) 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; } if (dwLocalDDVersion > dxw.dwMaxDDVersion) { @@ -1690,33 +1702,30 @@ void FixWindowFrame(HWND hwnd) HRESULT WINAPI extSetCooperativeLevel(void *lpdd, HWND hwnd, DWORD dwflags) { HRESULT res; - HWND hDesktop; OutTraceD("SetCooperativeLevel: hwnd=%x dwFlags=%x(%s)\n", hwnd, dwflags,ExplainCoopFlags(dwflags)); InitDDScreenParameters((LPDIRECTDRAW)lpdd); - // 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.1.82 fix: - hDesktop=(*pGetDesktopWindow)(); - if ((hwnd==0) || (hwnd==hDesktop)) { - OutTraceD("SetCooperativeLevel: detected desktop hwnd=%x redirected to %x\n", hwnd, dxw.GethWnd()); - hwnd=dxw.GethWnd(); - // this fixes the blocks on "Tomb Raider IV" !!!! - if(dxw.dwFlags1 & FIXPARENTWIN) hwnd=dxw.hParentWnd; - } - 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, DDSCL_NORMAL); res=(*pSetCooperativeLevel)(lpdd, hwnd, dwflags); AdjustWindowFrame(hwnd, dxw.GetScreenWidth(), dxw.GetScreenHeight()); - //FixWindowFrame(hwnd); //-- incompatible with Microsoft Madness if (dxw.dwFlags1 & FIXWINFRAME) FixWindowFrame(hwnd); } else{ @@ -1738,7 +1747,7 @@ HRESULT WINAPI extSetCooperativeLevel(void *lpdd, HWND hwnd, DWORD dwflags) // done, so better repeat the check here. if ((res==DD_OK) && (hwnd!=NULL)){ - if (hwnd==hDesktop){ + if (hwnd==(*pGetDesktopWindow)()){ OutTraceE("SetCooperativeLevel: attempt to work on desktop window\n"); } else @@ -1767,12 +1776,40 @@ static char *FixSurfaceCaps(LPDDSURFACEDESC2 lpddsd) default: break; } + break; case DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT: - // Duckman - OutTrace("FixSurfaceCaps: SystemMemory OffScreen PixelFormat\n"); - lpddsd->ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY; - lpddsd->ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN; - return SetPixFmt(lpddsd); + switch (lpddsd->ddsCaps.dwCaps){ + case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY: + // Duckman + OutTrace("FixSurfaceCaps: SystemMemory OffScreen PixelFormat\n"); + //lpddsd->ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY; + //lpddsd->ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN; + return SetPixFmt(lpddsd); + break; + case DDSCAPS_SYSTEMMEMORY|DDSCAPS_ZBUFFER: + // the Sims + OutTrace("FixSurfaceCaps: SystemMemory ZBuffer for the Sims\n"); + //lpddsd->ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY|DDSCAPS_ZBUFFER; identical ... + return "ZBUFFER"; + break; +#if 0 + case DDSCAPS_TEXTURE: + // Descent 3 cursors & other graphics + OutTrace("FixSurfaceCaps: Texture for Descent 3\n"); + lpddsd->ddsCaps.dwCaps = DDSCAPS_TEXTURE|DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN; + SetPixFmt(lpddsd); + return "TEXTURE1"; + break; + case DDSCAPS_TEXTURE|DDSCAPS_VIDEOMEMORY: + // Descent 3 cursors & other graphics + OutTrace("FixSurfaceCaps: VideoMemory Texture for Descent 3\n"); + lpddsd->ddsCaps.dwCaps = DDSCAPS_TEXTURE|DDSCAPS_SYSTEMMEMORY|DDSCAPS_OFFSCREENPLAIN; + SetPixFmt(lpddsd); + return "TEXTURE2"; + break; +#endif + } + break; case DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH: switch (lpddsd->ddsCaps.dwCaps){ case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_VIDEOMEMORY: @@ -1785,6 +1822,7 @@ static char *FixSurfaceCaps(LPDDSURFACEDESC2 lpddsd) default: break; } + break; default: break; } @@ -1841,7 +1879,7 @@ HRESULT WINAPI extCreateSurfaceEmu(int dxversion, CreateSurface_Type pCreateSurf GetHookInfo()->Width=(short)dxw.GetScreenWidth(); GetHookInfo()->ColorDepth=(short)dxw.VirtualPixelFormat.dwRGBBitCount; GetHookInfo()->DXVersion=dxversion; - lpServiceDD = lpdd; // v2.1.87 + lpPrimaryDD = lpdd; // v2.1.87 dxw.dwPrimarySurfaceCaps = ddsd.ddsCaps.dwCaps; dxw.dwBackBufferCount = (ddsd.dwFlags & DDSD_BACKBUFFERCOUNT) ? ddsd.dwBackBufferCount : 0; @@ -1851,17 +1889,22 @@ HRESULT WINAPI extCreateSurfaceEmu(int dxversion, CreateSurface_Type pCreateSurf if (lpDDC) while(lpDDC->Release()); if (lpDDSEmu_Back) while(lpDDSEmu_Back->Release()); if (lpDDSEmu_Prim) while(lpDDSEmu_Prim->Release()); - if (ddsd.dwFlags & DDSD_BACKBUFFERCOUNT) + if (ddsd.dwFlags & DDSD_BACKBUFFERCOUNT) { if (lpDDSBack) while(lpDDSBack->Release()); + lpBackBufferDD = NULL; + } } lpDDC=NULL; lpDDSEmu_Back=NULL; lpDDSEmu_Prim=NULL; - if (ddsd.dwFlags & DDSD_BACKBUFFERCOUNT) - lpDDSBack=NULL; int BBCount=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); @@ -1888,9 +1931,19 @@ HRESULT WINAPI extCreateSurfaceEmu(int dxversion, CreateSurface_Type pCreateSurf DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]" , __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; + 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: res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + if(res==DDERR_INVALIDPIXELFORMAT) DumpPixFmt(&ddsd); + return res; + } } lpDDSPrim = *lplpdds; OutTraceD("CreateSurface: created PRIMARY DDSPrim=%x\n", lpDDSPrim); @@ -1922,7 +1975,10 @@ HRESULT WINAPI extCreateSurfaceEmu(int dxversion, CreateSurface_Type pCreateSurf OutTraceD("CreateSurface: created BACK DDSBack=%x\n", lpDDSBack); dxw.UnmarkPrimarySurface(lpDDSBack); HookDDSurfaceGeneric(&lpDDSBack, dxversion); // added !!! + lpBackBufferDD = lpdd; // v2.02.31 + iBakBufferVersion=dxversion; // v2.02.31 } + FlipChainLength=BBCount; // V2.1.85: tricky !!!! // When a real backbuffer is created, it has a reference to its frontbuffer. @@ -2050,7 +2106,7 @@ HRESULT WINAPI extCreateSurfaceDir(int dxversion, CreateSurface_Type pCreateSurf GetHookInfo()->DXVersion=dxversion; dxw.dwPrimarySurfaceCaps = ddsd.ddsCaps.dwCaps; dxw.dwBackBufferCount = (ddsd.dwFlags & DDSD_BACKBUFFERCOUNT) ? ddsd.dwBackBufferCount : 0; - lpServiceDD = lpdd; // v2.1.87 + lpPrimaryDD = lpdd; // v2.1.87 // clean up service objects // beware of the different behaviour between older and newer directdraw releases... @@ -2074,7 +2130,11 @@ HRESULT WINAPI extCreateSurfaceDir(int dxversion, CreateSurface_Type pCreateSurf int BBCount=1; if (ddsd.dwFlags & DDSD_BACKBUFFERCOUNT) BBCount=ddsd.dwBackBufferCount; - if (BBCount > 0){ + // beware: a previously allocated backbuffer should be cleared or not depending on + // the ddraw version of the backbuffer surface, not the current one! + //if(0){ // ok for Silent Hunter II + //if(1){ // ok for Dark Vengeance + if ((BBCount > 0) && (iBakBufferVersion < 4)){ lpDDSBack=NULL; OutTraceD("CreateSurface: BackBufferCount=%d\n", BBCount); } @@ -2093,6 +2153,14 @@ HRESULT WINAPI extCreateSurfaceDir(int dxversion, CreateSurface_Type pCreateSurf DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Dir Primary]" , __LINE__); res = (*pCreateSurface)(lpdd, &ddsd, &lpDDSPrim, pu); 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, &lpDDSPrim, pu); + } + /* fall through */ 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 ... @@ -2139,11 +2207,12 @@ HRESULT WINAPI extCreateSurfaceDir(int dxversion, CreateSurface_Type pCreateSurf RenewClipper(lpdd, lpDDSPrim); } - HookDDSurfacePrim(&lpDDSPrim, dxversion); + if(dxw.dwFlags1 & CLIPCURSOR) dxw.SetClipCursor(); if (!BBCount) return 0; FlipChainLength=BBCount; + if (lpDDSBack) return 0; // v2.02.31: if you got a previous backbuffer surface, use it! ddsd.dwFlags |= DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS; // warning: can't create zero sized backbuffer surface !!!! @@ -2187,8 +2256,9 @@ HRESULT WINAPI extCreateSurfaceDir(int dxversion, CreateSurface_Type pCreateSurf // reference to the zero count. // Should this hold for EMULATED mode as well? Maybe, but Diablo crashes.... lpDDSBack->AddRef(); + lpBackBufferDD = lpdd; + iBakBufferVersion=dxversion; // v2.02.31 - if(dxw.dwFlags1 & CLIPCURSOR) dxw.SetClipCursor(); return 0; } @@ -2275,7 +2345,6 @@ HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreateSurface lpddsd->dwFlags++; } - lpDD = lpdd; if (dxw.dwFlags3 & SAVECAPS) ddsd=*lpddsd; if (dxw.dwFlags1 & EMULATESURFACE) @@ -2298,6 +2367,13 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet OutTraceD("GetAttachedSurface(%d): lpdds=%x%s caps=%x(%s)\n", dxversion, lpdds, (IsPrim?"(PRIM)":""), lpddsc->dwCaps, ExplainDDSCaps(lpddsc->dwCaps)); +#if 0 + if(0 && (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 @@ -2397,7 +2473,7 @@ static void BlitTrace(char *label, LPRECT lps, LPRECT lpd, int line) OutTrace(" dest=(%d,%d)-(%d,%d)",lpd->left, lpd->top, lpd->right, lpd->bottom); else OutTrace(" dest=(NULL)"); - OutTrace(" at %d\n", __LINE__); + OutTrace(" at %d\n", line); ReleaseMutex(hTraceMutex); return; } @@ -2452,7 +2528,7 @@ HRESULT WINAPI sBlt(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, #endif #define FIXBIGGERRECT 1 -#ifdef FIXBIGGERRECT +#if FIXBIGGERRECT if(ToPrim && lpdestrect){ if((DWORD)lpdestrect->bottom > dxw.GetScreenHeight()) lpdestrect->bottom = dxw.GetScreenHeight(); if((DWORD)lpdestrect->right > dxw.GetScreenWidth()) lpdestrect->right = dxw.GetScreenWidth(); @@ -2542,7 +2618,7 @@ HRESULT WINAPI sBlt(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, // Blit to primary surface if(dxw.HandleFPS()) return DD_OK; - + destrect=dxw.MapWindowRect(lpdestrect); if(!(dxw.dwFlags1 & (EMULATESURFACE|EMULATEBUFFER))){ @@ -2649,7 +2725,7 @@ HRESULT WINAPI sBlt(char *api, LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, if (IsDebug) BlitTrace("BACK2PRIM", &emurect, &destrect, __LINE__); res=(*pBlt)(lpDDSEmu_Prim, &destrect, lpDDSSource, &emurect, DDBLT_WAIT, 0); if (res==DDERR_NOCLIPLIST){ - RenewClipper(lpDD, lpDDSEmu_Prim); + RenewClipper(lpPrimaryDD, lpDDSEmu_Prim); if (IsDebug) BlitTrace("NOCLIP", &emurect, &destrect, __LINE__); res=(*pBlt)(lpDDSEmu_Prim, &destrect, lpDDSSource, &emurect, DDBLT_WAIT, 0); } @@ -2707,8 +2783,7 @@ HRESULT WINAPI extFlip(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc, // emulation to primary surface Flip - you can't flip to window surfaces, // so you have to replace it with Blt operations. - //lpdds->GetDDInterface(lpDD); from IDirectDrawSurface2 only - if((dwflags & DDFLIP_WAIT) || (dxw.dwFlags1 & SAVELOAD)) lpDD->WaitForVerticalBlank(DDWAITVB_BLOCKEND , 0); + if((dwflags & DDFLIP_WAIT) || (dxw.dwFlags1 & SAVELOAD)) lpPrimaryDD->WaitForVerticalBlank(DDWAITVB_BLOCKEND , 0); if(lpddssrc){ //res=lpdds->Blt(0, lpddssrc, 0, DDBLT_WAIT, 0); @@ -3015,7 +3090,7 @@ HRESULT WINAPI extLockDir(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDIRECTDRAW // 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==lpDD->GetGDISurface(&lpDDSPrim); + // 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", @@ -3026,7 +3101,7 @@ HRESULT WINAPI extLockDir(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDIRECTDRAW OutTrace(" rect=(NULL)\n"); } - (*pGetGDISurface)(lpDD, &lpDDSPrim); + (*pGetGDISurface)(lpPrimaryDD, &lpDDSPrim); if(lpdds==lpDDSPrim){ if(dxw.dwFlags1 & LOCKEDSURFACE){ DDSURFACEDESC2 ddsd; @@ -3040,8 +3115,7 @@ HRESULT WINAPI extLockDir(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDIRECTDRAW ddsd.ddsCaps.dwCaps = 0; //if (SurfaceDescrSize(lpdds)==sizeof(DDSURFACEDESC2)) ddsd.ddsCaps.dwCaps |= DDSCAPS_OFFSCREENPLAIN; DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Dir FixBuf]" , __LINE__); - //res=(*pCreateSurfaceMethod(lpdds))(lpDD, &ddsd, (LPDIRECTDRAWSURFACE *)&lpDDSBuffer, 0); - res=(*pCreateSurface1)(lpDD, (DDSURFACEDESC *)&ddsd, (LPDIRECTDRAWSURFACE *)&lpDDSBuffer, 0); + 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; @@ -3141,7 +3215,7 @@ HRESULT WINAPI extUnlockDir(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRAWSUR OutTrace("lpvoid=%x\n", lprect); } - (*pGetGDISurface)(lpDD, &lpDDSPrim); + (*pGetGDISurface)(lpPrimaryDD, &lpDDSPrim); if((lpdds==lpDDSPrim) && (dxw.dwFlags1 & LOCKEDSURFACE)){ RECT client; POINT upleft={0,0}; @@ -3195,7 +3269,7 @@ HRESULT WINAPI extGetDC(LPDIRECTDRAWSURFACE lpdds, HDC FAR *pHDC) if(lpDDP==NULL){ // should link here to the GDI palette? See Hyperblade.... dxw.palNumEntries=256; - res=(*pCreatePalette)(lpDD, DDPCAPS_ALLOW256|DDPCAPS_8BIT|DDPCAPS_INITIALIZE, dxw.palPalEntry, &lpDDP, NULL); + 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; @@ -3244,6 +3318,14 @@ HRESULT WINAPI extFlipToGDISurface(LPDIRECTDRAW lpdd) 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)); @@ -3599,6 +3681,7 @@ HRESULT WINAPI extAddAttachedSurface(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURF 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; @@ -3717,7 +3800,7 @@ ULONG WINAPI extReleaseD(LPDIRECTDRAW lpdd) BOOL IsClosed; dxversion=lpddHookedVersion(lpdd); // must be called BEFORE releasing the session!! - OutTraceD("Release(D): lpdd=%x\n", lpdd); + OutTraceD("Release(D): lpdd=%x dxversion=%d\n", lpdd, dxversion); IsClosed=0; __try{ @@ -3733,7 +3816,7 @@ ULONG WINAPI extReleaseD(LPDIRECTDRAW lpdd) ref=IsClosed?0:(*pReleaseD)(lpdd); - if (lpdd == lpServiceDD) { // v2.1.87: fix for Dungeon Keeper II + if (lpdd == lpPrimaryDD) { // v2.1.87: fix for Dungeon Keeper II OutTraceD("Release(D): service lpdd=%x version=%d\n", lpdd, dxversion); if((dxversion<4) && (ref==0)){ // directdraw old versions automatically free all linked objects when the parent session is closed. @@ -3741,9 +3824,12 @@ ULONG WINAPI extReleaseD(LPDIRECTDRAW lpdd) lpDDSEmu_Prim=NULL; lpDDSEmu_Back=NULL; lpDDC=NULL; - lpDDSBack=NULL; lpDDP=NULL; - lpServiceDD=NULL; // v2.02.11 + lpPrimaryDD=NULL; // v2.02.31 + if(lpBackBufferDD==lpdd){ + lpBackBufferDD=NULL; + lpDDSBack=NULL; // beware: Silent Hunter II seems to require the backbuffer .... + } } } diff --git a/dll/dinput.cpp b/dll/dinput.cpp index 2b720db..45a74a5 100644 --- a/dll/dinput.cpp +++ b/dll/dinput.cpp @@ -1,3 +1,5 @@ +#define DIRECTINPUT_VERSION 0x800 + #include #include #include "dxwnd.h" diff --git a/dll/dxhelper.cpp b/dll/dxhelper.cpp index ec33631..f9adc59 100644 --- a/dll/dxhelper.cpp +++ b/dll/dxhelper.cpp @@ -1211,3 +1211,14 @@ char *ExplainRegType(DWORD c) return "???"; } +char *ExplainDCType(DWORD c) +{ + char *Captions[GDI_OBJ_LAST+1]={ + "NULL", "OBJ_PEN", "OBJ_BRUSH", "OBJ_DC", + "OBJ_METADC", "OBJ_PAL", "OBJ_FONT", "OBJ_BITMAP", + "OBJ_REGION", "OBJ_METAFILE", "OBJ_MEMDC", "OBJ_EXTPEN", + "OBJ_ENHMETADC", "OBJ_ENHMETAFILE", "OBJ_COLORSPACE"}; + + if (c>=0 && c<=GDI_OBJ_LAST) return Captions[c]; + return "???"; +} diff --git a/dll/dxhelper.h b/dll/dxhelper.h index 418548c..cc93fb5 100644 --- a/dll/dxhelper.h +++ b/dll/dxhelper.h @@ -33,3 +33,4 @@ extern char *ExplainDevModeFields(DWORD); extern char *ExplainMCICommands(DWORD); extern char *ExplainMCIFlags(DWORD, DWORD); extern char *ExplainRegType(DWORD); +extern char *ExplainDCType(DWORD); diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index dcec90e..4167413 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -57,7 +57,7 @@ static char *Flag3Names[32]={ "FORCEHOOKOPENGL", "MARKBLIT", "HOOKDLLS", "SUPPRESSD3DEXT", "HOOKENABLED", "FIXD3DFRAME", "FORCE16BPP", "BLACKWHITE", "SAVECAPS", "SINGLEPROCAFFINITY", "EMULATEREGISTRY", "CDROMDRIVETYPE", - "Flag3:13", "Flag3:14", "Flag3:15", "Flag3:16", + "NOWINDOWMOVE", "Flag3:14", "Flag3:15", "Flag3:16", "", "", "", "", "", "", "", "", "", "", "", "", @@ -924,8 +924,10 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp } break; case WM_ERASEBKGND: - OutTraceD("WindowProc: WM_ERASEBKGND(%x,%x) - suppressed\n", wparam, lparam); - return 1; // 1 == OK, erased + if(dxw.IsRealDesktop(hwnd)){ + OutTraceD("WindowProc: WM_ERASEBKGND(%x,%x) - suppressed\n", wparam, lparam); + return 1; // 1 == OK, erased + } break; case WM_DISPLAYCHANGE: if ((dxw.dwFlags1 & LOCKWINPOS) && dxw.IsFullScreen()){ @@ -1126,7 +1128,7 @@ static void RecoverScreenMode() DEVMODE InitDevMode; BOOL res; EnumDisplaySettings(NULL, ENUM_REGISTRY_SETTINGS, &InitDevMode); - OutTraceD("ChangeDisplaySettings: RECOVER wxh=(%dx%d) BitsPerPel=%d\n", + OutTraceD("ChangeDisplaySettings: RECOVER WxH=(%dx%d) BitsPerPel=%d\n", InitDevMode.dmPelsWidth, InitDevMode.dmPelsHeight, InitDevMode.dmBitsPerPel); InitDevMode.dmFields |= DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; res=(*pChangeDisplaySettings)(&InitDevMode, 0); @@ -1306,10 +1308,8 @@ void SetSingleProcessAffinity(void) OutTraceE("SetProcessAffinityMask: ERROR err=%d\n", GetLastError()); } -int HookInit(TARGETMAP *target, HWND hwnd) +void HookInit(TARGETMAP *target, HWND hwnd) { - BOOL res; - WINDOWPOS wp; HMODULE base; char *sModule; char sModuleBuf[60+1]; @@ -1320,16 +1320,24 @@ int HookInit(TARGETMAP *target, HWND hwnd) dxw.InitTarget(target); - // v2.1.75: is it correct to set hWnd here? - dxw.SethWnd(hwnd); - dxw.hParentWnd=GetParent(hwnd); - dxw.hChildWnd=hwnd; + if(hwnd){ // v2/02.32: skip this when in code injection mode. + // v2.1.75: is it correct to set hWnd here? + //dxw.SethWnd(hwnd); + dxw.hParentWnd=GetParent(hwnd); + dxw.hChildWnd=hwnd; + // v2.02.31: set main win either this one or the parent! + dxw.SethWnd((dxw.dwFlags1 & FIXPARENTWIN) ? GetParent(hwnd) : hwnd); + } - OutTraceD("HookInit: path=\"%s\" module=\"%s\" dxversion=%s pos=(%d,%d) size=(%d,%d) hWnd=%x dxw.hParentWnd=%x desktop=%x\n", - target->path, target->module, dxversions[dxw.dwTargetDDVersion], - target->posx, target->posy, target->sizx, target->sizy, - hwnd, dxw.hParentWnd, GetDesktopWindow()); - if (IsDebug){ + if(IsTraceD){ + OutTrace("HookInit: path=\"%s\" module=\"%s\" dxversion=%s pos=(%d,%d) size=(%d,%d)", + target->path, target->module, dxversions[dxw.dwTargetDDVersion], + target->posx, target->posy, target->sizx, target->sizy); + if(hwnd) OutTrace(" hWnd=%x dxw.hParentWnd=%x desktop=%x\n", hwnd, dxw.hParentWnd, GetDesktopWindow()); + else OutTrace("\n"); + } + + if (hwnd && IsDebug){ DWORD dwStyle, dwExStyle; dwStyle=GetWindowLong(dxw.GethWnd(), GWL_STYLE); dwExStyle=GetWindowLong(dxw.GethWnd(), GWL_EXSTYLE); @@ -1349,7 +1357,8 @@ int HookInit(TARGETMAP *target, HWND hwnd) if (dxw.dwTFlags & DXPROXED){ HookDDProxy(base, dxw.dwTargetDDVersion); - return 0; + //return 0; + return; } // make InitPosition used for both DInput and DDraw @@ -1382,14 +1391,14 @@ int HookInit(TARGETMAP *target, HWND hwnd) InitScreenParameters(); if (IsDebug) OutTraceD("MoveWindow: target pos=(%d,%d) size=(%d,%d)\n", dxw.iPosX, dxw.iPosY, dxw.iSizX, dxw.iSizY); //v2.02.09 - if(dxw.dwFlags1 & FIXPARENTWIN){ - CalculateWindowPos(hwnd, dxw.iSizX, dxw.iSizY, &wp); - if (IsDebug) OutTraceD("MoveWindow: dxw.hParentWnd=%x pos=(%d,%d) size=(%d,%d)\n", dxw.hParentWnd, wp.x, wp.y, wp.cx, wp.cy); - res=(*pMoveWindow)(dxw.hParentWnd, wp.x, wp.y, wp.cx, wp.cy, FALSE); - if(!res) OutTraceE("MoveWindow ERROR: dxw.hParentWnd=%x err=%d at %d\n", dxw.hParentWnd, GetLastError(), __LINE__); - } + //if(dxw.dwFlags1 & FIXPARENTWIN){ + // CalculateWindowPos(hwnd, dxw.iSizX, dxw.iSizY, &wp); + // if (IsDebug) OutTraceD("MoveWindow: dxw.hParentWnd=%x pos=(%d,%d) size=(%d,%d)\n", dxw.hParentWnd, wp.x, wp.y, wp.cx, wp.cy); + // res=(*pMoveWindow)(dxw.hParentWnd, wp.x, wp.y, wp.cx, wp.cy, FALSE); + // if(!res) OutTraceE("MoveWindow ERROR: dxw.hParentWnd=%x err=%d at %d\n", dxw.hParentWnd, GetLastError(), __LINE__); + //} - return 0; + //return 0; } LPCSTR ProcToString(LPCSTR proc) diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index 44cdfbc..a5f2e80 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -1,3 +1,5 @@ +#define _CRT_SECURE_NO_WARNINGS + #include #include "dxwnd.h" #include "dxwcore.hpp" @@ -31,6 +33,24 @@ dxwCore::~dxwCore() { } +void dxwCore::SetFullScreen(BOOL fs, int line) +{ + OutTraceD("SetFullScreen: %s at %d\n", fs?"FULLSCREEN":"WINDOWED", line); + FullScreen=fs; +} + +void dxwCore::SetFullScreen(BOOL fs) +{ + OutTraceD("SetFullScreen: %s\n", fs?"FULLSCREEN":"WINDOWED"); + FullScreen=fs; +} + +BOOL dxwCore::IsFullScreen() +{ + // if(dxw.dwFlagsX && ALWAYSFULLSCREEN) return TRUE; + return FullScreen; +} + void dxwCore::InitTarget(TARGETMAP *target) { dwFlags1 = target->flags; @@ -154,6 +174,15 @@ BOOL dxwCore::IsDesktop(HWND hwnd) ); } +BOOL dxwCore::IsRealDesktop(HWND hwnd) +{ + return ( + (hwnd == 0) + || + (hwnd == (*pGetDesktopWindow)()) + ); +} + // v2.1.93: FixCursorPos completely revised to introduce a clipping tolerance in // clipping regions as well as in normal operations @@ -288,6 +317,13 @@ void dxwCore::EraseClipCursor() (*pClipCursor)(NULL); } +void dxwCore::SethWnd(HWND hwnd) +{ + OutTraceD("SethWnd: setting main win=%x\n", hwnd); + hWnd=hwnd; + hWndFPS=hwnd; +} + RECT dxwCore::MapWindowRect(LPRECT lpRect) { POINT UpLeft={0,0}; @@ -296,6 +332,10 @@ RECT dxwCore::MapWindowRect(LPRECT lpRect) int w, h, bx, by; // width, height and x,y borders if (!(*pGetClientRect)(hWnd, &ClientRect)){ OutTraceE("GetClientRect ERROR: err=%d hwnd=%x at %d\n", GetLastError(), hWnd, __LINE__); + // v2.02.31: try.... + ClientRect.top=ClientRect.left=0; + ClientRect.right=dxw.iSizX; + ClientRect.bottom=dxw.iSizY; } RetRect=ClientRect; bx = by = 0; @@ -308,7 +348,7 @@ RECT dxwCore::MapWindowRect(LPRECT lpRect) else { by = (h - (w * 600 / 800))/2; } - OutTraceD("bx=%d by=%d\n", bx, by); + OutTraceB("bx=%d by=%d\n", bx, by); } if(lpRect){ @@ -336,29 +376,49 @@ RECT dxwCore::MapWindowRect(LPRECT lpRect) void dxwCore::MapClient(LPRECT rect) { RECT client; + int w, h; (*pGetClientRect)(hWnd, &client); - rect->left= rect->left * client.right / dwScreenWidth; - rect->top= rect->top * client.bottom / dwScreenHeight; - rect->right= rect->right * client.right / dwScreenWidth; - rect->bottom= rect->bottom * client.bottom / dwScreenHeight; + w = client.right ? client.right : iSizX; + h = client.bottom ? client.bottom : iSizY; + rect->left= rect->left * w / (int)dwScreenWidth; + rect->top= rect->top * h / (int)dwScreenHeight; + rect->right= rect->right * w / (int)dwScreenWidth; + rect->bottom= rect->bottom * h / (int)dwScreenHeight; } void dxwCore::MapClient(int *nXDest, int *nYDest, int *nWDest, int *nHDest) { RECT client; + int w, h; (*pGetClientRect)(hWnd, &client); - *nXDest= *nXDest * client.right / dwScreenWidth; - *nYDest= *nYDest * client.bottom / dwScreenHeight; - *nWDest= *nWDest * client.right / dwScreenWidth; - *nHDest= *nHDest * client.bottom / dwScreenHeight; + w = client.right ? client.right : iSizX; + h = client.bottom ? client.bottom : iSizY; + *nXDest= *nXDest * w / (int)dwScreenWidth; + *nYDest= *nYDest * h / (int)dwScreenHeight; + *nWDest= *nWDest * w / (int)dwScreenWidth; + *nHDest= *nHDest * h / (int)dwScreenHeight; } void dxwCore::MapClient(LPPOINT lppoint) { RECT client; + int w, h; (*pGetClientRect)(hWnd, &client); - lppoint->x = (lppoint->x * client.right) / dwScreenWidth; - lppoint->y = (lppoint->y * client.bottom) / dwScreenHeight; + w = client.right ? client.right : iSizX; + h = client.bottom ? client.bottom : iSizY; + lppoint->x = (lppoint->x * w) / (int)dwScreenWidth; + lppoint->y = (lppoint->y * h) / (int)dwScreenHeight; +} + +void dxwCore::MapClient(int *nXDest, int *nYDest) +{ + RECT client; + int w, h; + (*pGetClientRect)(hWnd, &client); + w = client.right ? client.right : iSizX; + h = client.bottom ? client.bottom : iSizY; + *nXDest= *nXDest * w / (int)dwScreenWidth; + *nYDest= *nYDest * h / (int)dwScreenHeight; } void dxwCore::MapWindow(LPRECT rect) @@ -367,10 +427,10 @@ void dxwCore::MapWindow(LPRECT rect) POINT upleft = {0,0}; (*pGetClientRect)(hWnd, &client); (*pClientToScreen)(hWnd, &upleft); - rect->left= upleft.x + ((rect->left * client.right) / dwScreenWidth); - rect->top= upleft.y + ((rect->top * client.bottom) / dwScreenHeight); - rect->right= upleft.x + ((rect->right * client.right) / dwScreenWidth); - rect->bottom= upleft.y + ((rect->bottom * client.bottom) / dwScreenHeight); + rect->left= upleft.x + ((rect->left * client.right) / (int)dwScreenWidth); + rect->top= upleft.y + ((rect->top * client.bottom) / (int)dwScreenHeight); + rect->right= upleft.x + ((rect->right * client.right) / (int)dwScreenWidth); + rect->bottom= upleft.y + ((rect->bottom * client.bottom) / (int)dwScreenHeight); } void dxwCore::MapWindow(int *nXDest, int *nYDest, int *nWDest, int *nHDest) @@ -379,10 +439,10 @@ void dxwCore::MapWindow(int *nXDest, int *nYDest, int *nWDest, int *nHDest) POINT upleft = {0,0}; (*pGetClientRect)(hWnd, &client); (*pClientToScreen)(hWnd, &upleft); - *nXDest= upleft.x + ((*nXDest * client.right) / dwScreenWidth); - *nYDest= upleft.y + ((*nYDest * client.bottom) / dwScreenHeight); - *nWDest= (*nWDest * client.right) / dwScreenWidth; - *nHDest= (*nHDest * client.bottom) / dwScreenHeight; + *nXDest= upleft.x + ((*nXDest * client.right) / (int)dwScreenWidth); + *nYDest= upleft.y + ((*nYDest * client.bottom) / (int)dwScreenHeight); + *nWDest= (*nWDest * client.right) / (int)dwScreenWidth; + *nHDest= (*nHDest * client.bottom) / (int)dwScreenHeight; } void dxwCore::MapWindow(LPPOINT lppoint) diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp index 1a8da04..48d475b 100644 --- a/dll/dxwcore.hpp +++ b/dll/dxwcore.hpp @@ -13,7 +13,7 @@ public: // Operations public: // methods void InitTarget(TARGETMAP *); - void SethWnd(HWND hwnd) {hWnd=hwnd; hWndFPS=hwnd;} + void SethWnd(HWND hwnd); void SethWnd(HWND hwnd, HWND hwndfps) {hWnd=hwnd; hWndFPS=hwndfps;} void InitWindowPos(int, int, int, int); HWND GethWnd(void) {return hWnd;} @@ -21,9 +21,11 @@ public: // methods void SetScreenSize(int x, int y) {if(x)dwScreenWidth=x; if(y)dwScreenHeight=y;} DWORD GetScreenWidth(void) {return dwScreenWidth;} DWORD GetScreenHeight(void) {return dwScreenHeight;} - void SetFullScreen(BOOL fs) {FullScreen=fs;} - BOOL IsFullScreen() {return FullScreen;} + void SetFullScreen(BOOL); + void SetFullScreen(BOOL, int); + BOOL IsFullScreen(); BOOL IsDesktop(HWND); + BOOL IsRealDesktop(HWND); POINT FixCursorPos(POINT); void FixNCHITCursorPos(LPPOINT); void SetClipCursor(void); @@ -33,6 +35,7 @@ public: // methods void MapClient(LPPOINT); void MapClient(LPRECT); void MapClient(int *, int *, int *, int *); + void MapClient(int *, int *); void MapWindow(LPPOINT); void MapWindow(LPRECT); void MapWindow(int *, int *, int *, int *); diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 61655ce..5c59ddf 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.29" +#define VERSION "2.02.31" #define DDTHREADLOCK 1 diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index a87f0cf..74a50d9 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 f4c5db3..3dd8717 100644 --- a/dll/gdi32.cpp +++ b/dll/gdi32.cpp @@ -8,7 +8,6 @@ static HookEntry_Type Hooks[]={ {"GetDeviceCaps", (FARPROC)GetDeviceCaps, (FARPROC *)&pGDIGetDeviceCaps, (FARPROC)extGetDeviceCaps}, {"TextOutA", (FARPROC)TextOutA, (FARPROC *)&pGDITextOutA, (FARPROC)extTextOutA}, - {"TabbedTextOutA", (FARPROC)TabbedTextOutA, (FARPROC *)&pTabbedTextOutA, (FARPROC)extTabbedTextOutA}, {"ScaleWindowExtEx", (FARPROC)ScaleWindowExtEx, (FARPROC *)&pGDIScaleWindowExtEx, (FARPROC)extScaleWindowExtEx}, {"Rectangle", (FARPROC)Rectangle, (FARPROC *)&pGDIRectangle, (FARPROC)extRectangle}, {"SaveDC", (FARPROC)SaveDC, (FARPROC *)&pGDISaveDC, (FARPROC)extGDISaveDC}, @@ -17,6 +16,29 @@ static HookEntry_Type Hooks[]={ {"SelectPalette", (FARPROC)SelectPalette, (FARPROC *)&pGDISelectPalette, (FARPROC)extSelectPalette}, {"RealizePalette", (FARPROC)RealizePalette, (FARPROC *)&pGDIRealizePalette, (FARPROC)extRealizePalette}, {"GetSystemPaletteEntries", (FARPROC)GetSystemPaletteEntries, (FARPROC *)&pGDIGetSystemPaletteEntries, (FARPROC)extGetSystemPaletteEntries}, + {"GetClipBox", (FARPROC)NULL, (FARPROC *)&pGDIGetClipBox, (FARPROC)extGetClipBox}, + {"Polyline", (FARPROC)NULL, (FARPROC *)&pPolyline, (FARPROC)extPolyline}, + {"PolyBezierTo", (FARPROC)NULL, (FARPROC *)&pPolyBezierTo, (FARPROC)extPolyBezierTo}, + {"PolylineTo", (FARPROC)NULL, (FARPROC *)&pPolylineTo, (FARPROC)extPolylineTo}, + {"PolyDraw", (FARPROC)NULL, (FARPROC *)&pPolyDraw, (FARPROC)extPolyDraw}, + {"MoveToEx", (FARPROC)NULL, (FARPROC *)&pMoveToEx, (FARPROC)extMoveToEx}, + {"ArcTo", (FARPROC)NULL, (FARPROC *)&pArcTo, (FARPROC)extArcTo}, + {"LineTo", (FARPROC)NULL, (FARPROC *)&pLineTo, (FARPROC)extLineTo}, + {"StretchDIBits", (FARPROC)StretchDIBits, (FARPROC *)&pStretchDIBits, (FARPROC)extStretchDIBits}, + {"SetDIBitsToDevice", (FARPROC)NULL, (FARPROC *)&pSetDIBitsToDevice, (FARPROC)extSetDIBitsToDevice}, + //{"CreateCompatibleBitmap", (FARPROC)NULL, (FARPROC *)&pCreateCompatibleBitmap, (FARPROC)extCreateCompatibleBitmap}, + {"SetPixel", (FARPROC)NULL, (FARPROC *)&pSetPixel, (FARPROC)extSetPixel}, + {"Ellipse", (FARPROC)NULL, (FARPROC *)&pEllipse, (FARPROC)extEllipse}, + {"Polygon", (FARPROC)NULL, (FARPROC *)&pPolygon, (FARPROC)extPolygon}, + {"Arc", (FARPROC)NULL, (FARPROC *)&pArc, (FARPROC)extArc}, + {"CreateEllipticRgn", (FARPROC)NULL, (FARPROC *)&pCreateEllipticRgn, (FARPROC)extCreateEllipticRgn}, + {"CreateEllipticRgnIndirect", (FARPROC)NULL, (FARPROC *)&pCreateEllipticRgnIndirect, (FARPROC)extCreateEllipticRgnIndirect}, + {"CreateRectRgn", (FARPROC)NULL, (FARPROC *)&pCreateRectRgn, (FARPROC)extCreateRectRgn}, + {"CreateRectRgnIndirect", (FARPROC)NULL, (FARPROC *)&pCreateRectRgnIndirect, (FARPROC)extCreateRectRgnIndirect}, + {"CreatePolygonRgn", (FARPROC)NULL, (FARPROC *)&pCreatePolygonRgn, (FARPROC)extCreatePolygonRgn}, + {"DrawTextA", (FARPROC)NULL, (FARPROC *)&pDrawText, (FARPROC)extDrawText}, + {"DrawTextExA", (FARPROC)NULL, (FARPROC *)&pDrawTextEx, (FARPROC)extDrawTextEx}, + {"MaskBlt", (FARPROC)NULL, (FARPROC *)&pMaskBlt, (FARPROC)extMaskBlt}, {0, NULL, 0, 0} // terminator }; @@ -41,9 +63,9 @@ static HookEntry_Type GDIHooks[]={ }; static HookEntry_Type EmuHooks[]={ - {"SetTextColor", (FARPROC)SetTextColor, (FARPROC *)&pGDISetTextColor, (FARPROC)extSetTextColor}, - {"SetBkColor", (FARPROC)SetBkColor, (FARPROC *)&pGDISetBkColor, (FARPROC)extSetBkColor}, - {"CreateFont", (FARPROC)CreateFont, (FARPROC *)&pGDICreateFont, (FARPROC)extCreateFont}, + //{"SetTextColor", (FARPROC)SetTextColor, (FARPROC *)&pGDISetTextColor, (FARPROC)extSetTextColor}, + //{"SetBkColor", (FARPROC)SetBkColor, (FARPROC *)&pGDISetBkColor, (FARPROC)extSetBkColor}, + {"CreateFontA", (FARPROC)CreateFont, (FARPROC *)&pGDICreateFont, (FARPROC)extCreateFont}, {"CreateFontIndirectA", (FARPROC)CreateFontIndirectA, (FARPROC *)&pGDICreateFontIndirect, (FARPROC)extCreateFontIndirect}, {0, NULL, 0, 0} // terminator }; @@ -277,35 +299,17 @@ int WINAPI extGetDeviceCaps(HDC hdc, int nindex) BOOL WINAPI extTextOutA(HDC hdc, int nXStart, int nYStart, LPCTSTR lpString, int cchString) { - BOOL res; + BOOL ret; OutTraceD("TextOut: hdc=%x xy=(%d,%d) str=(%d)\"%s\"\n", hdc, nXStart, nYStart, cchString, lpString); - if (dxw.dwFlags1 & FIXTEXTOUT) { - POINT anchor; - anchor.x=nXStart; - anchor.y=nYStart; - (*pClientToScreen)(dxw.GethWnd(), &anchor); - nXStart=anchor.x; - nYStart=anchor.y; - } - res=(*pGDITextOutA)(hdc, nXStart, nYStart, lpString, cchString); - return res; -} -LONG WINAPI extTabbedTextOutA(HDC hDC, int X, int Y, LPCTSTR lpString, int nCount, int nTabPositions, const LPINT lpnTabStopPositions, int nTabOrigin) -{ - BOOL res; - OutTraceD("TabbedTextOut: hdc=%x xy=(%d,%d) nCount=%d nTP=%d nTOS=%d str=(%d)\"%s\"\n", - hDC, X, Y, nCount, nTabPositions, nTabOrigin, lpString); - if (dxw.dwFlags1 & FIXTEXTOUT) { - POINT anchor; - anchor.x=X; - anchor.y=Y; - (*pClientToScreen)(dxw.GethWnd(), &anchor); - X=anchor.x; - Y=anchor.y; + if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ + dxw.MapClient(&nXStart, &nYStart); + OutTraceD("TextOut: fixed dest=(%d,%d)\n", nXStart, nYStart); } - res=(*pTabbedTextOutA)(hDC, X, Y, lpString, nCount, nTabPositions, lpnTabStopPositions, nTabOrigin); - return res; + + ret=(*pGDITextOutA)(hdc, nXStart, nYStart, lpString, cchString); + if(!ret) OutTraceE("TextOut: ERROR ret=%x\n", ret); + return ret; } BOOL WINAPI extScaleWindowExtEx(HDC hdc, int Xnum, int Xdenom, int Ynum, int Ydenom, LPSIZE lpSize) @@ -320,21 +324,18 @@ BOOL WINAPI extScaleWindowExtEx(HDC hdc, int Xnum, int Xdenom, int Ynum, int Yde BOOL WINAPI extRectangle(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect) { + int ret; + OutTraceD("Rectangle: hdc=%x xy=(%d,%d)-(%d,%d)\n", hdc, nLeftRect, nTopRect, nRightRect, nBottomRect); - if (dxw.dwFlags1 & FIXTEXTOUT) { - POINT anchor; - anchor.x=nLeftRect; - anchor.y=nTopRect; - (*pClientToScreen)(dxw.GethWnd(), &anchor); - nLeftRect=anchor.x; - nTopRect=anchor.y; - anchor.x=nRightRect; - anchor.y=nBottomRect; - (*pClientToScreen)(dxw.GethWnd(), &anchor); - nRightRect=anchor.x; - nBottomRect=anchor.y; + + if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ + dxw.MapClient(&nLeftRect, &nTopRect, &nRightRect, &nBottomRect); + OutTraceD("Rectangle: fixed dest=(%d,%d)-(%d,%d)\n", nLeftRect, nTopRect, nRightRect, nBottomRect); } - return (*pGDIRectangle)(hdc, nLeftRect, nTopRect, nRightRect, nBottomRect); + + ret=(*pGDIRectangle)(hdc, nLeftRect, nTopRect, nRightRect, nBottomRect); + if(!ret) OutTraceE("Rectangle: ERROR ret=%x\n", ret); + return ret; } int WINAPI extGDISaveDC(HDC hdc) @@ -492,7 +493,7 @@ static HDC WINAPI winDDGetDC(HWND hwnd, char *api) dxw.ResetPrimarySurface(); dxw.SetPrimarySurface(); - if(dxw.IsDesktop(hwnd)) hwnd=dxw.GethWnd(); + if(dxw.IsRealDesktop(hwnd)) hwnd=dxw.GethWnd(); if(dxw.lpDDSPrimHDC){ if (PrimHDC){ @@ -702,6 +703,8 @@ BOOL WINAPI extGDIBitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nH // the screen surface later on, on ReleaseDC or ddraw Blit / Flip operation. Scaling of rect coordinates is // needed only in the first case, and must be avoided on the second, otherwise the image would be scaled twice! + + if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdcDest))){ int nWDest, nHDest; nWDest= nWidth; @@ -710,6 +713,15 @@ BOOL WINAPI extGDIBitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nH if (dxw.dwFlags2 & SHOWFPSOVERLAY) dxw.ShowFPS(hdcDest); res=(*pGDIStretchBlt)(hdcDest, nXDest, nYDest, nWDest, nHDest, hdcSrc, nXSrc, nYSrc, nWidth, nHeight, dwRop); } + else if(WindowFromDC(hdcDest)==NULL){ + // V2.02.31: See StretchBlt. + int nWDest, nHDest; + nWDest= nWidth; + 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); + } else { res=(*pGDIBitBlt)(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, dwRop); } @@ -727,11 +739,18 @@ BOOL WINAPI extGDIPatBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nH if (dxw.HandleFPS()) return TRUE; + OutTraceB("GDI.StretchBlt: DEBUG FullScreen=%x target hdctype=%x(%s) hwnd=%x\n", + dxw.IsFullScreen(), GetObjectType(hdcDest), ExplainDCType(GetObjectType(hdcDest)), WindowFromDC(hdcDest)); + if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdcDest))){ - int nWDest, nHDest; - dxw.MapClient(&nXDest, &nYDest, &nWDest, &nHDest); + dxw.MapClient(&nXDest, &nYDest, &nWidth, &nHeight); if (dxw.dwFlags2 & SHOWFPSOVERLAY) dxw.ShowFPS(hdcDest); - res=(*pGDIPatBlt)(hdcDest, nXDest, nYDest, nWDest, nHDest, dwRop); + res=(*pGDIPatBlt)(hdcDest, nXDest, nYDest, nWidth, nHeight, dwRop); + } + else if(WindowFromDC(hdcDest)==NULL){ + // V2.02.31: See StretchBlt. + dxw.MapWindow(&nXDest, &nYDest, &nWidth, &nHeight); + res=(*pGDIPatBlt)(hdcDest, nXDest, nYDest, nWidth, nHeight, dwRop); } else { res=(*pGDIPatBlt)(hdcDest, nXDest, nYDest, nWidth, nHeight, dwRop); @@ -751,9 +770,21 @@ BOOL WINAPI extGDIStretchBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, in if (dxw.HandleFPS()) return TRUE; - // to do: what happend if StretchBlt is applied on screen DC ? + OutTraceB("GDI.StretchBlt: DEBUG FullScreen=%x target hdctype=%x(%s) hwnd=%x\n", + dxw.IsFullScreen(), GetObjectType(hdcDest), ExplainDCType(GetObjectType(hdcDest)), WindowFromDC(hdcDest)); + + if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdcDest))){ + dxw.MapClient(&nXDest, &nYDest, &nWidth, &nHeight); + if (dxw.dwFlags2 & SHOWFPSOVERLAY) dxw.ShowFPS(hdcDest); + } + else if(WindowFromDC(hdcDest)==NULL){ + // V2.02.31: In "Silent Hunter II" intro movie, QuickTime 5 renders the vidoe on the PrimarySurface->GetDC device context, + // that is a memory device type associated to NULL (desktop) window, through GDI StretchBlt api. So, you shoud compensate + // by scaling and offsetting to main window. + dxw.MapWindow(&nXDest, &nYDest, &nWidth, &nHeight); + if (dxw.dwFlags2 & SHOWFPSOVERLAY) dxw.ShowFPS(hdcDest); + } - if (dxw.dwFlags2 & SHOWFPSOVERLAY) dxw.ShowFPS(hdcDest); res=(*pGDIStretchBlt)(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, nWSrc, nHSrc, dwRop); if(!res) OutTraceE("GDI.StretchBlt: ERROR err=%d at %d\n", GetLastError(), __LINE__); return res; @@ -798,6 +829,14 @@ HFONT WINAPI extCreateFont(int nHeight, int nWidth, int nEscapement, int nOrient DWORD fdwPitchAndFamily, LPCTSTR lpszFace) { OutTraceD("CreateFont: h=%d w=%d face=\"%s\"\n", nHeight, nWidth, lpszFace); + if(dxw.dwFlags1 & FIXTEXTOUT) { + if(nHeight > 0) dxw.MapClient(&nWidth, &nHeight); + else { + nHeight= -nHeight; + dxw.MapClient(&nWidth, &nHeight); + nHeight= -nHeight; + } + } return (*pGDICreateFont)(nHeight, nWidth, nEscapement, nOrientation, fnWeight, fdwItalic, fdwUnderline, fdwStrikeOut, fdwCharSet, fdwOutputPrecision, fdwClipPrecision, NONANTIALIASED_QUALITY, @@ -813,6 +852,14 @@ HFONT WINAPI extCreateFontIndirect(const LOGFONT* lplf) OutTraceD("CreateFontIndirect: h=%d w=%d face=\"%s\"\n", lplf->lfHeight, lplf->lfWidth, lplf->lfFaceName); memcpy((char *)&lf, (char *)lplf, sizeof(LOGFONT)); lf.lfQuality=NONANTIALIASED_QUALITY; + if(dxw.dwFlags1 & FIXTEXTOUT) { + if(lf.lfHeight > 0) dxw.MapClient((int *)&lf.lfWidth, (int *)&lf.lfHeight); + else { + lf.lfHeight= -lf.lfHeight; + dxw.MapClient((int *)&lf.lfWidth, (int *)&lf.lfHeight); + lf.lfHeight= -lf.lfHeight; + } + } retHFont=((*pGDICreateFontIndirect)(&lf)); if(retHFont) OutTraceD("CreateFontIndirect: hfont=%x\n", retHFont); @@ -843,3 +890,452 @@ BOOL WINAPI extGetDeviceGammaRamp(HDC hDC, LPVOID lpRamp) return ret; } +int WINAPI extGetClipBox(HDC hdc, LPRECT lprc) +{ + // v2.02.31: needed in "Imperialism II" to avoid blit clipping + int ret; + char *sRetCodes[4]={"ERROR", "NULLREGION", "SIMPLEREGION", "COMPLEXREGION"}; + OutTraceD("GetClipBox: hdc=%x\n", hdc); + ret=(*pGDIGetClipBox)(hdc, lprc); + if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc)) && (ret!=ERROR)){ + OutTraceD("GetClipBox: scaling main win coordinates (%d,%d)-(%d,%d)\n", + lprc->left, lprc->top, lprc->right, lprc->bottom); + *lprc=dxw.GetScreenRect(); + } + OutTraceD("GetClipBox: ret=%x(%s)\n", ret, sRetCodes[ret]); + return ret; +} + +BOOL WINAPI extPolyline(HDC hdc, const POINT *lppt, int cPoints) +{ + BOOL ret; + if(IsTraceD){ + int i; + OutTrace("Polyline: hdc=%x cPoints=%d pt=", hdc, cPoints); + for(i=0; ibmiHeader); + OutTraceD("SetDIBitsToDevice: BitmapInfo dim=(%dx%d) Planes=%d BPP=%d Compression=%x SizeImage=%x\n", + bmi->biWidth, bmi->biHeight, bmi->biPlanes, bmi->biBitCount, bmi->biCompression, bmi->biSizeImage); + + if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ + DWORD OrigWidth, OrigHeight; + int OrigXDest, OrigYDest; + OrigWidth=dwWidth; + OrigHeight=dwHeight; + OrigXDest=XDest; + OrigYDest=YDest; + dxw.MapClient(&XDest, &YDest, (int *)&dwWidth, (int *)&dwHeight); + OutTraceD("SetDIBitsToDevice: fixed dest=(%d,%d)-(%d,%d)\n", XDest, YDest, dwWidth, dwHeight); + HDC hTempDc; + HBITMAP hbmPic; + if(!(hTempDc=CreateCompatibleDC(hdc))) + OutTraceE("CreateCompatibleDC: ERROR err=%d at=%d\n", GetLastError(), __LINE__); + // tricky part: CreateCompatibleBitmap is needed to set the dc size, but it has to be performed + // against hdc to set for color depth, then selected (through SelectObject) against the temporary + // dc to assign the needed size and color space to the temporary dc. + if(!(hbmPic=CreateCompatibleBitmap(hdc, OrigWidth, OrigHeight))) + OutTraceE("CreateCompatibleBitmap: ERROR err=%d at=%d\n", GetLastError(), __LINE__); + if(!SelectObject(hTempDc, hbmPic)) + OutTraceE("SelectObject: ERROR err=%d at=%d\n", GetLastError(), __LINE__); + if(!(*pSetDIBitsToDevice)(hTempDc, 0, 0, OrigWidth, OrigHeight, XSrc, YSrc, uStartScan, cScanLines, lpvBits, lpbmi, fuColorUse)) + OutTraceE("SetDIBitsToDevice: ERROR err=%d at=%d\n", GetLastError(), __LINE__); + if(!(ret=(*pGDIStretchBlt)(hdc, XDest, YDest, dwWidth, dwHeight, hTempDc, 0, 0, OrigWidth, OrigHeight, SRCCOPY))) + OutTraceE("StretchBlt: ERROR err=%d at=%d\n", GetLastError(), __LINE__); + DeleteDC(hTempDc); + } + else{ + ret=(*pSetDIBitsToDevice)(hdc, XDest, YDest, dwWidth, dwHeight, XSrc, YSrc, uStartScan, cScanLines, lpvBits, lpbmi, fuColorUse); + } + if(!ret || (ret==GDI_ERROR)) OutTraceE("SetDIBitsToDevice: ERROR ret=%x err=%d\n", ret, GetLastError()); + return ret; +} + +//HBITMAP WINAPI extCreateCompatibleBitmap(HDC hdc, int nWidth, int nHeight) +//{ +// HBITMAP ret; +// OutTraceD("CreateCompatibleBitmap: hdc=%x size=(%d,%d)\n", +// hdc, nWidth, nHeight); +// +// if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ +// dxw.MapClient(&nWidth, &nHeight); +// OutTraceD("CreateCompatibleBitmap: fixed size=(%d,%d)\n", nWidth, nHeight); +// } +// +// ret=(*pCreateCompatibleBitmap)(hdc, nWidth, nHeight); +// if(!ret) OutTraceE("CreateCompatibleBitmap: ERROR ret=%x err=%d\n", ret, GetLastError()); +// return ret; +//} + +COLORREF WINAPI extSetPixel(HDC hdc, int X, int Y, COLORREF crColor) +{ + COLORREF ret; + OutTraceD("SetPixel: hdc=%x color=%x point=(%d,%d)\n", hdc, crColor, X, Y); + + if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ + dxw.MapClient(&X, &Y); + OutTraceD("SetPixel: fixed pos=(%d,%d)\n", X, Y); + } + + ret=(*pSetPixel)(hdc, X, Y, crColor); + // both 0x00000000 and 0xFFFFFFFF are legitimate colors and therefore valid return codes... + //if(ret==GDI_ERROR) OutTraceE("SetPixel: ERROR ret=%x err=%d\n", ret, GetLastError()); + return ret; +} + +BOOL WINAPI extEllipse(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect) +{ + int ret; + OutTraceD("Ellipse: hdc=%x rect=(%d,%d)-(%d,%d)\n", hdc, nLeftRect, nTopRect, nRightRect, nBottomRect); + + if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ + dxw.MapClient(&nLeftRect, &nTopRect, &nRightRect, &nBottomRect); + OutTraceD("Ellipse: fixed dest=(%d,%d)-(%d,%d)\n", nLeftRect, nTopRect, nRightRect, nBottomRect); + } + + ret=(*pEllipse)(hdc, nLeftRect, nTopRect, nRightRect, nBottomRect); + if(!ret) OutTraceE("Ellipse: ERROR ret=%x err=%d\n", ret, GetLastError()); + return ret; +} + +BOOL WINAPI extPolygon(HDC hdc, const POINT *lpPoints, int cCount) +{ + BOOL ret; + if(IsTraceD){ + int i; + OutTrace("Polygon: hdc=%x cCount=%d pt=", hdc, cCount); + for(i=0; ileft, lprc->top, lprc->right, lprc->bottom); + + if (dxw.IsFullScreen()){ + dxw.MapClient((RECT *)lprc); + OutTraceD("CreateEllipticRgnIndirect: fixed rect=(%d,%d)-(%d,%d)\n", lprc->left, lprc->top, lprc->right, lprc->bottom); + } + + ret=(*pCreateEllipticRgnIndirect)(lprc); + if(!ret) OutTraceE("CreateEllipticRgnIndirect: ERROR ret=%x err=%d\n", ret, GetLastError()); + return ret; +} + +HRGN WINAPI extCreateRectRgn(int nLeftRect, int nTopRect, int nRightRect, int nBottomRect) +{ + HRGN ret; + OutTraceD("CreateRectRgn: rect=(%d,%d)-(%d,%d)\n", nLeftRect, nTopRect, nRightRect, nBottomRect); + + if (dxw.IsFullScreen()){ + dxw.MapClient(&nLeftRect, &nTopRect, &nRightRect, &nBottomRect); + OutTraceD("CreateRectRgn: fixed rect=(%d,%d)-(%d,%d)\n", nLeftRect, nTopRect, nRightRect, nBottomRect); + } + + ret=(*pCreateRectRgn)(nLeftRect, nTopRect, nRightRect, nBottomRect); + if(!ret) OutTraceE("CreateRectRgn: ERROR ret=%x err=%d\n", ret, GetLastError()); + return ret; +} + +HRGN WINAPI extCreateRectRgnIndirect(const RECT *lprc) +{ + HRGN ret; + OutTraceD("CreateRectRgnIndirect: rect=(%d,%d)-(%d,%d)\n", lprc->left, lprc->top, lprc->right, lprc->bottom); + + if (dxw.IsFullScreen()){ + dxw.MapClient((RECT *)lprc); + OutTraceD("CreateRectRgnIndirect: fixed rect=(%d,%d)-(%d,%d)\n", lprc->left, lprc->top, lprc->right, lprc->bottom); + } + + ret=(*pCreateRectRgnIndirect)(lprc); + if(!ret) OutTraceE("CreateRectRgnIndirect: ERROR ret=%x err=%d\n", ret, GetLastError()); + return ret; +} + +HRGN WINAPI extCreatePolygonRgn(const POINT *lpPoints, int cPoints, int fnPolyFillMode) +{ + HRGN ret; + if(IsTraceD){ + int i; + OutTrace("CreatePolygonRgn: PolyFillMode=%x cCount=%d pt=", fnPolyFillMode, cPoints); + for(i=0; ileft, lpRect->top, lpRect->right, lpRect->bottom, uFormat, nCount, lpchText); + + if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ + dxw.MapClient((RECT *)lpRect); + OutTraceD("DrawText: fixed rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); + } + + ret=(*pDrawText)(hdc, lpchText, nCount, lpRect, uFormat); + if(!ret) OutTraceE("DrawText: ERROR ret=%x err=%d\n", ret, GetLastError()); + return ret; +} + +int WINAPI extDrawTextEx(HDC hdc, LPTSTR lpchText, int nCount, LPRECT lpRect, UINT dwDTFormat, LPDRAWTEXTPARAMS lpDTParams) +{ + int ret; + OutTraceD("DrawTextEx: hdc=%x rect=(%d,%d)-(%d,%d) DTFormat=%x Text=(%d)\"%s\"\n", + hdc, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, dwDTFormat, nCount, lpchText); + + if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ + dxw.MapClient((RECT *)lpRect); + OutTraceD("DrawTextEx: fixed rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); + } + + ret=(*pDrawTextEx)(hdc, lpchText, nCount, lpRect, dwDTFormat, lpDTParams); + if(!ret) OutTraceE("DrawTextEx: ERROR ret=%x err=%d\n", ret, GetLastError()); + return ret; +} + +BOOL WINAPI extMaskBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, + int nXSrc, int nYSrc, HBITMAP hbmMask, int xMask, int yMask, DWORD dwRop) +{ + BOOL ret; + OutTraceD("MaskBlt: hdcDest=%x pos=(%d,%d) size=(%dx%d) hdcSrc=%x pos=(%d,%d) hbmMask=%x Mask=(%d,%d) dwRop=%x\n", + hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, hbmMask, xMask, yMask, dwRop); + + if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdcDest))){ + dxw.MapClient(&nXDest, &nYDest, &nWidth, &nHeight); + OutTraceD("MaskBlt: fixed pos=(%d,%d) size=(%dx%d)\n", nXDest, nYDest, nWidth, nHeight); + } + + ret=(*pMaskBlt)(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, hbmMask, xMask, yMask, dwRop); + if(!ret) OutTraceE("MaskBlt: ERROR ret=%x err=%d\n", ret, GetLastError()); + return ret; +} + +#if 0 +// to map: +// GetCurrentPositionEx +// GetViewportExtEx +// DPtoLP +// GetWindowOrgEx +// LPtoDP +// OffsetViewportOrgEx +// OffsetWindowOrgEx +// TransparentBlt +// to do: eliminate FIXTEXTOUT handling + +BOOL SetTextJustification( + _In_ HDC hdc, + _In_ int nBreakExtra, <---- + _In_ int nBreakCount +); +#endif \ No newline at end of file diff --git a/dll/hddproxy.cpp b/dll/hddproxy.cpp index d0ddd61..1e1889b 100644 --- a/dll/hddproxy.cpp +++ b/dll/hddproxy.cpp @@ -602,7 +602,7 @@ HRESULT WINAPI extQueryInterfaceDProxy(void *lpdd, REFIID riid, LPVOID *obp) { HRESULT res; unsigned int dxVersion; - OutTraceP("QueryInterface(D): PROXED lpdd=%x REFIID=%x(%s)\n", lpdd, riid.Data1, ExplainGUID((GUID *)&riid.Data1)); + OutTraceP("QueryInterface(D): PROXED lpdd=%x REFIID=%x(%s) obp=%x\n", lpdd, riid.Data1, ExplainGUID((GUID *)&riid.Data1), *obp); res = (*pQueryInterfaceD)(lpdd, riid, obp); if(res) { OutTraceP("QueryInterface(D): ret=%x(%s)\n", res, ExplainDDError(res)); @@ -1748,7 +1748,6 @@ static void HookDDSessionProxy(LPDIRECTDRAW *lplpdd, int dxVersion) HRESULT WINAPI extDirectDrawCreateProxy(GUID FAR *lpguid, LPDIRECTDRAW FAR *lplpdd, IUnknown FAR *pu) { HRESULT res; - int DDVersion; OutTraceP("DirectDrawCreate: PROXED guid=%x(%s)\n", lpguid, ExplainGUID(lpguid)); @@ -1759,19 +1758,26 @@ HRESULT WINAPI extDirectDrawCreateProxy(GUID FAR *lpguid, LPDIRECTDRAW FAR *lplp return res; } - DDVersion=1; - if (lpguid) switch (*(DWORD *)lpguid){ - case 0x6C14DB80: DDVersion=1; break; - case 0xB3A6F3E0: DDVersion=2; break; - case 0x9c59509a: DDVersion=4; break; - case 0x15e65ec0: DDVersion=7; break; + dxw.dwDDVersion=1; + char *mode; + switch ((DWORD)lpguid){ + 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; } - - OutTraceP("DirectDrawCreate: lpdd=%x guid=%x DDVersion=%d\n", - *lplpdd, (lpguid ? *(DWORD *)lpguid:0), DDVersion); + OutTraceP("DirectDrawCreateEx: lpdd=%x guid=%s DDVersion=%d\n", *lplpdd, mode, dxw.dwDDVersion); #ifdef HOOKDDRAW - HookDDSessionProxy(lplpdd, DDVersion); + HookDDSessionProxy(lplpdd, dxw.dwDDVersion); #endif return 0; } @@ -1779,31 +1785,38 @@ HRESULT WINAPI extDirectDrawCreateProxy(GUID FAR *lpguid, LPDIRECTDRAW FAR *lplp HRESULT WINAPI extDirectDrawCreateExProxy(GUID FAR *lpguid, LPDIRECTDRAW FAR *lplpdd, REFIID RefIid, IUnknown FAR *pu) { HRESULT res; - int DDVersion; OutTraceP("DirectDrawCreateEx: PROXED guid=%x(%s) refiid=%x\n", lpguid, ExplainGUID(lpguid), RefIid); - res = (*pDirectDrawCreate)(lpguid, lplpdd, pu); + res = (*pDirectDrawCreateEx)(lpguid, lplpdd, RefIid, pu); if(res) { OutTraceP("DirectDrawCreateEx: ERROR res=%x(%s)\n", res, ExplainDDError(res)); return res; } - DDVersion=1; - if (lpguid) switch (*(DWORD *)lpguid){ - case 0x6C14DB80: DDVersion=1; break; - case 0xB3A6F3E0: DDVersion=2; break; - case 0x9c59509a: DDVersion=4; break; - case 0x15e65ec0: DDVersion=7; break; + dxw.dwDDVersion=7; + char *mode; + switch ((DWORD)lpguid){ + 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; } - - OutTraceP("DirectDrawCreateEx: lpdd=%x guid=%x DDVersion=%d\n", - *lplpdd, (lpguid ? *(DWORD *)lpguid:0), DDVersion); + OutTraceP("DirectDrawCreateEx: lpdd=%x guid=%s DDVersion=%d\n", *lplpdd, mode, dxw.dwDDVersion); #ifdef HOOKDDRAW - HookDDSessionProxy(lplpdd, DDVersion); + HookDDSessionProxy(lplpdd, dxw.dwDDVersion); #endif + return 0; } diff --git a/dll/opengl.cpp b/dll/opengl.cpp index 1f01a05..43ce9fa 100644 --- a/dll/opengl.cpp +++ b/dll/opengl.cpp @@ -247,15 +247,22 @@ void WINAPI extglClear(GLbitfield mask) HGLRC WINAPI extwglCreateContext(HDC hdc) { HGLRC ret; + OutTraceD("wglCreateContext: hdc=%x\n", hdc); + // v2.02.31: don't let it use desktop hdc + if(dxw.IsDesktop(WindowFromDC(hdc))){ + HDC oldhdc = hdc; + hdc=(*pGDIGetDC)(dxw.GethWnd()); + OutTraceD("wglCreateContext: remapped desktop hdc=%x->%x\n", oldhdc, hdc); + } ret=(*pwglCreateContext)(hdc); - if(ret!=NULL){ + if(ret){ HWND hwnd; hwnd=WindowFromDC(hdc); dxw.SethWnd(hwnd); - OutTraceD("wglCreateContext: hdc=%x hwnd=%x\n", hdc, hwnd); + OutTraceD("wglCreateContext: SET hwnd=%x\n", hwnd); } else { - OutTraceD("wglCreateContext: ERROR hdc=%x err=%x\n", hdc, GetLastError()); + OutTraceD("wglCreateContext: ERROR err=%x\n", GetLastError()); } return ret; } @@ -281,6 +288,12 @@ BOOL WINAPI extwglMakeCurrent(HDC hdc, HGLRC hglrc) BOOL ret; OutTraceD("wglMakeCurrent: hdc=%x hglrc=%x\n", hdc, hglrc); + // v2.02.31: don't let it use desktop hdc + if(dxw.IsDesktop(WindowFromDC(hdc))){ + HDC oldhdc = hdc; + hdc=(*pGDIGetDC)(dxw.GethWnd()); + OutTraceD("wglMakeCurrent: remapped desktop hdc=%x->%x\n", oldhdc, hdc); + } ret=(*pwglMakeCurrent)(hdc, hglrc); if(ret){ HWND hWnd; diff --git a/dll/syslibs.h b/dll/syslibs.h index 99fb457..f2c8401 100644 --- a/dll/syslibs.h +++ b/dll/syslibs.h @@ -18,6 +18,7 @@ type definitions // advapi32.dll typedef LONG (WINAPI *RegCloseKey_Type)(HKEY); +typedef LONG (WINAPI *RegCreateKey_Type)(HKEY, LPCTSTR, PHKEY); typedef LONG (WINAPI *RegCreateKeyEx_Type)(HKEY, LPCTSTR, DWORD, LPTSTR, DWORD, REGSAM, LPSECURITY_ATTRIBUTES, PHKEY, LPDWORD); typedef LONG (WINAPI *RegOpenKeyEx_Type)(HKEY, LPCTSTR, DWORD, REGSAM, PHKEY); typedef LONG (WINAPI *RegQueryValueEx_Type)(HKEY, LPCTSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD); @@ -43,10 +44,12 @@ typedef HFONT (WINAPI *CreateFontIndirect_Type)(const LOGFONT*); typedef HPALETTE(WINAPI *GDICreatePalette_Type)(CONST LOGPALETTE *); typedef HDWP (WINAPI *DeferWindowPos_Type)(HDWP, HWND, HWND, int, int, int, int, UINT); typedef BOOL (WINAPI *DeleteDC_Type)(HDC); +typedef int (WINAPI *GetClipBox_Type)(HDC, LPRECT); typedef int (WINAPI *GetDeviceCaps_Type)(HDC, int); typedef BOOL (WINAPI *GetDeviceGammaRamp_Type)(HDC, LPVOID); typedef BOOL (WINAPI *GetSystemPaletteEntries_Type)(HDC, UINT, UINT, LPPALETTEENTRY); typedef BOOL (WINAPI *PatBlt_Type)(HDC, int, int, int, int, DWORD); +typedef BOOL (WINAPI *Polyline_Type)(HDC, const POINT *, int); typedef UINT (WINAPI *RealizePalette_Type)(HDC); typedef BOOL (WINAPI *Rectangle_Type)(HDC, int, int, int, int); typedef BOOL (WINAPI *RestoreDC_Type)(HDC, int); @@ -57,8 +60,28 @@ typedef COLORREF (WINAPI *SetBkColor_Type)(HDC, COLORREF); typedef BOOL (WINAPI *SetDeviceGammaRamp_Type)(HDC, LPVOID); typedef COLORREF(WINAPI *SetTextColor_Type)(HDC, COLORREF); typedef BOOL (WINAPI *StretchBlt_Type)(HDC, int, int, int, int, HDC, int, int, int, int, DWORD); -typedef LONG (WINAPI *TabbedTextOutA_Type)(HDC, int, int, LPCTSTR, int, int, const LPINT, int); +typedef int (WINAPI *StretchDIBits_Type)(HDC, int, int, int, int, int, int, int, int, const VOID *, const BITMAPINFO *, UINT, DWORD); typedef BOOL (WINAPI *TextOut_Type)(HDC, int, int, LPCTSTR, int); +typedef BOOL (WINAPI *PolyBezierTo_Type)(HDC, const POINT *, DWORD); +typedef BOOL (WINAPI *PolylineTo_Type)(HDC, const POINT *, DWORD); +typedef BOOL (WINAPI *PolyDraw_Type)(HDC, const POINT *, const BYTE *, int); +typedef BOOL (WINAPI *MoveToEx_Type)(HDC, int, int, LPPOINT); +typedef BOOL (WINAPI *ArcTo_Type)(HDC, int, int, int, int, int, int, int, int); +typedef BOOL (WINAPI *LineTo_Type)(HDC, int, int); +typedef int (WINAPI *SetDIBitsToDevice_Type)(HDC, int, int, DWORD, DWORD, int, int, UINT, UINT, const VOID *, const BITMAPINFO *, UINT); +typedef HBITMAP (WINAPI *CreateCompatibleBitmap_Type)(HDC, int, int); +typedef COLORREF(WINAPI *SetPixel_Type)(HDC, int, int, COLORREF); +typedef BOOL (WINAPI *Ellipse_Type)(HDC, int, int, int, int); +typedef BOOL (WINAPI *Polygon_Type)(HDC, const POINT *, int); +typedef BOOL (WINAPI *Arc_Type)(HDC, int, int, int, int, int, int, int, int); +typedef HRGN (WINAPI *CreateEllipticRgn_Type)(int, int, int, int); +typedef HRGN (WINAPI *CreateEllipticRgnIndirect_Type)(const RECT *); +typedef HRGN (WINAPI *CreateRectRgn_Type)(int, int, int, int); +typedef HRGN (WINAPI *CreateRectRgnIndirect_Type)(const RECT *); +typedef HRGN (WINAPI *CreatePolygonRgn_Type)(const POINT *, int, int); +typedef int (WINAPI *DrawText_Type)(HDC, LPCTSTR, int, LPRECT, UINT); +typedef int (WINAPI *DrawTextEx_Type)(HDC, LPTSTR, int, LPRECT, UINT, LPDRAWTEXTPARAMS); +typedef BOOL (WINAPI *MaskBlt_Type)(HDC, int, int, int, int, HDC, int, int, HBITMAP, int, int, DWORD); // Kernel32.dll: typedef BOOL (WINAPI *GetDiskFreeSpaceA_Type)(LPCSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD); @@ -99,6 +122,7 @@ typedef LRESULT (WINAPI *DefWindowProc_Type)(HWND, UINT, WPARAM, LPARAM); typedef BOOL (WINAPI *EndPaint_Type)(HWND, const PAINTSTRUCT *); typedef LONG (WINAPI *EnumDisplaySettings_Type)(LPCTSTR, DWORD, LPDEVMODEA); typedef int (WINAPI *FillRect_Type)(HDC, const RECT *, HBRUSH); +typedef int (WINAPI *FrameRect_Type)(HDC, const RECT *, HBRUSH); typedef BOOL (WINAPI *GetClientRect_Type)(HWND, LPRECT); typedef BOOL (WINAPI *GetClipCursor_Type)(LPRECT); typedef BOOL (WINAPI *GetCursorPos_Type)(LPPOINT); @@ -124,6 +148,9 @@ typedef LONG (WINAPI *SetWindowLong_Type)(HWND, int, LONG); typedef BOOL (WINAPI *SetWindowPos_Type)(HWND, HWND, int, int, int, int, UINT); typedef int (WINAPI *ShowCursor_Type)(BOOL); typedef BOOL (WINAPI *ShowWindow_Type)(HWND, int); +typedef LONG (WINAPI *TabbedTextOutA_Type)(HDC, int, int, LPCTSTR, int, int, const LPINT, int); +typedef BOOL (WINAPI *DestroyWindow_Type)(HWND); +typedef BOOL (WINAPI *CloseWindow_Type)(HWND); // Winmm.dll: typedef MCIERROR(WINAPI *mciSendCommand_Type)(MCIDEVICEID, UINT, DWORD_PTR, DWORD_PTR); @@ -148,6 +175,7 @@ hooked APIs real pointers // advapi32.dll DXWEXTERN RegCloseKey_Type pRegCloseKey DXWINITIALIZED; +DXWEXTERN RegCreateKey_Type pRegCreateKey DXWINITIALIZED; DXWEXTERN RegCreateKeyEx_Type pRegCreateKeyEx DXWINITIALIZED; DXWEXTERN RegOpenKeyEx_Type pRegOpenKeyEx DXWINITIALIZED; DXWEXTERN RegQueryValueEx_Type pRegQueryValueEx DXWINITIALIZED; @@ -173,10 +201,12 @@ DXWEXTERN CreateFontIndirect_Type pGDICreateFontIndirect DXWINITIALIZED; DXWEXTERN GDICreatePalette_Type pGDICreatePalette DXWINITIALIZED; DXWEXTERN DeferWindowPos_Type pGDIDeferWindowPos DXWINITIALIZED; DXWEXTERN DeleteDC_Type pGDIDeleteDC DXWINITIALIZED; +DXWEXTERN GetClipBox_Type pGDIGetClipBox DXWINITIALIZED; DXWEXTERN GetDeviceCaps_Type pGDIGetDeviceCaps DXWINITIALIZED; DXWEXTERN GetDeviceGammaRamp_Type pGDIGetDeviceGammaRamp DXWINITIALIZED; DXWEXTERN GetSystemPaletteEntries_Type pGDIGetSystemPaletteEntries DXWINITIALIZED; DXWEXTERN PatBlt_Type pGDIPatBlt DXWINITIALIZED; +DXWEXTERN Polyline_Type pPolyline DXWINITIALIZED; DXWEXTERN RealizePalette_Type pGDIRealizePalette DXWINITIALIZED; DXWEXTERN Rectangle_Type pGDIRectangle DXWINITIALIZED; DXWEXTERN RestoreDC_Type pGDIRestoreDC DXWINITIALIZED; @@ -187,8 +217,28 @@ DXWEXTERN SetBkColor_Type pGDISetBkColor DXWINITIALIZED; DXWEXTERN SetDeviceGammaRamp_Type pGDISetDeviceGammaRamp DXWINITIALIZED; DXWEXTERN SetTextColor_Type pGDISetTextColor DXWINITIALIZED; DXWEXTERN StretchBlt_Type pGDIStretchBlt DXWINITIALIZED; -DXWEXTERN TabbedTextOutA_Type pTabbedTextOutA DXWINITIALIZED; +DXWEXTERN StretchDIBits_Type pStretchDIBits DXWINITIALIZED; DXWEXTERN TextOut_Type pGDITextOutA DXWINITIALIZED; +DXWEXTERN LineTo_Type pLineTo DXWINITIALIZED; +DXWEXTERN ArcTo_Type pArcTo DXWINITIALIZED; +DXWEXTERN MoveToEx_Type pMoveToEx DXWINITIALIZED; +DXWEXTERN PolyDraw_Type pPolyDraw DXWINITIALIZED; +DXWEXTERN PolylineTo_Type pPolylineTo DXWINITIALIZED; +DXWEXTERN PolyBezierTo_Type pPolyBezierTo DXWINITIALIZED; +DXWEXTERN SetDIBitsToDevice_Type pSetDIBitsToDevice DXWINITIALIZED; +DXWEXTERN CreateCompatibleBitmap_Type pCreateCompatibleBitmap DXWINITIALIZED; +DXWEXTERN SetPixel_Type pSetPixel DXWINITIALIZED; +DXWEXTERN Ellipse_Type pEllipse DXWINITIALIZED; +DXWEXTERN Polygon_Type pPolygon DXWINITIALIZED; +DXWEXTERN Arc_Type pArc DXWINITIALIZED; +DXWEXTERN CreateEllipticRgn_Type pCreateEllipticRgn DXWINITIALIZED; +DXWEXTERN CreateEllipticRgnIndirect_Type pCreateEllipticRgnIndirect DXWINITIALIZED; +DXWEXTERN CreateRectRgn_Type pCreateRectRgn DXWINITIALIZED; +DXWEXTERN CreateRectRgnIndirect_Type pCreateRectRgnIndirect DXWINITIALIZED; +DXWEXTERN CreatePolygonRgn_Type pCreatePolygonRgn DXWINITIALIZED; +DXWEXTERN DrawText_Type pDrawText DXWINITIALIZED; +DXWEXTERN DrawTextEx_Type pDrawTextEx DXWINITIALIZED; +DXWEXTERN MaskBlt_Type pMaskBlt DXWINITIALIZED; // Kernel32.dll: DXWEXTERN GetDiskFreeSpaceA_Type pGetDiskFreeSpaceA DXWINITIALIZED; @@ -228,6 +278,7 @@ DXWEXTERN DefWindowProc_Type pDefWindowProc DXWINITIALIZED; DXWEXTERN EndPaint_Type pEndPaint DXWINITIALIZED; DXWEXTERN EnumDisplaySettings_Type pEnumDisplaySettings DXWINITIALIZED; DXWEXTERN FillRect_Type pFillRect DXWINITIALIZED; +DXWEXTERN FrameRect_Type pFrameRect DXWINITIALIZED; DXWEXTERN GetClientRect_Type pGetClientRect DXWINITIALIZED; DXWEXTERN GetClipCursor_Type pGetClipCursor DXWINITIALIZED; DXWEXTERN GetCursorPos_Type pGetCursorPos DXWINITIALIZED; @@ -246,7 +297,8 @@ DXWEXTERN PeekMessage_Type pPeekMessage DXWINITIALIZED; DXWEXTERN RegisterClassExA_Type pRegisterClassExA DXWINITIALIZED; DXWEXTERN GDIReleaseDC_Type pGDIReleaseDC DXWINITIALIZED; DXWEXTERN ScreenToClient_Type pScreenToClient DXWINITIALIZED; -DXWEXTERN SendMessage_Type pSendMessage DXWINITIALIZED; +DXWEXTERN SendMessage_Type pSendMessageA DXWINITIALIZED; +DXWEXTERN SendMessage_Type pSendMessageW DXWINITIALIZED; DXWEXTERN SetCursor_Type pSetCursor DXWINITIALIZED; DXWEXTERN SetCursorPos_Type pSetCursorPos DXWINITIALIZED; DXWEXTERN SetTimer_Type pSetTimer DXWINITIALIZED; @@ -254,6 +306,9 @@ DXWEXTERN SetWindowLong_Type pSetWindowLong DXWINITIALIZED; DXWEXTERN SetWindowPos_Type pSetWindowPos DXWINITIALIZED; DXWEXTERN ShowCursor_Type pShowCursor DXWINITIALIZED; DXWEXTERN ShowWindow_Type pShowWindow DXWINITIALIZED; +DXWEXTERN TabbedTextOutA_Type pTabbedTextOutA DXWINITIALIZED; +DXWEXTERN DestroyWindow_Type pDestroyWindow DXWINITIALIZED; +DXWEXTERN CloseWindow_Type pCloseWindow DXWINITIALIZED; // Winmm.dll: DXWEXTERN mciSendCommand_Type pmciSendCommand DXWINITIALIZED; @@ -266,6 +321,7 @@ hook procedures (possibly more tnan one per each API...) // advapi32.dll extern LONG WINAPI extRegCloseKey(HKEY); +extern LONG WINAPI extRegCreateKey(HKEY, LPCTSTR, PHKEY); extern LONG WINAPI extRegCreateKeyEx(HKEY, LPCTSTR, DWORD, LPTSTR, DWORD, REGSAM, LPSECURITY_ATTRIBUTES, PHKEY, LPDWORD); extern LONG WINAPI extRegOpenKeyEx(HKEY, LPCTSTR, DWORD, REGSAM, PHKEY); extern LONG WINAPI extRegQueryValueEx(HKEY, LPCTSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD); @@ -294,10 +350,12 @@ extern HPALETTE WINAPI extGDICreatePalette(CONST LOGPALETTE *); extern HDWP WINAPI extDeferWindowPos(HDWP, HWND, HWND, int, int, int, int, UINT); extern BOOL WINAPI extGDIDeleteDC(HDC); extern BOOL WINAPI extDDDeleteDC(HDC); +extern int WINAPI extGetClipBox(HDC, LPRECT); extern int WINAPI extGetDeviceCaps(HDC, int); extern BOOL WINAPI extGetDeviceGammaRamp(HDC, LPVOID); extern UINT WINAPI extGetSystemPaletteEntries(HDC, UINT, UINT, LPPALETTEENTRY); extern BOOL WINAPI extGDIPatBlt(HDC, int, int, int, int, DWORD); +extern BOOL WINAPI extPolyline(HDC, const POINT *, int); extern BOOL WINAPI extDDBitBlt(HDC, int, int, int, int, HDC, int, int, DWORD); extern UINT WINAPI extRealizePalette(HDC); extern BOOL WINAPI extRectangle(HDC, int, int, int, int); @@ -309,9 +367,29 @@ extern COLORREF WINAPI extSetBkColor(HDC, COLORREF); extern BOOL WINAPI extSetDeviceGammaRamp(HDC, LPVOID); extern COLORREF WINAPI extSetTextColor(HDC, COLORREF); extern BOOL WINAPI extGDIStretchBlt(HDC, int, int, int, int, HDC, int, int, int, int, DWORD); +extern int WINAPI extStretchDIBits(HDC, int, int, int, int, int, int, int, int, const VOID *, const BITMAPINFO *, UINT, DWORD); extern BOOL WINAPI extDDStretchBlt(HDC, int, int, int, int, HDC, int, int, int, int, DWORD); -extern LONG WINAPI extTabbedTextOutA(HDC, int, int, LPCTSTR, int, int, const LPINT, int); extern BOOL WINAPI extTextOutA(HDC, int, int, LPCTSTR, int); +extern BOOL WINAPI extPolyBezierTo(HDC, const POINT *, DWORD); +extern BOOL WINAPI extPolylineTo(HDC, const POINT *, DWORD); +extern BOOL WINAPI extPolyDraw(HDC, const POINT *, const BYTE *, int); +extern BOOL WINAPI extMoveToEx(HDC, int, int, LPPOINT); +extern BOOL WINAPI extArcTo(HDC, int, int, int, int, int, int, int, int); +extern BOOL WINAPI extLineTo(HDC, int, int); +extern int WINAPI extSetDIBitsToDevice(HDC, int, int, DWORD, DWORD, int, int, UINT, UINT, const VOID *, const BITMAPINFO *, UINT); +extern HBITMAP WINAPI extCreateCompatibleBitmap(HDC, int, int); +extern COLORREF WINAPI extSetPixel(HDC, int, int, COLORREF); +extern BOOL WINAPI extEllipse(HDC, int, int, int, int); +extern BOOL WINAPI extPolygon(HDC, const POINT *, int); +extern BOOL WINAPI extArc(HDC, int, int, int, int, int, int, int, int); +extern HRGN WINAPI extCreateEllipticRgn(int, int, int, int); +extern HRGN WINAPI extCreateEllipticRgnIndirect(const RECT *); +extern HRGN WINAPI extCreateRectRgn(int, int, int, int); +extern HRGN WINAPI extCreateRectRgnIndirect(const RECT *); +extern HRGN WINAPI extCreatePolygonRgn(const POINT *, int, int); +extern int WINAPI extDrawText(HDC, LPCTSTR, int, LPRECT, UINT); +extern int WINAPI extDrawTextEx(HDC, LPTSTR, int, LPRECT, UINT, LPDRAWTEXTPARAMS); +extern BOOL WINAPI extMaskBlt(HDC, int, int, int, int, HDC, int, int, HBITMAP, int, int, DWORD); // Kernel32.dll: extern BOOL WINAPI extGetDiskFreeSpaceA(LPCSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD); @@ -352,6 +430,7 @@ extern LRESULT WINAPI extDefWindowProc(HWND, UINT, WPARAM, LPARAM); extern BOOL WINAPI extEndPaint(HWND, const PAINTSTRUCT *); extern LONG WINAPI extEnumDisplaySettings(LPCTSTR, DWORD, DEVMODE *); extern int WINAPI extFillRect(HDC, const RECT *, HBRUSH); +extern int WINAPI extFrameRect(HDC, const RECT *, HBRUSH); extern BOOL WINAPI extGetClientRect(HWND, LPRECT); extern BOOL WINAPI extGetClipCursor(LPRECT); extern BOOL WINAPI extGetCursorPos(LPPOINT); @@ -382,6 +461,10 @@ extern LONG WINAPI extSetWindowLong(HWND, int, LONG); extern BOOL WINAPI extSetWindowPos(HWND, HWND, int, int, int, int, UINT); extern int WINAPI extShowCursor(BOOL); extern BOOL WINAPI extShowWindow(HWND, int); +extern LONG WINAPI extTabbedTextOutA(HDC, int, int, LPCTSTR, int, int, const LPINT, int); +extern BOOL WINAPI extDestroyWindow(HWND); +extern BOOL WINAPI extCloseWindow(HWND); + // Winmm.dll: extern MCIERROR WINAPI extmciSendCommand(MCIDEVICEID, UINT, DWORD_PTR, DWORD_PTR); diff --git a/dll/user32.cpp b/dll/user32.cpp index dd1960e..c6b8a8b 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -1,5 +1,8 @@ #define _WIN32_WINNT 0x0600 #define WIN32_LEAN_AND_MEAN +#define _CRT_SECURE_NO_WARNINGS + +#include #include "dxwnd.h" #include "dxwcore.hpp" #include "syslibs.h" @@ -19,13 +22,17 @@ static HookEntry_Type Hooks[]={ {"EnumDisplaySettingsA", (FARPROC)EnumDisplaySettingsA, (FARPROC *)&pEnumDisplaySettings, (FARPROC)extEnumDisplaySettings}, {"GetClipCursor", (FARPROC)GetClipCursor, (FARPROC*)&pGetClipCursor, (FARPROC)extGetClipCursor}, {"ClipCursor", (FARPROC)ClipCursor, (FARPROC *)&pClipCursor, (FARPROC)extClipCursor}, - {"FillRect", (FARPROC)FillRect, (FARPROC *)&pFillRect, (FARPROC)extFillRect}, + {"FillRect", (FARPROC)NULL, (FARPROC *)&pFillRect, (FARPROC)extFillRect}, + {"FrameRect", (FARPROC)NULL, (FARPROC *)&pFrameRect, (FARPROC)extFrameRect}, {"DefWindowProcA", (FARPROC)DefWindowProcA, (FARPROC *)&pDefWindowProc, (FARPROC)extDefWindowProc}, {"CreateWindowExA", (FARPROC)CreateWindowExA, (FARPROC *)&pCreateWindowExA, (FARPROC)extCreateWindowExA}, {"CreateWindowExW", (FARPROC)CreateWindowExW, (FARPROC *)&pCreateWindowExW, (FARPROC)extCreateWindowExW}, {"RegisterClassExA", (FARPROC)RegisterClassExA, (FARPROC *)&pRegisterClassExA, (FARPROC)extRegisterClassExA}, {"GetSystemMetrics", (FARPROC)GetSystemMetrics, (FARPROC *)&pGetSystemMetrics, (FARPROC)extGetSystemMetrics}, {"GetDesktopWindow", (FARPROC)GetDesktopWindow, (FARPROC *)&pGetDesktopWindow, (FARPROC)extGetDesktopWindow}, + {"TabbedTextOutA", (FARPROC)TabbedTextOutA, (FARPROC *)&pTabbedTextOutA, (FARPROC)extTabbedTextOutA}, + {"CloseWindow", (FARPROC)NULL, (FARPROC *)&pCloseWindow, (FARPROC)extCloseWindow}, + {"DestroyWindow", (FARPROC)NULL, (FARPROC *)&pDestroyWindow, (FARPROC)extDestroyWindow}, {0, NULL, 0, 0} // terminator }; @@ -63,7 +70,8 @@ static HookEntry_Type MessageHooks[]={ static HookEntry_Type MouseHooks[]={ {"GetCursorPos", (FARPROC)GetCursorPos, (FARPROC *)&pGetCursorPos, (FARPROC)extGetCursorPos}, {"SetCursor", (FARPROC)SetCursor, (FARPROC *)&pSetCursor, (FARPROC)extSetCursor}, - {"SendMessageA", (FARPROC)SendMessageA, (FARPROC *)&pSendMessage, (FARPROC)extSendMessage}, // ??? + {"SendMessageA", (FARPROC)SendMessageA, (FARPROC *)&pSendMessageA, (FARPROC)extSendMessage}, // ??? + {"SendMessageW", (FARPROC)SendMessageW, (FARPROC *)&pSendMessageW, (FARPROC)extSendMessage}, // ??? //{"SetPhysicalCursorPos", NULL, (FARPROC *)&pSetCursor, (FARPROC)extSetCursor}, // ??? {0, NULL, 0, 0} // terminator }; @@ -157,8 +165,18 @@ LONG WINAPI MyChangeDisplaySettings(char *fname, DEVMODE *lpDevMode, DWORD dwfla // save desired settings first v.2.1.89 // v2.1.95 protect when lpDevMode is null (closing game... Jedi Outcast) // v2.2.23 consider new width/height only when dmFields flags are set. - if(lpDevMode && (lpDevMode->dmFields & (DM_PELSWIDTH | DM_PELSHEIGHT))) + if(lpDevMode && (lpDevMode->dmFields & (DM_PELSWIDTH | DM_PELSHEIGHT))){ + RECT client; dxw.SetScreenSize(lpDevMode->dmPelsWidth, lpDevMode->dmPelsHeight); + // v2.02.31: when main win is bigger that expected resolution, you're in windowed fullscreen mode + //(*pGetClientRect)((dxw.dwFlags1 & FIXPARENTWIN) ? dxw.hParentWnd : dxw.GethWnd(), &client); + (*pGetClientRect)(dxw.GethWnd(), &client); + OutTraceD("%s: current hWnd=%x size=(%d,%d)\n", fname, dxw.GethWnd(), client.right, client.bottom); + if((client.right>=(LONG)lpDevMode->dmPelsWidth) && (client.bottom>=(LONG)lpDevMode->dmPelsHeight)) { + OutTraceD("%s: entering FULLSCREEN mode\n", fname); + dxw.SetFullScreen(TRUE); + } + } if ((dwflags==0 || dwflags==CDS_FULLSCREEN) && lpDevMode){ if (dxw.dwFlags1 & EMULATESURFACE || !(lpDevMode->dmFields & DM_BITSPERPEL)){ @@ -497,7 +515,7 @@ LONG WINAPI extSetWindowLong(HWND hwnd, int nIndex, LONG dwNewLong) WNDPROC lres; WNDPROC OldProc; // GPL fix - if(dxw.IsDesktop(hwnd)) { + if(dxw.IsRealDesktop(hwnd)) { hwnd=dxw.GethWnd(); OutTraceD("SetWindowLong: DESKTOP hwnd, FIXING hwnd=%x\n",hwnd); } @@ -571,47 +589,17 @@ BOOL WINAPI extSetWindowPos(HWND hwnd, HWND hWndInsertAfter, int X, int Y, int c HDWP WINAPI extDeferWindowPos(HDWP hWinPosInfo, HWND hwnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags) { + // v2.02.31: heavily used by "Imperialism II" !!! HDWP res; OutTraceD("DeferWindowPos: hwnd=%x%s pos=(%d,%d) dim=(%d,%d) Flags=%x\n", hwnd, dxw.IsFullScreen()?"(FULLSCREEN)":"", X, Y, cx, cy, uFlags); - //if ((hwnd != dxw.GethWnd()) || !dxw.IsFullScreen()){ - { - // just proxy - res=(*pGDIDeferWindowPos)(hWinPosInfo, hwnd, hWndInsertAfter, X, Y, cx, cy, uFlags); - if(!res)OutTraceE("SetWindowPos: ERROR err=%d at %d\n", GetLastError(), __LINE__); - return res; + if(dxw.IsFullScreen()){ + dxw.MapClient(&X, &Y, &cx, &cy); + OutTraceD("DeferWindowPos: remapped pos=(%d,%d) dim=(%d,%d)\n", X, Y, cx, cy); } - if (dxw.dwFlags1 & LOCKWINPOS){ - return hWinPosInfo; - } - - if (dxw.dwFlags1 & PREVENTMAXIMIZE){ - int UpdFlag =0; - int MaxX, MaxY; - MaxX = dxw.iSizX; - MaxY = dxw.iSizY; - if (!MaxX) MaxX = dxw.GetScreenWidth(); - if (!MaxY) MaxY = dxw.GetScreenHeight(); - if(cx>MaxX) { cx=MaxX; UpdFlag=1; } - if(cy>MaxY) { cy=MaxY; UpdFlag=1; } - if (UpdFlag) - OutTraceD("SetWindowPos: using max dim=(%d,%d)\n", cx, cy); - } - - // useful??? to be demonstrated.... - // when altering main window in fullscreen mode, fix the coordinates for borders - DWORD dwCurStyle; - RECT rect; - rect.top=rect.left=0; - rect.right=cx; rect.bottom=cy; - dwCurStyle=(*pGetWindowLong)(hwnd, GWL_STYLE); - AdjustWindowRect(&rect, dwCurStyle, FALSE); - cx=rect.right; cy=rect.bottom; - OutTraceD("SetWindowPos: main form hwnd=%x fixed size=(%d,%d)\n", hwnd, cx, cy); - res=(*pGDIDeferWindowPos)(hWinPosInfo, hwnd, hWndInsertAfter, X, Y, cx, cy, uFlags); if(!res)OutTraceE("DeferWindowPos: ERROR err=%d at %d\n", GetLastError(), __LINE__); return res; @@ -653,7 +641,7 @@ LRESULT WINAPI extSendMessage(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) break; } } - ret=(*pSendMessage)(hwnd, Msg, wParam, lParam); + ret=(*pSendMessageA)(hwnd, Msg, wParam, lParam); OutTraceW("SendMessage: lresult=%x\n", ret); return ret; } @@ -808,7 +796,7 @@ BOOL WINAPI extGetMessage(LPMSG lpMsg, HWND hwnd, UINT wMsgFilterMin, UINT wMsgF Message=lpMsg->message & 0xFFFF; if((Message <= WM_MOUSELAST) && (Message >= WM_MOUSEFIRST)){ FixedHwnd=(hwnd)?hwnd:dxw.GethWnd(); - if(dxw.IsDesktop(FixedHwnd)) FixedHwnd=dxw.GethWnd(); // GPL fix... + if(dxw.IsRealDesktop(FixedHwnd)) FixedHwnd=dxw.GethWnd(); // GPL fix... lpMsg->pt=FixMessagePt(FixedHwnd, lpMsg->pt); lpMsg->lParam = MAKELPARAM(lpMsg->pt.x, lpMsg->pt.y); OutTraceC("PeekMessage: fixed lparam/pt=(%d,%d)\n", lpMsg->pt.x, lpMsg->pt.y); @@ -935,8 +923,8 @@ int WINAPI extMapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT } if(dxw.IsFullScreen()){ - if(dxw.IsDesktop(hWndTo)) hWndTo=dxw.GethWnd(); - if(dxw.IsDesktop(hWndFrom)) hWndFrom=dxw.GethWnd(); + if(dxw.IsRealDesktop(hWndTo)) hWndTo=dxw.GethWnd(); + if(dxw.IsRealDesktop(hWndFrom)) hWndFrom=dxw.GethWnd(); } // should scale the retcode ??? @@ -951,7 +939,7 @@ HWND WINAPI extGetDesktopWindow(void) HWND res; OutTraceD("GetDesktopWindow: FullScreen=%x\n", dxw.IsFullScreen()); - if (dxw.IsFullScreen()){ + if (dxw.IsFullScreen()){ OutTraceD("GetDesktopWindow: returning main window hwnd=%x\n", dxw.GethWnd()); return dxw.GethWnd(); } @@ -974,11 +962,13 @@ int WINAPI extGetSystemMetrics(int nindex) switch(nindex){ case SM_CXFULLSCREEN: case SM_CXSCREEN: + case SM_CXVIRTUALSCREEN: // v2.02.31 res = pSetDevMode->dmPelsWidth; OutTraceD("GetDeviceCaps: fix HORZRES cap=%d\n", res); return res; case SM_CYFULLSCREEN: case SM_CYSCREEN: + case SM_CYVIRTUALSCREEN: // v2.02.31 res = pSetDevMode->dmPelsHeight; OutTraceD("GetDeviceCaps: fix VERTRES cap=%d\n", res); return res; @@ -988,11 +978,13 @@ int WINAPI extGetSystemMetrics(int nindex) switch(nindex){ case SM_CXFULLSCREEN: case SM_CXSCREEN: + case SM_CXVIRTUALSCREEN: // v2.02.31 res= dxw.GetScreenWidth(); OutTraceD("GetSystemMetrics: fix SM_CXSCREEN=%d\n", res); break; case SM_CYFULLSCREEN: case SM_CYSCREEN: + case SM_CYVIRTUALSCREEN: // v2.02.31 res= dxw.GetScreenHeight(); OutTraceD("GetSystemMetrics: fix SM_CYSCREEN=%d\n", res); break; @@ -1014,35 +1006,8 @@ ATOM WINAPI extRegisterClassExA(WNDCLASSEX *lpwcx) return (*pRegisterClassExA)(lpwcx); } -HWND WINAPI extCreateWindowExW( - DWORD dwExStyle, - LPCWSTR lpClassName, - LPCWSTR lpWindowName, - DWORD dwStyle, - int x, - int y, - int nWidth, - int nHeight, - HWND hWndParent, - HMENU hMenu, - HINSTANCE hInstance, - LPVOID lpParam) -{ - char sClassName[256+1]; - char sWindowName[256+1]; - wcstombs_s(NULL, sClassName, lpClassName, 80); - wcstombs_s(NULL, sWindowName, lpWindowName, 80); - - 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(IsDebug) OutTrace("CreateWindowExW: DEBUG screen=(%d,%d)\n", dxw.GetScreenWidth(), dxw.GetScreenHeight()); - - return extCreateWindowExA(dwExStyle, sClassName, sWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); -} - -// GHO: pro Diablo -HWND WINAPI extCreateWindowExA( +static HWND WINAPI extCreateWindowCommon( + LPCTSTR ApiName, DWORD dwExStyle, LPCTSTR lpClassName, LPCTSTR lpWindowName, @@ -1060,14 +1025,9 @@ HWND WINAPI extCreateWindowExA( WNDPROC pWindowProc; BOOL isValidHandle=TRUE; - OutTraceD("CreateWindowExA: class=\"%s\" wname=\"%s\" 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(IsDebug) OutTrace("CreateWindowExA: DEBUG screen=(%d,%d)\n", dxw.GetScreenWidth(), dxw.GetScreenHeight()); - // no maximized windows in any case if (dxw.dwFlags1 & PREVENTMAXIMIZE){ - OutTraceD("CreateWindowExA: handling PREVENTMAXIMIZE mode\n"); + OutTraceD("%s: handling PREVENTMAXIMIZE mode\n", ApiName); dwStyle &= ~(WS_MAXIMIZE | WS_POPUP); dwExStyle &= ~WS_EX_TOPMOST; } @@ -1117,7 +1077,7 @@ HWND WINAPI extCreateWindowExA( } nWidth=screen.right; nHeight=screen.bottom; - OutTraceD("CreateWindowExA: fixed BIG win pos=(%d,%d) size=(%d,%d)\n", x, y, nWidth, nHeight); + OutTraceD("%s: fixed BIG win pos=(%d,%d) size=(%d,%d)\n", ApiName, x, y, nWidth, nHeight); } else { // invalid parent coordinates: use initial placement, but leave the size. @@ -1128,7 +1088,7 @@ HWND WINAPI extCreateWindowExA( //} nWidth=dxw.iSizX; nHeight=dxw.iSizY; - OutTraceD("CreateWindowExA: renewed BIG win pos=(%d,%d) size=(%d,%d)\n", x, y, nWidth, nHeight); + OutTraceD("%s: renewed BIG win pos=(%d,%d) size=(%d,%d)\n", ApiName, x, y, nWidth, nHeight); } dxw.SetFullScreen(TRUE); if(dxw.Coordinates==DXW_DESKTOP_WORKAREA){ @@ -1139,14 +1099,14 @@ HWND WINAPI extCreateWindowExA( nWidth=workarea.right; nHeight=workarea.bottom; dwStyle=(dxw.dwFlags2 & MODALSTYLE) ? 0 : WS_OVERLAPPEDWINDOW; - OutTraceD("CreateWindowExA: WORKAREA win pos=(%d,%d) size=(%d,%d)\n", x, y, nWidth, nHeight); + OutTraceD("%s: WORKAREA win pos=(%d,%d) size=(%d,%d)\n", ApiName, x, y, nWidth, nHeight); } } if(!dxw.IsFullScreen()){ // v2.1.63: needed for "Monster Truck Madness" wndh= (*pCreateWindowExA)(dwExStyle, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); - OutTraceD("CreateWindowExA: windowed mode ret=%x\n", wndh); + OutTraceD("%s: windowed mode ret=%x\n", ApiName, wndh); return wndh; } @@ -1154,25 +1114,25 @@ HWND WINAPI extCreateWindowExA( // Age of Empires.... if (dwStyle & WS_CHILD){ dxw.MapClient(&x, &y, &nWidth, &nHeight); - OutTraceD("CreateWindowExA: fixed WS_CHILD pos=(%d,%d) size=(%d,%d)\n", - x, y, nWidth, nHeight); + OutTraceD("%s: fixed WS_CHILD pos=(%d,%d) size=(%d,%d)\n", + ApiName, x, y, nWidth, nHeight); } // needed for Diablo, that creates a new control parent window that must be // overlapped to the directdraw surface. else if (dwExStyle & WS_EX_CONTROLPARENT){ dxw.MapWindow(&x, &y, &nWidth, &nHeight); - OutTraceD("CreateWindowExA: fixed WS_EX_CONTROLPARENT pos=(%d,%d) size=(%d,%d)\n", - x, y, nWidth, nHeight); + OutTraceD("%s: fixed WS_EX_CONTROLPARENT pos=(%d,%d) size=(%d,%d)\n", + ApiName, x, y, nWidth, nHeight); } - OutTraceB("CreateWindowExA: fixed pos=(%d,%d) size=(%d,%d) Style=%x(%s) ExStyle=%x(%s)\n", - x, y, nWidth, nHeight, dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle)); + OutTraceB("%s: fixed pos=(%d,%d) size=(%d,%d) Style=%x(%s) ExStyle=%x(%s)\n", + ApiName, x, y, nWidth, nHeight, dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle)); wndh= (*pCreateWindowExA)(dwExStyle, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); if (wndh==(HWND)NULL){ - OutTraceE("CreateWindowExA: ERROR err=%d Style=%x(%s) ExStyle=%x\n", - GetLastError(), dwStyle, ExplainStyle(dwStyle), dwExStyle); + OutTraceE("%s: ERROR err=%d Style=%x(%s) ExStyle=%x\n", + ApiName, GetLastError(), dwStyle, ExplainStyle(dwStyle), dwExStyle); return wndh; } @@ -1181,7 +1141,7 @@ HWND WINAPI extCreateWindowExA( extern void AdjustWindowPos(HWND, DWORD, DWORD); (*pSetWindowLong)(wndh, GWL_STYLE, (dxw.dwFlags2 & MODALSTYLE) ? 0 : WS_OVERLAPPEDWINDOW); (*pSetWindowLong)(wndh, GWL_EXSTYLE, 0); - OutTraceD("CreateWindowExA: hwnd=%x, set style=WS_OVERLAPPEDWINDOW extstyle=0\n", wndh); + OutTraceD("%s: hwnd=%x, set style=WS_OVERLAPPEDWINDOW extstyle=0\n", ApiName, wndh); AdjustWindowPos(wndh, nWidth, nHeight); (*pShowWindow)(wndh, SW_SHOWNORMAL); } @@ -1196,13 +1156,75 @@ HWND WINAPI extCreateWindowExA( OutTraceD("Hooking CHILD wndh=%x WindowProc %x->%x\n", wndh, pWindowProc, extChildWindowProc); res=(*pSetWindowLong)(wndh, GWL_WNDPROC, (LONG)extChildWindowProc); WhndStackPush(wndh, pWindowProc); - if(!res) OutTraceE("CreateWindowExA: SetWindowLong ERROR %x\n", GetLastError()); + if(!res) OutTraceE("%s: SetWindowLong ERROR %x\n", ApiName, GetLastError()); } - OutTraceD("CreateWindowExA: ret=%x\n", wndh); + OutTraceD("%s: ret=%x\n", ApiName, wndh); return wndh; } +static LPCSTR ClassToStr(LPCSTR Class) +{ + static char AtomBuf[20+1]; + if(((DWORD)Class & 0xFFFF0000) == 0){ + sprintf(AtomBuf, "ATOM(%X)", Class); + return AtomBuf; + } + return Class; +} + +// to do: implement and use ClassToWStr() for widechar call + +HWND WINAPI extCreateWindowExW( + DWORD dwExStyle, + LPCWSTR lpClassName, + LPCWSTR lpWindowName, + DWORD dwStyle, + int x, + int y, + int nWidth, + int nHeight, + HWND hWndParent, + HMENU hMenu, + HINSTANCE hInstance, + LPVOID lpParam) +{ + char sClassName[256+1]; + char sWindowName[256+1]; + wcstombs_s(NULL, sClassName, lpClassName, 80); + wcstombs_s(NULL, sWindowName, lpWindowName, 80); + + 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(IsDebug) OutTrace("CreateWindowExW: DEBUG screen=(%d,%d)\n", dxw.GetScreenWidth(), dxw.GetScreenHeight()); + + return extCreateWindowCommon("CreateWindowExW", dwExStyle, sClassName, sWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); +} + +// GHO: pro Diablo +HWND WINAPI extCreateWindowExA( + DWORD dwExStyle, + LPCTSTR lpClassName, + LPCTSTR lpWindowName, + DWORD dwStyle, + int x, + int y, + int nWidth, + int nHeight, + HWND hWndParent, + HMENU hMenu, + 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(IsDebug) OutTrace("CreateWindowExA: DEBUG screen=(%d,%d)\n", dxw.GetScreenWidth(), dxw.GetScreenHeight()); + + return extCreateWindowCommon("CreateWindowExA", dwExStyle, lpClassName, lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); +} + LRESULT WINAPI extCallWindowProc(WNDPROC lpPrevWndFunc, HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) { // v2.02.30: fix (Imperialism II): apply to main window only !!! @@ -1233,39 +1255,48 @@ LRESULT WINAPI extDefWindowProc(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lPara int WINAPI extFillRect(HDC hdc, const RECT *lprc, HBRUSH hbr) { - RECT rc, trim; - HWND hWnd; - OutTraceD("FillRect: hdc=%x xy=(%d,%d)-(%d,%d)\n", hdc, lprc->left, lprc->top, lprc->right, lprc->bottom); + int res; + RECT rc; + OutTraceD("FillRect: hdc=%x hbrush=%x rect=(%d,%d)-(%d,%d)\n", hdc, hbr, lprc->left, lprc->top, lprc->right, lprc->bottom); + + // when not in fullscreen mode, just proxy the call + if(!dxw.IsFullScreen()) return (*pFillRect)(hdc, lprc, hbr); + memcpy(&rc, lprc, sizeof(rc)); - hWnd = WindowFromDC(hdc); - if((hWnd == dxw.GethWnd()) || - (hWnd == 0) || - (hWnd == GetDesktopWindow())){ - // trim: some games (Player Manager 98) clear the screen by filling an exagerated rect - (*pGetClientRect)(dxw.GethWnd(), &trim); - hdc=GetDC(dxw.GethWnd()); - dxw.MapWindowRect(&rc); - if(rc.left < trim.left) rc.left = trim.left; - if(rc.top < trim.top) rc.top = trim.top; - if(rc.right > trim.right) rc.right = trim.right; - if(rc.bottom > trim.bottom) rc.bottom = trim.bottom; - OutTraceD("FillRect: hwnd=%x hdc=%x fixed xy=(%d,%d)-(%d,%d)\n", hWnd, hdc, rc.left, rc.top, rc.right, rc.bottom); + if(OBJ_DC == GetObjectType(hdc)){ + if(rc.left < 0) rc.left = 0; + if(rc.top < 0) rc.top = 0; + if((DWORD)rc.right > dxw.GetScreenWidth()) rc.right = dxw.GetScreenWidth(); + if((DWORD)rc.bottom > dxw.GetScreenHeight()) rc.bottom = dxw.GetScreenHeight(); + dxw.MapClient(&rc); + OutTraceD("FillRect: fixed rect=(%d,%d)-(%d,%d)\n", rc.left, rc.top, rc.right, rc.bottom); } - if (dxw.dwFlags1 & FIXTEXTOUT) { - // to be verified: why shifting and not scaling? - POINT anchor; - anchor.x=rc.left; - anchor.y=rc.top; - (*pClientToScreen)(dxw.GethWnd(), &anchor); - rc.left=anchor.x; - rc.top=anchor.y; - anchor.x=rc.right; - anchor.y=rc.bottom; - (*pClientToScreen)(dxw.GethWnd(), &anchor); - rc.right=anchor.x; - rc.bottom=anchor.y; + + res=(*pFillRect)(hdc, &rc, hbr); + return res; +} + +int WINAPI extFrameRect(HDC hdc, const RECT *lprc, HBRUSH hbr) +{ + int res; + RECT rc; + OutTraceD("FrameRect: hdc=%x hbrush=%x rect=(%d,%d)-(%d,%d)\n", hdc, hbr, lprc->left, lprc->top, lprc->right, lprc->bottom); + + // when not in fullscreen mode, just proxy the call + if(!dxw.IsFullScreen()) return (*pFrameRect)(hdc, lprc, hbr); + + memcpy(&rc, lprc, sizeof(rc)); + if(OBJ_DC == GetObjectType(hdc)){ + if(rc.left < 0) rc.left = 0; + if(rc.top < 0) rc.top = 0; + if((DWORD)rc.right > dxw.GetScreenWidth()) rc.right = dxw.GetScreenWidth(); + if((DWORD)rc.bottom > dxw.GetScreenHeight()) rc.bottom = dxw.GetScreenHeight(); + dxw.MapClient(&rc); + OutTraceD("FrameRect: fixed rect=(%d,%d)-(%d,%d)\n", rc.left, rc.top, rc.right, rc.bottom); } - return (*pFillRect)(hdc, &rc, hbr); + + res=(*pFrameRect)(hdc, &rc, hbr); + return res; } BOOL WINAPI extClipCursor(RECT *lpRectArg) @@ -1363,7 +1394,7 @@ LONG WINAPI extChangeDisplaySettings(DEVMODE *lpDevMode, DWORD dwflags) { if(IsTraceD){ OutTrace("ChangeDisplaySettings: lpDevMode=%x flags=%x", lpDevMode, dwflags); - if (lpDevMode) OutTrace(" fields=%x(%s) size=(%d x %d) bpp=%x", + if (lpDevMode) OutTrace(" fields=%x(%s) size=(%d x %d) bpp=%d", lpDevMode->dmFields, ExplainDevModeFields(lpDevMode->dmFields), lpDevMode->dmPelsWidth, lpDevMode->dmPelsHeight, lpDevMode->dmBitsPerPel); OutTrace("\n"); @@ -1376,7 +1407,7 @@ LONG WINAPI extChangeDisplaySettingsEx(LPCTSTR lpszDeviceName, DEVMODE *lpDevMod { if(IsTraceD){ OutTrace("ChangeDisplaySettingsEx: DeviceName=%s lpDevMode=%x flags=%x", lpszDeviceName, lpDevMode, dwflags); - if (lpDevMode) OutTrace(" size=(%d x %d) bpp=%x", + if (lpDevMode) OutTrace(" size=(%d x %d) bpp=%d", lpDevMode->dmPelsWidth, lpDevMode->dmPelsHeight, lpDevMode->dmBitsPerPel); OutTrace("\n"); } @@ -1391,8 +1422,7 @@ HDC WINAPI extGDIGetDC(HWND hwnd) OutTraceD("GDI.GetDC: hwnd=%x\n", hwnd); lochwnd=hwnd; - //if (dxw.IsFullScreen() && dxw.IsDesktop()) { - if (dxw.IsDesktop(hwnd)) { + if (dxw.IsRealDesktop(hwnd)) { OutTraceD("GDI.GetDC: desktop remapping hwnd=%x->%x\n", hwnd, dxw.GethWnd()); lochwnd=dxw.GethWnd(); } @@ -1437,7 +1467,7 @@ HDC WINAPI extGDIGetWindowDC(HWND hwnd) HWND lochwnd; OutTraceD("GDI.GetWindowDC: hwnd=%x\n", hwnd); lochwnd=hwnd; - if (dxw.IsDesktop(hwnd)) { + if (dxw.IsRealDesktop(hwnd)) { OutTraceD("GDI.GetWindowDC: desktop remapping hwnd=%x->%x\n", hwnd, dxw.GethWnd()); lochwnd=dxw.GethWnd(); } @@ -1465,7 +1495,7 @@ int WINAPI extGDIReleaseDC(HWND hwnd, HDC hDC) int res; OutTraceD("GDI.ReleaseDC: hwnd=%x hdc=%x\n", hwnd, hDC); - if (dxw.IsDesktop(hwnd)) hwnd=dxw.GethWnd(); + if (dxw.IsRealDesktop(hwnd)) hwnd=dxw.GethWnd(); #if 0 if(dxw.lpDDSPrimHDC){ @@ -1700,6 +1730,7 @@ BOOL WINAPI extScrollDC(HDC hDC, int dx, int dy, const RECT *lprcScroll, const R { return TRUE; } + HWND WINAPI extGetTopWindow(HWND hwnd) { HWND ret; @@ -1708,4 +1739,46 @@ HWND WINAPI extGetTopWindow(HWND hwnd) ret = (dxw.IsFullScreen() && dxw.IsDesktop(hwnd)) ? dxw.GethWnd() : (*pGetTopWindow)(hwnd); OutTraceD("GetTopWindow: ret=%x\n", ret); return ret; -} \ No newline at end of file +} + +LONG WINAPI extTabbedTextOutA(HDC hdc, int X, int Y, LPCTSTR lpString, int nCount, int nTabPositions, const LPINT lpnTabStopPositions, int nTabOrigin) +{ + BOOL res; + OutTraceD("TabbedTextOut: hdc=%x xy=(%d,%d) nCount=%d nTP=%d nTOS=%d str=(%d)\"%s\"\n", + hdc, X, Y, nCount, nTabPositions, nTabOrigin, lpString); + + if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){ + dxw.MapClient(&X, &Y); + OutTraceD("TextOut: fixed dest=(%d,%d)\n", X, Y); + } + + res=(*pTabbedTextOutA)(hdc, X, Y, lpString, nCount, nTabPositions, lpnTabStopPositions, nTabOrigin); + return res; +} + +BOOL WINAPI extDestroyWindow(HWND hWnd) +{ + BOOL res; + OutTraceB("DestroyWindow: hwnd=%x\n", hWnd); + if (hWnd == dxw.GethWnd()) { + OutTraceD("DestroyWindow: destroy main hwnd=%x\n", hWnd); + if(1) return 0; + dxw.SethWnd(NULL); + } + res=(*pDestroyWindow)(hWnd); + if(!res)OutTraceE("DestroyWindow: ERROR err=%d\n", GetLastError()); + return res; +} + +BOOL WINAPI extCloseWindow(HWND hWnd) +{ + BOOL res; + OutTraceB("CloseWindow: hwnd=%x\n", hWnd); + if (hWnd == dxw.GethWnd()) { + OutTraceD("CloseWindow: close main hwnd=%x\n", hWnd); + dxw.SethWnd(NULL); + } + res=(*pCloseWindow)(hWnd); + if(!res)OutTraceE("CloseWindow: ERROR err=%d\n", GetLastError()); + return res; +} diff --git a/dll/wndproc.cpp b/dll/wndproc.cpp index 200e756..ffdff0c 100644 --- a/dll/wndproc.cpp +++ b/dll/wndproc.cpp @@ -1,5 +1,7 @@ #define _WIN32_WINNT 0x0600 #define WIN32_LEAN_AND_MEAN +#define _CRT_SECURE_NO_WARNINGS + #include #include #include diff --git a/host/MainFrm.cpp b/host/MainFrm.cpp index f6225e5..f81a617 100644 --- a/host/MainFrm.cpp +++ b/host/MainFrm.cpp @@ -20,8 +20,6 @@ along with this program. If not, see . // MainFrm.cpp : CMainFrame defines the class behavior. // -#define _CRT_SECURE_NO_DEPRECATE 1 - #include "stdafx.h" #include "dxwndhost.h" diff --git a/host/Resource.h b/host/Resource.h index b326853..c005824 100644 --- a/host/Resource.h +++ b/host/Resource.h @@ -159,6 +159,7 @@ #define IDC_CDROMDRIVETYPE 1114 #define IDC_OUTREGISTRY 1115 #define IDC_NOWINDOWMOVE 1116 +#define IDC_DISABLEHAL 1117 #define ID_MODIFY 32771 #define ID_DELETE 32772 #define ID_ADD 32773 diff --git a/host/StdAfx.h b/host/StdAfx.h index 1e09d07..bcd4c7c 100644 --- a/host/StdAfx.h +++ b/host/StdAfx.h @@ -3,6 +3,8 @@ // Write the project specific include files. // +#define _CRT_SECURE_NO_DEPRECATE + #if !defined(AFX_STDAFX_H__9139BF92_2E61_4CBC_AB58_646DE772409F__INCLUDED_) #define AFX_STDAFX_H__9139BF92_2E61_4CBC_AB58_646DE772409F__INCLUDED_ diff --git a/host/TabDirectX.cpp b/host/TabDirectX.cpp index 1edf6c5..e7d47a8 100644 --- a/host/TabDirectX.cpp +++ b/host/TabDirectX.cpp @@ -39,6 +39,7 @@ void CTabDirectX::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_FULLRECTBLT, cTarget->m_FullRectBlt); DDX_Check(pDX, IDC_NOPALETTEUPDATE, cTarget->m_NoPaletteUpdate); DDX_Check(pDX, IDC_SETCOMPATIBILITY, cTarget->m_SetCompatibility); + DDX_Check(pDX, IDC_DISABLEHAL, cTarget->m_DisableHAL); DDX_Check(pDX, IDC_SAVECAPS, cTarget->m_SaveCaps); // DirectInput DDX_Check(pDX, IDC_HOOKDI, cTarget->m_HookDI); diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index b6af39e..fc78335 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -1,8 +1,6 @@ // TargetDlg.cpp : Implementation // -#define _CRT_SECURE_NO_DEPRECATE 1 - #include "stdafx.h" #include "dxwndhost.h" #include "TargetDlg.h" @@ -36,6 +34,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_SuppressIME = FALSE; m_SuppressD3DExt = FALSE; m_SetCompatibility = FALSE; + m_DisableHAL = FALSE; m_SaveCaps = FALSE; m_SingleProcAffinity = FALSE; m_LimitResources = FALSE; diff --git a/host/TargetDlg.h b/host/TargetDlg.h index 4fa044c..d0c95d1 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -106,6 +106,7 @@ public: BOOL m_CDROMDriveType; BOOL m_SuppressIME; BOOL m_SetCompatibility; + BOOL m_DisableHAL; BOOL m_SaveCaps; BOOL m_SingleProcAffinity; BOOL m_WireFrame; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index d00cb5c..35bd6ae 100644 Binary files a/host/dxwndhost.aps and b/host/dxwndhost.aps differ diff --git a/host/dxwndhost.cpp b/host/dxwndhost.cpp index 01aee28..3bf2421 100644 --- a/host/dxwndhost.cpp +++ b/host/dxwndhost.cpp @@ -1,8 +1,6 @@ // dxwndhost.cpp : Application and class definitions // -#define _CRT_SECURE_NO_DEPRECATE 1 - #include "stdafx.h" #include "dxwndhost.h" diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index a3008a3..0309a05 100644 --- a/host/dxwndhost.rc +++ b/host/dxwndhost.rc @@ -316,13 +316,13 @@ BEGIN CONTROL "Auto Primary Surface Refresh",IDC_AUTOREFRESH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,38,126,9 GROUPBOX "DirectDraw Surface handling",IDC_STATIC,112,3,181,167 CONTROL "VIDEO->SYSTEM surf. on fail",IDC_VIDEOTOSYSTEMMEM, - "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,118,49,126,9 - CONTROL "Suppress DX common errors",IDC_SUPPRESSDXERRORS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,61,127,10 - CONTROL "Make Backbuf attachable",IDC_BACKBUFATTACH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,84,119,10 - CONTROL "Blit from BackBuffer",IDC_BLITFROMBACKBUFFER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,95,119,10 - CONTROL "Suppress clipping",IDC_SUPPRESSCLIPPING,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,107,119,10 - CONTROL "Full RECT Blit",IDC_FULLRECTBLT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,119,119,10 - CONTROL "Palette update don't Blit",IDC_NOPALETTEUPDATE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,130,119,10 + "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,118,50,126,9 + CONTROL "Suppress DX common errors",IDC_SUPPRESSDXERRORS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,62,127,10 + CONTROL "Make Backbuf attachable",IDC_BACKBUFATTACH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,86,119,10 + CONTROL "Blit from BackBuffer",IDC_BLITFROMBACKBUFFER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,98,119,10 + CONTROL "Suppress clipping",IDC_SUPPRESSCLIPPING,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,110,119,10 + CONTROL "Full RECT Blit",IDC_FULLRECTBLT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,122,119,10 + CONTROL "Palette update don't Blit",IDC_NOPALETTEUPDATE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,134,119,10 LTEXT "DirectInput initial coord. and X,Y range",IDC_STATIC,19,197,146,9 LTEXT "X",IDC_STATIC,13,212,9,9 LTEXT "Y",IDC_STATIC,40,212,9,9 @@ -339,9 +339,10 @@ BEGIN EDITTEXT IDC_MAXY,148,209,17,14,ES_AUTOHSCROLL,WS_EX_RIGHT CONTROL "DirectInput Hooking",IDC_HOOKDI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,182,97,12 GROUPBOX "DirectInput",IDC_STATIC,7,172,286,61 - CONTROL "Set AERO compatible mode",IDC_SETCOMPATIBILITY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,141,109,12 - CONTROL "Highlight blit to primary",IDC_MARKBLIT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,72,127,10 + CONTROL "Set AERO compatible mode",IDC_SETCOMPATIBILITY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,146,109,12 + CONTROL "Highlight blit to primary",IDC_MARKBLIT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,74,127,10 CONTROL "Preserve surface capabilities",IDC_SAVECAPS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,14,109,12 + CONTROL "Disable HAL support",IDC_DISABLEHAL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,118,158,109,12 END IDD_TAB_MOUSE DIALOGEX 0, 0, 300, 240 @@ -437,7 +438,7 @@ IDD_TAB_GDI DIALOGEX 0, 0, 300, 240 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD FONT 8, "MS Shell Dlg", 400, 0, 0x1 BEGIN - CONTROL "Fix TextOutA placement",IDC_FIXTEXTOUT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,28,125,10 + CONTROL "Scale font parameters",IDC_FIXTEXTOUT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,28,125,10 GROUPBOX "GDI Handling",IDC_STATIC,6,3,140,51 CONTROL "Hook GDI",IDC_HOOKGDI,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,16,119,10 CONTROL "Map GDI HDC to Primary DC",IDC_MAPGDITOPRIMARY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,40,119,10 diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index ebf3bde..adf0df0 100644 Binary files a/host/dxwndhost.vs2008.suo and b/host/dxwndhost.vs2008.suo differ diff --git a/host/dxwndhostDoc.cpp b/host/dxwndhostDoc.cpp index c45d0f7..1536efc 100644 --- a/host/dxwndhostDoc.cpp +++ b/host/dxwndhostDoc.cpp @@ -1,8 +1,6 @@ // dxwndhostDoc.cpp : CDxwndhostDoc Define the behavior of the class. // -#define _CRT_SECURE_NO_DEPRECATE 1 - #include "stdafx.h" #include "dxwndhost.h" diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index 582e208..9d726a0 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -1,5 +1,3 @@ -#define _CRT_SECURE_NO_DEPRECATE 1 - // dxwndhostView.cpp : CDxwndhostView Define the behavior of the class. // @@ -142,6 +140,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_SuppressIME) t->flags2 |= SUPPRESSIME; if(dlg->m_SuppressD3DExt) t->flags3 |= SUPPRESSD3DEXT; if(dlg->m_SetCompatibility) t->flags2 |= SETCOMPATIBILITY; + if(dlg->m_DisableHAL) t->flags3 |= DISABLEHAL; if(dlg->m_SaveCaps) t->flags3 |= SAVECAPS; if(dlg->m_SingleProcAffinity) t->flags3 |= SINGLEPROCAFFINITY; if(dlg->m_SaveLoad) t->flags |= SAVELOAD; @@ -253,6 +252,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_SuppressIME = t->flags2 & SUPPRESSIME ? 1 : 0; dlg->m_SuppressD3DExt = t->flags3 & SUPPRESSD3DEXT ? 1 : 0; dlg->m_SetCompatibility = t->flags2 & SETCOMPATIBILITY ? 1 : 0; + dlg->m_DisableHAL = t->flags3 & DISABLEHAL ? 1 : 0; dlg->m_SaveCaps = t->flags3 & SAVECAPS ? 1 : 0; dlg->m_SingleProcAffinity = t->flags3 & SINGLEPROCAFFINITY ? 1 : 0; dlg->m_LimitResources = t->flags2 & LIMITRESOURCES ? 1 : 0;