From 6d56f83f1f8762bbe2aa0d08e61dea3fa1bea857 Mon Sep 17 00:00:00 2001 From: gho tik Date: Sun, 25 Aug 2013 12:38:13 -0400 Subject: [PATCH] v2_02_31_src Former-commit-id: e532b31652aeb08b559f61757c211a100810b42c --- Include/dxwnd.h | 5 +- build/dxwnd.dll | 4 +- build/dxwnd.exe | 2 +- build/dxwnd.ini | 731 +++++++++++++++++++++++++++++++------- build/readme-relnotes.txt | 18 + dll/advapi.cpp | 39 +- dll/ddraw.cpp | 218 ++++++++---- dll/dinput.cpp | 2 + dll/dxhelper.cpp | 11 + dll/dxhelper.h | 1 + dll/dxhook.cpp | 57 +-- dll/dxwcore.cpp | 98 ++++- dll/dxwcore.hpp | 9 +- dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 178688 -> 190464 bytes dll/gdi32.cpp | 594 ++++++++++++++++++++++++++++--- dll/hddproxy.cpp | 61 ++-- dll/opengl.cpp | 19 +- dll/syslibs.h | 91 ++++- dll/user32.cpp | 333 ++++++++++------- dll/wndproc.cpp | 2 + host/MainFrm.cpp | 2 - host/Resource.h | 1 + host/StdAfx.h | 2 + host/TabDirectX.cpp | 1 + host/TargetDlg.cpp | 3 +- host/TargetDlg.h | 1 + host/dxwndhost.aps | Bin 162224 -> 162364 bytes host/dxwndhost.cpp | 2 - host/dxwndhost.rc | 21 +- host/dxwndhost.vs2008.suo | Bin 292864 -> 300032 bytes host/dxwndhostDoc.cpp | 2 - host/dxwndhostView.cpp | 4 +- 33 files changed, 1854 insertions(+), 482 deletions(-) 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 a87f0cf6d13206f1039f3b70cdc29824fa3c0427..74a50d904141fe0cd54ad032db0461f837b6bb7b 100644 GIT binary patch delta 44664 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 delta 37677 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 I<`DIN08lz4>;M1& 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 d00cb5cebd6d9a3c53439d8c5bf627cd2289e83d..35bd6aea5e9db4b3926f4579ce52453b1f2c624c 100644 GIT binary patch delta 3088 zcmZuz3sh9s6+QP39|Z#g!cb91OyXbZe5ee@ic@Eh(UEyD!_PJC_#p~LWROoxO@c|f zT#0ola!syDf7lY^r){ufG>MdI8iPq&#niZ(Rz)$$nEu+bK>*g|$I+g*`H79Fg;^gz>sP=T-1 zQ{eKIF7cJP!D_Y6hTQ-jS7?dP<;g1tyDdB03O|*Q%k6as+!C_E&m`n@xnypKHkrH2 z6tAyH)nvh|5-Tb$keY1RBXdOu95ClK6&cnn2llGiP&bDK_NkcG&S8c9>}EpBi~|xb z@wiL9zJ;QRBO87$v4GRRIJDT~^-44ce!(n>6AixvV5bAAY<^1&d7Xt5Q%O5p-eRH$ zfj!fbGV52e6sv6e@gdj@_ zvf%iTK&zI-H{cyfh>Z*>&SJl~vkp8Xza4^c`r;*Svm~Mf=OjwPRRlG%jlETIPKyt*y^lVo#hq;C zDs3US7q?gCY50@OzgjaRPqCL|?5v!~dRLn@1!ZF@r)aT(l~+#I;wZMOa*`HDvvYdP zwpYb7bJbXtVSm6ZIGDw+iD$3q85zk=Rp}0KY}6V(j*l!_Qy0UIgB8u&Kz!>RzekU1s-ww*}F%%L= ziY(pox4Dr8T~C;(DUNks$Rsma(%EeG@WtuWna7li|D?`xmfvHeMT;X(_QaAg9?)K~ zK$RFUzzSFm0|WTX{qRzr88F-gZm5O^SPRRc9;%=Q*2$7`f6HYX4Jj<^@;Zw8w#&Ij zqPrO~h|&l)cI$E}na39Q`bi1%w&bVV_3a%I8z!4{~Y%4j$NEih6}JTUMq+kQ2TWquM!5Q9GpWzq*%-292D zNrlQKWXT!qfF^D@ixz_>FjbPXha{*8-lLf*S!dpmh$`z*6F=>ISy3qgQ=o z5sSa(B6g-+Tbh<_|6j$A@g9%D8|M61T53Kx!3!Bshj%@Ue>Jck>LagSBe8T~fbISK zFuQwo1S|M*1Y6fPm*stFWN-I{+0%bbV2=LjY|D)V7Ve)d@W|o*$%F(W7jDjo&iBJg zJV9&WQFLA=r5 z9qy_*e=kf;B%fahQ#+~TNwstWY3Ek)v5Oaqk4?N5Kj?_lZ2zhB=-*>$fFDF;;`}q> zU`6BgqMX=b)CUKcgU`ih{HCaP@uc-wKlLx{gFmOcO>qDj7xltd?kg-X0F-^E^FO$c z{|*|T__*><|A^JpAn6-Zn14&q(^VU!d*P64htQ3^upcu6>dgZD=$RZ zgZWr~$u| zGxa=0bv~9$`Pf`dPM=r!;YQq|+g8GTRxwQ@n!G8uC;|Jtz zLXw>4|G*E!&MM0LDuvw>XlGnQ`D0bWPG;4Zt;H-XvO}09R%6zT*|;G7)E^j#!RrhB LuE$e2?5X=Naqfl! delta 2594 zcmZ`&4^)&@7QgR}{L_R1bpRa(CfCHW&io-6Hi(^^Ay|nSnNgr)4Jan0;$TRmt0!FA z%v@`|bY6Rou2EK6R_gReixkqr&gmGH$CD)pLTRRH+NrH9_P#gYXi58VK7RN9?(f}u z-@V_oe;2poV%+1dao!~ys{cI4)l^njJ*UwYu-F223--@WX4akceWMoy?(n#Z3M#;E z%g(k!8$gjO;Bptc{cc6s;AurUT`uL@;Th$-%e}>((y%5AwkWQ2R*BMN!?ViwMhFKy zhabg{ng4v4zLMTyfvsUq%kQwlwlMLV0uCFzpvc)p?y_Rf?Xrj?8(vhL-|3qXm{C+* ztk@jbjztM({u1Eg4aVe`m877k*c~YJcxFgRP8Pg^n-dIEcc_@813tgUt76k&r(&r{ zKo(PE4(!7I1Vc(lh3MLsV-AZIUInzEA^Ei{m1IYB&|$H|>sW;b{s!PmG_u`TuTOFB zQ9_xV$~yhCd`g-FZz|qZ?(}*C?(!nPq^%ZsOVK{(Y`46HMz&)@>jcBw+KI9f7d5Lw zHrR_pdL!G1#>5QPfq983tP?l48rVCyI5F9>UmcOtij2%*b-)3|szH{zeY5Tem&t*5 z0ofA<{vKf36DfIJO68@!cuG}wHX9rabK3YFHaolz5O8{Z0lO|Z##`g+Y4=&fF%*-ztO^%2e9g`dn{sM+mUcF!xC-HquB3N(8;u38Yu zvjRIKHXq^`Rdbyt0(8|()@+6?mwAr+YbI&D4q0u)9)bB0dqeFge7JT(ScJEd_wHry zZ{+Fjjl|w0&l&b=(?ZMdt&7$H0G!^q;j~<%ZUDH5sB0#Q|i1=v~UkV@9u@-GJ8KDqQ>NNZi=_ z4X5<$j@t-A9miuB_Iw_b1P}w<8x1;`3kzU~9_;HYNS4Nf;D*Jp3>HBZG(asZfjV>^ z9fRKf>#*QxJht@Dlz_|_JP~k zLR>Lm$Bn0BvE*npvG?P?fm_&W{CQwHo*9V6fpz`2RV2r3Cjrca>%ewjCLR?O*() zZnNsE*pb`8#PY&3?EccEUHhLn^reRtqUWRwzrHvcpE_9*ns(|^v|L8kx!3v4S$O8$ zU%9IY9p_hZ*L2){ej0P*x%1Px-x(mf#mX5^}{a1pL4uVOq*fOfT}5l6$FJ+%4TLVkNl@#3soOeunX%k5?b>u^##H zn)nAN#jjGBE7I;GMf+KC>wV-Fio2w{^@3O>-D|`q>2CjC?3M0V(WAsaiC@X(TYeFy z27a5ln=u*%r}y7#p_VIah0Iuh6w%y3%~Xmu0^LR{6A3n!8nsmqP%ZjpC@9!60*5e5 za0#b`Yeba`7uFhr@ZIpmzicSfY zqF=%y!R{x>5@rJ3B@Y)%ygW5(ES;|rRWdYHG)n-{Mqoa?UbY-h?>be)@|*ivhzW{* zDeL$&B71C@>{?>{!rVkjD}|H5JZO-e%cL9rP@O57rR+duMAkY?Cc7CcI;E_mO3I?? zW${vH36Db^xtsnQ1$#g)crF(S^XRT4nH;W@IA#%561<{WLab;baJJM&@{JjmZ#Cs> bSrmyk4~ws%+?j$c=jq1ox`^z;FxmeAqj?ih 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 ebf3bde8db53e074986a0fc0140fc2715793070a..adf0df087ec3009eb2eb08fbf8e98895334b597f 100644 GIT binary patch delta 5866 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 delta 3786 zcmds3ZBSI#8NTniXEzJ3WLcMWS=RNkBBBk7Xj>D%R*J+>J0+H}F**jnNtzg<#xK^g zDnUv>kpsNOW+E~c?P$~09l3rm$%bScHO63*QKP2WA^qWG9L1DcO9=EmiqBP9RupBnh*y)~d6BM8;yt~+y<)kVmav>2 ztRSo;tRfT=ekS&-AI4cypRVqxy9g>V{*hucKW|E)E=}ykwzt$Y5i;@MMuRW*sR>L` zt_-JV)Qn2J0-z{~)SpNgLHOwKWb2)t+r5%6CR7n-Jj9pL7=zO-QyIJ&++_U|VBQt5 zi%f4sLS%91MGDZA*kTE+F>I?qFA=oVx!h1T@c$Q(tWtJ*ZE6QTh=ql!M!M6Ju zfZkMa2uF8q<2@$6*2ckHvHOduqWZMG<~kRZ->$=g9I&D$U<&3kXl?9bxRiqjwF^wE zNp`72LBV(Ls-l^L8S0(j4!V2VRngjQ(=`KxnTY$?BzC4-bVn@Q1kn*=L5mH#n@m98 z8|%Wf1h^_5vzrf^X8<&r!6epHSkXNb+H20a(VY#q<)XUV4%ddTCPnW`h9*^{(1L-{ z@RvUSqh&0l=q+PlM&DScalo`h##;ZN+DGF6A>$!_7LDf-hCRf~Y?%K)_^HG_O^DNz zGvSLN$aa8N+}4el`vlna!r5>Dn!Lc#S_I>T)@DTSlMoWs7vl7|Lg-;lb3hZV*R%D! z-$1~KIcGrAwRLcdHLrm*fE*mV7OvpDVsPrI8=%xAYOiWo@V+`;&ntrfVD)B-_}IVM z^~Wk<3dKZwEXMjN)FPRXvB!patH7o2@k5~jJvwAy?o_bo2dW?h=r5NaD~GTume!5e zYj(kEhT3s(U`8UDaN03QQ-yWc99-lBhh9(v4I@N;m4;zII7MKWOW0qqe>;Tjvl~Opm{U(V2{)Js z)f+KZ(LI-;Ue(!o=ox|@ z1EgTbx3nd1r31~^U{SpH-P4IQc*Qk?d8Z&#&p*qKq~o^h zFhiVgx9XP7d;=-RDsbZTQm!GyaF=NPtJ~lEA_aaz#gaA%<^D{4FF~rFL{r(q)CB^-CFgP3*59h2c$VGR~~w zx#W~#%9m<08&u*)lh{cTYnSOUA4gR2M+eF{{A34DX!faR*TRXJ^ zB)^xB-<0#A1DTe20QdWNPQUY!TOOTgjNEdSoAP!%C=cUAAGc$4_Zg9$kNfdY1~>WP zx*$3(IdGGo&rcb2XuZ2VS|18(ZJ55DPmm=~*Ot?j)KEjgQ2U?A!OoRDAKvIktXoC) z3Z#QQBFW}86efl8NqTnhlcSFP9+~@~)c^2u2ct>u5(Vc-&Pw>Q Rfzs`}DRxRzmkf+w{~Na=f`kA7 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;