From fb1b339376a19d36b9925ce5c4815b655b052221 Mon Sep 17 00:00:00 2001 From: gho tik Date: Wed, 25 May 2016 12:46:02 -0400 Subject: [PATCH] v2_03_70_src Former-commit-id: a516cfdde172868c23b2a62175e7a008e90a5f6f --- Include/dxwnd.h | 4 + Release/-dxwnd (2).dll | 3 + Release/-dxwnd.dll | 3 + Release/.gitattributes | 1 + Release/Disasm.dll | 3 + Release/dxwnd.ini | 459 +++ Release/filter.dll | 3 + Release/vcomp90.dll | 3 + build/dxwnd.dll | 4 +- build/dxwnd.exe | 4 +- build/exports/American McGee's Alice.dxw | 31 + build/exports/Cossacks II.dxw | 31 + build/exports/F1 Manager 2000.dxw | 31 + build/exports/Lode Runner 2.dxw | 31 + build/exports/Microsoft Golf 1999 Edition.dxw | 6 +- build/exports/Need For Speed SE.dxw | 31 + build/exports/Patrician III.dxw | 31 + build/exports/Tanktics.dxw | 31 + build/readme-relnotes.txt | 7 + dll/ddblit.cpp | 3 +- dll/ddraw.cpp | 84 +- dll/dxhook.cpp | 14 +- dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 694272 -> 752640 bytes dll/gdi32.cpp | 23 +- dll/msghook.cpp | 22 +- dll/user32.09.cpp | 3302 ----------------- dll/user32.cpp | 31 +- dll/winproc.cpp | 3 + host/TabCompat.cpp | 3 +- host/TabDirect3D.cpp | 1 + host/TabHook.cpp | 4 + host/TabWindow.cpp | 4 +- host/TargetDlg.cpp | 2 + host/TargetDlg.h | 2 + host/dxwndhost.aps | Bin 167912 -> 168604 bytes host/dxwndhost.rc | Bin 115250 -> 116308 bytes host/dxwndhost.vs2008.suo | Bin 202752 -> 209920 bytes host/dxwndhostView.cpp | 24 +- host/resource | Bin 40580 -> 40948 bytes 40 files changed, 898 insertions(+), 3343 deletions(-) create mode 100644 Release/-dxwnd (2).dll create mode 100644 Release/-dxwnd.dll create mode 100644 Release/.gitattributes create mode 100644 Release/Disasm.dll create mode 100644 Release/dxwnd.ini create mode 100644 Release/filter.dll create mode 100644 Release/vcomp90.dll create mode 100644 build/exports/American McGee's Alice.dxw create mode 100644 build/exports/Cossacks II.dxw create mode 100644 build/exports/F1 Manager 2000.dxw create mode 100644 build/exports/Lode Runner 2.dxw create mode 100644 build/exports/Need For Speed SE.dxw create mode 100644 build/exports/Patrician III.dxw create mode 100644 build/exports/Tanktics.dxw delete mode 100644 dll/user32.09.cpp diff --git a/Include/dxwnd.h b/Include/dxwnd.h index ff4b41e..d1dacac 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -224,6 +224,10 @@ #define CPUSLOWDOWN 0x00000040 // reduces CPU time dedicated to non time critical threads #define CPUMAXUSAGE 0x00000080 // reduces CPU time to non time critical threads that consume more than the given ratio #define NOWINERRORS 0x00000100 // suppress some possible window errors returning OK also in case of failure +#define SUPPRESSOVERLAY 0x00000200 // Supress ddraw overlay capabilities (moto racer 2) +#define INIT24BPP 0x00000400 // simulate a 24BPP initial desktop setting (in GetDeviceCaps API) +#define INIT32BPP 0x00000800 // simulate a 24BPP initial desktop setting (in GetDeviceCaps API) + // eighth flags DWORD dxw.dwFlags8: // logging Tflags DWORD: diff --git a/Release/-dxwnd (2).dll b/Release/-dxwnd (2).dll new file mode 100644 index 0000000..ae75b63 --- /dev/null +++ b/Release/-dxwnd (2).dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:61559f87e638c3e804586c3a84c178771a9795a5160e46196267ba0bc551ce67 +size 654848 diff --git a/Release/-dxwnd.dll b/Release/-dxwnd.dll new file mode 100644 index 0000000..f09497a --- /dev/null +++ b/Release/-dxwnd.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2a37cc0d0feca74c6cad95af68a73bb1678677db3de38ed9d3dff3907ee05184 +size 653824 diff --git a/Release/.gitattributes b/Release/.gitattributes new file mode 100644 index 0000000..b110a24 --- /dev/null +++ b/Release/.gitattributes @@ -0,0 +1 @@ +*.{dll,exe} filter=lfs diff=lfs merge=lfs -text \ No newline at end of file diff --git a/Release/Disasm.dll b/Release/Disasm.dll new file mode 100644 index 0000000..b9c3542 --- /dev/null +++ b/Release/Disasm.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f413a207787da88281500aaeae07fb98d7d438ecb4d67f8fcdf0aff2f988717f +size 138752 diff --git a/Release/dxwnd.ini b/Release/dxwnd.ini new file mode 100644 index 0000000..8d6fa2d --- /dev/null +++ b/Release/dxwnd.ini @@ -0,0 +1,459 @@ +[window] +exepath=D:\Games\Imperialism II - Age of Exploration (GOG)\ +posx=-893 +posy=292 +sizx=320 +sizy=400 +exportpath=D:\DxWnd\export.wip\ +debug=1 +[target] +title0=Tanktics +path0=D:\Games\tanktics\tanktics.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=2 +flag0=-1398800350 +flagg0=1744830480 +flagh0=20 +flagi0=-2008543232 +flagj0=5248 +flagk0=65536 +flagl0=513 +flagm0=0 +tflag0=-2147477245 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=3 +swapeffect0=0 +maxddinterface0=6 +slowratio0=2 +title1=Tanktics (no hook) +path1=D:\Games\tanktics\tanktics.exe +launchpath1= +module1= +opengllib1= +notes1= +registry1= +ver1=12 +coord1=0 +flag1=614465570 +flagg1=1073774592 +flagh1=4 +flagi1=-2009071612 +flagj1=4224 +flagk1=65536 +flagl1=1 +flagm1=0 +tflag1=-2147477245 +dflag1=0 +posx1=50 +posy1=50 +sizx1=800 +sizy1=600 +maxfps1=0 +initts1=0 +winver1=0 +maxres1=-1 +swapeffect1=0 +maxddinterface1=6 +slowratio1=2 +title2=ROADRASH.EXE +path2=D:\Games\road-rash\ROADRASH.EXE +launchpath2= +module2= +opengllib2= +notes2= +registry2= +ver2=0 +coord2=0 +flag2=136314914 +flagg2=1207959552 +flagh2=20 +flagi2=134217732 +flagj2=4224 +flagk2=65536 +flagl2=0 +flagm2=0 +tflag2=0 +dflag2=0 +posx2=50 +posy2=50 +sizx2=800 +sizy2=600 +maxfps2=0 +initts2=0 +winver2=0 +maxres2=-1 +swapeffect2=0 +maxddinterface2=7 +slowratio2=2 +title3=EMPIRES2.EXE +path3=D:\Games\Age of Empires II Trial\EMPIRES2.EXE +launchpath3= +module3= +opengllib3= +notes3= +registry3= +ver3=0 +coord3=0 +flag3=136314914 +flagg3=1207959552 +flagh3=20 +flagi3=134217732 +flagj3=4224 +flagk3=65536 +flagl3=0 +flagm3=0 +tflag3=0 +dflag3=0 +posx3=50 +posy3=50 +sizx3=800 +sizy3=600 +maxfps3=0 +initts3=0 +winver3=0 +maxres3=-1 +swapeffect3=0 +maxddinterface3=7 +slowratio3=2 +title4=Blade of Darkness (GOG-OpenGL) +path4=D:\Games\Blade of Darkness (GOG)\Bin\Blade.exe +launchpath4= +module4=raster\rOpenGL.dll +opengllib4= +notes4= +registry4=( +ver4=0 +coord4=0 +flag4=681574434 +flagg4=1208090624 +flagh4=21 +flagi4=205520902 +flagj4=4224 +flagk4=5308416 +flagl4=0 +flagm4=0 +tflag4=0 +dflag4=0 +posx4=50 +posy4=50 +sizx4=800 +sizy4=600 +maxfps4=0 +initts4=0 +winver4=0 +maxres4=-1 +swapeffect4=0 +maxddinterface4=7 +slowratio4=1 +title5=msgolf98 +path5=D:\Games\MSGolf98\MSGOLF98\GAME.EXE +launchpath5= +module5= +opengllib5= +notes5= +registry5= +ver5=0 +coord5=0 +flag5=136314914 +flagg5=1207959552 +flagh5=20 +flagi5=134217732 +flagj5=4224 +flagk5=327680 +flagl5=0 +flagm5=0 +tflag5=0 +dflag5=0 +posx5=50 +posy5=50 +sizx5=880 +sizy5=660 +maxfps5=0 +initts5=0 +winver5=0 +maxres5=-1 +swapeffect5=0 +maxddinterface5=7 +slowratio5=2 +title6=Vitae.exe +path6=D:\Games\Vitae\Vitae.exe +launchpath6= +module6= +opengllib6= +notes6= +registry6= +ver6=0 +coord6=0 +flag6=136314914 +flagg6=1744830592 +flagh6=20 +flagi6=138412036 +flagj6=4224 +flagk6=3473450 +flagl6=0 +flagm6=0 +tflag6=-2147476729 +dflag6=0 +posx6=50 +posy6=50 +sizx6=800 +sizy6=600 +maxfps6=0 +initts6=0 +winver6=0 +maxres6=-1 +swapeffect6=0 +maxddinterface6=7 +slowratio6=2 +title7=moto.exe +path7=D:\Games\Moto Racer 2 (GOG)\moto.exe +launchpath7=D:\Games\Moto Racer 2 (GOG)\moto.exe -NoPowerVr -KeepAvailableVram1073741824 +module7= +opengllib7= +notes7= +registry7= +ver7=0 +coord7=0 +flag7=681574434 +flagg7=1207959680 +flagh7=524308 +flagi7=138412036 +flagj7=33558656 +flagk7=196608 +flagl7=0 +flagm7=0 +tflag7=-1073735421 +dflag7=0 +posx7=50 +posy7=50 +sizx7=800 +sizy7=600 +maxfps7=0 +initts7=0 +winver7=0 +maxres7=-1 +swapeffect7=0 +maxddinterface7=7 +slowratio7=2 +title8=Army Men RTS +path8=D:\Games\Army Men RTS\amrts.exe +launchpath8= +module8= +opengllib8= +notes8= +registry8= +ver8=0 +coord8=0 +flag8=671088678 +flagg8=1207959552 +flagh8=20 +flagi8=4194304 +flagj8=128 +flagk8=65536 +flagl8=0 +flagm8=0 +tflag8=0 +dflag8=0 +posx8=50 +posy8=50 +sizx8=800 +sizy8=600 +maxfps8=0 +initts8=0 +winver8=0 +maxres8=0 +swapeffect8=0 +maxddinterface8=7 +slowratio8=1 +title9=Glover +path9=D:\Games\Glover\glover.exe +launchpath9= +module9= +opengllib9= +notes9= +registry9= +ver9=0 +coord9=0 +flag9=203423778 +flagg9=1207959552 +flagh9=20 +flagi9=138412052 +flagj9=67113088 +flagk9=65536 +flagl9=0 +flagm9=0 +tflag9=-2147477245 +dflag9=0 +posx9=50 +posy9=50 +sizx9=800 +sizy9=600 +maxfps9=0 +initts9=0 +winver9=0 +maxres9=-1 +swapeffect9=0 +maxddinterface9=7 +slowratio9=2 +title10=Moonbase.exe +path10=D:\Games\MoonBase Commander\Moonbase.exe +launchpath10= +module10= +opengllib10= +notes10= +registry10= +ver10=0 +coord10=0 +flag10=-1465909134 +flagg10=1744963584 +flagh10=524308 +flagi10=138412036 +flagj10=-2147479424 +flagk10=272957440 +flagl10=0 +flagm10=0 +tflag10=-2147477237 +dflag10=0 +posx10=150 +posy10=150 +sizx10=800 +sizy10=600 +maxfps10=0 +initts10=0 +winver10=0 +maxres10=-1 +swapeffect10=0 +maxddinterface10=7 +slowratio10=2 +title11=Lode Runner 2 +path11=D:\Games\Lode Runner 2\LR2.exe +launchpath11= +module11= +opengllib11= +notes11= +registry11= +ver11=0 +coord11=0 +flag11=136319010 +flagg11=1744830592 +flagh11=20 +flagi11=138416132 +flagj11=4224 +flagk11=327680 +flagl11=4 +flagm11=0 +tflag11=-2147477245 +dflag11=0 +posx11=50 +posy11=50 +sizx11=800 +sizy11=600 +maxfps11=0 +initts11=0 +winver11=0 +maxres11=3 +swapeffect11=0 +maxddinterface11=7 +slowratio11=2 +title12=Patrician III +path12=D:\Games\Patrician III - Impero dei Mari\Patrician3.exe +launchpath12= +module12= +opengllib12= +notes12= +registry12= +ver12=0 +coord12=0 +flag12=681574434 +flagg12=1744830464 +flagh12=20 +flagi12=136314886 +flagj12=4224 +flagk12=65536 +flagl12=0 +flagm12=0 +tflag12=-2147477245 +dflag12=0 +posx12=50 +posy12=50 +sizx12=800 +sizy12=600 +maxfps12=0 +initts12=0 +winver12=0 +maxres12=-1 +swapeffect12=0 +maxddinterface12=7 +slowratio12=2 +title13=Need for Speed SE +path13=D:\NFSSE\NFS_WIN.EXE +launchpath13= +module13= +opengllib13= +notes13= +registry13= +ver13=0 +coord13=0 +flag13=136314978 +flagg13=2013266048 +flagh13=532 +flagi13=138412036 +flagj13=4224 +flagk13=65536 +flagl13=0 +flagm13=0 +tflag13=-2147477245 +dflag13=0 +posx13=50 +posy13=50 +sizx13=800 +sizy13=600 +maxfps13=0 +initts13=0 +winver13=0 +maxres13=-1 +swapeffect13=0 +maxddinterface13=7 +slowratio13=2 +title14=Imperialism II.exe +path14=D:\Games\Imperialism II - Age of Exploration (GOG)\Imperialism II.exe +launchpath14= +module14= +opengllib14= +notes14= +registry14= +ver14=0 +coord14=0 +flag14=136314914 +flagg14=1209008128 +flagh14=20 +flagi14=138412036 +flagj14=4224 +flagk14=1073807360 +flagl14=0 +flagm14=0 +tflag14=0 +dflag14=0 +posx14=50 +posy14=50 +sizx14=800 +sizy14=600 +maxfps14=0 +initts14=0 +winver14=0 +maxres14=-1 +swapeffect14=0 +maxddinterface14=7 +slowratio14=2 diff --git a/Release/filter.dll b/Release/filter.dll new file mode 100644 index 0000000..41f9d5a --- /dev/null +++ b/Release/filter.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d364d53ff922e8381c306d23d51c3a93a0512325824e5e0513c424e9372f9b4c +size 13312 diff --git a/Release/vcomp90.dll b/Release/vcomp90.dll new file mode 100644 index 0000000..71b9a14 --- /dev/null +++ b/Release/vcomp90.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9140efe26252b6329da254201219fc2d17a3f651e1591e32ae04c86a27e35bb2 +size 51024 diff --git a/build/dxwnd.dll b/build/dxwnd.dll index c451cc5..4790bdc 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c7943551fe966c9338314466a778a5b8116dbf776047162959a1403ad895a167 -size 652800 +oid sha256:1072541e0a7edd1b828cc7f0ea4aea38f4c8bddf9afbb732b583c11d066281ad +size 655360 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 8194b1e..75cb4f4 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1dfdcf69403a93563f73c0f77084c8c054b570c2c2681aa1323aa5d7d0c70ae0 -size 568320 +oid sha256:a96a88210c3088f48be0524d62bb5023d0ab66a3eff66817277a792e3ec210dd +size 568832 diff --git a/build/exports/American McGee's Alice.dxw b/build/exports/American McGee's Alice.dxw new file mode 100644 index 0000000..47f0044 --- /dev/null +++ b/build/exports/American McGee's Alice.dxw @@ -0,0 +1,31 @@ +[target] +title0=American McGee's Alice +path0=D:\Games\American McGee's Alice\alice.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=673194038 +flagg0=1208090624 +flagh0=21 +flagi0=136314884 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 diff --git a/build/exports/Cossacks II.dxw b/build/exports/Cossacks II.dxw new file mode 100644 index 0000000..b5dc5d7 --- /dev/null +++ b/build/exports/Cossacks II.dxw @@ -0,0 +1,31 @@ +[target] +title0=Cossacks II +path0=D:\Games\GSC Game World\Cossacks II\Data\engine.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=136314914 +flagg0=1744961536 +flagh0=21 +flagi0=138412036 +flagj0=4224 +flagk0=4259840 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 diff --git a/build/exports/F1 Manager 2000.dxw b/build/exports/F1 Manager 2000.dxw new file mode 100644 index 0000000..51245c5 --- /dev/null +++ b/build/exports/F1 Manager 2000.dxw @@ -0,0 +1,31 @@ +[target] +title0=F1 Manager 2000 +path0=D:\Games\F1 Manager\F1 Manager.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=681590818 +flagg0=1207959552 +flagh0=20 +flagi0=138420228 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 diff --git a/build/exports/Lode Runner 2.dxw b/build/exports/Lode Runner 2.dxw new file mode 100644 index 0000000..6d56009 --- /dev/null +++ b/build/exports/Lode Runner 2.dxw @@ -0,0 +1,31 @@ +[target] +title0=Lode Runner 2 +path0=D:\Games\Lode Runner 2\LR2.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=136319010 +flagg0=1744830592 +flagh0=20 +flagi0=138416132 +flagj0=4224 +flagk0=327680 +flagl0=4 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=3 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 diff --git a/build/exports/Microsoft Golf 1999 Edition.dxw b/build/exports/Microsoft Golf 1999 Edition.dxw index 5f1bda9..ffa9158 100644 --- a/build/exports/Microsoft Golf 1999 Edition.dxw +++ b/build/exports/Microsoft Golf 1999 Edition.dxw @@ -4,12 +4,12 @@ path0=D:\Games\Microsoft Golf 1999 Edition\game.exe launchpath0= module0= opengllib0= -notes0= -registry0=[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft]\n[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Games]\n[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Games\Golf '98]\n[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Games\Golf '98\Version 1.0 Demo]\n"AppPath"="D:\\Games\\MSGolf98\\MSGOLF98"\n"InstallType"="1"\n"InstallPath"="D:\\Games\\MSGolf98\\MSGOLF98\\"\n"CDPath"="D:\\Games\\MSGolf98\\MSGOLF98"\n"Launched"="1"\n"PID"=""\n"Path"="D:\\Games\\MSGolf98\\MSGOLF98"\n"VersionType"="TrialVersion"\n"InstalledGroup"="1"\n"LangID"=dword:00000009\n +notes0=Install instructions for Win7:\nRun setup from the cd with Win95 compatibility\nIf the setup copies 100% files but fails the final setting phase, \nedit the virtual registry settings.\nRemember to delete / rename the odious Backfill.exe before it requires you to \nrestart the pc....\n +registry0=[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft]\n[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Games]\n[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Games\Golf '99]\n[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Games\Golf '99\Version 1.0]\n"InstalledPATH"="D:\\Games\\Microsoft Golf 1999 Edition"\n"CDPath"="E:\\"\n"InstalledGroup"="1"\n ver0=0 coord0=0 flag0=136314914 -flagg0=-671088640 +flagg0=-134217728 flagh0=1302 flagi0=1212547076 flagj0=4224 diff --git a/build/exports/Need For Speed SE.dxw b/build/exports/Need For Speed SE.dxw new file mode 100644 index 0000000..354d933 --- /dev/null +++ b/build/exports/Need For Speed SE.dxw @@ -0,0 +1,31 @@ +[target] +title0=Need For Speed SE +path0=C:\NFSSE\NFS.EXE +launchpath0= +module0= +opengllib0= +notes0=Need For Speed Special Edition installation Notes:\n(tested on Win7 64-bit)\n\nYou can install the game using DOSBOX. Just make sure that the \nmounted CD drive in DOSBOX is using the same letter as your real CD\DVD drive.\ne.g. if your real CD/DVD drive letter is F:\nuse "mount f f:\ -t cdrom -ioctl"\ninstead off "mount d f:\ -t cdrom -ioctl"\n(the game will not start if it can not find the correct CD drive letter that is \nwritten to "C:\NFSSE\GAMEDATA\CONFIG\PATHS.DAT" by the installer)\n\nInstall using the Custom Install option and select all the checkboxes.\n(otherwise the game may have framerate issues streaming files from the CD)\n\nCopy NFS_WIN.EXE and IFORCE.DLL from the CD to your C:\NFSSE directory \nand rename NFS_WIN.EXE to NFS.EXE.\n\nThen you need to copy dplayx.dll to the C:\NFSSE directory from \n"C:\Windows\SysWOW64\dplayx.dll". Then rename this copy to dplay.dll.\n\nUsing Notepad make sure NFS.CFG reads:\nYESSOUND VIDEO ENGLISH NOREMOTE \n\nThe game should then run with this .dxw setup.\n +registry0= +ver0=0 +coord0=1 +flag0=136331362 +flagg0=1543503872 +flagh0=532 +flagi0=138413060 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 diff --git a/build/exports/Patrician III.dxw b/build/exports/Patrician III.dxw new file mode 100644 index 0000000..f2b0c29 --- /dev/null +++ b/build/exports/Patrician III.dxw @@ -0,0 +1,31 @@ +[target] +title0=Patrician III +path0=D:\Games\Patrician III - Impero dei Mari\Patrician3.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=681574434 +flagg0=1744830464 +flagh0=20 +flagi0=136314886 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 diff --git a/build/exports/Tanktics.dxw b/build/exports/Tanktics.dxw new file mode 100644 index 0000000..aba022e --- /dev/null +++ b/build/exports/Tanktics.dxw @@ -0,0 +1,31 @@ +[target] +title0=Tanktics +path0=D:\Games\tanktics\tanktics.exe +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=748683298 +flagg0=1744830464 +flagh0=20 +flagi0=-2008543232 +flagj0=4224 +flagk0=65536 +flagl0=513 +flagm0=0 +tflag0=0 +dflag0=0 +posx0=-9550 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=3 +swapeffect0=0 +maxddinterface0=6 +slowratio0=2 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 3387529..4d3b148 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -1117,3 +1117,10 @@ fix: fixed "CPU max usage" option fix: WindowFromPoint & WindowFromPointEx hooks fix: recovered partilly working implementation of "shared dc" mode add: "Suppress Win errors" option, needed to skip a blocking error and make "Migrosoft Golf '98" starting + +v2.03.70 +add: ddraw Overlay tracing (waiting to implement an emulation strategy) +add: SetWindowsHookExA logging, SetWindowsHookExW hooking +fix: MessageHook logging +GUI: some rearrangements / rationalizations to the interface +add: INIT24BPP and INIT32BPP flags diff --git a/dll/ddblit.cpp b/dll/ddblit.cpp index d1da846..6a59562 100644 --- a/dll/ddblit.cpp +++ b/dll/ddblit.cpp @@ -176,7 +176,8 @@ static HRESULT sBltToPrimary(int dxversion, Blt_Type pBlt, char *api, LPDIRECTDR // any blit operation! if(destrect.left == -32000) return DD_OK; // no blit on invisible window - if(!(lpddssrc || (dwflags & DDBLT_COLORFILL))) { + //if(!(lpddssrc || (dwflags & DDBLT_COLORFILL))) { + if((lpddssrc==0) && !(dwflags & DDBLT_COLORFILL)){ lpddssrc = dxwss.GetBackBufferSurface(); OutTraceDW("Flip: setting flip chain to lpdds=%x\n", lpddssrc); } diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index 940c02a..dcaef85 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -219,6 +219,16 @@ HRESULT WINAPI extUnlockDir2(LPDIRECTDRAWSURFACE, LPVOID); HRESULT WINAPI extUnlockDir3(LPDIRECTDRAWSURFACE, LPVOID); HRESULT WINAPI extUnlockDir4(LPDIRECTDRAWSURFACE, LPRECT); HRESULT WINAPI extUnlockDir7(LPDIRECTDRAWSURFACE, LPRECT); +HRESULT WINAPI extEnumOverlayZOrders1(LPDIRECTDRAWSURFACE, DWORD, LPVOID, LPDDENUMSURFACESCALLBACK); +HRESULT WINAPI extEnumOverlayZOrders2(LPDIRECTDRAWSURFACE, DWORD, LPVOID, LPDDENUMSURFACESCALLBACK); +HRESULT WINAPI extEnumOverlayZOrders3(LPDIRECTDRAWSURFACE, DWORD, LPVOID, LPDDENUMSURFACESCALLBACK); +HRESULT WINAPI extEnumOverlayZOrders4(LPDIRECTDRAWSURFACE, DWORD, LPVOID, LPDDENUMSURFACESCALLBACK); +HRESULT WINAPI extEnumOverlayZOrders7(LPDIRECTDRAWSURFACE, DWORD, LPVOID, LPDDENUMSURFACESCALLBACK); +HRESULT WINAPI extAddOverlayDirtyRect1(LPDIRECTDRAWSURFACE, LPRECT); +HRESULT WINAPI extAddOverlayDirtyRect2(LPDIRECTDRAWSURFACE, LPRECT); +HRESULT WINAPI extAddOverlayDirtyRect3(LPDIRECTDRAWSURFACE, LPRECT); +HRESULT WINAPI extAddOverlayDirtyRect4(LPDIRECTDRAWSURFACE, LPRECT); +HRESULT WINAPI extAddOverlayDirtyRect7(LPDIRECTDRAWSURFACE, LPRECT); HRESULT WINAPI extCreateSurface(int, CreateSurface_Type, LPDIRECTDRAW, DDSURFACEDESC2 *, LPDIRECTDRAWSURFACE *, void *); HRESULT WINAPI extSetSurfaceDesc3(LPDIRECTDRAWSURFACE, LPDDSURFACEDESC, DWORD); @@ -315,6 +325,8 @@ GetPixelFormat_Type pGetPixelFormat1, pGetPixelFormat2, pGetPixelFormat3, pGetPi GetSurfaceDesc_Type pGetSurfaceDesc1, pGetSurfaceDesc2, pGetSurfaceDesc3; GetSurfaceDesc2_Type pGetSurfaceDesc4, pGetSurfaceDesc7; Lock_Type pLock1, pLock2, pLock3, pLock4, pLock7; +EnumOverlayZOrders_Type pEnumOverlayZOrders1, pEnumOverlayZOrders2, pEnumOverlayZOrders3, pEnumOverlayZOrders4, pEnumOverlayZOrders7; +AddOverlayDirtyRect_Type pAddOverlayDirtyRect1, pAddOverlayDirtyRect2, pAddOverlayDirtyRect3, pAddOverlayDirtyRect4, pAddOverlayDirtyRect7; //Initialize IsLost_Type pIsLost; @@ -646,6 +658,8 @@ void InitScreenParameters(int dxversion) dxw.VirtualPixelFormat.dwRGBBitCount=CurrDevMode.dmBitsPerPel; // until set differently if(dxw.dwFlags2 & INIT8BPP) FixPixelFormat(8, &dxw.VirtualPixelFormat); if(dxw.dwFlags2 & INIT16BPP) FixPixelFormat(16, &dxw.VirtualPixelFormat); + if(dxw.dwFlags7 & INIT24BPP) FixPixelFormat(24, &dxw.VirtualPixelFormat); + if(dxw.dwFlags7 & INIT32BPP) FixPixelFormat(32, &dxw.VirtualPixelFormat); OutTraceDW("InitScreenParameters: dxversion=%d RGBBitCount=%d\n", dxversion, CurrDevMode.dmBitsPerPel); SetBltTransformations(dxversion); @@ -1220,10 +1234,12 @@ static void HookDDSurface(LPDIRECTDRAWSURFACE *lplpdds, int dxversion, BOOL isPr SetHook((void *)(**(DWORD **)lplpdds), extQueryInterfaceS1, (void **)&pQueryInterfaceS1, "QueryInterface(S1)"); SetHook((void *)(**(DWORD **)lplpdds + 8), extReleaseS1, (void **)&pReleaseS1, "Release(S1)"); SetHook((void *)(**(DWORD **)lplpdds + 12), extAddAttachedSurface1, (void **)&pAddAttachedSurface1, "AddAttachedSurface(S1)"); + SetHook((void *)(**(DWORD **)lplpdds + 16), extAddOverlayDirtyRect1, (void **)&pAddOverlayDirtyRect1, "AddOverlayDirtyRect(S1)"); SetHook((void *)(**(DWORD **)lplpdds + 28), extBltFast1, (void **)&pBltFast1, "BltFast(S1)"); SetHook((void *)(**(DWORD **)lplpdds + 20), extBlt1, (void **)&pBlt1, "Blt(S1)"); SetHook((void *)(**(DWORD **)lplpdds + 32), extDeleteAttachedSurface1, (void **)&pDeleteAttachedSurface1, "DeleteAttachedSurface(S1)"); SetHook((void *)(**(DWORD **)lplpdds + 36), extEnumAttachedSurfaces1, (void **)&pEnumAttachedSurfaces1, "EnumAttachedSurfaces(S1)"); + SetHook((void *)(**(DWORD **)lplpdds + 40), extEnumOverlayZOrders1, (void **)&pEnumOverlayZOrders1, "EnumOverlayZOrders(S1)"); SetHook((void *)(**(DWORD **)lplpdds + 44), extFlip1, (void **)&pFlip1, "Flip(S1)"); SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface1, (void **)&pGetAttachedSurface1, "GetAttachedSurface(S1)"); SetHook((void *)(**(DWORD **)lplpdds + 56), extGetCaps1S, (void **)&pGetCaps1S, "GetCaps(S1)"); @@ -1241,10 +1257,12 @@ static void HookDDSurface(LPDIRECTDRAWSURFACE *lplpdds, int dxversion, BOOL isPr SetHook((void *)(**(DWORD **)lplpdds), extQueryInterfaceS2, (void **)&pQueryInterfaceS2, "QueryInterface(S2)"); SetHook((void *)(**(DWORD **)lplpdds + 8), extReleaseS2, (void **)&pReleaseS2, "Release(S2)"); SetHook((void *)(**(DWORD **)lplpdds + 12), extAddAttachedSurface2, (void **)&pAddAttachedSurface2, "AddAttachedSurface(S2)"); + SetHook((void *)(**(DWORD **)lplpdds + 16), extAddOverlayDirtyRect2, (void **)&pAddOverlayDirtyRect2, "AddOverlayDirtyRect(S2)"); SetHook((void *)(**(DWORD **)lplpdds + 28), extBltFast2, (void **)&pBltFast2, "BltFast(S2)"); SetHook((void *)(**(DWORD **)lplpdds + 20), extBlt2, (void **)&pBlt2, "Blt(S2)"); SetHook((void *)(**(DWORD **)lplpdds + 32), extDeleteAttachedSurface2, (void **)&pDeleteAttachedSurface2, "DeleteAttachedSurface(S2)"); SetHook((void *)(**(DWORD **)lplpdds + 36), extEnumAttachedSurfaces2, (void **)&pEnumAttachedSurfaces2, "EnumAttachedSurfaces(S2)"); + SetHook((void *)(**(DWORD **)lplpdds + 40), extEnumOverlayZOrders2, (void **)&pEnumOverlayZOrders2, "EnumOverlayZOrders(S2)"); SetHook((void *)(**(DWORD **)lplpdds + 44), extFlip2, (void **)&pFlip2, "Flip(S2)"); SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface2, (void **)&pGetAttachedSurface2, "GetAttachedSurface(S2)"); SetHook((void *)(**(DWORD **)lplpdds + 56), extGetCaps2S, (void **)&pGetCaps2S, "GetCaps(S2)"); @@ -1262,10 +1280,12 @@ static void HookDDSurface(LPDIRECTDRAWSURFACE *lplpdds, int dxversion, BOOL isPr SetHook((void *)(**(DWORD **)lplpdds), extQueryInterfaceS3, (void **)&pQueryInterfaceS3, "QueryInterface(S3)"); SetHook((void *)(**(DWORD **)lplpdds + 8), extReleaseS3, (void **)&pReleaseS3, "Release(S3)"); SetHook((void *)(**(DWORD **)lplpdds + 12), extAddAttachedSurface3, (void **)&pAddAttachedSurface3, "AddAttachedSurface(S3)"); + SetHook((void *)(**(DWORD **)lplpdds + 16), extAddOverlayDirtyRect3, (void **)&pAddOverlayDirtyRect3, "AddOverlayDirtyRect(S3)"); SetHook((void *)(**(DWORD **)lplpdds + 28), extBltFast3, (void **)&pBltFast3, "BltFast(S3)"); SetHook((void *)(**(DWORD **)lplpdds + 20), extBlt3, (void **)&pBlt3, "Blt(S1)"); SetHook((void *)(**(DWORD **)lplpdds + 32), extDeleteAttachedSurface3, (void **)&pDeleteAttachedSurface3, "DeleteAttachedSurface(S3)"); SetHook((void *)(**(DWORD **)lplpdds + 36), extEnumAttachedSurfaces3, (void **)&pEnumAttachedSurfaces3, "EnumAttachedSurfaces(S3)"); + SetHook((void *)(**(DWORD **)lplpdds + 40), extEnumOverlayZOrders3, (void **)&pEnumOverlayZOrders3, "EnumOverlayZOrders(S3)"); SetHook((void *)(**(DWORD **)lplpdds + 44), extFlip3, (void **)&pFlip3, "Flip(S3)"); SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface3, (void **)&pGetAttachedSurface3, "GetAttachedSurface(S3)"); SetHook((void *)(**(DWORD **)lplpdds + 56), extGetCaps3S, (void **)&pGetCaps3S, "GetCaps(S3)"); @@ -1285,10 +1305,12 @@ static void HookDDSurface(LPDIRECTDRAWSURFACE *lplpdds, int dxversion, BOOL isPr SetHook((void *)(**(DWORD **)lplpdds), extQueryInterfaceS4, (void **)&pQueryInterfaceS4, "QueryInterface(S4)"); SetHook((void *)(**(DWORD **)lplpdds + 8), extReleaseS4, (void **)&pReleaseS4, "Release(S4)"); SetHook((void *)(**(DWORD **)lplpdds + 12), extAddAttachedSurface4, (void **)&pAddAttachedSurface4, "AddAttachedSurface(S4)"); + SetHook((void *)(**(DWORD **)lplpdds + 16), extAddOverlayDirtyRect4, (void **)&pAddOverlayDirtyRect4, "AddOverlayDirtyRect(S4)"); SetHook((void *)(**(DWORD **)lplpdds + 28), extBltFast4, (void **)&pBltFast4, "BltFast(S4)"); SetHook((void *)(**(DWORD **)lplpdds + 20), extBlt4, (void **)&pBlt4, "Blt(S1)"); SetHook((void *)(**(DWORD **)lplpdds + 32), extDeleteAttachedSurface4, (void **)&pDeleteAttachedSurface4, "DeleteAttachedSurface(S4)"); SetHook((void *)(**(DWORD **)lplpdds + 36), extEnumAttachedSurfaces4, (void **)&pEnumAttachedSurfaces4, "EnumAttachedSurfaces(S4)"); + SetHook((void *)(**(DWORD **)lplpdds + 40), extEnumOverlayZOrders4, (void **)&pEnumOverlayZOrders4, "EnumOverlayZOrders(S4)"); SetHook((void *)(**(DWORD **)lplpdds + 44), extFlip4, (void **)&pFlip4, "Flip(S4)"); SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface4, (void **)&pGetAttachedSurface4, "GetAttachedSurface(S4)"); SetHook((void *)(**(DWORD **)lplpdds + 56), extGetCaps4S, (void **)&pGetCaps4S, "GetCaps(S4)"); @@ -1308,10 +1330,12 @@ static void HookDDSurface(LPDIRECTDRAWSURFACE *lplpdds, int dxversion, BOOL isPr SetHook((void *)(**(DWORD **)lplpdds), extQueryInterfaceS7, (void **)&pQueryInterfaceS7, "QueryInterface(S7)"); SetHook((void *)(**(DWORD **)lplpdds + 8), extReleaseS7, (void **)&pReleaseS7, "Release(S7)"); SetHook((void *)(**(DWORD **)lplpdds + 12), extAddAttachedSurface7, (void **)&pAddAttachedSurface7, "AddAttachedSurface(S7)"); + SetHook((void *)(**(DWORD **)lplpdds + 16), extAddOverlayDirtyRect7, (void **)&pAddOverlayDirtyRect7, "AddOverlayDirtyRect(S7)"); SetHook((void *)(**(DWORD **)lplpdds + 28), extBltFast7, (void **)&pBltFast7, "BltFast(S7)"); SetHook((void *)(**(DWORD **)lplpdds + 20), extBlt7, (void **)&pBlt7, "Blt(S1)"); SetHook((void *)(**(DWORD **)lplpdds + 32), extDeleteAttachedSurface7, (void **)&pDeleteAttachedSurface7, "DeleteAttachedSurface(S7)"); SetHook((void *)(**(DWORD **)lplpdds + 36), extEnumAttachedSurfaces7, (void **)&pEnumAttachedSurfaces7, "EnumAttachedSurfaces(S7)"); + SetHook((void *)(**(DWORD **)lplpdds + 40), extEnumOverlayZOrders7, (void **)&pEnumOverlayZOrders7, "EnumOverlayZOrders(S7)"); SetHook((void *)(**(DWORD **)lplpdds + 44), extFlip7, (void **)&pFlip7, "Flip(S7)"); SetHook((void *)(**(DWORD **)lplpdds + 48), extGetAttachedSurface7, (void **)&pGetAttachedSurface7, "GetAttachedSurface(S7)"); SetHook((void *)(**(DWORD **)lplpdds + 56), extGetCaps7S, (void **)&pGetCaps7S, "GetCaps(S7)"); @@ -1465,6 +1489,8 @@ static void HandleCapsD(char *sLabel, LPDDCAPS c) c->dwCKeyCaps, ExplainDDCKeyCaps(c->dwCKeyCaps)); OutTraceDDRAW("GetCaps(%s): VidMemTotal=%x VidMemFree=%x ZBufferBitDepths=%x(%s)\n", sLabel, c->dwVidMemTotal, c->dwVidMemFree, c->dwZBufferBitDepths, ExplainZBufferBitDepths(c->dwZBufferBitDepths)); + OutTraceDDRAW("GetCaps(%s): MaxVisibleOverlays=%x CurrVisibleOverlays=%x\n", + sLabel, c->dwMaxVisibleOverlays, c->dwCurrVisibleOverlays); if(dxw.dwFlags2 & LIMITRESOURCES){ // check for memory value overflow const DWORD dwMaxMem = 0x70000000; if(c->dwVidMemTotal > dwMaxMem) c->dwVidMemTotal = dwMaxMem; @@ -1530,6 +1556,14 @@ static HRESULT WINAPI extGetCapsD(int dxversion, GetCapsD_Type pGetCapsD, LPDIRE if(dxw.dwFlags3 & CAPMASK) MaskCapsD(c1, c2); + if(dxw.dwFlags7 & SUPPRESSOVERLAY){ +#define LAYERCAPS (DDCAPS_OVERLAY|DDCAPS_OVERLAYCANTCLIP|DDCAPS_OVERLAYFOURCC|DDCAPS_OVERLAYSTRETCH) + c1->ddsCaps.dwCaps &= ~LAYERCAPS; + c2->ddsCaps.dwCaps &= ~LAYERCAPS; + c1->dwMaxVisibleOverlays = c1->dwCurrVisibleOverlays = 0; + c2->dwMaxVisibleOverlays = c2->dwCurrVisibleOverlays = 0; + } + return res; } @@ -2080,9 +2114,11 @@ HRESULT WINAPI extGetDisplayMode(GetDisplayMode_Type pGetDisplayMode, LPDIRECTDR lpddsd->dwHeight = dxw.GetScreenHeight(); // v2.1.96: fake screen color depth - if(dxw.dwFlags2 & (INIT8BPP|INIT16BPP)){ // v2.02.32 fix + if((dxw.dwFlags2 & (INIT8BPP|INIT16BPP)) || (dxw.dwFlags7 & (INIT24BPP|INIT32BPP))){ // v2.02.32 fix if(dxw.dwFlags2 & INIT8BPP) FixPixelFormat(8, &lpddsd->ddpfPixelFormat); if(dxw.dwFlags2 & INIT16BPP) FixPixelFormat(16, &lpddsd->ddpfPixelFormat); + if(dxw.dwFlags7 & INIT24BPP) FixPixelFormat(24, &lpddsd->ddpfPixelFormat); + if(dxw.dwFlags7 & INIT32BPP) FixPixelFormat(32, &lpddsd->ddpfPixelFormat); OutTraceDW("GetDisplayMode: fix RGBBitCount=%d\n", lpddsd->ddpfPixelFormat.dwRGBBitCount); } } @@ -5759,3 +5795,49 @@ HRESULT WINAPI extDirectDrawCreateClipper(DWORD dwFlags, LPDIRECTDRAWCLIPPER *lp HookDDClipper(lplpDDClipper); return res; } + +HRESULT WINAPI extEnumOverlayZOrders(int dxversion, EnumOverlayZOrders_Type pEnumOverlayZOrders, LPDIRECTDRAWSURFACE lpdds, DWORD dwFlags, LPVOID lpContext, LPDDENUMSURFACESCALLBACK lpfnCallback) +{ + HRESULT res; + OutTrace("EnumOverlayZOrders(%d): lpdds=%x flags=%x(%s)\n", dxversion, lpdds, dwFlags, dwFlags?"FRONTTOBACK":"BACKTOFRONT"); + res = (*pEnumOverlayZOrders)(lpdds, dwFlags, lpContext, lpfnCallback); + OutTrace("EnumOverlayZOrders: res=%x(%s)\n", res, ExplainDDError(res)); + return res; +} + +HRESULT WINAPI extEnumOverlayZOrders1(LPDIRECTDRAWSURFACE lpdds, DWORD dwFlags, LPVOID lpContext, LPDDENUMSURFACESCALLBACK lpfnCallback) +{ return extEnumOverlayZOrders(1, pEnumOverlayZOrders1, lpdds, dwFlags, lpContext, lpfnCallback); } +HRESULT WINAPI extEnumOverlayZOrders2(LPDIRECTDRAWSURFACE lpdds, DWORD dwFlags, LPVOID lpContext, LPDDENUMSURFACESCALLBACK lpfnCallback) +{ return extEnumOverlayZOrders(2, pEnumOverlayZOrders2, lpdds, dwFlags, lpContext, lpfnCallback); } +HRESULT WINAPI extEnumOverlayZOrders3(LPDIRECTDRAWSURFACE lpdds, DWORD dwFlags, LPVOID lpContext, LPDDENUMSURFACESCALLBACK lpfnCallback) +{ return extEnumOverlayZOrders(3, pEnumOverlayZOrders3, lpdds, dwFlags, lpContext, lpfnCallback); } +HRESULT WINAPI extEnumOverlayZOrders4(LPDIRECTDRAWSURFACE lpdds, DWORD dwFlags, LPVOID lpContext, LPDDENUMSURFACESCALLBACK lpfnCallback) +{ return extEnumOverlayZOrders(4, pEnumOverlayZOrders4, lpdds, dwFlags, lpContext, lpfnCallback); } +HRESULT WINAPI extEnumOverlayZOrders7(LPDIRECTDRAWSURFACE lpdds, DWORD dwFlags, LPVOID lpContext, LPDDENUMSURFACESCALLBACK lpfnCallback) +{ return extEnumOverlayZOrders(7, pEnumOverlayZOrders7, lpdds, dwFlags, lpContext, lpfnCallback); } + +HRESULT WINAPI extAddOverlayDirtyRect(int dxversion, AddOverlayDirtyRect_Type pAddOverlayDirtyRect, LPDIRECTDRAWSURFACE lpdds, LPRECT lpRect) +{ + HRESULT res; + char sInfo[128]; + if (lpRect) + sprintf(sInfo, "(%d,%d)-(%d,%d)", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); + else + sprintf(sInfo, "(NULL)"); + + OutTrace("AddOverlayDirtyRect(%d): lpdds=%x rect=%s\n", dxversion, lpdds, sInfo); + res=(*pAddOverlayDirtyRect)(lpdds, lpRect); + OutTrace("AddOverlayDirtyRect: res=%x(%s)\n", res, ExplainDDError(res)); + return res; +} + +HRESULT WINAPI extAddOverlayDirtyRect1(LPDIRECTDRAWSURFACE lpdds, LPRECT lpRect) +{ return extAddOverlayDirtyRect(1, pAddOverlayDirtyRect1, lpdds, lpRect); } +HRESULT WINAPI extAddOverlayDirtyRect2(LPDIRECTDRAWSURFACE lpdds, LPRECT lpRect) +{ return extAddOverlayDirtyRect(2, pAddOverlayDirtyRect2, lpdds, lpRect); } +HRESULT WINAPI extAddOverlayDirtyRect3(LPDIRECTDRAWSURFACE lpdds, LPRECT lpRect) +{ return extAddOverlayDirtyRect(3, pAddOverlayDirtyRect3, lpdds, lpRect); } +HRESULT WINAPI extAddOverlayDirtyRect4(LPDIRECTDRAWSURFACE lpdds, LPRECT lpRect) +{ return extAddOverlayDirtyRect(4, pAddOverlayDirtyRect4, lpdds, lpRect); } +HRESULT WINAPI extAddOverlayDirtyRect7(LPDIRECTDRAWSURFACE lpdds, LPRECT lpRect) +{ return extAddOverlayDirtyRect(7, pAddOverlayDirtyRect7, lpdds, lpRect); } diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 5d61bac..a449987 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -127,7 +127,7 @@ static char *Flag6Names[32]={ static char *Flag7Names[32]={ "LIMITDDRAW", "DISABLEDISABLEALTTAB", "FIXCLIPPERAREA", "HOOKDIRECTSOUND", "HOOKSMACKW32", "BLOCKPRIORITYCLASS", "CPUSLOWDOWN", "CPUMAXUSAGE", - "", "", "", "", + "NOWINERRORS", "SUPPRESSOVERLAY", "INIT24BPP", "INIT32BPP", "", "", "", "", "", "", "", "", "", "", "", "", @@ -1312,14 +1312,6 @@ void HookInit(TARGETMAP *target, HWND hwnd) if (dxw.dwFlags7 & CPUMAXUSAGE) OutTrace("HookInit: CPU maxusage ratio 1:%d\n", dxw.SlowRatio); } - { - // Beware: for some strange & mysterious reason, this call makes Warcraft II and other games - // work better, avoiding something that resembles a black palette (no blit errors, but the - // whole screen black!!) and an AERO rupture. - PIXELFORMATDESCRIPTOR pfd; - DescribePixelFormat(GetDC(GetDesktopWindow()), 1, sizeof(PIXELFORMATDESCRIPTOR), &pfd); - } - if (hwnd && IsDebug){ DWORD dwStyle, dwExStyle; char ClassName[81]; @@ -1425,8 +1417,8 @@ void HookInit(TARGETMAP *target, HWND hwnd) if (dxw.dwFlags1 & MESSAGEPROC){ extern HINSTANCE hInst; typedef HHOOK (WINAPI *SetWindowsHookEx_Type)(int, HOOKPROC, HINSTANCE, DWORD); - extern SetWindowsHookEx_Type pSetWindowsHookEx; - hMouseHook=(*pSetWindowsHookEx)(WH_GETMESSAGE, MessageHook, hInst, GetCurrentThreadId()); + extern SetWindowsHookEx_Type pSetWindowsHookExA; + hMouseHook=(*pSetWindowsHookExA)(WH_GETMESSAGE, MessageHook, hInst, GetCurrentThreadId()); if(hMouseHook==NULL) OutTraceE("SetWindowsHookEx WH_GETMESSAGE failed: error=%d\n", GetLastError()); } diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index a7ee597..77bb028 100644 --- a/dll/dxwnd.cpp +++ b/dll/dxwnd.cpp @@ -27,7 +27,7 @@ along with this program. If not, see . #include "TlHelp32.h" -#define VERSION "2.03.69" +#define VERSION "2.03.70" #define DDTHREADLOCK 1 //#define LOCKTHREADS diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 273bf64efdf465af2774a7a8bf2bd9069f7b50a8..d7efafe718c127b8ced5f887b9ace13794030eec 100644 GIT binary patch delta 59735 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�iFuY#$56*h_8~yHkwa^ImBD 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 Z(fVa`)pMgtZc6Sfoze2bPob!K{|oM)9UTAw delta 8452 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, msg->message, ExplainWinMessage(msg->message), msg->wParam, msg->pt.x, msg->pt.y); + OutTraceC("MessageHook: hwnd=%x message=%d(%s) remove=%d params=(L:%x,R:%x) pt=(%d,%d)\n", + msg->hwnd, msg->message, ExplainWinMessage(msg->message), wParam, msg->lParam, msg->wParam, msg->pt.x, msg->pt.y); switch(msg->message){ case WM_ENTERSIZEMOVE: SizeMoving = TRUE; break; @@ -43,8 +54,11 @@ LRESULT CALLBACK MessageHook(int code, WPARAM wParam, LPARAM lParam) // fix the message point coordinates POINT upleft={0,0}; POINT pt; - // v2.03.36: offset to be calculated from target window - (*pClientToScreen)(msg->hwnd, &upleft); + HWND hwnd; + // v2.03.36: offset to be calculated from target window + // v2-03.70: unless is a thread message (hwnd == NULL) !! + hwnd=(msg->hwnd)?msg->hwnd:dxw.GethWnd(); + (*pClientToScreen)(hwnd, &upleft); pt = msg->pt; pt = dxw.SubCoordinates(pt, upleft); pt=dxw.FixCursorPos(pt); diff --git a/dll/user32.09.cpp b/dll/user32.09.cpp deleted file mode 100644 index 61dc1fe..0000000 --- a/dll/user32.09.cpp +++ /dev/null @@ -1,3302 +0,0 @@ -#define _WIN32_WINNT 0x0600 -#define WIN32_LEAN_AND_MEAN -#define _CRT_SECURE_NO_WARNINGS -#define _CRT_NON_CONFORMING_SWPRINTFS - -#include -#include -#include "dxwnd.h" -#include "dxwcore.hpp" -#include "syslibs.h" -#include "dxhook.h" -#include "hddraw.h" -#include "dxhelper.h" -#include "shareddc.hpp" - -#define FIXCHILDSIZE FALSE - -BOOL IsChangeDisplaySettingsHotPatched = FALSE; -extern BOOL bFlippedDC; -extern HDC hFlippedDC; - -//typedef BOOL (WINAPI *EnumDisplayMonitors_Type)(HDC, LPCRECT, MONITORENUMPROC, LPARAM); -//EnumDisplayMonitors_Type pEnumDisplayMonitors = NULL; -//BOOL WINAPI extEnumDisplayMonitors(HDC, LPCRECT, MONITORENUMPROC, LPARAM); - -typedef BOOL (WINAPI *BringWindowToTop_Type)(HWND); -BringWindowToTop_Type pBringWindowToTop = NULL; -BOOL WINAPI extBringWindowToTop(HWND); -typedef BOOL (WINAPI *SetForegroundWindow_Type)(HWND); -SetForegroundWindow_Type pSetForegroundWindow = NULL; -BOOL WINAPI extSetForegroundWindow(HWND); -typedef HHOOK (WINAPI *SetWindowsHookEx_Type)(int, HOOKPROC, HINSTANCE, DWORD); -SetWindowsHookEx_Type pSetWindowsHookEx = NULL; -HHOOK WINAPI extSetWindowsHookEx(int, HOOKPROC, HINSTANCE, DWORD); -typedef BOOL (WINAPI *PostMessageA_Type)(HWND, UINT, WPARAM, LPARAM); -PostMessageA_Type pPostMessageA = NULL; -BOOL WINAPI extPostMessageA(HWND, UINT, WPARAM, LPARAM); -typedef HRESULT (WINAPI *MessageBoxTimeoutA_Type)(HWND, LPCSTR, LPCSTR, UINT, WORD, DWORD); -MessageBoxTimeoutA_Type pMessageBoxTimeoutA = NULL; -HRESULT WINAPI extMessageBoxTimeoutA(HWND, LPCSTR, LPCSTR, UINT, WORD, DWORD); -typedef HRESULT (WINAPI *MessageBoxTimeoutW_Type)(HWND, LPCWSTR, LPCWSTR, UINT, WORD, DWORD); -MessageBoxTimeoutW_Type pMessageBoxTimeoutW = NULL; -HRESULT WINAPI extMessageBoxTimeoutW(HWND, LPCWSTR, LPCWSTR, UINT, WORD, DWORD); -typedef BOOL (WINAPI *IsIconic_Type)(HWND); -IsIconic_Type pIsIconic = NULL; -BOOL WINAPI extIsIconic(HWND); -typedef BOOL (WINAPI *IsZoomed_Type)(HWND); -IsZoomed_Type pIsZoomed = NULL; -BOOL WINAPI extIsZoomed(HWND); -typedef HDESK (WINAPI *CreateDesktop_Type)(LPCTSTR, LPCTSTR, DEVMODE *, DWORD, ACCESS_MASK, LPSECURITY_ATTRIBUTES); -CreateDesktop_Type pCreateDesktop = NULL; -HDESK WINAPI extCreateDesktop(LPCTSTR, LPCTSTR, DEVMODE *, DWORD, ACCESS_MASK, LPSECURITY_ATTRIBUTES); -typedef BOOL (WINAPI *SwitchDesktop_Type)(HDESK); -SwitchDesktop_Type pSwitchDesktop = NULL; -BOOL WINAPI extSwitchDesktop(HDESK); -typedef HDESK (WINAPI *OpenDesktop_Type)(LPTSTR, DWORD, BOOL, ACCESS_MASK); -OpenDesktop_Type pOpenDesktop = NULL; -HDESK WINAPI extOpenDesktop(LPTSTR, DWORD, BOOL, ACCESS_MASK); -typedef BOOL (WINAPI *CloseDesktop_Type)(HDESK); -CloseDesktop_Type pCloseDesktop = NULL; -BOOL WINAPI extCloseDesktop(HDESK); -typedef int (WINAPI *ValidateRect_Type)(HWND, const RECT *); -ValidateRect_Type pValidateRect = NULL; -int WINAPI extValidateRect(HWND, const RECT *); -typedef BOOL (WINAPI *ScrollWindow_Type)(HWND, int, int, const RECT *, const RECT *); -ScrollWindow_Type pScrollWindow = NULL; -BOOL extScrollWindow(HWND, int, int, const RECT *, const RECT *); -typedef INT_PTR (WINAPI *DialogBoxParamA_Type)(HINSTANCE, LPCTSTR, HWND, DLGPROC, LPARAM); -DialogBoxParamA_Type pDialogBoxParamA = NULL; -INT_PTR WINAPI extDialogBoxParamA(HINSTANCE, LPCTSTR, HWND, DLGPROC, LPARAM); -typedef HWND (WINAPI *GetParent_Type)(HWND); -GetParent_Type pGetParent = NULL; -HWND WINAPI extGetParent(HWND); -typedef BOOL (WINAPI *InvalidateRgn_Type)(HWND, HRGN, BOOL); -InvalidateRgn_Type pInvalidateRgn = NULL; -BOOL WINAPI extInvalidateRgn(HWND, HRGN, BOOL); -typedef BOOL (WINAPI *InvertRect_Type)(HDC, const RECT *); -InvertRect_Type pInvertRect = NULL; -BOOL WINAPI extInvertRect(HDC, const RECT *); -typedef BOOL (WINAPI *ScrollDC_Type)(HDC, int, int, const RECT *, const RECT *, HRGN, LPRECT); -ScrollDC_Type pScrollDC = NULL; -BOOL WINAPI extScrollDC(HDC, int, int, const RECT *, const RECT *, HRGN, LPRECT); - -#ifdef TRACEPALETTE -typedef UINT (WINAPI *GetDIBColorTable_Type)(HDC, UINT, UINT, RGBQUAD *); -GetDIBColorTable_Type pGetDIBColorTable = NULL; -UINT WINAPI extGetDIBColorTable(HDC, UINT, UINT, RGBQUAD *); -typedef UINT (WINAPI *SetDIBColorTable_Type)(HDC, UINT, UINT, const RGBQUAD *); -SetDIBColorTable_Type pSetDIBColorTable = NULL; -UINT WINAPI extSetDIBColorTable(HDC, UINT, UINT, const RGBQUAD *); -#endif - -static HookEntry_Type Hooks[]={ - {HOOK_IAT_CANDIDATE, "UpdateWindow", (FARPROC)NULL, (FARPROC *)&pUpdateWindow, (FARPROC)extUpdateWindow}, - //{HOOK_IAT_CANDIDATE, "GetWindowPlacement", (FARPROC)NULL, (FARPROC *)&pGetWindowPlacement, (FARPROC)extGetWindowPlacement}, - //{HOOK_IAT_CANDIDATE, "SetWindowPlacement", (FARPROC)NULL, (FARPROC *)&pSetWindowPlacement, (FARPROC)extSetWindowPlacement}, - {HOOK_HOT_CANDIDATE, "ChangeDisplaySettingsA", (FARPROC)ChangeDisplaySettingsA, (FARPROC *)&pChangeDisplaySettingsA, (FARPROC)extChangeDisplaySettingsA}, - {HOOK_HOT_CANDIDATE, "ChangeDisplaySettingsExA", (FARPROC)ChangeDisplaySettingsExA, (FARPROC *)&pChangeDisplaySettingsExA, (FARPROC)extChangeDisplaySettingsExA}, - {HOOK_HOT_CANDIDATE, "ChangeDisplaySettingsW", (FARPROC)NULL, (FARPROC *)&pChangeDisplaySettingsW, (FARPROC)extChangeDisplaySettingsW}, // ref. by Knights of Honor - {HOOK_HOT_CANDIDATE, "ChangeDisplaySettingsExW", (FARPROC)NULL, (FARPROC *)&pChangeDisplaySettingsExW, (FARPROC)extChangeDisplaySettingsExW}, - {HOOK_HOT_CANDIDATE, "GetMonitorInfoA", (FARPROC)GetMonitorInfoA, (FARPROC *)&pGetMonitorInfoA, (FARPROC)extGetMonitorInfoA}, - {HOOK_HOT_CANDIDATE, "GetMonitorInfoW", (FARPROC)GetMonitorInfoW, (FARPROC *)&pGetMonitorInfoW, (FARPROC)extGetMonitorInfoW}, - {HOOK_HOT_CANDIDATE, "ShowCursor", (FARPROC)ShowCursor, (FARPROC *)&pShowCursor, (FARPROC)extShowCursor}, - {HOOK_IAT_CANDIDATE, "CreateDialogIndirectParamA", (FARPROC)CreateDialogIndirectParamA, (FARPROC *)&pCreateDialogIndirectParam, (FARPROC)extCreateDialogIndirectParam}, - {HOOK_IAT_CANDIDATE, "CreateDialogParamA", (FARPROC)CreateDialogParamA, (FARPROC *)&pCreateDialogParam, (FARPROC)extCreateDialogParam}, - {HOOK_IAT_CANDIDATE, "MoveWindow", (FARPROC)MoveWindow, (FARPROC *)&pMoveWindow, (FARPROC)extMoveWindow}, - {HOOK_HOT_CANDIDATE, "EnumDisplaySettingsA", (FARPROC)EnumDisplaySettingsA, (FARPROC *)&pEnumDisplaySettings, (FARPROC)extEnumDisplaySettings}, - {HOOK_IAT_CANDIDATE, "GetClipCursor", (FARPROC)GetClipCursor, (FARPROC*)&pGetClipCursor, (FARPROC)extGetClipCursor}, - {HOOK_IAT_CANDIDATE, "ClipCursor", (FARPROC)ClipCursor, (FARPROC *)&pClipCursor, (FARPROC)extClipCursor}, - {HOOK_IAT_CANDIDATE, "DefWindowProcA", (FARPROC)DefWindowProcA, (FARPROC *)&pDefWindowProcA, (FARPROC)extDefWindowProcA}, - {HOOK_IAT_CANDIDATE, "DefWindowProcW", (FARPROC)DefWindowProcW, (FARPROC *)&pDefWindowProcW, (FARPROC)extDefWindowProcW}, - {HOOK_HOT_CANDIDATE, "CreateWindowExA", (FARPROC)CreateWindowExA, (FARPROC *)&pCreateWindowExA, (FARPROC)extCreateWindowExA}, - {HOOK_HOT_CANDIDATE, "CreateWindowExW", (FARPROC)CreateWindowExW, (FARPROC *)&pCreateWindowExW, (FARPROC)extCreateWindowExW}, - {HOOK_IAT_CANDIDATE, "RegisterClassExA", (FARPROC)RegisterClassExA, (FARPROC *)&pRegisterClassExA, (FARPROC)extRegisterClassExA}, - {HOOK_IAT_CANDIDATE, "RegisterClassA", (FARPROC)RegisterClassA, (FARPROC *)&pRegisterClassA, (FARPROC)extRegisterClassA}, - {HOOK_HOT_CANDIDATE, "GetSystemMetrics", (FARPROC)GetSystemMetrics, (FARPROC *)&pGetSystemMetrics, (FARPROC)extGetSystemMetrics}, - {HOOK_HOT_CANDIDATE, "GetDesktopWindow", (FARPROC)GetDesktopWindow, (FARPROC *)&pGetDesktopWindow, (FARPROC)extGetDesktopWindow}, - {HOOK_IAT_CANDIDATE, "CloseWindow", (FARPROC)NULL, (FARPROC *)&pCloseWindow, (FARPROC)extCloseWindow}, - {HOOK_IAT_CANDIDATE, "DestroyWindow", (FARPROC)NULL, (FARPROC *)&pDestroyWindow, (FARPROC)extDestroyWindow}, - {HOOK_IAT_CANDIDATE, "SetSysColors", (FARPROC)NULL, (FARPROC *)&pSetSysColors, (FARPROC)extSetSysColors}, - {HOOK_IAT_CANDIDATE, "SetCapture", (FARPROC)NULL, (FARPROC *)&pSetCapture, (FARPROC)extSetCapture}, - {HOOK_HOT_CANDIDATE, "SetWindowLongA", (FARPROC)SetWindowLongA, (FARPROC *)&pSetWindowLongA, (FARPROC)extSetWindowLongA}, - {HOOK_HOT_CANDIDATE, "GetWindowLongA", (FARPROC)GetWindowLongA, (FARPROC *)&pGetWindowLongA, (FARPROC)extGetWindowLongA}, - {HOOK_HOT_CANDIDATE, "SetWindowLongW", (FARPROC)SetWindowLongW, (FARPROC *)&pSetWindowLongW, (FARPROC)extSetWindowLongW}, - {HOOK_HOT_CANDIDATE, "GetWindowLongW", (FARPROC)GetWindowLongW, (FARPROC *)&pGetWindowLongW, (FARPROC)extGetWindowLongW}, - {HOOK_IAT_CANDIDATE, "IsWindowVisible", (FARPROC)NULL, (FARPROC *)&pIsWindowVisible, (FARPROC)extIsWindowVisible}, - // hot by MinHook since v2.03.07 - {HOOK_HOT_CANDIDATE, "SystemParametersInfoA", (FARPROC)SystemParametersInfoA, (FARPROC *)&pSystemParametersInfoA, (FARPROC)extSystemParametersInfoA}, - {HOOK_HOT_CANDIDATE, "SystemParametersInfoW", (FARPROC)SystemParametersInfoW, (FARPROC *)&pSystemParametersInfoW, (FARPROC)extSystemParametersInfoW}, - //{HOOK_HOT_CANDIDATE, "GetActiveWindow", (FARPROC)NULL, (FARPROC *)&pGetActiveWindow, (FARPROC)extGetActiveWindow}, - //{HOOK_HOT_CANDIDATE, "GetForegroundWindow", (FARPROC)GetForegroundWindow, (FARPROC *)&pGetForegroundWindow, (FARPROC)extGetForegroundWindow}, - //{HOOK_IAT_CANDIDATE, "GetWindowTextA", (FARPROC)GetWindowTextA, (FARPROC *)&pGetWindowTextA, (FARPROC)extGetWindowTextA}, - //{HOOK_HOT_CANDIDATE, "EnumDisplayMonitors", (FARPROC)EnumDisplayMonitors, (FARPROC *)&pEnumDisplayMonitors, (FARPROC)extEnumDisplayMonitors}, -#ifdef TRACEPALETTE - {HOOK_HOT_CANDIDATE, "GetDIBColorTable", (FARPROC)GetDIBColorTable, (FARPROC *)&pGetDIBColorTable, (FARPROC)extGetDIBColorTable}, - {HOOK_HOT_CANDIDATE, "SetDIBColorTable", (FARPROC)SetDIBColorTable, (FARPROC *)&pSetDIBColorTable, (FARPROC)extSetDIBColorTable}, -#endif - - {HOOK_HOT_CANDIDATE, "BringWindowToTop", (FARPROC)BringWindowToTop, (FARPROC *)&pBringWindowToTop, (FARPROC)extBringWindowToTop}, - {HOOK_HOT_CANDIDATE, "SetForegroundWindow", (FARPROC)SetForegroundWindow, (FARPROC *)&pSetForegroundWindow, (FARPROC)extSetForegroundWindow}, - {HOOK_HOT_CANDIDATE, "ChildWindowFromPoint", (FARPROC)ChildWindowFromPoint, (FARPROC *)&pChildWindowFromPoint, (FARPROC)extChildWindowFromPoint}, - {HOOK_HOT_CANDIDATE, "ChildWindowFromPointEx", (FARPROC)ChildWindowFromPointEx, (FARPROC *)&pChildWindowFromPointEx, (FARPROC)extChildWindowFromPointEx}, - {HOOK_HOT_CANDIDATE, "WindowFromPoint", (FARPROC)WindowFromPoint, (FARPROC *)&pWindowFromPoint, (FARPROC)extWindowFromPoint}, - {HOOK_HOT_CANDIDATE, "SetWindowsHookExA", (FARPROC)SetWindowsHookExA, (FARPROC *)&pSetWindowsHookEx, (FARPROC)extSetWindowsHookEx}, - - //{HOOK_HOT_CANDIDATE, "MessageBoxTimeoutA", (FARPROC)NULL, (FARPROC *)&pMessageBoxTimeoutA, (FARPROC)extMessageBoxTimeoutA}, - //{HOOK_HOT_CANDIDATE, "MessageBoxTimeoutW", (FARPROC)NULL, (FARPROC *)&pMessageBoxTimeoutW, (FARPROC)extMessageBoxTimeoutW}, - - {HOOK_IAT_CANDIDATE, "GetDC", (FARPROC)GetDC, (FARPROC *)&pGDIGetDC, (FARPROC)extGDIGetDC}, - {HOOK_IAT_CANDIDATE, "GetDCEx", (FARPROC)GetDCEx, (FARPROC *)&pGDIGetDCEx, (FARPROC)extGDIGetDCEx}, - {HOOK_IAT_CANDIDATE, "GetWindowDC", (FARPROC)GetWindowDC, (FARPROC *)&pGDIGetWindowDC, (FARPROC)extGDIGetWindowDC}, - {HOOK_IAT_CANDIDATE, "ReleaseDC", (FARPROC)ReleaseDC, (FARPROC *)&pGDIReleaseDC, (FARPROC)extGDIReleaseDC}, - - {HOOK_HOT_CANDIDATE, "BeginPaint", (FARPROC)BeginPaint, (FARPROC *)&pBeginPaint, (FARPROC)extBeginPaint}, - {HOOK_HOT_CANDIDATE, "EndPaint", (FARPROC)EndPaint, (FARPROC *)&pEndPaint, (FARPROC)extEndPaint}, - - {HOOK_IAT_CANDIDATE, "DialogBoxParamA", (FARPROC)NULL, (FARPROC *)&pDialogBoxParamA, (FARPROC)extDialogBoxParamA}, - - //{HOOK_IAT_CANDIDATE, "IsZoomed", (FARPROC)NULL, (FARPROC *)&pIsZoomed, (FARPROC)extIsZoomed}, - //{HOOK_HOT_CANDIDATE, "IsIconic", (FARPROC)IsIconic, (FARPROC *)&pIsIconic, (FARPROC)extIsIconic}, - - {HOOK_HOT_CANDIDATE, "FillRect", (FARPROC)FillRect, (FARPROC *)&pFillRect, (FARPROC)extFillRect}, - {HOOK_IAT_CANDIDATE, "FrameRect", (FARPROC)FrameRect, (FARPROC *)&pFrameRect, (FARPROC)extFrameRect}, - {HOOK_IAT_CANDIDATE, "RedrawWindow", (FARPROC)RedrawWindow, (FARPROC *)&pRedrawWindow, (FARPROC)extRedrawWindow}, - {HOOK_HOT_CANDIDATE, "GetParent", (FARPROC)GetParent, (FARPROC *)&pGetParent, (FARPROC)extGetParent}, - {HOOK_HOT_CANDIDATE, "InvalidateRgn", (FARPROC)InvalidateRgn, (FARPROC *)&pInvalidateRgn, (FARPROC)extInvalidateRgn}, - {HOOK_IAT_CANDIDATE, "TabbedTextOutA", (FARPROC)TabbedTextOutA, (FARPROC *)&pTabbedTextOutA, (FARPROC)extTabbedTextOutA}, - {HOOK_IAT_CANDIDATE, "ScrollDC", (FARPROC)ScrollDC, (FARPROC *)&pScrollDC, (FARPROC)extScrollDC}, - {HOOK_IAT_CANDIDATE, "InvalidateRect", (FARPROC)InvalidateRect, (FARPROC *)&pInvalidateRect, (FARPROC)extInvalidateRect}, - {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator -}; - -static HookEntry_Type NoGDIHooks[]={ - {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator -}; - -static HookEntry_Type EmulateHooks[]={ - //{HOOK_IAT_CANDIDATE, "GetDC", (FARPROC)GetDC, (FARPROC *)&pGDIGetDC, (FARPROC)extGDIGetDC}, - //{HOOK_IAT_CANDIDATE, "GetDCEx", (FARPROC)GetDCEx, (FARPROC *)&pGDIGetDCEx, (FARPROC)extGDIGetDCEx}, - //{HOOK_IAT_CANDIDATE, "GetWindowDC", (FARPROC)GetWindowDC, (FARPROC *)&pGDIGetWindowDC, (FARPROC)extGDIGetWindowDC}, - //{HOOK_IAT_CANDIDATE, "ReleaseDC", (FARPROC)ReleaseDC, (FARPROC *)&pGDIReleaseDC, (FARPROC)extGDIReleaseDC}, - //{HOOK_IAT_CANDIDATE, "InvalidateRect", (FARPROC)InvalidateRect, (FARPROC *)&pInvalidateRect, (FARPROC)extInvalidateRect}, - {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator -}; - -static HookEntry_Type ScaledHooks[]={ - {HOOK_IAT_CANDIDATE, "DrawTextA", (FARPROC)DrawTextA, (FARPROC *)&pDrawText, (FARPROC)extDrawTextA}, - {HOOK_IAT_CANDIDATE, "DrawTextExA", (FARPROC)DrawTextExA, (FARPROC *)&pDrawTextEx, (FARPROC)extDrawTextExA}, - {HOOK_HOT_CANDIDATE, "FillRect", (FARPROC)NULL, (FARPROC *)&pFillRect, (FARPROC)extFillRect}, - {HOOK_IAT_CANDIDATE, "GetDC", (FARPROC)GetDC, (FARPROC *)&pGDIGetDC, (FARPROC)extGDIGetDC}, - {HOOK_IAT_CANDIDATE, "GetDCEx", (FARPROC)NULL, (FARPROC *)&pGDIGetDCEx, (FARPROC)extGDIGetDCEx}, - {HOOK_IAT_CANDIDATE, "GetWindowDC", (FARPROC)GetWindowDC, (FARPROC *)&pGDIGetWindowDC, (FARPROC)extGDIGetWindowDC}, - {HOOK_IAT_CANDIDATE, "ReleaseDC", (FARPROC)ReleaseDC, (FARPROC *)&pGDIReleaseDC, (FARPROC)extGDIReleaseDC}, - {HOOK_IAT_CANDIDATE, "ValidateRect", (FARPROC)ValidateRect, (FARPROC *)&pValidateRect, (FARPROC)extValidateRect}, - {HOOK_IAT_CANDIDATE, "ScrollWindow", (FARPROC)ScrollWindow, (FARPROC *)&pScrollWindow, (FARPROC)extScrollWindow}, - - {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator -}; - -static HookEntry_Type RemapHooks[]={ - {HOOK_HOT_CANDIDATE, "ScreenToClient", (FARPROC)ScreenToClient, (FARPROC *)&pScreenToClient, (FARPROC)extScreenToClient}, - {HOOK_HOT_CANDIDATE, "ClientToScreen", (FARPROC)ClientToScreen, (FARPROC *)&pClientToScreen, (FARPROC)extClientToScreen}, - {HOOK_HOT_CANDIDATE, "GetClientRect", (FARPROC)GetClientRect, (FARPROC *)&pGetClientRect, (FARPROC)extGetClientRect}, - {HOOK_HOT_CANDIDATE, "GetWindowRect", (FARPROC)GetWindowRect, (FARPROC *)&pGetWindowRect, (FARPROC)extGetWindowRect}, - {HOOK_HOT_CANDIDATE, "MapWindowPoints", (FARPROC)MapWindowPoints, (FARPROC *)&pMapWindowPoints, (FARPROC)extMapWindowPoints}, - {HOOK_HOT_CANDIDATE, "GetUpdateRgn", (FARPROC)GetUpdateRgn, (FARPROC *)&pGetUpdateRgn, (FARPROC)extGetUpdateRgn}, - //{HOOK_IAT_CANDIDATE, "GetUpdateRect", (FARPROC)GetUpdateRect, (FARPROC *)&pGetUpdateRect, (FARPROC)extGetUpdateRect}, - //{HOOK_IAT_CANDIDATE, "RedrawWindow", (FARPROC)RedrawWindow, (FARPROC *)&pRedrawWindow, (FARPROC)extRedrawWindow}, - {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator -}; - -static HookEntry_Type PeekAllHooks[]={ - {HOOK_IAT_CANDIDATE, "PeekMessageA", (FARPROC)NULL, (FARPROC *)&pPeekMessage, (FARPROC)extPeekMessage}, - {HOOK_IAT_CANDIDATE, "PeekMessageW", (FARPROC)NULL, (FARPROC *)&pPeekMessage, (FARPROC)extPeekMessage}, - {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator -}; - -static HookEntry_Type MouseHooks[]={ - {HOOK_HOT_CANDIDATE, "GetCursorPos", (FARPROC)GetCursorPos, (FARPROC *)&pGetCursorPos, (FARPROC)extGetCursorPos}, - {HOOK_HOT_CANDIDATE, "SetCursorPos", (FARPROC)SetCursorPos, (FARPROC *)&pSetCursorPos, (FARPROC)extSetCursorPos}, - {HOOK_IAT_CANDIDATE, "GetCursorInfo", (FARPROC)GetCursorInfo, (FARPROC *)&pGetCursorInfo, (FARPROC)extGetCursorInfo}, - {HOOK_IAT_CANDIDATE, "SetCursor", (FARPROC)SetCursor, (FARPROC *)&pSetCursor, (FARPROC)extSetCursor}, - {HOOK_IAT_CANDIDATE, "SendMessageA", (FARPROC)SendMessageA, (FARPROC *)&pSendMessageA, (FARPROC)extSendMessageA}, - {HOOK_IAT_CANDIDATE, "SendMessageW", (FARPROC)SendMessageW, (FARPROC *)&pSendMessageW, (FARPROC)extSendMessageW}, - //{HOOK_IAT_CANDIDATE, "SetPhysicalCursorPos", NULL, (FARPROC *)&pSetCursor, (FARPROC)extSetCursor}, // ??? - {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator -}; - -static HookEntry_Type WinHooks[]={ - {HOOK_HOT_CANDIDATE, "ShowWindow", (FARPROC)ShowWindow, (FARPROC *)&pShowWindow, (FARPROC)extShowWindow}, - {HOOK_HOT_CANDIDATE, "SetWindowPos", (FARPROC)SetWindowPos, (FARPROC *)&pSetWindowPos, (FARPROC)extSetWindowPos}, - {HOOK_HOT_CANDIDATE, "DeferWindowPos", (FARPROC)DeferWindowPos, (FARPROC *)&pGDIDeferWindowPos, (FARPROC)extDeferWindowPos}, - {HOOK_HOT_CANDIDATE, "CallWindowProcA", (FARPROC)CallWindowProcA, (FARPROC *)&pCallWindowProcA, (FARPROC)extCallWindowProcA}, - {HOOK_HOT_CANDIDATE, "CallWindowProcW", (FARPROC)CallWindowProcW, (FARPROC *)&pCallWindowProcW, (FARPROC)extCallWindowProcW}, - {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator -}; - -static HookEntry_Type TimeHooks[]={ - {HOOK_IAT_CANDIDATE, "SetTimer", (FARPROC)SetTimer, (FARPROC *)&pSetTimer, (FARPROC)extSetTimer}, - {HOOK_IAT_CANDIDATE, "KillTimer", (FARPROC)KillTimer, (FARPROC *)&pKillTimer, (FARPROC)extKillTimer}, - {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator -}; - -static HookEntry_Type DesktopHooks[]={ // currently unused, needed for X-Files - {HOOK_IAT_CANDIDATE, "CreateDesktopA", (FARPROC)CreateDesktopA, (FARPROC *)&pCreateDesktop, (FARPROC)extCreateDesktop}, - {HOOK_IAT_CANDIDATE, "SwitchDesktop", (FARPROC)SwitchDesktop, (FARPROC *)&pSwitchDesktop, (FARPROC)extSwitchDesktop}, - {HOOK_IAT_CANDIDATE, "OpenDesktopA", (FARPROC)OpenDesktopA, (FARPROC *)&pOpenDesktop, (FARPROC)extOpenDesktop}, - {HOOK_IAT_CANDIDATE, "CloseDesktop", (FARPROC)CloseDesktop, (FARPROC *)&pCloseDesktop, (FARPROC)extCloseDesktop}, - {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator -}; - -FARPROC Remap_user32_ProcAddress(LPCSTR proc, HMODULE hModule) -{ - FARPROC addr; - if (addr=RemapLibrary(proc, hModule, Hooks)) return addr; - if (dxw.dwFlags1 & CLIENTREMAPPING) if (addr=RemapLibrary(proc, hModule, RemapHooks)) return addr; - - if (dxw.dwFlags2 & GDISTRETCHED) - if (addr=RemapLibrary(proc, hModule, ScaledHooks)) return addr; - if (dxw.dwFlags3 & GDIEMULATEDC) - if (addr=RemapLibrary(proc, hModule, EmulateHooks)) return addr; - if (!(dxw.dwFlags2 & GDISTRETCHED) && !(dxw.dwFlags3 & GDIEMULATEDC)) - if (addr=RemapLibrary(proc, hModule, NoGDIHooks)) return addr; - if (dxw.dwFlags1 & (PREVENTMAXIMIZE|FIXWINFRAME|LOCKWINPOS|LOCKWINSTYLE)) - if (addr=RemapLibrary(proc, hModule, WinHooks)) return addr; - if ((dxw.dwFlags1 & (MODIFYMOUSE|SLOWDOWN|KEEPCURSORWITHIN)) || (dxw.dwFlags2 & KEEPCURSORFIXED)) - if (addr=RemapLibrary(proc, hModule, MouseHooks)) return addr; - if (dxw.dwFlags3 & PEEKALLMESSAGES) - if (addr=RemapLibrary(proc, hModule, PeekAllHooks)) return addr; - if((dxw.dwFlags2 & TIMESTRETCH) && (dxw.dwFlags4 & STRETCHTIMERS)) - if (addr=RemapLibrary(proc, hModule, TimeHooks)) return addr; - - return NULL; -} - -static char *libname = "user32.dll"; - -void HookUser32(HMODULE hModule) -{ - - HookLibrary(hModule, Hooks, libname); - if (!(dxw.dwFlags2 & GDISTRETCHED) && !(dxw.dwFlags3 & GDIEMULATEDC)) - HookLibrary(hModule, NoGDIHooks, libname); - if (dxw.dwFlags3 & GDIEMULATEDC) HookLibrary(hModule, EmulateHooks, libname); - if (dxw.dwFlags2 & GDISTRETCHED) HookLibrary(hModule, ScaledHooks, libname); - - if (dxw.dwFlags1 & CLIENTREMAPPING) HookLibrary(hModule, RemapHooks, libname); - if (dxw.dwFlags1 & (PREVENTMAXIMIZE|FIXWINFRAME|LOCKWINPOS|LOCKWINSTYLE)) HookLibrary(hModule, WinHooks, libname); - if ((dxw.dwFlags1 & (MODIFYMOUSE|SLOWDOWN|KEEPCURSORWITHIN)) || (dxw.dwFlags2 & KEEPCURSORFIXED)) HookLibrary(hModule, MouseHooks, libname); - if (dxw.dwFlags3 & PEEKALLMESSAGES) HookLibrary(hModule, PeekAllHooks, libname); - if (dxw.dwFlags2 & TIMESTRETCH) HookLibrary(hModule, TimeHooks, libname); - - IsChangeDisplaySettingsHotPatched = IsHotPatched(Hooks, "ChangeDisplaySettingsExA") || IsHotPatched(Hooks, "ChangeDisplaySettingsExW"); - return; -} - -void HookUser32Init() -{ - HookLibInit(Hooks); - HookLibInit(ScaledHooks); - HookLibInit(EmulateHooks); - HookLibInit(RemapHooks); - HookLibInit(MouseHooks); - HookLibInit(WinHooks); -} - -/* ------------------------------------------------------------------------------ */ -// auxiliary (static) functions -/* ------------------------------------------------------------------------------ */ - -static void Stopper(char *s, int line) -{ - char sMsg[81]; - sprintf(sMsg,"break: \"%s\"", s); - MessageBox(0, sMsg, "break", MB_OK | MB_ICONEXCLAMATION); -} - -//#define STOPPER_TEST // comment out to eliminate -#ifdef STOPPER_TEST -#define STOPPER(s) Stopper(s, __LINE__) -#else -#define STOPPER(s) -#endif - -static LPCSTR sTemplateName(LPCSTR tn) -{ - static char sBuf[20+1]; - if((DWORD)tn >> 16) - return tn; - else { - sprintf(sBuf, "ID:(%x)", ((DWORD)tn & 0x0000FFFF)); - return sBuf; - } -} - -// -------------------------------------------------------------------------- -// -// globals, externs, static functions... -// -// -------------------------------------------------------------------------- - -// PrimHDC: DC handle of the selected DirectDraw primary surface. NULL when invalid. -HDC PrimHDC=NULL; - -LPRECT lpClipRegion=NULL; -RECT ClipRegion; -int LastCurPosX, LastCurPosY; - -extern GetDC_Type pGetDC; -extern ReleaseDC_Type pReleaseDC; -//extern void FixWindowFrame(HWND); -extern HRESULT WINAPI sBlt(char *, LPDIRECTDRAWSURFACE, LPRECT, LPDIRECTDRAWSURFACE, LPRECT, DWORD, LPDDBLTFX, BOOL); - -LONG WINAPI MyChangeDisplaySettings(char *fname, BOOL WideChar, void *lpDevMode, DWORD dwflags) -{ - HRESULT res; - DWORD dmFields, dmBitsPerPel, dmPelsWidth, dmPelsHeight; - - if(dwflags & CDS_TEST) { - OutTraceDW("%s: TEST res=DISP_CHANGE_SUCCESSFUL\n", fname); - return DISP_CHANGE_SUCCESSFUL; - } - - // v2.02.32: reset the emulated DC used in GDIEMULATEDC mode - dxw.ResetEmulatedDC(); - - if(lpDevMode){ - if(WideChar){ - dmFields=((DEVMODEW *)lpDevMode)->dmFields; - dmPelsWidth=((DEVMODEW *)lpDevMode)->dmPelsWidth; - dmPelsHeight=((DEVMODEW *)lpDevMode)->dmPelsHeight; - dmBitsPerPel=((DEVMODEW *)lpDevMode)->dmBitsPerPel; - } - else{ - dmFields=((DEVMODEA *)lpDevMode)->dmFields; - dmPelsWidth=((DEVMODEA *)lpDevMode)->dmPelsWidth; - dmPelsHeight=((DEVMODEA *)lpDevMode)->dmPelsHeight; - dmBitsPerPel=((DEVMODEA *)lpDevMode)->dmBitsPerPel; - } - } - - // 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 && (dmFields & (DM_PELSWIDTH | DM_PELSHEIGHT))){ - RECT client; - dxw.SetScreenSize(dmPelsWidth, 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); - OutTraceDW("%s: current hWnd=%x size=(%d,%d)\n", fname, dxw.GethWnd(), client.right, client.bottom); - if((client.right>=(LONG)dmPelsWidth) && (client.bottom>=(LONG)dmPelsHeight)) { - OutTraceDW("%s: entering FULLSCREEN mode\n", fname); - dxw.SetFullScreen(TRUE); - } - } - - if ((dwflags==0 || dwflags==CDS_FULLSCREEN) && lpDevMode){ - if (dxw.dwFlags1 & EMULATESURFACE || !(dmFields & DM_BITSPERPEL)){ - OutTraceDW("%s: BYPASS res=DISP_CHANGE_SUCCESSFUL\n", fname); - return DISP_CHANGE_SUCCESSFUL; - } - else{ - DEVMODEA NewMode; - if(dwflags==CDS_FULLSCREEN) dwflags=0; // no FULLSCREEN - (*pEnumDisplaySettings)(NULL, ENUM_CURRENT_SETTINGS, &NewMode); - OutTraceDW("ChangeDisplaySettings: CURRENT wxh=(%dx%d) BitsPerPel=%d -> %d\n", - NewMode.dmPelsWidth, NewMode.dmPelsHeight, NewMode.dmBitsPerPel, dmBitsPerPel); - NewMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; - NewMode.dmBitsPerPel = dmBitsPerPel; - res=(*pChangeDisplaySettingsExA)(NULL, &NewMode, NULL, 0, NULL); - if(res) OutTraceE("ChangeDisplaySettings: ERROR err=%d at %d\n", GetLastError(), __LINE__); - return res; - } - } - else{ - if(WideChar) - return (*pChangeDisplaySettingsExW)(NULL, (LPDEVMODEW)lpDevMode, NULL, dwflags, NULL); - else - return (*pChangeDisplaySettingsExA)(NULL, (LPDEVMODEA)lpDevMode, NULL, dwflags, NULL); - } -} - -void dxwFixWindowPos(char *ApiName, HWND hwnd, LPARAM lParam) -{ - LPWINDOWPOS wp; - int MaxX, MaxY; - wp = (LPWINDOWPOS)lParam; - MaxX = dxw.iSizX; - MaxY = dxw.iSizY; - if (!MaxX) MaxX = dxw.GetScreenWidth(); - if (!MaxY) MaxY = dxw.GetScreenHeight(); - static int iLastCX, iLastCY; - static int BorderX=-1; - static int BorderY=-1; - int cx, cy; - extern void CalculateWindowPos(HWND, DWORD, DWORD, LPWINDOWPOS); - - OutTraceDW("%s: GOT hwnd=%x pos=(%d,%d) dim=(%d,%d) Flags=%x(%s)\n", - ApiName, hwnd, wp->x, wp->y, wp->cx, wp->cy, wp->flags, ExplainWPFlags(wp->flags)); - - if (dxw.dwFlags1 & PREVENTMAXIMIZE){ - int UpdFlag = 0; - WINDOWPOS MaxPos; - CalculateWindowPos(hwnd, MaxX, MaxY, &MaxPos); - - if(wp->cx>MaxPos.cx) { wp->cx=MaxPos.cx; UpdFlag=1; } - if(wp->cy>MaxPos.cy) { wp->cy=MaxPos.cy; UpdFlag=1; } - if (UpdFlag) - OutTraceDW("%s: SET max dim=(%d,%d)\n", ApiName, wp->cx, wp->cy); - } - - if ((wp->flags & (SWP_NOMOVE|SWP_NOSIZE))==(SWP_NOMOVE|SWP_NOSIZE)) return; //v2.02.13 - - if ((dxw.dwFlags1 & LOCKWINPOS) && dxw.IsFullScreen() && (hwnd==dxw.GethWnd())){ - CalculateWindowPos(hwnd, MaxX, MaxY, wp); - OutTraceDW("%s: LOCK pos=(%d,%d) dim=(%d,%d)\n", ApiName, wp->x, wp->y, wp->cx, wp->cy); - } - - if ((dxw.dwFlags2 & KEEPASPECTRATIO) && dxw.IsFullScreen() && (hwnd==dxw.GethWnd())){ - // note: while keeping aspect ration, resizing from one corner doesn't tell - // which coordinate is prevalent to the other. We made an arbitrary choice. - // note: v2.1.93: compensation must refer to the client area, not the wp - // window dimensions that include the window borders. - if(BorderX==-1){ - // v2.02.92: Fixed for AERO mode, where GetWindowRect substantially LIES! - RECT client, full; - LONG dwStyle, dwExStyle; - HMENU hMenu; - extern GetWindowLong_Type pGetWindowLongA; - (*pGetClientRect)(hwnd, &client); - full=client; - dwStyle=(*pGetWindowLongA)(hwnd, GWL_STYLE); - dwExStyle=(*pGetWindowLongA)(hwnd, GWL_EXSTYLE); - hMenu = (dwStyle & WS_CHILD) ? NULL : GetMenu(hwnd); - AdjustWindowRectEx(&full, dwStyle, (hMenu!=NULL), dwExStyle); - if (hMenu && (hMenu != (HMENU)-1)) __try {CloseHandle(hMenu);} __except(EXCEPTION_EXECUTE_HANDLER){}; - BorderX= full.right - full.left - client.right; - BorderY= full.bottom - full.top - client.bottom; - OutTraceDW("%s: KEEPASPECTRATIO window borders=(%d,%d)\n", ApiName, BorderX, BorderY); - } - extern LRESULT LastCursorPos; - switch (LastCursorPos){ - case HTBOTTOM: - case HTTOP: - case HTBOTTOMLEFT: - case HTBOTTOMRIGHT: - case HTTOPLEFT: - case HTTOPRIGHT: - cx = BorderX + ((wp->cy - BorderY) * dxw.iRatioX) / dxw.iRatioY; - if(cx!=wp->cx){ - OutTraceDW("%s: KEEPASPECTRATIO adjusted cx=%d->%d\n", ApiName, wp->cx, cx); - wp->cx = cx; - } - break; - case HTLEFT: - case HTRIGHT: - cy = BorderY + ((wp->cx - BorderX) * dxw.iRatioY) / dxw.iRatioX; - if(cy!=wp->cy){ - OutTraceDW("%s: KEEPASPECTRATIO adjusted cy=%d->%d\n", ApiName, wp->cy, cy); - wp->cy = cy; - } - break; - } - } - - if ((dxw.dwFlags5 & CENTERTOWIN) && dxw.IsFullScreen() && (hwnd==dxw.GethWnd())){ - RECT wrect; - LONG dwStyle, dwExStyle; - HMENU hMenu; - int minx, miny; - wrect = dxw.GetScreenRect(); - dwStyle=(*pGetWindowLongA)(hwnd, GWL_STYLE); - dwExStyle=(*pGetWindowLongA)(hwnd, GWL_EXSTYLE); - hMenu = (dwStyle & WS_CHILD) ? NULL : GetMenu(hwnd); - AdjustWindowRectEx(&wrect, dwStyle, (hMenu!=NULL), dwExStyle); - minx = wrect.right - wrect.left; - miny = wrect.bottom - wrect.top; - if(wp->cx < minx) wp->cx = minx; - if(wp->cy < miny) wp->cy = miny; - } - - iLastCX= wp->cx; - iLastCY= wp->cy; -} - -void dxwFixMinMaxInfo(char *ApiName, HWND hwnd, LPARAM lParam) -{ - if (dxw.dwFlags1 & PREVENTMAXIMIZE){ - LPMINMAXINFO lpmmi; - lpmmi=(LPMINMAXINFO)lParam; - OutTraceDW("%s: GOT MaxPosition=(%d,%d) MaxSize=(%d,%d)\n", ApiName, - lpmmi->ptMaxPosition.x, lpmmi->ptMaxPosition.y, lpmmi->ptMaxSize.x, lpmmi->ptMaxSize.y); - lpmmi->ptMaxPosition.x=0; - lpmmi->ptMaxPosition.y=0; - lpmmi->ptMaxSize.x = dxw.GetScreenWidth(); - lpmmi->ptMaxSize.y = dxw.GetScreenHeight(); - - OutTraceDW("%s: SET PREVENTMAXIMIZE MaxPosition=(%d,%d) MaxSize=(%d,%d)\n", ApiName, - lpmmi->ptMaxPosition.x, lpmmi->ptMaxPosition.y, lpmmi->ptMaxSize.x, lpmmi->ptMaxSize.y); - } - - // v2.1.75: added logic to fix win coordinates to selected ones. - // fixes the problem with "Achtung Spitfire", that can't be managed through PREVENTMAXIMIZE flag. - if (dxw.dwFlags1 & LOCKWINPOS){ - LPMINMAXINFO lpmmi; - lpmmi=(LPMINMAXINFO)lParam; - OutTraceDW("%s: GOT MaxPosition=(%d,%d) MaxSize=(%d,%d)\n", ApiName, - lpmmi->ptMaxPosition.x, lpmmi->ptMaxPosition.y, lpmmi->ptMaxSize.x, lpmmi->ptMaxSize.y); - lpmmi->ptMaxPosition.x=dxw.iPosX; - lpmmi->ptMaxPosition.y=dxw.iPosY; - lpmmi->ptMaxSize.x = dxw.iSizX ? dxw.iSizX : dxw.GetScreenWidth(); - lpmmi->ptMaxSize.y = dxw.iSizY ? dxw.iSizY : dxw.GetScreenHeight(); - OutTraceDW("%s: SET LOCKWINPOS MaxPosition=(%d,%d) MaxSize=(%d,%d)\n", ApiName, - lpmmi->ptMaxPosition.x, lpmmi->ptMaxPosition.y, lpmmi->ptMaxSize.x, lpmmi->ptMaxSize.y); - } -} - -static LRESULT WINAPI FixWindowProc(char *ApiName, HWND hwnd, UINT Msg, WPARAM wParam, LPARAM *lpParam) -{ - LPARAM lParam; - - lParam=*lpParam; - OutTraceW("%s: hwnd=%x msg=[0x%x]%s(%x,%x)\n", - ApiName, hwnd, Msg, ExplainWinMessage(Msg), wParam, lParam); - - switch(Msg){ - case WM_NCHITTEST: - // v2.02.71 fix: when processing WM_NCHITTEST messages whith fixed coordinates avoid calling - // the *pDefWindowProc call - // fixes "Microsoft Motocross Madness" mouse handling - if((dxw.dwFlags2 & FIXNCHITTEST) && (dxw.dwFlags1 & MODIFYMOUSE)){ // mouse processing - OutTraceDW("%s: suppress WM_NCHITTEST\n", ApiName); - return TRUE; - } - break; - case WM_ERASEBKGND: - OutTraceDW("%s: prevent erase background\n", ApiName); - return TRUE; // 1=erased - break; // useless - case WM_GETMINMAXINFO: - dxwFixMinMaxInfo(ApiName, hwnd, lParam); - break; - case WM_WINDOWPOSCHANGING: - case WM_WINDOWPOSCHANGED: - dxwFixWindowPos(ApiName, hwnd, lParam); - break; - case WM_STYLECHANGING: - case WM_STYLECHANGED: - dxw.FixStyle(ApiName, hwnd, wParam, lParam); - break; - case WM_SIZE: - if ((dxw.dwFlags1 & LOCKWINPOS) && dxw.IsFullScreen()) return 0; - if (dxw.dwFlags1 & PREVENTMAXIMIZE){ - if ((wParam == SIZE_MAXIMIZED)||(wParam == SIZE_MAXSHOW)){ - OutTraceDW("%s: prevent screen SIZE to fullscreen wparam=%d(%s) size=(%d,%d)\n", ApiName, - wParam, ExplainResizing(wParam), HIWORD(lParam), LOWORD(lParam)); - return 0; // checked - //lParam = MAKELPARAM(dxw.GetScreenWidth(), dxw.GetScreenHeight()); - //OutTraceDW("%s: updated SIZE wparam=%d(%s) size=(%d,%d)\n", ApiName, - // wParam, ExplainResizing(wParam), HIWORD(lParam), LOWORD(lParam)); - } - } - break; - default: - break; - } - - // marker to run hooked function - return(-1); -} - -// -------------------------------------------------------------------------- -// -// user32 API hookers -// -// -------------------------------------------------------------------------- - - -BOOL WINAPI extInvalidateRect(HWND hwnd, RECT *lpRect, BOOL bErase) -{ - if(IsTraceDW){ - char sRect[81]; - if(lpRect) sprintf(sRect, "(%d,%d)-(%d,%d)", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); - else strcpy(sRect, "NULL"); - OutTrace("InvalidateRect: hwnd=%x rect=%s erase=%x\n", hwnd, sRect, bErase); - } - - if(dxw.IsFullScreen()) { - if(dxw.dwFlags6 & SHAREDDC){ // Deadlock 2 - if(lpRect) dxw.MapClient(lpRect); - return (*pInvalidateRect)(hwnd, lpRect, bErase); - } - switch(dxw.GDIEmulationMode){ - case GDIMODE_STRETCHED: - case GDIMODE_SHAREDDC: - if(lpRect) dxw.MapClient(lpRect); - break; - case GDIMODE_EMULATED: - default: - break; - } - } - - return (*pInvalidateRect)(hwnd, lpRect, bErase); -} - -BOOL WINAPI extShowWindow(HWND hwnd, int nCmdShow) -{ - BOOL res; - - OutTraceDW("ShowWindow: hwnd=%x, CmdShow=%x(%s)\n", hwnd, nCmdShow, ExplainShowCmd(nCmdShow)); - if (dxw.dwFlags1 & PREVENTMAXIMIZE){ - if(nCmdShow==SW_MAXIMIZE){ - OutTraceDW("ShowWindow: suppress SW_MAXIMIZE maximize\n"); - nCmdShow=SW_SHOWNORMAL; - } - if(nCmdShow==SW_SHOWDEFAULT){ - STARTUPINFO StartupInfo; - GetStartupInfo(&StartupInfo); - OutTraceDW("DEBUG: StartupInfo dwFlags=%x ShowWindow=%x\n", StartupInfo.dwFlags, StartupInfo.wShowWindow); - if((StartupInfo.dwFlags & STARTF_USESHOWWINDOW) && (StartupInfo.wShowWindow == SW_MAXIMIZE)){ - OutTraceDW("ShowWindow: suppress SW_SHOWDEFAULT maximize\n"); - nCmdShow=SW_SHOWNORMAL; - } - } - } - - res=(*pShowWindow)(hwnd, nCmdShow); - OutTraceDW("ShowWindow: res=%x\n", res); - - return res; -} - -LONG WINAPI extGetWindowLong(GetWindowLong_Type pGetWindowLong, char *ApiName, HWND hwnd, int nIndex) -{ - LONG res; - - res=(*pGetWindowLong)(hwnd, nIndex); - - OutTraceB("%s: hwnd=%x, Index=%x(%s) res=%x\n", ApiName, hwnd, nIndex, ExplainSetWindowIndex(nIndex), res); - - if((nIndex==GWL_WNDPROC)||(nIndex==DWL_DLGPROC)){ - WNDPROC wp; - wp=dxwws.GetProc(hwnd); - OutTraceDW("%s: remapping WindowProc res=%x -> %x\n", ApiName, res, (LONG)wp); - if(wp) res=(LONG)wp; // if not found, don't alter the value. - } - - return res; -} - -LONG WINAPI extGetWindowLongA(HWND hwnd, int nIndex) -{ - return extGetWindowLong(pGetWindowLongA, "GetWindowLongA", hwnd, nIndex); -} - -LONG WINAPI extGetWindowLongW(HWND hwnd, int nIndex) -{ - return extGetWindowLong(pGetWindowLongW, "GetWindowLongW", hwnd, nIndex); -} - -LONG WINAPI extSetWindowLong(HWND hwnd, int nIndex, LONG dwNewLong, SetWindowLong_Type pSetWindowLong) -{ - LONG res; - - OutTraceDW("SetWindowLong: hwnd=%x, Index=%x(%s) Val=%x\n", - hwnd, nIndex, ExplainSetWindowIndex(nIndex), dwNewLong); - - if (dxw.Windowize){ - if(dxw.dwFlags1 & LOCKWINSTYLE){ - if(nIndex==GWL_STYLE){ - OutTraceDW("SetWindowLong: Lock GWL_STYLE=%x\n", dwNewLong); - return (*pGetWindowLongA)(hwnd, nIndex); - } - if(nIndex==GWL_EXSTYLE){ - OutTraceDW("SetWindowLong: Lock GWL_EXSTYLE=%x\n", dwNewLong); - return (*pGetWindowLongA)(hwnd, nIndex); - } - } - - if (dxw.dwFlags1 & PREVENTMAXIMIZE){ - if(nIndex==GWL_STYLE){ - dwNewLong &= ~WS_MAXIMIZE; - if(dxw.IsDesktop(hwnd)){ - OutTraceDW("SetWindowLong: GWL_STYLE %x suppress MAXIMIZE\n", dwNewLong); - dwNewLong |= WS_OVERLAPPEDWINDOW; - dwNewLong &= ~(WS_DLGFRAME|WS_MAXIMIZE|WS_VSCROLL|WS_HSCROLL|WS_CLIPSIBLINGS); - } - } - // v2.02.32: disable topmost for main window only - if(dxw.IsDesktop(hwnd) && (nIndex==GWL_EXSTYLE)){ - OutTraceDW("SetWindowLong: GWL_EXSTYLE %x suppress TOPMOST\n", dwNewLong); - dwNewLong = dwNewLong & ~(WS_EX_TOPMOST); - } - } - - if (dxw.dwFlags1 & FIXWINFRAME){ - //if((nIndex==GWL_STYLE) && !(dwNewLong & WS_CHILD)){ - if((nIndex==GWL_STYLE) && !(dwNewLong & WS_CHILD) && dxw.IsDesktop(hwnd)){ - OutTraceDW("SetWindowLong: GWL_STYLE %x force OVERLAPPEDWINDOW\n", dwNewLong); - dwNewLong |= WS_OVERLAPPEDWINDOW; - dwNewLong &= ~WS_CLIPSIBLINGS; - } - } - } - - if (((nIndex==GWL_WNDPROC)||(nIndex==DWL_DLGPROC)) && - dxw.IsFullScreen() && // v2.02.51 - see A10 Cuba.... - !(dxw.dwFlags6 & NOWINDOWHOOKS)){ // v2.03.41 - debug flag - WNDPROC lres; - WNDPROC OldProc; - // GPL fix - if(dxw.IsRealDesktop(hwnd) && dxw.Windowize) { - hwnd=dxw.GethWnd(); - OutTraceDW("SetWindowLong: DESKTOP hwnd, FIXING hwnd=%x\n",hwnd); - } - // end of GPL fix - - OldProc = (WNDPROC)(*pGetWindowLongA)(hwnd, nIndex); - // v2.02.70 fix - if((OldProc==extWindowProc) || - (OldProc==extChildWindowProc)|| - (OldProc==extDialogWindowProc)) - OldProc=dxwws.GetProc(hwnd); - dxwws.PutProc(hwnd, (WNDPROC)dwNewLong); - res=(LONG)OldProc; - SetLastError(0); - lres=(WNDPROC)(*pSetWindowLongA)(hwnd, nIndex, (LONG)extWindowProc); - if(!lres && GetLastError())OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__); - } - else { - res=(*pSetWindowLongA)(hwnd, nIndex, dwNewLong); - } - - OutTraceDW("SetWindowLong: hwnd=%x, nIndex=%x, Val=%x, res=%x\n", hwnd, nIndex, dwNewLong, res); - return res; -} - -LONG WINAPI extSetWindowLongA(HWND hwnd, int nIndex, LONG dwNewLong) -{ - return extSetWindowLong(hwnd, nIndex, dwNewLong, pSetWindowLongA); -} - -LONG WINAPI extSetWindowLongW(HWND hwnd, int nIndex, LONG dwNewLong) -{ - return extSetWindowLong(hwnd, nIndex, dwNewLong, pSetWindowLongW); -} - -BOOL WINAPI extSetWindowPos(HWND hwnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags) -{ - BOOL res; - - OutTraceDW("SetWindowPos: hwnd=%x%s pos=(%d,%d) dim=(%d,%d) Flags=%x\n", - hwnd, dxw.IsFullScreen()?"(FULLSCREEN)":"", X, Y, cx, cy, uFlags); - - // when not in fullscreen mode, just proxy the call - if (!dxw.IsFullScreen()){ - res=(*pSetWindowPos)(hwnd, hWndInsertAfter, X, Y, cx, cy, uFlags); - if(!res)OutTraceE("SetWindowPos: ERROR err=%d at %d\n", GetLastError(), __LINE__); - return res; - } - - // in fullscreen, but a child window inside ..... - if (!dxw.IsDesktop(hwnd)){ - RECT r; - r.left = X; - r.right = X + cx; - r.top = Y; - r.bottom = Y + cy; - if ((*pGetWindowLongA)(hwnd, GWL_STYLE) & WS_CHILD){ - r = dxw.MapClientRect(&r); - } - else { - //r = dxw.MapWindowRect(&r); - } - X = r.left; - Y = r.top; - cx = r.right - r.left; - cy = r.bottom - r.top; - - res=(*pSetWindowPos)(hwnd, hWndInsertAfter, X, Y, cx, cy, uFlags); - if(!res)OutTraceE("SetWindowPos: ERROR err=%d at %d\n", GetLastError(), __LINE__); - - //HFONT hFont; - //hFont=CreateFont ( - // 30, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, - // FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, - // DEFAULT_PITCH | FF_SWISS, NULL); // "Arial"); - //SendMessage (hwnd, WM_SETFONT, WPARAM (hFont), TRUE); - - return res; - } - - if (dxw.dwFlags1 & LOCKWINPOS){ - // Note: any attempt to change the window position, no matter where and how, through the - // SetWindowPos API is causing resizing to the default 1:1 pixed size in Commandos. - // in such cases, there is incompatibility between LOCKWINPOS and LOCKWINSTYLE. - OutTraceDW("SetWindowPos: locked position\n"); - return 1; - } - - 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) - OutTraceDW("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, dwExStyle; - HMENU hMenu; - RECT rect; - rect.top=rect.left=0; - rect.right=cx; rect.bottom=cy; - dwCurStyle=(*pGetWindowLongA)(hwnd, GWL_STYLE); - dwExStyle=(*pGetWindowLongA)(hwnd, GWL_EXSTYLE); - // BEWARE: from MSDN - If the window is a child window, the return value is undefined. - hMenu = (dwCurStyle & WS_CHILD) ? NULL : GetMenu(hwnd); - AdjustWindowRectEx(&rect, dwCurStyle, (hMenu!=NULL), dwExStyle); - if (hMenu && (hMenu != (HMENU)-1)) __try {CloseHandle(hMenu);} __except(EXCEPTION_EXECUTE_HANDLER){}; - cx=rect.right; cy=rect.bottom; - OutTraceDW("SetWindowPos: main form hwnd=%x fixed size=(%d,%d)\n", hwnd, cx, cy); - - res=(*pSetWindowPos)(hwnd, hWndInsertAfter, X, Y, cx, cy, uFlags); - if(!res)OutTraceE("SetWindowPos: ERROR err=%d at %d\n", GetLastError(), __LINE__); - return res; -} - -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; - - OutTraceDW("DeferWindowPos: hwnd=%x%s pos=(%d,%d) dim=(%d,%d) Flags=%x\n", - hwnd, dxw.IsFullScreen()?"(FULLSCREEN)":"", X, Y, cx, cy, uFlags); - - if(dxw.IsFullScreen()){ - dxw.MapClient(&X, &Y, &cx, &cy); - OutTraceDW("DeferWindowPos: remapped pos=(%d,%d) dim=(%d,%d)\n", X, Y, 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; -} - -LRESULT WINAPI extSendMessage(char *apiname, SendMessage_Type pSendMessage, HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) -{ - LRESULT ret; - OutTraceW("%s: hwnd=%x WinMsg=[0x%x]%s(%x,%x)\n", - apiname, hwnd, Msg, ExplainWinMessage(Msg), wParam, lParam); - - if(dxw.dwFlags1 & MODIFYMOUSE){ - switch (Msg){ - case WM_MOUSEMOVE: - case WM_MOUSEWHEEL: - case WM_LBUTTONDOWN: - case WM_LBUTTONUP: - case WM_LBUTTONDBLCLK: - case WM_RBUTTONDOWN: - case WM_RBUTTONUP: - case WM_RBUTTONDBLCLK: - case WM_MBUTTONDOWN: - case WM_MBUTTONUP: - case WM_MBUTTONDBLCLK: - // revert here the WindowProc mouse correction - POINT prev, curr; - RECT rect; - prev.x = LOWORD(lParam); - prev.y = HIWORD(lParam); - (*pGetClientRect)(dxw.GethWnd(), &rect); - curr.x = (prev.x * rect.right) / dxw.GetScreenWidth(); - curr.y = (prev.y * rect.bottom) / dxw.GetScreenHeight(); - if (Msg == WM_MOUSEWHEEL){ // v2.02.33 mousewheel fix - POINT upleft={0,0}; - (*pClientToScreen)(dxw.GethWnd(), &upleft); - curr = dxw.AddCoordinates(curr, upleft); - } - lParam = MAKELPARAM(curr.x, curr.y); - OutTraceC("%s: hwnd=%x pos XY=(%d,%d)->(%d,%d)\n", apiname, hwnd, prev.x, prev.y, curr.x, curr.y); - break; - default: - break; - } - } - ret=(*pSendMessage)(hwnd, Msg, wParam, lParam); - OutTraceW("%s: lresult=%x\n", apiname, ret); - return ret; -} - -LRESULT WINAPI extSendMessageA(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) -{ - return extSendMessage("SendMessageA", pSendMessageA, hwnd, Msg, wParam, lParam); -} - -LRESULT WINAPI extSendMessageW(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) -{ - return extSendMessage("SendMessageW", pSendMessageW, hwnd, Msg, wParam, lParam); -} - -HCURSOR WINAPI extSetCursor(HCURSOR hCursor) -{ - HCURSOR ret; - - ret=(*pSetCursor)(hCursor); - OutTraceDW("GDI.SetCursor: Cursor=%x, ret=%x\n", hCursor, ret); - //MessageBox(0, "SelectPalette", "GDI32.dll", MB_OK | MB_ICONEXCLAMATION); - return ret; -} - -BOOL WINAPI extGetCursorPos(LPPOINT lppoint) -{ - HRESULT res; - static int PrevX, PrevY; - POINT prev; - - if(dxw.dwFlags1 & SLOWDOWN) dxw.DoSlow(2); - - if (pGetCursorPos) { - res=(*pGetCursorPos)(lppoint); - } - else { - lppoint->x =0; lppoint->y=0; - res=1; - } - - prev=*lppoint; - *lppoint=dxw.ScreenToClient(*lppoint); - *lppoint=dxw.FixCursorPos(*lppoint); - - GetHookInfo()->CursorX=(short)lppoint->x; - GetHookInfo()->CursorY=(short)lppoint->y; - OutTraceC("GetCursorPos: FIXED pos=(%d,%d)->(%d,%d)\n", prev.x, prev.y, lppoint->x, lppoint->y); - - return res; -} - -BOOL WINAPI extSetCursorPos(int x, int y) -{ - BOOL res; - int PrevX, PrevY; - - PrevX=x; - PrevY=y; - - if(dxw.dwFlags2 & KEEPCURSORFIXED) { - OutTraceC("SetCursorPos: FIXED pos=(%d,%d)\n", x, y); - LastCurPosX=x; - LastCurPosY=y; - return 1; - } - - if(dxw.dwFlags1 & SLOWDOWN) dxw.DoSlow(2); - - if(dxw.dwFlags1 & KEEPCURSORWITHIN){ - // Intercept SetCursorPos outside screen boundaries (used as Cursor OFF in some games) - if ((y<0)||(y>=(int)dxw.GetScreenHeight())||(x<0)||(x>=(int)dxw.GetScreenWidth())) return 1; - } - - if(dxw.dwFlags1 & MODIFYMOUSE){ - // v2.03.41 - POINT cur; - cur.x = x; - cur.y = y; - dxw.MapWindow(&cur); - x = cur.x; - y = cur.y; - } - - res=0; - if (pSetCursorPos) res=(*pSetCursorPos)(x,y); - - OutTraceC("SetCursorPos: res=%x XY=(%d,%d)->(%d,%d)\n", res, PrevX, PrevY, x, y); - return res; -} - -BOOL WINAPI extPeekMessage(LPMSG lpMsg, HWND hwnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) -{ - BOOL res; - - if((wMsgFilterMin==0) && (wMsgFilterMax == 0)){ - // no filtering, everything is good - res=(*pPeekMessage)(lpMsg, hwnd, wMsgFilterMin, wMsgFilterMax, (wRemoveMsg & 0x000F)); - } - else { - MSG Dummy; - // better eliminate all messages before and after the selected range !!!! - //if(wMsgFilterMin)(*pPeekMessage)(&Dummy, hwnd, 0, wMsgFilterMin-1, TRUE); - if(wMsgFilterMin>0x0F)(*pPeekMessage)(&Dummy, hwnd, 0x0F, wMsgFilterMin-1, TRUE); - res=(*pPeekMessage)(lpMsg, hwnd, wMsgFilterMin, wMsgFilterMax, (wRemoveMsg & 0x000F)); - if(wMsgFilterMaxhwnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg, ExplainPeekRemoveMsg(wRemoveMsg), - lpMsg->message, ExplainWinMessage(lpMsg->message & 0xFFFF), - lpMsg->wParam, lpMsg->lParam, lpMsg->pt.x, lpMsg->pt.y, res); - else - OutTraceW("PeekMessage: ANY lpmsg=%x hwnd=%x filter=(%x-%x) remove=%x(%s) res=%x\n", - lpMsg, lpMsg->hwnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg, ExplainPeekRemoveMsg(wRemoveMsg), res); - - - return res; -} - -BOOL WINAPI extClientToScreen(HWND hwnd, LPPOINT lppoint) -{ - // v2.02.10: fully revised to handle scaled windows - BOOL res; - - OutTraceB("ClientToScreen: hwnd=%x hWnd=%x FullScreen=%x point=(%d,%d)\n", - hwnd, dxw.GethWnd(), dxw.IsFullScreen(), lppoint->x, lppoint->y); - if (lppoint && dxw.IsFullScreen()){ - // optimization: in fullscreen mode, coordinate conversion for the desktop window - // should always keep the same values inaltered - if(hwnd != dxw.GethWnd()){ - *lppoint = dxw.AddCoordinates(*lppoint, dxw.ClientOffset(hwnd)); - } - OutTraceB("ClientToScreen: FIXED point=(%d,%d)\n", lppoint->x, lppoint->y); - res=TRUE; - } - else { - res=(*pClientToScreen)(hwnd, lppoint); - } - return res; -} - -BOOL WINAPI extScreenToClient(HWND hwnd, LPPOINT lppoint) -{ - // v2.02.10: fully revised to handle scaled windows - BOOL res; - OutTraceB("ScreenToClient: hwnd=%x hWnd=%x FullScreen=%x point=(%d,%d)\n", - hwnd, dxw.GethWnd(), dxw.IsFullScreen(), lppoint->x, lppoint->y); - - if (lppoint && (lppoint->x == -32000) && (lppoint->y == -32000)) return 1; - - if (lppoint && dxw.IsFullScreen()){ - // optimization: in fullscreen mode, coordinate conversion for the desktop window - // should always keep the same values inaltered - if(hwnd != dxw.GethWnd()){ - *lppoint = dxw.SubCoordinates(*lppoint, dxw.ClientOffset(hwnd)); - OutTraceB("ScreenToClient: FIXED point=(%d,%d)\n", lppoint->x, lppoint->y); - } - res=TRUE; - } - else { - res=(*pScreenToClient)(hwnd, lppoint); - } - return res; -} - -BOOL WINAPI extGetClientRect(HWND hwnd, LPRECT lpRect) -{ - BOOL ret; - OutTraceB("GetClientRect: whnd=%x FullScreen=%x\n", hwnd, dxw.IsFullScreen()); - - if(!lpRect) return 0; - - // proxed call - ret=(*pGetClientRect)(hwnd, lpRect); - if(!ret) { - OutTraceE("GetClientRect: ERROR hwnd=%x err=%d at %d\n", hwnd, GetLastError(), __LINE__); - return ret; - } - OutTraceB("GetClientRect: actual rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); - - if (dxw.IsDesktop(hwnd)){ - *lpRect = dxw.GetScreenRect(); - OutTraceB("GetClientRect: desktop rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); - } - else - if (dxw.IsFullScreen()){ - int w, h; - if(FIXCHILDSIZE){ - if(dxwws.GetSize(hwnd, &w, &h)){ - lpRect->top=lpRect->left=0; - lpRect->right=w; - lpRect->bottom=h; - OutTraceB("GetClientRect: fixed rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); - return TRUE; - } - } - *lpRect=dxw.GetClientRect(*lpRect); - OutTraceB("GetClientRect: fixed rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); - } - return ret; -} - -BOOL WINAPI extGetWindowRect(HWND hwnd, LPRECT lpRect) -{ - BOOL ret; - OutTraceB("GetWindowRect: hwnd=%x hWnd=%x FullScreen=%x\n", hwnd, dxw.GethWnd(), dxw.IsFullScreen()); - - if(dxw.IsRealDesktop(hwnd)) hwnd = dxw.GethWnd(); // v2.03.52: fix for "Storm Angel" - - ret=(*pGetWindowRect)(hwnd, lpRect); - if(!ret) { - OutTraceE("GetWindowRect: GetWindowRect hwnd=%x error %d at %d\n", hwnd, GetLastError(), __LINE__); - return ret; - } - OutTraceB("GetWindowRect: rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); - - // minimized windows behaviour - if((lpRect->left == -32000)||(lpRect->top == -32000)) return ret; - - if (dxw.IsDesktop(hwnd)){ - // to avoid keeping track of window frame - *lpRect = dxw.GetScreenRect(); - OutTraceB("GetWindowRect: desktop rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); - } - else - if (dxw.IsFullScreen()){ - *lpRect=dxw.GetWindowRect(*lpRect); - - // Diablo fix: it retrieves coordinates for the explorer window, that are as big as the real desktop!!! - if(lpRect->left < 0) lpRect->left=0; -// if(lpRect->left > (LONG)dxw.GetScreenWidth()) lpRect->left=dxw.GetScreenWidth(); -// if(lpRect->right < 0) lpRect->right=0; - if(lpRect->right > (LONG)dxw.GetScreenWidth()) lpRect->right=dxw.GetScreenWidth(); - if(lpRect->top < 0) lpRect->top=0; -// if(lpRect->top > (LONG)dxw.GetScreenHeight()) lpRect->top=dxw.GetScreenHeight(); -// if(lpRect->bottom < 0) lpRect->bottom=0; - if(lpRect->bottom > (LONG)dxw.GetScreenHeight()) lpRect->bottom=dxw.GetScreenHeight(); - - OutTraceB("GetWindowRect: fixed rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); - } - - return ret; -} - -int WINAPI extMapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT cPoints) -{ - UINT pi; - int ret; - // a rarely used API, but responsible for a painful headache: needs hooking for "Commandos 2", "Alien Nations". - // used also in "Full Pipe" activemovie - // used also in "NBA Live 99" menu screen - - OutTraceDW("MapWindowPoints: hWndFrom=%x%s hWndTo=%x%s cPoints=%d FullScreen=%x\n", - hWndFrom, dxw.IsDesktop(hWndFrom)?"(DESKTOP)":"", - hWndTo, dxw.IsDesktop(hWndTo)?"(DESKTOP)":"", - cPoints, dxw.IsFullScreen()); - if(IsDebug){ - OutTrace("Points: "); - for(pi=0; pi>16, ret&0x0000FFFF); - return ret; -} - -HWND WINAPI extGetDesktopWindow(void) -{ - HWND res; - - if((!dxw.Windowize) || (dxw.dwFlags5 & DIABLOTWEAK)) { - HWND ret; - ret = (*pGetDesktopWindow)(); - OutTraceDW("GetDesktopWindow: BYPASS ret=%x\n", ret); - return ret; - } - - OutTraceDW("GetDesktopWindow: FullScreen=%x\n", dxw.IsFullScreen()); - if (dxw.IsFullScreen()){ - if(dxw.dwFlags6 & CREATEDESKTOP){ - extern HWND hDesktopWindow; - OutTraceDW("GetDesktopWindow: returning desktop emulated hwnd=%x\n", hDesktopWindow); - return hDesktopWindow; - } - OutTraceDW("GetDesktopWindow: returning main window hwnd=%x\n", dxw.GethWnd()); - return dxw.GethWnd(); - } - else{ - res=(*pGetDesktopWindow)(); - OutTraceDW("GetDesktopWindow: returning desktop window hwnd=%x\n", res); - return res; - } -} - -int WINAPI extGetSystemMetrics(int nindex) -{ - HRESULT res; - - res=(*pGetSystemMetrics)(nindex); - OutTraceDW("GetSystemMetrics: index=%x(%s), res=%d\n", nindex, ExplainsSystemMetrics(nindex), res); - - if(!dxw.Windowize){ - // v2.02.95: if not in window mode, just implement the HIDEMULTIMONITOR flag - if( (nindex ==SM_CMONITORS) && - (dxw.dwFlags2 & HIDEMULTIMONITOR) && - res>1) { - res=1; - OutTraceDW("GetSystemMetrics: fix SM_CMONITORS=%d\n", res); - } - return res; - } - - switch(nindex){ - case SM_CXFULLSCREEN: - case SM_CXSCREEN: - case SM_CXVIRTUALSCREEN: // v2.02.31 - res= dxw.GetScreenWidth(); - OutTraceDW("GetSystemMetrics: fix SM_CXSCREEN=%d\n", res); - break; - case SM_CYFULLSCREEN: - case SM_CYSCREEN: - case SM_CYVIRTUALSCREEN: // v2.02.31 - res= dxw.GetScreenHeight(); - OutTraceDW("GetSystemMetrics: fix SM_CYSCREEN=%d\n", res); - break; - case SM_CMONITORS: - if((dxw.dwFlags2 & HIDEMULTIMONITOR) && res>1) { - res=1; - OutTraceDW("GetSystemMetrics: fix SM_CMONITORS=%d\n", res); - } - break; - } - - return res; -} - -ATOM WINAPI extRegisterClassExA(WNDCLASSEX *lpwcx) -{ - OutTraceDW("RegisterClassEx: PROXED ClassName=%s style=%x(%s) WndProc=%x cbClsExtra=%d cbWndExtra=%d hInstance=%x\n", - lpwcx->lpszClassName, lpwcx->style, ExplainStyle(lpwcx->style), lpwcx->lpfnWndProc, lpwcx->cbClsExtra, lpwcx->cbWndExtra, lpwcx->hInstance); - return (*pRegisterClassExA)(lpwcx); -} - -ATOM WINAPI extRegisterClassA(WNDCLASS *lpwcx) -{ - // referenced by Syberia, together with RegisterClassExA - OutTraceDW("RegisterClass: PROXED ClassName=%s style=%x(%s) WndProc=%x cbClsExtra=%d cbWndExtra=%d hInstance=%x\n", - lpwcx->lpszClassName, lpwcx->style, ExplainStyle(lpwcx->style), lpwcx->lpfnWndProc, lpwcx->cbClsExtra, lpwcx->cbWndExtra, lpwcx->hInstance); - return (*pRegisterClassA)(lpwcx); -} - -static void HookChildWndProc(HWND hwnd, DWORD dwStyle, LPCTSTR ApiName) -{ - // child window inherit the father's windproc, so if it's redirected to - // a hooker (either extWindowProc or extChildWindowProc) you have to retrieve - // the correct value (dxwws.GetProc) before saving it (dxwws.PutProc). - long res; - WNDPROC pWindowProc; - - if(dxw.dwFlags6 & NOWINDOWHOOKS) return; - - pWindowProc = (WNDPROC)(*pGetWindowLongA)(hwnd, GWL_WNDPROC); - if((pWindowProc == extWindowProc) || - (pWindowProc == extChildWindowProc) || - (pWindowProc == extDialogWindowProc)){ // avoid recursions - HWND Father; - WNDPROC pFatherProc; - Father=(*pGetParent)(hwnd); - pFatherProc=dxwws.GetProc(Father); - OutTraceDW("%s: WndProc=%s father=%x WndProc=%x\n", ApiName, - (pWindowProc == extWindowProc) ? "extWindowProc" : ((pWindowProc == extChildWindowProc) ? "extChildWindowProc" : "extDialogWindowProc"), - Father, pFatherProc); - pWindowProc = pFatherProc; - } - dxwws.PutProc(hwnd, pWindowProc); - if(dwStyle & WS_CHILD){ - OutTraceDW("%s: Hooking CHILD hwnd=%x father WindowProc %x->%x\n", ApiName, hwnd, pWindowProc, extChildWindowProc); - res=(*pSetWindowLongA)(hwnd, GWL_WNDPROC, (LONG)extChildWindowProc); - } - else { // must be dwStyle & WS_DLGFRAME - OutTraceDW("%s: Hooking DLGFRAME hwnd=%x father WindowProc %x->%x\n", ApiName, hwnd, pWindowProc, extDialogWindowProc); - res=(*pSetWindowLongA)(hwnd, GWL_WNDPROC, (LONG)extDialogWindowProc); - } - if(!res) OutTraceE("%s: SetWindowLong ERROR %x\n", ApiName, GetLastError()); -} - -HWND hControlParentWnd = NULL; - -// see https://msdn.microsoft.com/en-us/library/windows/desktop/ms632679%28v=vs.85%29.aspx - -static BOOL IsFullscreenWindow( - void *lpClassName, - DWORD dwStyle, - DWORD dwExStyle, - HWND hWndParent, - int x, - int y, - int nWidth, - int nHeight) -{ - if (dwExStyle & WS_EX_CONTROLPARENT) return FALSE; // "Diablo" fix - if ((dwStyle & WS_CHILD) && (!dxw.IsDesktop(hWndParent))) return FALSE; // Diablo fix - // if maximized. - if(dwStyle & WS_MAXIMIZE) return TRUE; - // go through here only when WS_CHILD of desktop window - if((x == CW_USEDEFAULT) && (dwStyle & (WS_POPUP|WS_CHILD))) x = y = 0; - if(nWidth == CW_USEDEFAULT){ - if (dwStyle & (WS_POPUP|WS_CHILD)) nWidth = nHeight = 0; - else nWidth = dxw.GetScreenWidth() - x; - } - // msdn undocumented case: x,y=(-1000, CW_USEDEFAULT) w,h=(CW_USEDEFAULT,CW_USEDEFAULT) in "Imperialism" - if(nHeight == CW_USEDEFAULT){ - y = 0; - nHeight = dxw.GetScreenHeight(); - } - // if bigger than screen ... - if((x<=0)&& - (y<=0)&& - (nWidth>=(int)dxw.GetScreenWidth())&& - (nHeight>=(int)dxw.GetScreenHeight())) return TRUE; - return FALSE; -} - -static HWND WINAPI extCreateWindowCommon( - LPCTSTR ApiName, - BOOL WideChar, - DWORD dwExStyle, - void *lpClassName, - void *lpWindowName, - DWORD dwStyle, - int x, - int y, - int nWidth, - int nHeight, - HWND hWndParent, - HMENU hMenu, - HINSTANCE hInstance, - LPVOID lpParam) -{ - HWND hwnd; - BOOL isValidHandle=TRUE; - int iOrigW, iOrigH; - - iOrigW=nWidth; - iOrigH=nHeight; - if(!dxw.Windowize || (hWndParent == HWND_MESSAGE)){ // v2.02.87: don't process message windows (hWndParent == HWND_MESSAGE) - if(WideChar) - hwnd= (*pCreateWindowExW)(dwExStyle, (LPCWSTR)lpClassName, (LPCWSTR)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); - else - hwnd= (*pCreateWindowExA)(dwExStyle, (LPCSTR)lpClassName, (LPCSTR)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); - - if ((dxw.dwFlags1 & HOOKCHILDWIN) && (dwStyle & (WS_CHILD|WS_DLGFRAME))) - HookChildWndProc(hwnd, dwStyle, ApiName); - - OutTraceDW("%s: ret=%x\n", ApiName, hwnd); - return hwnd; - } - - // no maximized windows in any case - if (dxw.dwFlags1 & PREVENTMAXIMIZE){ - OutTraceDW("%s: handling PREVENTMAXIMIZE mode\n", ApiName); - dwStyle &= ~WS_MAXIMIZE; - } - - if(dxw.dwFlags6 & CREATEDESKTOP){ - extern HWND hDesktopWindow; - if (dxw.IsRealDesktop(hWndParent)){ - OutTraceE("%s: new parent win %x->%x\n", ApiName, hWndParent, hDesktopWindow); - hWndParent=hDesktopWindow; - } - } - - // v2.1.92: fixes size & position for auxiliary big window, often used - // for intro movies etc. : needed for ...... - // evidently, this was supposed to be a fullscreen window.... - // v2.1.100: fixes for "The Grinch": this game creates a new main window for OpenGL - // rendering using CW_USEDEFAULT placement and 800x600 size while the previous - // main win was 640x480 only! - // v2.02.13: if it's a WS_CHILD window, don't reposition the x,y, placement for BIG win. - // v2.02.30: fix (Fable - lost chapters) Fable creates a bigger win with negative x,y coordinates. - // v2.03.53: revised code, logic moved to IsFullscreenWindow - - if(IsFullscreenWindow(lpClassName, dwStyle, dwExStyle, hWndParent, x, y, nWidth, nHeight)){ - RECT screen; - POINT upleft = {0,0}; - - // update virtual screen size if it has grown - dxw.SetScreenSize(nWidth, nHeight); - - // inserted some checks here, since the main window could be destroyed - // or minimized (see "Jedi Outcast") so that you may get a dangerous - // zero size. In this case, better renew the hWnd assignement and its coordinates. - do { // fake loop - isValidHandle = FALSE; - if (!(*pGetClientRect)(dxw.GethWnd(),&screen)) break; - if (!(*pClientToScreen)(dxw.GethWnd(),&upleft)) break; - if (screen.right==0 || screen.bottom==0) break; - isValidHandle = TRUE; - } while(FALSE); - if (isValidHandle){ // use parent's coordinates - if (!(dwStyle & WS_CHILD)){ - x=upleft.x; - y=upleft.y; - } - nWidth=screen.right; - nHeight=screen.bottom; - OutTraceDW("%s: fixed BIG win pos=(%d,%d) size=(%d,%d)\n", ApiName, x, y, nWidth, nHeight); - } - else { - x=dxw.iPosX; - y=dxw.iPosY; - nWidth=dxw.iSizX; - nHeight=dxw.iSizY; - OutTraceDW("%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){ - RECT workarea; - (*pSystemParametersInfoA)(SPI_GETWORKAREA, NULL, &workarea, 0); - x=0; - y=0; - nWidth=workarea.right; - nHeight=workarea.bottom; - dwStyle=0; - OutTraceDW("%s: WORKAREA win pos=(%d,%d) size=(%d,%d)\n", ApiName, x, y, nWidth, nHeight); - } - else if(dxw.Coordinates==DXW_DESKTOP_FULL){ - RECT workarea; - (*pGetClientRect)((*pGetDesktopWindow)(), &workarea); - x=0; - y=0; - nWidth=workarea.right; - nHeight=workarea.bottom; - dwStyle=0; - OutTraceDW("%s: FULLDESKTOP win pos=(%d,%d) size=(%d,%d)\n", ApiName, x, y, nWidth, nHeight); - } - } - - if(!dxw.IsFullScreen()){ // v2.1.63: needed for "Monster Truck Madness" - if(WideChar) - hwnd= (*pCreateWindowExW)(dwExStyle, (LPCWSTR)lpClassName, (LPCWSTR)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); - else - hwnd= (*pCreateWindowExA)(dwExStyle, (LPCSTR)lpClassName, (LPCSTR)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); - OutTraceDW("%s: windowed mode ret=%x\n", ApiName, hwnd); - return hwnd; - } - - // from here on, fullscreen is garanteed - - if (dwStyle & WS_CHILD){ - // tested on Gangsters: coordinates must be window-relative!!! - // Age of Empires.... - dxw.MapClient(&x, &y, &nWidth, &nHeight); - OutTraceDW("%s: fixed WS_CHILD pos=(%d,%d) size=(%d,%d)\n", - ApiName, x, y, nWidth, nHeight); - } - else { - if ((dwExStyle & WS_EX_CONTROLPARENT) || (dwStyle & WS_POPUP)){ - // needed for "Diablo", that creates a new WS_EX_CONTROLPARENT window that must be - // overlapped to the directdraw surface. - // needed for "Riven", that creates a new WS_POPUP window with the menu bar that must be - // overlapped to the directdraw surface. - dxw.MapWindow(&x, &y, &nWidth, &nHeight); - OutTraceDW("%s: fixed pos=(%d,%d) size=(%d,%d)\n", - ApiName, x, y, nWidth, nHeight); - } - } - - 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)); - - if(WideChar) - hwnd= (*pCreateWindowExW)(dwExStyle, (LPCWSTR)lpClassName, (LPCWSTR)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); - else - hwnd= (*pCreateWindowExA)(dwExStyle, (LPCSTR)lpClassName, (LPCSTR)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); - if (hwnd==(HWND)NULL){ - OutTraceE("%s: ERROR err=%d Style=%x(%s) ExStyle=%x\n", - ApiName, GetLastError(), dwStyle, ExplainStyle(dwStyle), dwExStyle); - return hwnd; - } - - if (dwExStyle & WS_EX_CONTROLPARENT) hControlParentWnd=hwnd; - - if ((!isValidHandle) && dxw.IsFullScreen()){ - dxw.SethWnd(hwnd); - extern void AdjustWindowPos(HWND, DWORD, DWORD); - (*pSetWindowLongA)(hwnd, GWL_STYLE, (dxw.dwFlags2 & MODALSTYLE) ? 0 : WS_OVERLAPPEDWINDOW); - (*pSetWindowLongA)(hwnd, GWL_EXSTYLE, 0); - OutTraceDW("%s: hwnd=%x, set style=WS_OVERLAPPEDWINDOW extstyle=0\n", ApiName, hwnd); - AdjustWindowPos(hwnd, nWidth, nHeight); - (*pShowWindow)(hwnd, SW_SHOWNORMAL); - } - - //if ((dxw.dwFlags1 & FIXWINFRAME) && !(dwStyle & WS_CHILD)) - if ((dxw.dwFlags1 & FIXWINFRAME) && !(dwStyle & WS_CHILD) && dxw.IsDesktop(hwnd)) - dxw.FixWindowFrame(hwnd); - - if ((dxw.dwFlags1 & HOOKCHILDWIN) && (dwStyle & (WS_CHILD|WS_DLGFRAME))) - HookChildWndProc(hwnd, dwStyle, ApiName); - - if ((FIXCHILDSIZE) && (dwStyle & (WS_CHILD|WS_DLGFRAME))) - dxwws.PutSize(hwnd, iOrigW, iOrigH); - - // "Hoyle Casino Empire" needs to be in a maximized state to continue after the intro movie. - // Sending a SW_MAXIMIZE message intercepted by the PREVENTMAXIMIZE handling fixes the problem. - //if (dxw.IsFullScreen() && (dxw.dwFlags1 & PREVENTMAXIMIZE)){ - if ((hwnd == dxw.GethWnd()) && dxw.IsFullScreen() && (dxw.dwFlags1 & PREVENTMAXIMIZE)){ - OutTraceDW("%s: entering maximized state\n", ApiName); - (*pShowWindow)(hwnd, SW_MAXIMIZE); - } - - if(dxw.dwFlags1 & CLIPCURSOR) dxw.SetClipCursor(); - - OutTraceDW("%s: ret=%x\n", ApiName, hwnd); - return hwnd; -} - -static LPCSTR ClassToStr(LPCSTR Class) -{ - static char AtomBuf[20+1]; - if(((DWORD)Class & 0xFFFF0000) == 0){ - sprintf(AtomBuf, "ATOM(%X)", (DWORD)Class); - return AtomBuf; - } - return Class; -} - -static LPCWSTR ClassToWStr(LPCWSTR Class) -{ - static WCHAR AtomBuf[20+1]; - if(((DWORD)Class & 0xFFFF0000) == 0){ - swprintf(AtomBuf, L"ATOM(%X)", (DWORD)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) -{ - if(IsTraceDW){ - char xString[20], yString[20], wString[20], hString[20]; - if (x==CW_USEDEFAULT) strcpy(xString,"CW_USEDEFAULT"); - else sprintf(xString,"%d", x); - if (y==CW_USEDEFAULT) strcpy(yString,"CW_USEDEFAULT"); - else sprintf(yString,"%d", y); - if (nWidth==CW_USEDEFAULT) strcpy(wString,"CW_USEDEFAULT"); - else sprintf(wString,"%d", nWidth); - if (nHeight==CW_USEDEFAULT) strcpy(hString,"CW_USEDEFAULT"); - else sprintf(hString,"%d", nHeight); - OutTrace("CreateWindowExW: class=\"%ls\" wname=\"%ls\" pos=(%s,%s) size=(%s,%s) Style=%x(%s) ExStyle=%x(%s) hWndParent=%x%s hMenu=%x\n", - ClassToWStr(lpClassName), lpWindowName, xString, yString, wString, hString, - dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle), - hWndParent, hWndParent==HWND_MESSAGE?"(HWND_MESSAGE)":"", hMenu); - } - OutTraceB("CreateWindowExW: DEBUG fullscreen=%x mainwin=%x screen=(%d,%d)\n", - dxw.IsFullScreen(), dxw.GethWnd(), dxw.GetScreenWidth(), dxw.GetScreenHeight()); - - if((dxw.dwFlags6 & STRETCHMOVIES) && !wcscmp(lpWindowName, L"ActiveMovie Window")){ - RECT MainWin; - (*pGetClientRect)(dxw.GethWnd(), &MainWin); - nWidth = MainWin.right; - nHeight = MainWin.bottom; - } - - return extCreateWindowCommon("CreateWindowExW", TRUE, dwExStyle, (void *)lpClassName, (void *)lpWindowName, 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) -{ - if(IsTraceDW){ - char xString[20], yString[20], wString[20], hString[20]; - if (x==CW_USEDEFAULT) strcpy(xString,"CW_USEDEFAULT"); - else sprintf(xString,"%d", x); - if (y==CW_USEDEFAULT) strcpy(yString,"CW_USEDEFAULT"); - else sprintf(yString,"%d", y); - if (nWidth==CW_USEDEFAULT) strcpy(wString,"CW_USEDEFAULT"); - else sprintf(wString,"%d", nWidth); - if (nHeight==CW_USEDEFAULT) strcpy(hString,"CW_USEDEFAULT"); - else sprintf(hString,"%d", nHeight); - OutTrace("CreateWindowExA: class=\"%s\" wname=\"%s\" pos=(%s,%s) size=(%s,%s) Style=%x(%s) ExStyle=%x(%s) hWndParent=%x%s hMenu=%x\n", - ClassToStr(lpClassName), lpWindowName, xString, yString, wString, hString, - dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle), - hWndParent, hWndParent==HWND_MESSAGE?"(HWND_MESSAGE)":"", hMenu); - } - OutTraceB("CreateWindowExA: DEBUG fullscreen=%x mainwin=%x screen=(%d,%d)\n", - dxw.IsFullScreen(), dxw.GethWnd(), dxw.GetScreenWidth(), dxw.GetScreenHeight()); - - if((dxw.dwFlags6 & STRETCHMOVIES) && !strcmp(lpWindowName, "ActiveMovie Window")){ - RECT MainWin; - (*pGetClientRect)(dxw.GethWnd(), &MainWin); - nWidth = MainWin.right; - nHeight = MainWin.bottom; - } - - return extCreateWindowCommon("CreateWindowExA", FALSE, dwExStyle, (void *)lpClassName, (void *)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); -} - -LRESULT WINAPI extCallWindowProcA(WNDPROC lpPrevWndFunc, HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) -{ - // v2.02.30: fix (Imperialism II): apply to main window only !!! - HRESULT res; - - res = -1; - if(hwnd == dxw.GethWnd()) res=FixWindowProc("CallWindowProcA", hwnd, Msg, wParam, &lParam); - - if (res==(HRESULT)-1) - return (*pCallWindowProcA)(lpPrevWndFunc, hwnd, Msg, wParam, lParam); - else - return res; -} - -LRESULT WINAPI extCallWindowProcW(WNDPROC lpPrevWndFunc, HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) -{ - // v2.02.30: fix (Imperialism II): apply to main window only !!! - HRESULT res; - - res = -1; - if(hwnd == dxw.GethWnd()) res=FixWindowProc("CallWindowProcW", hwnd, Msg, wParam, &lParam); - - if (res==(HRESULT)-1) - return (*pCallWindowProcW)(lpPrevWndFunc, hwnd, Msg, wParam, lParam); - else - return res; -} - -LRESULT WINAPI extDefWindowProcA(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) -{ - // v2.02.30: fix (Imperialism II): apply to main window only !!! - // v2.03.50: fix - do clip cursor only after the window has got focus - HRESULT res; - res = (HRESULT)-1; - if(hwnd == dxw.GethWnd()) res=FixWindowProc("DefWindowProcA", hwnd, Msg, wParam, &lParam); - if (res==(HRESULT)-1) res = (*pDefWindowProcA)(hwnd, Msg, wParam, lParam); - if((Msg == WM_SETFOCUS) && (dxw.dwFlags1 & CLIPCURSOR)) dxw.SetClipCursor(); - return res; -} - -LRESULT WINAPI extDefWindowProcW(HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam) -{ - // v2.02.30: fix (Imperialism II): apply to main window only !!! - // v2.03.50: fix - do clip cursor only after the window has got focus - HRESULT res; - res = (HRESULT)-1; - if(hwnd == dxw.GethWnd()) res=FixWindowProc("DefWindowProcW", hwnd, Msg, wParam, &lParam); - if (res==(HRESULT)-1) res = (*pDefWindowProcW)(hwnd, Msg, wParam, lParam); - if((Msg == WM_SETFOCUS) && (dxw.dwFlags1 & CLIPCURSOR)) dxw.SetClipCursor(); - return res; -} - -static int HandleRect(char *ApiName, void *pFun, HDC hdc, const RECT *lprc, HBRUSH hbr) -{ - // used for both FillRect and FrameRect calls - int res; - RECT rc; - OutTraceDW("%s: hdc=%x hbrush=%x rect=(%d,%d)-(%d,%d)\n", ApiName, hdc, hbr, lprc->left, lprc->top, lprc->right, lprc->bottom); - - if(dxw.dwFlags4 & NOFILLRECT) { - OutTraceDW("%s: SUPPRESS\n", ApiName, hdc, hbr, lprc->left, lprc->top, lprc->right, lprc->bottom); - return TRUE; - } - - memcpy(&rc, lprc, sizeof(rc)); - - // Be careful: when you call CreateCompatibleDC with NULL DC, it is created a memory DC - // with same characteristics as desktop. That would return true from the call to - // dxw.IsRealDesktop(WindowFromDC(hdc)) because WindowFromDC(hdc) is null. - // So, it's fundamental to check also the hdc type (OBJ_DC is a window's DC) - - if((dxw.IsRealDesktop(WindowFromDC(hdc)) && (OBJ_DC == GetObjectType(hdc)))) { - HWND VirtualDesktop; - VirtualDesktop=dxw.GethWnd(); - if(VirtualDesktop==NULL){ - OutTraceDW("%s: no virtual desktop\n", ApiName); - return TRUE; - } - OutTraceDW("%s: remapped hdc to virtual desktop hwnd=%x\n", ApiName, dxw.GethWnd()); - hdc=(*pGDIGetDC)(dxw.GethWnd()); - } - - if(dxw.IsToRemap(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(); - - switch(dxw.GDIEmulationMode){ - case GDIMODE_SHAREDDC: - if (sdc.GetPrimaryDC(hdc)){ - res=(*(FillRect_Type)pFun)(sdc.GetHdc(), &rc, hbr); - sdc.PutPrimaryDC(hdc, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top); - return res; - } - break; - case GDIMODE_STRETCHED: - dxw.MapClient(&rc); - OutTraceDW("%s: fixed rect=(%d,%d)-(%d,%d)\n", ApiName, rc.left, rc.top, rc.right, rc.bottom); - break; - default: - break; - } - } - else { - // when not in fullscreen mode, just proxy the call - // but check coordinates: some games may use excessive coordinates: see "Premier Manager 98" - RECT client; - HWND hwnd; - hwnd=WindowFromDC(hdc); - (*pGetClientRect)(hwnd, &client); - if(rc.left < 0) rc.left=0; - if(rc.top < 0) rc.top=0; - if(rc.right > client.right) rc.right=client.right; - if(rc.bottom > client.bottom) rc.bottom=client.bottom; - OutTraceDW("%s: remapped hdc from hwnd=%x to rect=(%d,%d)-(%d,%d)\n", ApiName, hwnd, rc.left, rc.top, rc.right, rc.bottom); - } - - res=(*(FillRect_Type)pFun)(hdc, &rc, hbr); - return res; -} - -int WINAPI extFillRect(HDC hdc, const RECT *lprc, HBRUSH hbr) -{ - return HandleRect("FillRect", (void *)pFillRect, hdc, lprc, hbr); -} - -int WINAPI extFrameRect(HDC hdc, const RECT *lprc, HBRUSH hbr) -{ - return HandleRect("FramelRect", (void *)pFrameRect, hdc, lprc, hbr); -} - -BOOL WINAPI extInvertRect(HDC hdc, const RECT *lprc) -{ - int res; - RECT rc; - OutTraceDW("InvertRect: hdc=%x rect=(%d,%d)-(%d,%d)\n", hdc, lprc->left, lprc->top, lprc->right, lprc->bottom); - - memcpy(&rc, lprc, sizeof(rc)); - - if(dxw.IsToRemap(hdc)) { - switch(dxw.GDIEmulationMode){ - case GDIMODE_SHAREDDC: - if(sdc.GetPrimaryDC(hdc)){ - res=(*pInvertRect)(sdc.GetHdc(), &rc); - sdc.PutPrimaryDC(hdc, rc.left, rc.top, rc.right-rc.left, rc.bottom-rc.top); - return res; - } - break; - case GDIMODE_STRETCHED: - dxw.MapClient(&rc); - OutTraceDW("InvertRect: fixed rect=(%d,%d)-(%d,%d)\n", rc.left, rc.top, rc.right, rc.bottom); - break; - default: - break; - } - } - - res=(*pInvertRect)(hdc, &rc); - return res; -} - -int WINAPI extValidateRect(HWND hwnd, const RECT *lprc) -{ - int res; - RECT rc; - - OutTraceDW("ValidateRect: hwnd=%x rect=(%d,%d)-(%d,%d)\n", - hwnd, lprc->left, lprc->top, lprc->right, lprc->bottom); - - memcpy(&rc, lprc, sizeof(rc)); - - if(dxw.IsFullScreen()) { - if(dxw.IsRealDesktop(hwnd)) hwnd=dxw.GethWnd(); - dxw.MapClient(&rc); - OutTraceDW("ValidateRect: fixed rect=(%d,%d)-(%d,%d)\n", rc.left, rc.top, rc.right, rc.bottom); - } - - res=(*pValidateRect)(hwnd, &rc); - return res; -} - -BOOL WINAPI extClipCursor(RECT *lpRectArg) -{ - // reference: hooking and setting ClipCursor is mandatori in "Emergency: Fighters for Life" - // where the application expects the cursor to be moved just in a inner rect within the - // main window surface. - - BOOL res; - RECT *lpRect; - RECT Rect; - - if(IsTraceC){ - if (lpRectArg) - OutTrace("ClipCursor: rect=(%d,%d)-(%d,%d)\n", - lpRectArg->left,lpRectArg->top,lpRectArg->right,lpRectArg->bottom); - else - OutTrace("ClipCursor: rect=(NULL)\n"); - } - - if (!(dxw.dwFlags1 & ENABLECLIPPING)) return 1; - - if(lpRectArg){ - Rect=*lpRectArg; - lpRect=&Rect; - } - else - lpRect=NULL; - - if(dxw.dwFlags1 & MODIFYMOUSE){ - // save desired clip region - // v2.02.39: fix - do not attempt to write to NULL lpRect - if (lpRect) { - ClipRegion=*lpRectArg; - lpClipRegion=&ClipRegion; - *lpRect=dxw.MapWindowRect(lpRect); - } - else - lpClipRegion=NULL; - } - - if (pClipCursor) res=(*pClipCursor)(lpRect); - if (lpRect) OutTraceDW("ClipCursor: REMAPPED rect=(%d,%d)-(%d,%d) res=%x\n", lpRect->left,lpRect->top,lpRect->right,lpRect->bottom, res); - - return TRUE; -} - -BOOL WINAPI extGetClipCursor(LPRECT lpRect) -{ - // v2.1.93: if ENABLECLIPPING, return the saved clip rect coordinates - - BOOL ret; - - // proxy.... - if (!(dxw.dwFlags1 & ENABLECLIPPING)) { - ret=(*pGetClipCursor)(lpRect); - // v2.03.11: fix for "SubCulture" mouse movement - if(lpRect && dxw.Windowize) *lpRect = dxw.GetScreenRect(); - if(IsTraceDDRAW){ - if (lpRect) - OutTrace("GetClipCursor: rect=(%d,%d)-(%d,%d) ret=%d\n", - lpRect->left,lpRect->top,lpRect->right,lpRect->bottom, ret); - else - OutTrace("GetClipCursor: rect=(NULL) ret=%d\n", ret); - } - return ret; - } - - if(lpRect){ - if(lpClipRegion) - *lpRect=ClipRegion; - else - *lpRect=dxw.GetScreenRect(); - OutTraceDW("GetClipCursor: rect=(%d,%d)-(%d,%d) ret=%d\n", - lpRect->left,lpRect->top,lpRect->right,lpRect->bottom, TRUE); - } - - return TRUE; -} - -LONG WINAPI extEnumDisplaySettings(LPCTSTR lpszDeviceName, DWORD iModeNum, DEVMODE *lpDevMode) -{ - LONG res; - OSVERSIONINFO osinfo; - - osinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - (*pGetVersionExA)(&osinfo); - OutTraceDW("EnumDisplaySettings: Devicename=%s ModeNum=%x OS=%d.%d\n", lpszDeviceName, iModeNum, osinfo.dwMajorVersion, osinfo.dwMinorVersion); - - if(dxw.dwFlags4 & NATIVERES){ - // lists video card native resolutions, though faking emulated color resolutions - if((osinfo.dwMajorVersion >= 6) && (dxw.dwFlags1 & EMULATESURFACE)){ - switch(iModeNum){ - case ENUM_CURRENT_SETTINGS: - case ENUM_REGISTRY_SETTINGS: // lie ... - res=(*pEnumDisplaySettings)(lpszDeviceName, iModeNum, lpDevMode); - if(dxw.dwFlags2 & INIT8BPP) lpDevMode->dmBitsPerPel = 8; - if(dxw.dwFlags2 & INIT16BPP) lpDevMode->dmBitsPerPel = 16; - if(dxw.dwFlags3 & FORCE16BPP) lpDevMode->dmBitsPerPel = 16; - break; - default: - res=(*pEnumDisplaySettings)(lpszDeviceName, iModeNum / SUPPORTED_DEPTHS_NUMBER, lpDevMode); - lpDevMode->dmBitsPerPel = (DWORD)SupportedDepths[iModeNum % SUPPORTED_DEPTHS_NUMBER]; - break; - } - } - else - res=(*pEnumDisplaySettings)(lpszDeviceName, iModeNum, lpDevMode); - - } - else { // simulated modes: VGA or HDTV - //int SupportedDepths[5]={8,16,24,32,0}; - SupportedRes_Type *SupportedRes; - SupportedRes = (dxw.dwFlags4 & SUPPORTHDTV) ? &SupportedHDTVRes[0] : &SupportedSVGARes[0]; - res=(*pEnumDisplaySettings)(lpszDeviceName, ENUM_CURRENT_SETTINGS, lpDevMode); - switch(iModeNum){ - case ENUM_CURRENT_SETTINGS: - case ENUM_REGISTRY_SETTINGS: // lie ... - lpDevMode->dmPelsHeight = 600; - lpDevMode->dmPelsWidth = 800; - if(dxw.dwFlags2 & INIT8BPP) lpDevMode->dmBitsPerPel = 8; - if(dxw.dwFlags2 & INIT16BPP) lpDevMode->dmBitsPerPel = 16; - if(dxw.dwFlags3 & FORCE16BPP) lpDevMode->dmBitsPerPel = 16; - break; - default: - lpDevMode->dmPelsHeight = SupportedRes[iModeNum / 4].h; - lpDevMode->dmPelsWidth = SupportedRes[iModeNum / 4].w; - lpDevMode->dmBitsPerPel = SupportedDepths[iModeNum % 4]; - if(lpDevMode->dmPelsHeight == 0) res = 0; // end of list - break; - } - } - - if(dxw.dwFlags4 & LIMITSCREENRES){ - #define HUGE 100000 - DWORD maxw, maxh; - maxw = maxh = HUGE; - switch(dxw.MaxScreenRes){ - case DXW_NO_LIMIT: maxw=HUGE; maxh=HUGE; break; - case DXW_LIMIT_320x200: maxw=320; maxh=200; break; - case DXW_LIMIT_640x480: maxw=640; maxh=480; break; - case DXW_LIMIT_800x600: maxw=800; maxh=600; break; - case DXW_LIMIT_1024x768: maxw=1024; maxh=768; break; - case DXW_LIMIT_1280x960: maxw=1280; maxh=960; break; - } - if((lpDevMode->dmPelsWidth > maxw) || (lpDevMode->dmPelsHeight > maxh)){ - OutTraceDW("EnumDisplaySettings: limit device size=(%d,%d)\n", maxw, maxh); - lpDevMode->dmPelsWidth = maxw; - lpDevMode->dmPelsHeight = maxh; - } - } - - OutTraceDW("EnumDisplaySettings: color=%dBPP size=(%dx%d) refresh=%dHz\n", - lpDevMode->dmBitsPerPel, lpDevMode->dmPelsWidth, lpDevMode->dmPelsHeight, lpDevMode->dmDisplayFrequency); - return res; -} - -LONG WINAPI extChangeDisplaySettingsA(DEVMODEA *lpDevMode, DWORD dwflags) -{ - if(IsTraceDDRAW){ - char sInfo[1024]; - strcpy(sInfo, ""); - if (lpDevMode) sprintf(sInfo, " DeviceName=%s fields=%x(%s) size=(%d x %d) bpp=%d", - lpDevMode->dmDeviceName, lpDevMode->dmFields, ExplainDevModeFields(lpDevMode->dmFields), - lpDevMode->dmPelsWidth, lpDevMode->dmPelsHeight, lpDevMode->dmBitsPerPel); - OutTrace("ChangeDisplaySettingsA: lpDevMode=%x flags=%x(%s)%s\n", - lpDevMode, dwflags, ExplainChangeDisplaySettingsFlags(dwflags), sInfo); - } - - if(dxw.Windowize) - return MyChangeDisplaySettings("ChangeDisplaySettingsA", FALSE, lpDevMode, dwflags); - else - return (*pChangeDisplaySettingsExA)(NULL, lpDevMode, NULL, dwflags, NULL); -} - -LONG WINAPI extChangeDisplaySettingsW(DEVMODEW *lpDevMode, DWORD dwflags) -{ - if(IsTraceDDRAW){ - char sInfo[1024]; - strcpy(sInfo, ""); - if (lpDevMode) sprintf(sInfo, " DeviceName=%ls fields=%x(%s) size=(%d x %d) bpp=%d", - lpDevMode->dmDeviceName, lpDevMode->dmFields, ExplainDevModeFields(lpDevMode->dmFields), - lpDevMode->dmPelsWidth, lpDevMode->dmPelsHeight, lpDevMode->dmBitsPerPel); - OutTrace("ChangeDisplaySettingsW: lpDevMode=%x flags=%x(%s)%s\n", - lpDevMode, dwflags, ExplainChangeDisplaySettingsFlags(dwflags), sInfo); - } - - if(dxw.Windowize) - return MyChangeDisplaySettings("ChangeDisplaySettingsW", TRUE, lpDevMode, dwflags); - else - return (*pChangeDisplaySettingsW)(lpDevMode, dwflags); -} - -LONG WINAPI extChangeDisplaySettingsExA(LPCTSTR lpszDeviceName, DEVMODEA *lpDevMode, HWND hwnd, DWORD dwflags, LPVOID lParam) -{ - if(IsTraceDDRAW){ - char sInfo[1024]; - strcpy(sInfo, ""); - if (lpDevMode) sprintf(sInfo, " DeviceName=%s fields=%x(%s) size=(%d x %d) bpp=%d", - lpDevMode->dmDeviceName, lpDevMode->dmFields, ExplainDevModeFields(lpDevMode->dmFields), - lpDevMode->dmPelsWidth, lpDevMode->dmPelsHeight, lpDevMode->dmBitsPerPel); - OutTrace("ChangeDisplaySettingsExA: DeviceName=%s lpDevMode=%x flags=%x(%s)%s\n", - lpszDeviceName, lpDevMode, dwflags, ExplainChangeDisplaySettingsFlags(dwflags), sInfo); - } - - if(dxw.Windowize) - return MyChangeDisplaySettings("ChangeDisplaySettingsExA", FALSE, lpDevMode, dwflags); - else - return (*pChangeDisplaySettingsExA)(lpszDeviceName, lpDevMode, hwnd, dwflags, lParam); -} - -LONG WINAPI extChangeDisplaySettingsExW(LPCTSTR lpszDeviceName, DEVMODEW *lpDevMode, HWND hwnd, DWORD dwflags, LPVOID lParam) -{ - if(IsTraceDDRAW){ - char sInfo[1024]; - strcpy(sInfo, ""); - if (lpDevMode) sprintf(sInfo, " DeviceName=%ls fields=%x(%s) size=(%d x %d) bpp=%d", - lpDevMode->dmDeviceName, lpDevMode->dmFields, ExplainDevModeFields(lpDevMode->dmFields), - lpDevMode->dmPelsWidth, lpDevMode->dmPelsHeight, lpDevMode->dmBitsPerPel); - OutTrace("ChangeDisplaySettingsExW: DeviceName=%ls lpDevMode=%x flags=%x(%s)%s\n", - lpszDeviceName, lpDevMode, dwflags, ExplainChangeDisplaySettingsFlags(dwflags), sInfo); - } - - if(dxw.Windowize) - return MyChangeDisplaySettings("ChangeDisplaySettingsExW", TRUE, lpDevMode, dwflags); - else - return (*pChangeDisplaySettingsExW)(lpszDeviceName, lpDevMode, hwnd, dwflags, lParam); -} - -static HDC WINAPI sGetDC(HWND hwnd, char *ApiName) -{ - // to do: add parameter and reference to pGDIGetDCEx to merge properly GetDC and GetDCEx - HDC ret; - HWND lochwnd; - - if(!dxw.IsFullScreen() || (dxw.dwFlags6 & SHAREDDC)) return(*pGDIGetDC)(hwnd); - - lochwnd=hwnd; - - if (dxw.IsRealDesktop(hwnd)) { - OutTraceDW("%s: desktop remapping hwnd=%x->%x\n", ApiName, hwnd, dxw.GethWnd()); - lochwnd=dxw.GethWnd(); - } - - //if(bFlippedDC) { - // ret = dxw.AcquireSharedDC(hwnd); - // if(ret) return ret; - //} - - switch(dxw.GDIEmulationMode){ - case GDIMODE_STRETCHED: - ret=(*pGDIGetDC)(lochwnd); - break; - case GDIMODE_EMULATED: - ret=dxw.AcquireEmulatedDC(lochwnd); - break; - } - - if(ret){ - OutTraceDW("%s: hwnd=%x ret=%x\n", ApiName, lochwnd, ret); - } - else{ - int err; - err=GetLastError(); - OutTraceE("%s ERROR: hwnd=%x err=%d at %d\n", ApiName, lochwnd, err, __LINE__); - if((err==ERROR_INVALID_WINDOW_HANDLE) && (lochwnd!=hwnd)){ - ret=(*pGDIGetDC)(hwnd); - if(ret) - OutTraceDW("%s: hwnd=%x ret=%x\n", ApiName, hwnd, ret); - else - OutTraceE("%s ERROR: hwnd=%x err=%d at %d\n", ApiName, hwnd, GetLastError(), __LINE__); - } - } - - return ret; -} - -HDC WINAPI extGDIGetDC(HWND hwnd) -{ - OutTraceDW("GDI.GetDC: hwnd=%x\n", hwnd); - return sGetDC(hwnd, "GDI.GetDC"); -} - -HDC WINAPI extGDIGetDCEx(HWND hwnd, HRGN hrgnClip, DWORD flags) -{ - // used by Star Wars Shadow of the Empire - OutTraceDW("GDI.GetDCEx: hwnd=%x hrgnClip=%x flags=%x(%s)\n", hwnd, hrgnClip, flags, ExplainGetDCExFlags(flags)); - return sGetDC(hwnd, "GDI.GetDCEx"); -} - -HDC WINAPI extGDIGetWindowDC(HWND hwnd) -{ - OutTraceDW("GDI.GetWindowDC: hwnd=%x\n", hwnd); - - // if not fullscreen or not desktop win, just proxy the call - if(!dxw.IsFullScreen() || !dxw.IsDesktop(hwnd)){ - HDC ret; - ret=(*pGDIGetWindowDC)(hwnd); - OutTraceDW("GDI.GetWindowDC: hwnd=%x hdc=%x\n", hwnd, ret); - return ret; - } - - return sGetDC(hwnd, "GDI.GetWindowDC"); -} - -int WINAPI extGDIReleaseDC(HWND hwnd, HDC hDC) -{ - int res; - - OutTraceDW("GDI.ReleaseDC: hwnd=%x hdc=%x\n", hwnd, hDC); - - if (dxw.IsRealDesktop(hwnd)) hwnd=dxw.GethWnd(); - if(hwnd == 0) return(TRUE); - - switch(dxw.GDIEmulationMode){ - case GDIMODE_STRETCHED: - res=(*pGDIReleaseDC)(hwnd, hDC); - break; - case GDIMODE_EMULATED: - res=dxw.ReleaseEmulatedDC(hwnd); - break; - } - - if (!res) OutTraceE("GDI.ReleaseDC ERROR: err=%d at %d\n", GetLastError(), __LINE__); - return(res); -} - -HDC WINAPI extBeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint) -{ - HDC hdc; - - OutTraceDW("GDI.BeginPaint: hwnd=%x lpPaint=%x FullScreen=%x\n", hwnd, lpPaint, dxw.IsFullScreen()); - - // avoid access to real desktop - if(dxw.IsRealDesktop(hwnd)) hwnd=dxw.GethWnd(); - - hdc=(*pBeginPaint)(hwnd, lpPaint); - - // if not in fullscreen mode, that's all! - if(!dxw.IsFullScreen()) return hdc; - - switch(dxw.GDIEmulationMode){ - case GDIMODE_STRETCHED: - // on CLIENTREMAPPING, resize the paint area to virtual screen size - //if(dxw.dwFlags1 & CLIENTREMAPPING) lpPaint->rcPaint=dxw.GetScreenRect(); - if(dxw.dwFlags1 & CLIENTREMAPPING) dxw.UnmapClient(&(lpPaint->rcPaint)); - break; - case GDIMODE_EMULATED: - HDC EmuHDC; - EmuHDC = dxw.AcquireEmulatedDC(hwnd); - lpPaint->hdc=EmuHDC; - hdc = EmuHDC; - break; - } - - - OutTraceDW("GDI.BeginPaint: hdc=%x rcPaint=(%d,%d)-(%d,%d)\n", - hdc, lpPaint->rcPaint.left, lpPaint->rcPaint.top, lpPaint->rcPaint.right, lpPaint->rcPaint.bottom); - return hdc; -} - -BOOL WINAPI extEndPaint(HWND hwnd, const PAINTSTRUCT *lpPaint) -{ - BOOL ret; - - OutTraceDW("GDI.EndPaint: hwnd=%x lpPaint=%x lpPaint.hdc=%x lpPaint.rcpaint=(%d,%d)-(%d-%d)\n", - hwnd, lpPaint, lpPaint->hdc, lpPaint->rcPaint.left, lpPaint->rcPaint.top, lpPaint->rcPaint.right, lpPaint->rcPaint.bottom); - - // if not fullscreen or not desktop win, just proxy the call - if(!dxw.IsFullScreen() || (dxw.dwFlags6 & SHAREDDC)){ - ret=(*pEndPaint)(hwnd, lpPaint); - return ret; - } - - // avoid access to real desktop - if(dxw.IsRealDesktop(hwnd)) hwnd=dxw.GethWnd(); - - switch(dxw.GDIEmulationMode){ - case GDIMODE_EMULATED: - ret=dxw.ReleaseEmulatedDC(hwnd); - break; - default: - ret=(*pEndPaint)(hwnd, lpPaint); - break; - } - - if(ret){ - OutTraceDW("GDI.EndPaint: hwnd=%x ret=%x\n", hwnd, ret); - } - else{ - OutTraceE("GDI.EndPaint ERROR: err=%d at %d\n", GetLastError(), __LINE__); - } - - return ret; -} - -HWND WINAPI extCreateDialogIndirectParam(HINSTANCE hInstance, LPCDLGTEMPLATE lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM lParamInit) -{ - HWND RetHWND; - BOOL FullScreen; - FullScreen = dxw.IsFullScreen(); - OutTraceDW("CreateDialogIndirectParam: hInstance=%x lpTemplate=(style=%x extstyle=%x items=%d pos=(%d,%d) size=(%dx%d)) hWndParent=%x lpDialogFunc=%x lParamInit=%x\n", - hInstance, - lpTemplate->style, lpTemplate->dwExtendedStyle, lpTemplate->cdit, lpTemplate->x, lpTemplate->y, lpTemplate->cx, lpTemplate->cy, - hWndParent, lpDialogFunc, lParamInit); - if(dxw.IsFullScreen() && hWndParent==NULL) hWndParent=dxw.GethWnd(); - dxw.SetFullScreen(FALSE); - RetHWND=(*pCreateDialogIndirectParam)(hInstance, lpTemplate, hWndParent, lpDialogFunc, lParamInit); - dxw.SetFullScreen(FullScreen); - - // v2.02.73: redirect lpDialogFunc only when it is nor NULL - if( lpDialogFunc && - !(dxw.dwFlags6 & NOWINDOWHOOKS)){ // v2.03.41 - debug option - dxwws.PutProc(RetHWND, (WNDPROC)lpDialogFunc); - if(!(*pSetWindowLongA)(RetHWND, DWL_DLGPROC, (LONG)extDialogWindowProc)) - OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__); - } - - OutTraceDW("CreateDialogIndirectParam: hwnd=%x\n", RetHWND); - return RetHWND; -} - -HWND WINAPI extCreateDialogParam(HINSTANCE hInstance, LPCTSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM lParamInit) -{ - HWND RetHWND; - BOOL FullScreen; - FullScreen = dxw.IsFullScreen(); - OutTraceDW("CreateDialogParam: hInstance=%x lpTemplateName=%s hWndParent=%x lpDialogFunc=%x lParamInit=%x\n", - hInstance, sTemplateName(lpTemplateName), hWndParent, lpDialogFunc, lParamInit); - if(hWndParent==NULL) hWndParent=dxw.GethWnd(); - dxw.SetFullScreen(FALSE); - RetHWND=(*pCreateDialogParam)(hInstance, lpTemplateName, hWndParent, lpDialogFunc, lParamInit); - dxw.SetFullScreen(FullScreen); - - // v2.02.73: redirect lpDialogFunc only when it is nor NULL: fix for "LEGO Stunt Rally" - if( lpDialogFunc && - !(dxw.dwFlags6 & NOWINDOWHOOKS)){ // v2.03.41 - debug option - dxwws.PutProc(RetHWND, (WNDPROC)lpDialogFunc); - if(!(*pSetWindowLongA)(RetHWND, DWL_DLGPROC, (LONG)extDialogWindowProc)) - OutTraceE("SetWindowLong: ERROR err=%d at %d\n", GetLastError(), __LINE__); - } - - OutTraceDW("CreateDialogParam: hwnd=%x\n", RetHWND); - return RetHWND; -} - -BOOL WINAPI extMoveWindow(HWND hwnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint) -{ - BOOL ret; - OutTraceDW("MoveWindow: hwnd=%x xy=(%d,%d) size=(%d,%d) repaint=%x fullscreen=%x\n", - hwnd, X, Y, nWidth, nHeight, bRepaint, dxw.IsFullScreen()); - - if(dxw.Windowize){ - if(dxw.IsDesktop(hwnd)){ - // v2.1.93: happens in "Emergency Fighters for Life" ... - // what is the meaning of this? is it related to video stretching? - OutTraceDW("MoveWindow: prevent moving desktop win\n"); - return TRUE; - } - - if((hwnd==dxw.GethWnd()) || (hwnd==dxw.hParentWnd)){ - OutTraceDW("MoveWindow: prevent moving main win\n"); - return TRUE; - } - - if (dxw.IsFullScreen() && (dxw.dwFlags1 & CLIENTREMAPPING)){ - POINT upleft={0,0}; - RECT client; - BOOL isChild; - (*pClientToScreen)(dxw.GethWnd(),&upleft); - (*pGetClientRect)(dxw.GethWnd(),&client); - if ((*pGetWindowLongA)(hwnd, GWL_STYLE) & WS_CHILD){ - isChild=TRUE; - // child coordinate adjustement - X = (X * client.right) / dxw.GetScreenWidth(); - Y = (Y * client.bottom) / dxw.GetScreenHeight(); - nWidth = (nWidth * client.right) / dxw.GetScreenWidth(); - nHeight = (nHeight * client.bottom) / dxw.GetScreenHeight(); - } - else { - isChild=FALSE; - // regular win coordinate adjustement - X = upleft.x + (X * client.right) / dxw.GetScreenWidth(); - Y = upleft.y + (Y * client.bottom) / dxw.GetScreenHeight(); - nWidth = (nWidth * client.right) / dxw.GetScreenWidth(); - nHeight = (nHeight * client.bottom) / dxw.GetScreenHeight(); - } - OutTraceDW("MoveWindow: DEBUG client=(%d,%d) screen=(%d,%d)\n", - client.right, client.bottom, dxw.GetScreenWidth(), dxw.GetScreenHeight()); - OutTraceDW("MoveWindow: hwnd=%x child=%x relocated to xy=(%d,%d) size=(%d,%d)\n", - hwnd, isChild, X, Y, nWidth, nHeight); - } - else{ - if((X==0)&&(Y==0)&&(nWidth==dxw.GetScreenWidth())&&(nHeight==dxw.GetScreenHeight())){ - // evidently, this was supposed to be a fullscreen window.... - RECT screen; - DWORD dwStyle; - POINT upleft = {0,0}; - (*pGetClientRect)(dxw.GethWnd(),&screen); - (*pClientToScreen)(dxw.GethWnd(),&upleft); - if((dwStyle=(*pGetWindowLongA)(hwnd, GWL_STYLE)) && WS_CHILDWINDOW){ - // Big main child window: see "Reah" - X=Y=0; - } - else{ - // Regular big main window, usual case. - X=upleft.x; - Y=upleft.y; - } - nWidth=screen.right; - nHeight=screen.bottom; - OutTraceDW("MoveWindow: fixed BIG win pos=(%d,%d) size=(%d,%d)\n", X, Y, nWidth, nHeight); - } - } - } - - ret=(*pMoveWindow)(hwnd, X, Y, nWidth, nHeight, bRepaint); - if(!ret) OutTraceE("MoveWindow: ERROR err=%d at %d\n", GetLastError(), __LINE__); - return ret; -} - -int WINAPI extShowCursor(BOOL bShow) -{ - static int iFakeCounter; - int ret; - - OutTraceC("ShowCursor: bShow=%x\n", bShow); - if (bShow){ - if (dxw.dwFlags1 & HIDEHWCURSOR){ - iFakeCounter++; - OutTraceC("ShowCursor: HIDEHWCURSOR ret=%x\n", iFakeCounter); - return iFakeCounter; - } - } - else { - if (dxw.dwFlags2 & SHOWHWCURSOR){ - iFakeCounter--; - OutTraceC("ShowCursor: SHOWHWCURSOR ret=%x\n", iFakeCounter); - return iFakeCounter; - } - } - ret=(*pShowCursor)(bShow); - OutTraceC("ShowCursor: ret=%x\n", ret); - return ret; -} - -BOOL WINAPI extDrawFocusRect(HDC hDC, const RECT *lprc) -{ - return TRUE; -} - -BOOL WINAPI extScrollDC(HDC hDC, int dx, int dy, const RECT *lprcScroll, const RECT *lprcClip, HRGN hrgnUpdate, LPRECT lprcUpdate) -{ - MessageBox(0, "ScrollDC", "to do", MB_OK); - return TRUE; -} - -HWND WINAPI extGetTopWindow(HWND hwnd) -{ - HWND ret; - OutTraceDW("GetTopWindow: hwnd=%x fullscreen=%x\n", hwnd, dxw.IsFullScreen()); - // a fullscreen program is supposed to be always top Z-order on the desktop! - ret = (dxw.IsFullScreen() && dxw.IsDesktop(hwnd)) ? dxw.GethWnd() : (*pGetTopWindow)(hwnd); - OutTraceDW("GetTopWindow: ret=%x\n", ret); - return ret; -} - -LONG WINAPI extTabbedTextOutA(HDC hdc, int X, int Y, LPCTSTR lpString, int nCount, int nTabPositions, const LPINT lpnTabStopPositions, int nTabOrigin) -{ - BOOL res; - OutTraceDW("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.IsToRemap(hdc)){ - switch(dxw.GDIEmulationMode){ - case GDIMODE_SHAREDDC: - if(sdc.GetPrimaryDC(hdc)){ - res=(*pTabbedTextOutA)(sdc.GetHdc(), X, Y, lpString, nCount, nTabPositions, lpnTabStopPositions, nTabOrigin); - sdc.PutPrimaryDC(hdc); - return res; - } - break; - case GDIMODE_STRETCHED: - dxw.MapClient(&X, &Y); - break; - case GDIMODE_EMULATED: - if(dxw.IsVirtual(hdc)){ - X+=dxw.VirtualOffsetX; - Y+=dxw.VirtualOffsetY; - } - break; - default: - break; - } - OutTraceDW("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) -{ - // v2.02.43: "Empire Earth" builds test surfaces that must be destroyed! - // v2.03.20: "Prince of Persia 3D" destroys the main window that must be preserved! - BOOL res; - OutTraceB("DestroyWindow: hwnd=%x\n", hWnd); - if (hWnd == dxw.GethWnd()) { - if(dxw.dwFlags6 & NODESTROYWINDOW) { - OutTraceDW("DestroyWindow: do NOT destroy main hwnd=%x\n", hWnd); - return TRUE; - } - OutTraceDW("DestroyWindow: destroy main hwnd=%x\n", hWnd); - dxw.SethWnd(NULL); - } - if (hControlParentWnd && (hWnd == hControlParentWnd)) { - OutTraceDW("DestroyWindow: destroy control parent hwnd=%x\n", hWnd); - hControlParentWnd = NULL; - } - res=(*pDestroyWindow)(hWnd); - if(!res)OutTraceE("DestroyWindow: ERROR err=%d\n", GetLastError()); - return res; -} - -static char *ExplainTAAlign(UINT c) -{ - static char eb[256]; - unsigned int l; - strcpy(eb,"TA_"); - strcat(eb, (c & TA_UPDATECP) ? "UPDATECP+" : "NOUPDATECP+"); - strcat(eb, (c & TA_RIGHT) ? (((c & TA_CENTER) == TA_CENTER) ? "CENTER+" : "RIGHT+") : "LEFT+"); - strcat(eb, (c & TA_BOTTOM) ? "BOTTOM+" : "TOP+"); - if ((c & TA_BASELINE)==TA_BASELINE) strcat(eb, "BASELINE+"); - if (c & TA_RTLREADING) strcat(eb, "RTLREADING+"); - l=strlen(eb); - eb[l-1]=0; - return(eb); -} - -static char *ExplainDTFormat(UINT c) -{ - static char eb[256]; - unsigned int l; - strcpy(eb,"DT_"); - if(!(c & (DT_CENTER|DT_RIGHT))) strcat(eb, "LEFT+"); - if(c & DT_CENTER) strcat(eb, "CENTER+"); - if(c & DT_RIGHT) strcat(eb, "RIGHT+"); - if(!(c & (DT_VCENTER|DT_BOTTOM))) strcat(eb, "TOP+"); - if(c & DT_VCENTER) strcat(eb, "VCENTER+"); - if(c & DT_BOTTOM) strcat(eb, "BOTTOM+"); - if(c & DT_WORDBREAK) strcat(eb, "WORDBREAK+"); - if(c & DT_SINGLELINE) strcat(eb, "SINGLELINE+"); - if(c & DT_EXPANDTABS) strcat(eb, "EXPANDTABS+"); - if(c & DT_TABSTOP) strcat(eb, "TABSTOP+"); - if(c & DT_NOCLIP) strcat(eb, "NOCLIP+"); - if(c & DT_EXTERNALLEADING) strcat(eb, "EXTERNALLEADING+"); - if(c & DT_CALCRECT) strcat(eb, "CALCRECT+"); - if(c & DT_NOPREFIX) strcat(eb, "NOPREFIX+"); - if(c & DT_INTERNAL) strcat(eb, "INTERNAL+"); - l=strlen(eb); - eb[l-1]=0; - return(eb); -} - -BOOL gFixed; - -int WINAPI extDrawTextA(HDC hdc, LPCTSTR lpchText, int nCount, LPRECT lpRect, UINT uFormat) -{ - int ret; - OutTraceDW("DrawText: hdc=%x rect=(%d,%d)-(%d,%d) Format=%x(%s) Text=(%d)\"%s\"\n", - hdc, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, uFormat, ExplainDTFormat(uFormat), nCount, lpchText); - - gFixed = TRUE; // semaphore to avoid multiple scaling with HOT patching - if(dxw.IsToRemap(hdc)){ - - switch(dxw.GDIEmulationMode){ - case GDIMODE_SHAREDDC: - if(sdc.GetPrimaryDC(hdc)){ - ret=(*pDrawText)(sdc.GetHdc(), lpchText, nCount, lpRect, uFormat); - sdc.PutPrimaryDC(hdc, lpRect->left, lpRect->top, lpRect->right-lpRect->left, lpRect->bottom-lpRect->top); - return ret; - } - break; - case GDIMODE_STRETCHED: - dxw.MapClient((RECT *)lpRect); - OutTraceDW("DrawText: fixed rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); - ret=(*pDrawText)(hdc, lpchText, nCount, lpRect, uFormat); - dxw.UnmapClient((RECT *)lpRect); - OutTraceDW("DrawText: fixed output rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); - break; - default: - ret=(*pDrawText)(hdc, lpchText, nCount, lpRect, uFormat); - break; - } - } - else { - ret=(*pDrawText)(hdc, lpchText, nCount, lpRect, uFormat); - } - gFixed = FALSE; - - // if nCount is zero, DrawRect returns 0 as text heigth, but this is not an error! (ref. "Imperialism II") - if(nCount && !ret) OutTraceE("DrawText: ERROR ret=%x err=%d\n", ret, GetLastError()); - return ret; -} - -int WINAPI extDrawTextExA(HDC hdc, LPTSTR lpchText, int nCount, LPRECT lpRect, UINT dwDTFormat, LPDRAWTEXTPARAMS lpDTParams) -{ - int ret; - OutTraceDW("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 (IsDebug){ - if(lpDTParams) - OutTrace("DTParams: size=%d (L,R)margins=(%d,%d) TabLength=%d lDrawn=%d\n", - lpDTParams->cbSize, lpDTParams->iLeftMargin, lpDTParams->iRightMargin, - lpDTParams->iTabLength, lpDTParams->uiLengthDrawn); - else - OutTrace("DTParams: NULL\n"); - } - - gFixed = TRUE; // semaphore to avoid multiple scaling with HOT patching - if(dxw.IsToRemap(hdc)){ - switch(dxw.GDIEmulationMode){ - case GDIMODE_SHAREDDC: - if(sdc.GetPrimaryDC(hdc)){ - ret=(*pDrawTextEx)(sdc.GetHdc(), lpchText, nCount, lpRect, dwDTFormat, lpDTParams); - sdc.PutPrimaryDC(hdc, lpRect->left, lpRect->top, lpRect->right-lpRect->left, lpRect->bottom-lpRect->top); - return ret; - } - break; - case GDIMODE_STRETCHED: - dxw.MapClient((RECT *)lpRect); - OutTraceDW("DrawText: fixed rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); - ret=(*pDrawTextEx)(hdc, lpchText, nCount, lpRect, dwDTFormat, lpDTParams); - dxw.UnmapClient((RECT *)lpRect); - OutTraceDW("DrawText: fixed output rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); - break; - default: - ret=(*pDrawTextEx)(hdc, lpchText, nCount, lpRect, dwDTFormat, lpDTParams); - break; - } - } - else { - ret=(*pDrawTextEx)(hdc, lpchText, nCount, lpRect, dwDTFormat, lpDTParams); - } - gFixed = FALSE; - - // if nCount is zero, DrawRect returns 0 as text heigth, but this is not an error! (ref. "Imperialism II") - if(nCount && !ret) OutTraceE("DrawText: ERROR ret=%x err=%d\n", ret, GetLastError()); - return ret; -} - -BOOL WINAPI extCloseWindow(HWND hWnd) -{ - // from MSDN: Minimizes (but does not destroy) the specified window. - BOOL res; - OutTraceB("CloseWindow: hwnd=%x\n", hWnd); - if (hWnd == dxw.GethWnd()) { - OutTraceDW("CloseWindow: close main hwnd=%x\n", hWnd); - // do not delete the reference to main hWnd. - } - res=(*pCloseWindow)(hWnd); - if(!res)OutTraceE("CloseWindow: ERROR err=%d\n", GetLastError()); - return res; -} - -BOOL WINAPI extSetSysColors(int cElements, const INT *lpaElements, const COLORREF *lpaRgbValues) -{ - // v2.02.32: added to avoid SysColors changes by "Western Front" - BOOL ret; - OutTraceDW("SetSysColors: Elements=%d\n", cElements); - - if(dxw.dwFlags3 & LOCKSYSCOLORS) return TRUE; - - ret=(*pSetSysColors)(cElements, lpaElements, lpaRgbValues); - if(!ret) OutTraceE("SetSysColors: ERROR er=%d\n", GetLastError()); - return ret; -} - -BOOL WINAPI extUpdateWindow(HWND hwnd) -{ - BOOL ret; - OutTraceDW("UpdateWindow: hwnd=%x\n", hwnd); - - if(dxw.Windowize && dxw.IsRealDesktop(hwnd)){ - OutTraceDW("UpdateWindow: remapping hwnd=%x->%x\n", hwnd, dxw.GethWnd()); - hwnd=dxw.GethWnd(); - } - - ret=(*pUpdateWindow)(hwnd); - if(!ret) OutTraceE("UpdateWindow: ERROR er=%d\n", GetLastError()); - return ret; -} - -BOOL WINAPI extRedrawWindow(HWND hWnd, const RECT *lprcUpdate, HRGN hrgnUpdate, UINT flags) -{ - RECT rcUpdate; - BOOL ret; - - OutTraceDW("RedrawWindow: hwnd=%x flags=%x\n", hWnd, flags); - - rcUpdate = *lprcUpdate; - // avoid redrawing the whole desktop - if(dxw.Windowize && dxw.IsRealDesktop(hWnd)) hWnd=dxw.GethWnd(); - if(dxw.IsFullScreen()){ - switch(dxw.GDIEmulationMode){ - case GDIMODE_STRETCHED: - rcUpdate = dxw.MapClientRect((LPRECT)lprcUpdate); - break; - default: - break; - } - } - - ret = (*pRedrawWindow)(hWnd, &rcUpdate, hrgnUpdate, flags); - if(ret) OutTraceE("RedrawWindow ERROR: err=%d\n", GetLastError()); - return ret; -} - - -BOOL WINAPI extGetWindowPlacement(HWND hwnd, WINDOWPLACEMENT *lpwndpl) -{ - BOOL ret; - OutTraceDW("GetWindowPlacement: hwnd=%x\n", hwnd); - - if(dxw.IsRealDesktop(hwnd)){ - OutTraceDW("GetWindowPlacement: remapping hwnd=%x->%x\n", hwnd, dxw.GethWnd()); - hwnd=dxw.GethWnd(); - } - - ret=(*pGetWindowPlacement)(hwnd, lpwndpl); - OutTraceDW("GetWindowPlacement: flags=%x showCmd=%x MinPosition=(%d,%d) MaxPosition=(%d,%d) NormalPosition=(%d,%d)-(%d,%d)\n", - lpwndpl->flags, lpwndpl->showCmd, - lpwndpl->ptMinPosition.x, lpwndpl->ptMinPosition.y, - lpwndpl->ptMaxPosition.x, lpwndpl->ptMaxPosition.y, - lpwndpl->rcNormalPosition.left, lpwndpl->rcNormalPosition.top, lpwndpl->rcNormalPosition.right, lpwndpl->rcNormalPosition.bottom); - - switch (lpwndpl->showCmd){ - case SW_SHOW: - if (dxw.IsFullScreen()){ - lpwndpl->showCmd = SW_MAXIMIZE; - OutTraceDW("GetWindowPlacement: forcing SW_MAXIMIZE state\n"); - } - break; - } - if(!ret) OutTraceE("GetWindowPlacement: ERROR er=%d\n", GetLastError()); - return ret; -} - -BOOL WINAPI extSetWindowPlacement(HWND hwnd, WINDOWPLACEMENT *lpwndpl) -{ - BOOL ret; - OutTraceDW("SetWindowPlacement: hwnd=%x\n", hwnd); - - if(dxw.IsRealDesktop(hwnd)){ - OutTraceDW("SetWindowPlacement: remapping hwnd=%x->%x\n", hwnd, dxw.GethWnd()); - hwnd=dxw.GethWnd(); - } - - OutTraceDW("SetWindowPlacement: flags=%x showCmd=%x MinPosition=(%d,%d) MaxPosition=(%d,%d) NormalPosition=(%d,%d)-(%d,%d)\n", - lpwndpl->flags, lpwndpl->showCmd, - lpwndpl->ptMinPosition.x, lpwndpl->ptMinPosition.y, - lpwndpl->ptMaxPosition.x, lpwndpl->ptMaxPosition.y, - lpwndpl->rcNormalPosition.left, lpwndpl->rcNormalPosition.top, lpwndpl->rcNormalPosition.right, lpwndpl->rcNormalPosition.bottom); - - switch (lpwndpl->showCmd){ - case SW_MAXIMIZE: - if (dxw.IsFullScreen()){ - lpwndpl->showCmd = SW_SHOW; - OutTraceDW("SetWindowPlacement: forcing SW_SHOW state\n"); - } - break; - } - ret=(*pSetWindowPlacement)(hwnd, lpwndpl); - if(!ret) OutTraceE("SetWindowPlacement: ERROR er=%d\n", GetLastError()); - return ret; -} - -HWND WINAPI extSetCapture(HWND hwnd) -{ - HWND ret; - OutTraceDW("SetCapture: hwnd=%x\n", hwnd); - ret=(*pSetCapture)(hwnd); - OutTraceDW("SetCapture: ret=%x\n", ret); - return ret; -} - -HWND WINAPI extGetActiveWindow(void) -{ - HWND ret; - ret=(*pGetActiveWindow)(); - if(dxw.Windowize && dxw.IsFullScreen()) { - OutTraceDW("GetActiveWindow: ret=%x->%x\n", ret, dxw.GethWnd()); - return dxw.GethWnd(); - } - return ret; -} - -HWND WINAPI extGetForegroundWindow(void) -{ - HWND ret; - ret=(*pGetForegroundWindow)(); - if(dxw.Windowize && dxw.IsFullScreen()) { - OutTraceDW("GetForegroundWindow: ret=%x->%x\n", ret, dxw.GethWnd()); - return dxw.GethWnd(); - } - return ret; -} - -BOOL WINAPI extIsWindowVisible(HWND hwnd) -{ - BOOL ret; - ret=(*pIsWindowVisible)(hwnd); - OutTraceB("IsWindowVisible: hwnd=%x ret=%x\n", hwnd, ret); - if(dxw.IsDesktop(hwnd) && !ret){ - OutTraceDW("IsWindowVisible: FORCING ret=TRUE\n"); - ret=TRUE; - } - return ret; -} - -BOOL WINAPI extSystemParametersInfoA(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni) -{ - BOOL ret; - OutTraceDW("SystemParametersInfoA: Action=%x Param=%x WinIni=%x\n", uiAction, uiParam, fWinIni); - switch(uiAction){ - case SPI_SETKEYBOARDDELAY: - case SPI_SETKEYBOARDSPEED: - OutTraceDW("SystemParametersInfoA: bypass action=%x\n", uiAction); - return TRUE; - break; - } - ret=(*pSystemParametersInfoA)(uiAction, uiParam, pvParam, fWinIni); - if(uiAction==SPI_GETWORKAREA){ - LPRECT cli = (LPRECT)pvParam; - *cli = dxw.GetScreenRect(); - OutTraceDW("SystemParametersInfoA: resized client workarea rect=(%d,%d)-(%d,%d)\n", cli->left, cli->top, cli->right, cli->bottom); - } - return ret; -} - -BOOL WINAPI extSystemParametersInfoW(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni) -{ - BOOL ret; - OutTraceDW("SystemParametersInfoW: Action=%x Param=%x WinIni=%x\n", uiAction, uiParam, fWinIni); - switch(uiAction){ - case SPI_SETKEYBOARDDELAY: - case SPI_SETKEYBOARDSPEED: - OutTraceDW("SystemParametersInfoW: bypass action=%x\n", uiAction); - return TRUE; - break; - } - ret=(*pSystemParametersInfoW)(uiAction, uiParam, pvParam, fWinIni); - if(uiAction==SPI_GETWORKAREA){ - LPRECT cli = (LPRECT)pvParam; - *cli = dxw.GetScreenRect(); - OutTraceDW("SystemParametersInfoW: resized client workarea rect=(%d,%d)-(%d,%d)\n", cli->left, cli->top, cli->right, cli->bottom); - } - return ret; -} - -#undef OutTraceDW -#define OutTraceDW OutTrace - -UINT_PTR WINAPI extSetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc) -{ - UINT uShiftedElapse; - UINT_PTR ret; - // beware: the quicker the time flows, the more the time clicks are incremented, - // and the lesser the pauses must be lasting! Shift operations are reverted in - // GetSystemTime vs. Sleep or SetTimer - uShiftedElapse = dxw.StretchTime(uElapse); - OutTraceDW("SetTimer: hwnd=%x TimerFunc=%x elapse=%d->%d timeshift=%d\n", hWnd, lpTimerFunc, uElapse, uShiftedElapse, dxw.TimeShift); - ret = (*pSetTimer)(hWnd, nIDEvent, uShiftedElapse, lpTimerFunc); - if(ret) dxw.PushTimer(hWnd, ret, uElapse, lpTimerFunc); - OutTraceDW("SetTimer: IDEvent=%x ret=%x\n", nIDEvent, ret); - return ret; -} - -BOOL WINAPI extKillTimer(HWND hWnd, UINT_PTR uIDEvent) -{ - BOOL ret; - OutTraceDW("KillTimer: hwnd=%x IDEvent=%x\n", hWnd, uIDEvent); - ret = (*pKillTimer)(hWnd, uIDEvent); - OutTraceDW("KillTimer: ret=%x\n", ret); - if(ret) dxw.PopTimer(hWnd, uIDEvent); - return ret; -} - -BOOL WINAPI extGetUpdateRect(HWND hWnd, LPRECT lpRect, BOOL bErase) -{ - BOOL ret; - OutTraceDW("GetUpdateRect: hwnd=%x Erase=%x\n", hWnd, bErase); - ret = (*pGetUpdateRect)(hWnd, lpRect, bErase); - if(ret){ - OutTraceDW("GetUpdateRect: rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); - if(dxw.IsFullScreen()){ - dxw.UnmapClient(lpRect); - OutTraceDW("GetUpdateRect: FIXED rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); - } - } - else - OutTraceE("GetUpdateRect ERROR: err=%d\n", GetLastError()); - return ret; -} - -BOOL WINAPI extGetCursorInfo(PCURSORINFO pci) -{ - BOOL ret; - OutTraceDW("GetCursorInfo\n"); - ret = (*pGetCursorInfo)(pci); - if(ret){ - OutTraceDW("GetCursorInfo: flags=%x hcursor=%x pos=(%d,%d)\n", pci->flags, pci->hCursor, pci->ptScreenPos.x, pci->ptScreenPos.y); - if(dxw.IsFullScreen()){ - dxw.UnmapClient(&(pci->ptScreenPos)); - OutTraceDW("GetCursorInfo: FIXED pos=(%d,%d)\n", pci->ptScreenPos.x, pci->ptScreenPos.y); - } - } - else - OutTraceE("GetCursorInfo ERROR: err=%d\n", GetLastError()); - return ret; -} - -// --- to be hooked .... - -HWND WINAPI extWindowFromPoint(POINT Point) -{ - HWND ret; - OutTraceDW("WindowFromPoint: point=(%d,%d)\n", Point.x, Point.y); - if(dxw.IsFullScreen()){ - dxw.UnmapWindow(&Point); - OutTraceDW("WindowFromPoint: FIXED point=(%d,%d)\n", Point.x, Point.y); - } - ret = (*pWindowFromPoint)(Point); - OutTraceDW("WindowFromPoint: hwnd=%x\n", ret); - return ret; -} - -HWND WINAPI extChildWindowFromPoint(HWND hWndParent, POINT Point) -{ - HWND ret; - OutTraceDW("ChildWindowFromPoint: hWndParent=%x point=(%d,%d)\n", hWndParent, Point.x, Point.y); - if(dxw.IsDesktop(hWndParent) && dxw.IsFullScreen() && dxw.Windowize){ - dxw.UnmapClient(&Point); - OutTraceDW("ChildWindowFromPoint: FIXED point=(%d,%d)\n", Point.x, Point.y); - } - ret = (*pChildWindowFromPoint)(hWndParent, Point); - OutTraceDW("ChildWindowFromPoint: hwnd=%x\n", ret); - return ret; -} - -HWND WINAPI extChildWindowFromPointEx(HWND hWndParent, POINT Point, UINT uFlags) -{ - HWND ret; - OutTraceDW("ChildWindowFromPoint: hWndParent=%x point=(%d,%d) flags=%x\n", hWndParent, Point.x, Point.y, uFlags); - if(dxw.IsDesktop(hWndParent) && dxw.IsFullScreen() && dxw.Windowize){ - dxw.UnmapClient(&Point); - OutTraceDW("ChildWindowFromPointEx: FIXED point=(%d,%d)\n", Point.x, Point.y); - } - ret = (*pChildWindowFromPointEx)(hWndParent, Point, uFlags); - OutTraceDW("ChildWindowFromPointEx: hwnd=%x\n", ret); - return ret; -} - -BOOL extGetMonitorInfo(HMONITOR hMonitor, LPMONITORINFO lpmi, GetMonitorInfo_Type pGetMonitorInfo) -{ - BOOL res; - OutTraceDW("GetMonitorInfo: hMonitor=%x mi=MONITORINFO%s\n", hMonitor, lpmi->cbSize==sizeof(MONITORINFO)?"":"EX"); - res=(*pGetMonitorInfo)(hMonitor, lpmi); - //v2.03.15 - must fix the coordinates also in case of error: that may depend on the windowed mode. - if(dxw.Windowize){ - OutTraceDW("GetMonitorInfo: FIX Work=(%d,%d)-(%d,%d) Monitor=(%d,%d)-(%d,%d) -> (%d,%d)-(%d,%d)\n", - lpmi->rcWork.left, lpmi->rcWork.top, lpmi->rcWork.right, lpmi->rcWork.bottom, - lpmi->rcMonitor.left, lpmi->rcMonitor.top, lpmi->rcMonitor.right, lpmi->rcMonitor.bottom, - 0, 0, dxw.GetScreenWidth(), dxw.GetScreenHeight()); - lpmi->rcWork = dxw.GetScreenRect(); - lpmi->rcMonitor = dxw.GetScreenRect(); - res=TRUE; - } - else - OutTraceE("GetMonitorInfo: ERROR err=%d\n", GetLastError()); - - return res; -} - -BOOL WINAPI extGetMonitorInfoA(HMONITOR hMonitor, LPMONITORINFO lpmi) -{ - return extGetMonitorInfo(hMonitor, lpmi, pGetMonitorInfoA); -} - -BOOL WINAPI extGetMonitorInfoW(HMONITOR hMonitor, LPMONITORINFO lpmi) -{ - return extGetMonitorInfo(hMonitor, lpmi, pGetMonitorInfoW); -} - -int WINAPI extGetUpdateRgn(HWND hWnd, HRGN hRgn, BOOL bErase) -{ - int regionType; - regionType=(*pGetUpdateRgn)(hWnd, hRgn, bErase); - OutTraceDW("GetUpdateRgn: hwnd=%x hrgn=%x erase=%x regionType=%x(%s)\n", - hWnd, hRgn, bErase, regionType, ExplainRegionType(regionType)); - - if(dxw.IsFullScreen()){ - if(regionType == SIMPLEREGION){ - RECT rc; - if(!pGetRgnBox) pGetRgnBox=GetRgnBox; - regionType = (*pGetRgnBox)(hRgn, &rc); - OutTraceDW("GetUpdateRgn: regionType=%x(%s) box=(%d,%d)-(%d,%d)\n", - regionType, ExplainRegionType(regionType), rc.left, rc.top, rc.right, rc.bottom); - if(regionType == SIMPLEREGION){ - dxw.UnmapClient(&rc); - if(SetRectRgn(hRgn, rc.left, rc.top, rc.right, rc.bottom )){ - // success - OutTraceDW("GetUpdateRgn: FIXED box=(%d,%d)-(%d,%d)\n", rc.left, rc.top, rc.right, rc.bottom); - } - } - } -#if 0 - if(regionType == COMPLEXREGION){ - RECT rc; - if(!pGetRgnBox) pGetRgnBox=GetRgnBox; - regionType = (*pGetRgnBox)(hRgn, &rc); - OutTraceDW("GetUpdateRgn: regionType=%x(%s) box=(%d,%d)-(%d,%d)\n", - regionType, ExplainRegionType(regionType), rc.left, rc.top, rc.right, rc.bottom); - if(regionType == COMPLEXREGION){ - //dxw.UnmapClient(&rc); - //if(SetRectRgn(hRgn, rc.left, rc.top, rc.right, rc.bottom )){ - if(SetRectRgn(hRgn, 0, 0, dxw.GetScreenWidth(), dxw.GetScreenHeight())){ - // success - OutTraceDW("GetUpdateRgn: FIXED box=(%d,%d)-(%d,%d)\n", rc.left, rc.top, rc.right, rc.bottom); - } - } - } -#endif - } - - return regionType; -} - -#ifdef TRACEPALETTE -UINT WINAPI extGetDIBColorTable(HDC hdc, UINT uStartIndex, UINT cEntries, RGBQUAD *pColors) -{ - UINT ret; - OutTraceDW("GetDIBColorTable: hdc=%x start=%d entries=%d\n", hdc, uStartIndex, cEntries); - - //if((OBJ_DC == GetObjectType(hdc)) && (dxw.dwFlags1 & EMULATESURFACE)){ - // //extern PALETTEENTRY PalEntries[256]; - // extern DWORD *PaletteEntries; - // if((uStartIndex+cEntries) > 256) cEntries = 256 - uStartIndex; - // for(UINT i=0; i 256) cEntries = 256 - uStartIndex; - // for(UINT i=0; ileft, lpRect->top, lpRect->right, lpRect->bottom); - else - OutTrace("ValidateRect: hwnd=%x rect=NULL\n", hWnd); - } - ret = (*pValidateRect)(hWnd, lpRect); - return ret; -} - -int WINAPI extGetWindowTextA(HWND hWnd, LPTSTR lpString, int nMaxCount) -{ - // purpose of this wrapped call is to clear the FPS indicator (format " ~ (%d FPS)") - // from the window title, if present. It crashes games such as "Panzer General 3 Scorched Earth" - // when FPS on window title is activated. - int ret; - OutTraceDW("GetWindowTextA: hwnd=%x MaxCount=%d\n", hWnd, nMaxCount); - ret=(*pGetWindowTextA)(hWnd, lpString, nMaxCount); - if(ret) OutTraceDW("GetWindowTextA: ret=%d String=\"%s\"\n", ret, lpString); - if (ret && (dxw.dwFlags2 & SHOWFPS) && dxw.ishWndFPS(hWnd)){ - char *p; - p=strstr(lpString, " ~ ("); - if(p){ - *p = NULL; - ret = strlen(lpString); - OutTraceDW("GetWindowTextA: FIXED ret=%d String=\"%s\"\n", ret, lpString); - } - } - return ret; -} -#endif - -BOOL WINAPI extBringWindowToTop(HWND hwnd) -{ - BOOL res; - OutTraceDW("BringWindowToTop: hwnd=%x\n", hwnd); - if(dxw.dwFlags5 & UNLOCKZORDER) return TRUE; - res=(*pBringWindowToTop)(hwnd); - return res; -} - -BOOL WINAPI extSetForegroundWindow(HWND hwnd) -{ - BOOL res; - OutTraceDW("SetForegroundWindow: hwnd=%x\n", hwnd); - if(dxw.dwFlags5 & UNLOCKZORDER) return TRUE; - res=(*pSetForegroundWindow)(hwnd); - return res; -} - -/* -HOOKPROC glpMouseHookProcessFunction; -LRESULT CALLBACK extMouseHookProc(int code, WPARAM wParam, LPARAM lParam) -{ - LRESULT ret; - OutTrace("HookProc intercepted: code=%x wParam=%x lParam=%x\n", code, wParam, lParam); - MOUSEHOOKSTRUCT * pMouseStruct = (MOUSEHOOKSTRUCT *)lParam; - if (pMouseStruct != NULL){ - dxw.UnmapWindow(&(pMouseStruct->pt)); - } - ret= (*glpMouseHookProcessFunction)(code, wParam, lParam); - return ret; -} -*/ - -HOOKPROC glpMessageHookProcessFunction; - -LRESULT CALLBACK extMessageHookProc(int code, WPARAM wParam, LPARAM lParam) -{ - LRESULT ret; - OutTrace("MessageHookProc: code=%x wParam=%x lParam=%x\n", code, wParam, lParam); - MSG * pMessage = (MSG *)lParam; - ret = NULL; - if(pMessage){ - UINT message = pMessage->message; - if ((message >= 0x600) || // custom messages - ((message >= WM_KEYFIRST) && (message <= WM_KEYLAST)) || // keyboard messages - ((message >= WM_MOUSEFIRST) && (message <= WM_MOUSELAST)) // mouse messages - ) - ret = (*glpMessageHookProcessFunction)(code, wParam, lParam); - } - return ret; -} - -HHOOK WINAPI extSetWindowsHookEx(int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId) -{ - HHOOK ret; - if(dxw.dwFlags5 & EASPORTSHACK){ - if(idHook == WH_MOUSE) return NULL; - if(idHook == WH_GETMESSAGE) { - glpMessageHookProcessFunction = lpfn; - lpfn=extMessageHookProc; - } - } - // v2.03.39: "One Must Fall Battlegrounds" keyboard fix - if((idHook == WH_KEYBOARD) && (dwThreadId == NULL)) dwThreadId = GetCurrentThreadId(); - - ret=(*pSetWindowsHookEx)(idHook, lpfn, hMod, dwThreadId); - - return ret; -} - - -HRESULT WINAPI extMessageBoxTimeoutA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType, WORD wLanguageId, DWORD dwMilliseconds) -{ - HRESULT res; - if(1) dwMilliseconds=1000; - res=(*pMessageBoxTimeoutA)(hWnd, lpText, lpCaption, uType, wLanguageId, dwMilliseconds); - return res; -} - -HRESULT WINAPI extMessageBoxTimeoutW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType, WORD wLanguageId, DWORD dwMilliseconds) -{ - HRESULT res; - if(1) dwMilliseconds=1000; - res=(*pMessageBoxTimeoutW)(hWnd, lpText, lpCaption, uType, wLanguageId, dwMilliseconds); - return res; -} - -HDESK WINAPI extCreateDesktop( LPCTSTR lpszDesktop, LPCTSTR lpszDevice, DEVMODE *pDevmode, DWORD dwFlags, ACCESS_MASK dwDesiredAccess, LPSECURITY_ATTRIBUTES lpsa) -{ - //OutTrace("CreateDesktop: SUPPRESS Desktop=%s Device=%s flags=%x access=%x\n", lpszDesktop, lpszDevice, dwFlags, dwDesiredAccess); - OutTraceDW("CreateDesktop: SUPPRESS flags=%x access=%x\n", dwFlags, dwDesiredAccess); - return (HDESK)0xDEADBEEF; // fake handle - //return (HDESK)NULL; // fake handle -} - -BOOL WINAPI extSwitchDesktop(HDESK hDesktop) -{ - OutTraceDW("SwitchDesktop: SUPPRESS hDesktop=%x\n", hDesktop); - return TRUE; -} - -HDESK WINAPI extOpenDesktop(LPTSTR lpszDesktop, DWORD dwFlags, BOOL fInherit, ACCESS_MASK dwDesiredAccess) -{ - OutTraceDW("CreateDesktop: SUPPRESS flags=%x access=%x\n", dwFlags, dwDesiredAccess); - return (HDESK)0xDEADBEEF; // fake handle - //return (HDESK)NULL; // fake handle -} - -BOOL WINAPI extCloseDesktop(HDESK hDesktop) -{ - OutTraceDW("CloseDesktop: SUPPRESS hDesktop=%x\n", hDesktop); - return TRUE; -} - -INT_PTR WINAPI extDialogBoxParamA(HINSTANCE hInstance, LPCTSTR lpTemplateName, HWND hWndParent, DLGPROC lpDialogFunc, LPARAM dwInitParam) -{ - BOOL ret, FullScreen; - FullScreen = dxw.IsFullScreen(); - OutTraceDW("DialogBoxParamA: FullScreen=%x TemplateName=\"%s\" WndParent=%x\n", - FullScreen, sTemplateName(lpTemplateName), hWndParent); - dxw.SetFullScreen(FALSE); - ret = (*pDialogBoxParamA)(hInstance, lpTemplateName, hWndParent, lpDialogFunc, dwInitParam); - dxw.SetFullScreen(FullScreen); - OutTraceDW("DialogBoxParamA: ret=%x\n", ret); - return ret; -} - -BOOL WINAPI extIsZoomed(HWND hWnd) -{ - BOOL ret; - ret = (*pIsZoomed)(hWnd); - OutTraceDW("IsZoomed: hwnd=%x ret=%x\n", hWnd, ret); - //if(dxw.IsFullScreen()) ret = FALSE; - return ret; -} - -BOOL WINAPI extIsIconic(HWND hWnd) -{ - BOOL ret; - ret = (*pIsIconic)(hWnd); - OutTraceDW("IsIconic: hwnd=%x ret=%x\n", hWnd, ret); - //return FALSE; - return ret; -} - -BOOL extScrollWindow(HWND hWnd, int XAmount, int YAmount, const RECT *lpRect, const RECT *lpClipRect) -{ - RECT Rect, ClipRect; - BOOL res; - - OutTraceDW("ScrollWindow: hwnd=%x amount=(%d,%d) rect=(%d,%d)-(%d,%d) clip=(%d,%d)-(%d,%d)\n", - hWnd, XAmount, YAmount, - lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, - lpClipRect->left, lpClipRect->top, lpClipRect->right, lpClipRect->bottom); - - Rect = *lpRect; - ClipRect = *lpClipRect; - if(dxw.Windowize && dxw.IsFullScreen()){ - dxw.MapClient(&XAmount, &YAmount); - dxw.MapClient(&Rect); - dxw.MapClient(&ClipRect); - } - - res=(*pScrollWindow)(hWnd, XAmount, YAmount, (const RECT *)&Rect, (const RECT *)&ClipRect); - if(!res) OutTraceE("ScrollWindow ERROR: err=%d\n", GetLastError()); - return res; -} - -#if 0 -// avoid invalidating whole desktop!!! -BOOL InvalidateRgn( - _In_ HWND hWnd, - _In_ HRGN hRgn, - _In_ BOOL bErase -); - -#endif - -HWND WINAPI extGetParent(HWND hWnd) -{ - HWND ret; - - ret = (*pGetParent)(hWnd); - OutTraceB("GetParent: hwnd=%x ret=%x\n", hWnd, ret); - - if(dxw.IsFullScreen()){ - if(ret == dxw.GethWnd()) { - OutTraceDW("GetParent: setting desktop reached\n"); - ret = 0; // simulate reaching the desktop - } - } - - return ret; -} - -BOOL WINAPI extInvalidateRgn(HWND hWnd, HRGN hRgn, BOOL bErase) -{ - OutTraceDW("InvalidateRgn: hwnd=%x hrgn=%x erase=%x\n", hWnd, hRgn, bErase); - - if(dxw.IsFullScreen()){ - if (dxw.IsRealDesktop(hWnd) && bErase) return true; - } - - return (*pInvalidateRgn)(hWnd, hRgn, bErase); -} diff --git a/dll/user32.cpp b/dll/user32.cpp index a530d97..31743bf 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -32,8 +32,10 @@ typedef BOOL (WINAPI *SetForegroundWindow_Type)(HWND); SetForegroundWindow_Type pSetForegroundWindow = NULL; BOOL WINAPI extSetForegroundWindow(HWND); typedef HHOOK (WINAPI *SetWindowsHookEx_Type)(int, HOOKPROC, HINSTANCE, DWORD); -SetWindowsHookEx_Type pSetWindowsHookEx = NULL; -HHOOK WINAPI extSetWindowsHookEx(int, HOOKPROC, HINSTANCE, DWORD); +SetWindowsHookEx_Type pSetWindowsHookExA = NULL; +SetWindowsHookEx_Type pSetWindowsHookExW = NULL; +HHOOK WINAPI extSetWindowsHookExA(int, HOOKPROC, HINSTANCE, DWORD); +HHOOK WINAPI extSetWindowsHookExW(int, HOOKPROC, HINSTANCE, DWORD); typedef BOOL (WINAPI *PostMessageA_Type)(HWND, UINT, WPARAM, LPARAM); PostMessageA_Type pPostMessageA = NULL; BOOL WINAPI extPostMessageA(HWND, UINT, WPARAM, LPARAM); @@ -167,7 +169,8 @@ static HookEntryEx_Type Hooks[]={ {HOOK_HOT_CANDIDATE, 0, "ChildWindowFromPoint", (FARPROC)ChildWindowFromPoint, (FARPROC *)&pChildWindowFromPoint, (FARPROC)extChildWindowFromPoint}, {HOOK_HOT_CANDIDATE, 0, "ChildWindowFromPointEx", (FARPROC)ChildWindowFromPointEx, (FARPROC *)&pChildWindowFromPointEx, (FARPROC)extChildWindowFromPointEx}, {HOOK_HOT_CANDIDATE, 0, "WindowFromPoint", (FARPROC)WindowFromPoint, (FARPROC *)&pWindowFromPoint, (FARPROC)extWindowFromPoint}, - {HOOK_HOT_REQUIRED, 0 ,"SetWindowsHookExA", (FARPROC)SetWindowsHookExA, (FARPROC *)&pSetWindowsHookEx, (FARPROC)extSetWindowsHookEx}, + {HOOK_HOT_REQUIRED, 0 ,"SetWindowsHookExA", (FARPROC)SetWindowsHookExA, (FARPROC *)&pSetWindowsHookExA, (FARPROC)extSetWindowsHookExA}, + {HOOK_HOT_REQUIRED, 0 ,"SetWindowsHookExW", (FARPROC)SetWindowsHookExW, (FARPROC *)&pSetWindowsHookExW, (FARPROC)extSetWindowsHookExW}, //{HOOK_HOT_CANDIDATE, 0, "MessageBoxTimeoutA", (FARPROC)NULL, (FARPROC *)&pMessageBoxTimeoutA, (FARPROC)extMessageBoxTimeoutA}, //{HOOK_HOT_CANDIDATE, 0, "MessageBoxTimeoutW", (FARPROC)NULL, (FARPROC *)&pMessageBoxTimeoutW, (FARPROC)extMessageBoxTimeoutW}, @@ -3050,6 +3053,7 @@ BOOL WINAPI extSystemParametersInfoA(UINT uiAction, UINT uiParam, PVOID pvParam, *cli = dxw.GetScreenRect(); OutTraceDW("SystemParametersInfoA: resized client workarea rect=(%d,%d)-(%d,%d)\n", cli->left, cli->top, cli->right, cli->bottom); } + if(!ret) OutTraceE("SystemParametersInfoA ERROR: err=%d\n", GetLastError()); return ret; } @@ -3070,6 +3074,7 @@ BOOL WINAPI extSystemParametersInfoW(UINT uiAction, UINT uiParam, PVOID pvParam, *cli = dxw.GetScreenRect(); OutTraceDW("SystemParametersInfoW: resized client workarea rect=(%d,%d)-(%d,%d)\n", cli->left, cli->top, cli->right, cli->bottom); } + if(!ret) OutTraceE("SystemParametersInfoW ERROR: err=%d\n", GetLastError()); return ret; } @@ -3396,10 +3401,14 @@ LRESULT CALLBACK extMessageHookProc(int code, WPARAM wParam, LPARAM lParam) return ret; } -HHOOK WINAPI extSetWindowsHookEx(int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId) +static HHOOK WINAPI extSetWindowsHookEx(SetWindowsHookEx_Type pSetWindowsHookEx, int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId) { HHOOK ret; + + OutTraceDW("SetWindowsHookEx: id=%x threadid=%x\n", idHook, dwThreadId); + if(dxw.dwFlags5 & EASPORTSHACK){ + OutTraceDW("SetWindowsHookEx: EASPORTSHACK bypass active\n"); if(idHook == WH_MOUSE) return NULL; if(idHook == WH_GETMESSAGE) { glpMessageHookProcessFunction = lpfn; @@ -3407,16 +3416,26 @@ HHOOK WINAPI extSetWindowsHookEx(int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWOR } } // v2.03.39: "One Must Fall Battlegrounds" keyboard fix - if((idHook == WH_KEYBOARD) && (dwThreadId == NULL)) dwThreadId = GetCurrentThreadId(); + if((idHook == WH_KEYBOARD) && (dwThreadId == NULL)) { + dwThreadId = GetCurrentThreadId(); + OutTraceDW("SetWindowsHookEx: fixing WH_KEYBOARD thread=0->%x\n", dwThreadId); + } // v2.03.54: disable the disable Alt-Tab fix - if((dxw.dwFlags7 & DISABLEDISABLEALTTAB) && (idHook == WH_KEYBOARD_LL)) return NULL; + if((dxw.dwFlags7 & DISABLEDISABLEALTTAB) && (idHook == WH_KEYBOARD_LL)) { + OutTraceDW("SetWindowsHookEx: DISABLEDISABLEALTTAB bypass active\n"); + return NULL; + } ret=(*pSetWindowsHookEx)(idHook, lpfn, hMod, dwThreadId); return ret; } +HHOOK WINAPI extSetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId) +{ return extSetWindowsHookEx(pSetWindowsHookExA, idHook, lpfn, hMod, dwThreadId); } +HHOOK WINAPI extSetWindowsHookExW(int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId) +{ return extSetWindowsHookEx(pSetWindowsHookExW, idHook, lpfn, hMod, dwThreadId); } HRESULT WINAPI extMessageBoxTimeoutA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType, WORD wLanguageId, DWORD dwMilliseconds) { diff --git a/dll/winproc.cpp b/dll/winproc.cpp index b8f803a..a1f3816 100644 --- a/dll/winproc.cpp +++ b/dll/winproc.cpp @@ -303,7 +303,9 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp } break; case WM_NCHITTEST: + // which one is good ? if((dxw.dwFlags2 & FIXNCHITTEST) && (dxw.dwFlags1 & MODIFYMOUSE)){ // mouse processing + //if((dxw.dwFlags2 & FIXNCHITTEST) && (dxw.dwFlags1 & MODIFYMOUSE) && !(dxw.dwFlags1 & MESSAGEPROC)){ // mouse processing POINT cursor; LRESULT ret; ret=(*pDefWindowProcA)(hwnd, message, wparam, lparam); @@ -312,6 +314,7 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp cursor.y=HIWORD(lparam); dxw.FixNCHITCursorPos(&cursor); lparam = MAKELPARAM(cursor.x, cursor.y); + OutTraceC("WindowProc[%x]: fixed WM_NCHITTEST pt=(%d,%d)\n", hwnd, cursor.x, cursor.y); } else return ret; diff --git a/host/TabCompat.cpp b/host/TabCompat.cpp index 8b82b27..c8097f2 100644 --- a/host/TabCompat.cpp +++ b/host/TabCompat.cpp @@ -46,9 +46,8 @@ void CTabCompat::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_DISABLEDISABLEALTTAB, cTarget->m_DisableDisableAltTab); DDX_Check(pDX, IDC_NOIMAGEHLP, cTarget->m_NoImagehlp); DDX_Check(pDX, IDC_REPLACEPRIVOPS, cTarget->m_ReplacePrivOps); - DDX_Check(pDX, IDC_HOOKDIRECTSOUND, cTarget->m_HookDirectSound); - DDX_Check(pDX, IDC_HOOKSMACKW32, cTarget->m_HookSmackW32); DDX_Check(pDX, IDC_BLOCKPRIORITYCLASS, cTarget->m_BlockPriorityClass); + DDX_Check(pDX, IDC_COLORFIX, cTarget->m_ColorFix); // Registry management DDX_Check(pDX, IDC_EMULATEREGISTRY, cTarget->m_EmulateRegistry); diff --git a/host/TabDirect3D.cpp b/host/TabDirect3D.cpp index fbe3e0c..40de20b 100644 --- a/host/TabDirect3D.cpp +++ b/host/TabDirect3D.cpp @@ -46,6 +46,7 @@ void CTabDirect3D::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_SETZBUFFERBITDEPTHS, cTarget->m_SetZBufferBitDepths); DDX_Check(pDX, IDC_DEINTERLACE, cTarget->m_Deinterlace); DDX_Check(pDX, IDC_LIMITDDRAW, cTarget->m_LimitDdraw); + DDX_Check(pDX, IDC_SUPPRESSOVERLAY, cTarget->m_SuppressOverlay); DDX_CBIndex(pDX, IDC_DDWAWLIMITCOMBO, cTarget->m_MaxDdrawInterface); // Texture management diff --git a/host/TabHook.cpp b/host/TabHook.cpp index a38d0d8..fa8164e 100644 --- a/host/TabHook.cpp +++ b/host/TabHook.cpp @@ -37,6 +37,10 @@ void CTabHook::DoDataExchange(CDataExchange* pDX) // Kernel32 DDX_Radio(pDX, IDC_SONDEFAULT, cTarget->m_SonProcessMode); + + // additional hooks + DDX_Check(pDX, IDC_HOOKSMACKW32, cTarget->m_HookSmackW32); + DDX_Check(pDX, IDC_HOOKDIRECTSOUND, cTarget->m_HookDirectSound); } BEGIN_MESSAGE_MAP(CTabHook, CDialog) diff --git a/host/TabWindow.cpp b/host/TabWindow.cpp index 75113e1..bec1c79 100644 --- a/host/TabWindow.cpp +++ b/host/TabWindow.cpp @@ -50,15 +50,13 @@ void CTabWindow::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_ACTIVATEAPP, cTarget->m_ActivateApp); // color management - DDX_Check(pDX, IDC_INIT8BPP, cTarget->m_Init8BPP); - DDX_Check(pDX, IDC_INIT16BPP, cTarget->m_Init16BPP); + DDX_Radio(pDX, IDC_COLORCURRENT, cTarget->m_InitColorDepth); DDX_Check(pDX, IDC_DISABLEGAMMARAMP, cTarget->m_DisableGammaRamp); DDX_Check(pDX, IDC_FORCE16BPP, cTarget->m_Force16BPP); DDX_Check(pDX, IDC_BLACKWHITE, cTarget->m_BlackWhite); DDX_Check(pDX, IDC_USERGB565, cTarget->m_UseRGB565); DDX_Check(pDX, IDC_LOCKSYSCOLORS, cTarget->m_LockSysColors); DDX_Check(pDX, IDC_LOCKRESERVEDPALETTE, cTarget->m_LockReservedPalette); - DDX_Check(pDX, IDC_COLORFIX, cTarget->m_ColorFix); // screen resolution management DDX_Check(pDX, IDC_LIMITSCREENRES, cTarget->m_LimitScreenRes); diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index 34148fc..818bfae 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -25,6 +25,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_MaxDdrawInterface = 6; m_SlowRatio = 2; m_Coordinates = 0; + m_InitColorDepth = 0; // default: current color depth m_DxEmulationMode = 3; // default: emulated m_DxFilterMode = 0; // default: ddraw filtering m_DCEmulationMode = 0; // default: no emulation @@ -213,6 +214,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_CenterToWin = FALSE; m_Deinterlace = FALSE; m_LimitDdraw = FALSE; + m_SuppressOverlay = FALSE; m_SurfaceWarn = FALSE; m_CapMask = FALSE; m_NoWindowHooks = FALSE; diff --git a/host/TargetDlg.h b/host/TargetDlg.h index 0151717..ac1fb8e 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -27,6 +27,7 @@ public: CEdit m_Launch; int m_DXVersion; int m_Coordinates; + int m_InitColorDepth; int m_DxEmulationMode; int m_DxFilterMode; int m_DCEmulationMode; @@ -168,6 +169,7 @@ public: BOOL m_CenterToWin; BOOL m_Deinterlace; BOOL m_LimitDdraw; + BOOL m_SuppressOverlay; BOOL m_SurfaceWarn; BOOL m_CapMask; BOOL m_NoWindowHooks; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index 2400950fbfc07125b16de2e5ee889a90a4f43610..d76af9dd2a5bbc7867de009391d9425b0b652b6c 100644 GIT binary patch delta 8356 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 delta 7929 zcmZu$34B!5)j#JYVK)gRnLP_Tu_Ci1lL?FPGV_v5GnpA?A&baZMP(=K2voo|RhEQ< zJ{JU{sI)}^V-0QrOd6DQ`77ms_#{VE)lHtwSaR!@-2F zCK?5ov$6_q0tg2DDFM2?Y19V`fId2GQx*c@5i>5L{|vEM7E5I)Qm2L0nvfP?170^Q zp(}@)txMBp8l#a|A|YtOR=_fvH`Jjl2ReMD7~ANnNLL)i#4@@bQ0lN8iPA`OwK7Oo4i zEuRyYyTb{N~-Xf`5wLzPs#p1z8SkM))RpS0gV@)I>9P?Ge ztu%YMJ${>H8r4`sO(-Zj;;Vw&B^V0E6H@JiJNhAEUFfReP6_g`N7b+U_7D55&^9yStno*+)X&5sQMmB27+-hi*;%v`=mCCXsND* zZIY~w#Qa)QFwAokY!yyadtp08Mwom%1_&-1wrU^jOk39C4T(t9uZ0uRp=#&=iauj< zbV@;H)&rh^*33iUa=Ks_y*0udASp<2JjA1#h(MRq1G^D;Y_Ju14 zJlsbQ{m5?BB^!{g)FwkbXdEVRKjlAbvOFN!nvm*mXyVY~9qLE8GP6(6FPo-JwE z({EnPz02i>hb5#nCPOOsOsnH*i?s;O1A8Us55yvkfmm>kmS~9ztF8*zM|rsp+)r2J zTCj_z9JAshl*+Z59+g!%w8D|Fp{<4kKwZZQEstH)QozrK+%9+===3oYK0&8*?Rb#> zoNKduUkYm@;Y3YKRE>+VaaY0*s5H;4{17PhoCOcj>^vJjNlWr9#ZO5+4{d`Q3h^Mv z)jCa7^0?qIb>*3qBS3$B&V)zl?L1rS(^9U6)lf?!=;swJ{Pa{pw

(v{8*W2+Rx5 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 diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index d5b97b0b27314b96b65597178dd39b20bcecf270..54599a1d3ca0dc96a3d4ac10a752d2f2349fd1fa 100644 GIT binary patch delta 5776 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 delta 2630 zcma)8e^AuN72mht?_ItiUXJ59PPo9A^GcKia{M|Gf8;FLD?~ zlAcZ`7$$X2*7BTAlR9-KX{@%GGi=Rd^o-U?XHuh1nnasel5tvUteSQ@V~}9q9uRBu zN4wwo?7n^b_PcN2zI|__gK5#ew7yn-;u}n!I(!~9##nH*=+NhjITK2RU)RMgz22}B z`wkV1?Sv^JVd!G3<$Zmwg)ynvHsnSkHD1`k;>h^&uqb4<`7bXO-_)C>-B*5!qe_@`?R zWQ#A%3=!^1!-Fk6TO7}N-l8^|nf!;}M1iI=(6axpMU3MOr zj{948{7q3u=)kQ0vBxrcUp*aeLGS1ccruV&7d21x9}-iF?u)K{z1)$l*yFmb$fUv~TCR z;>=LD@+WC^z)%IQS^*J^HFHDGTnwk7KLiQruZOMR{Iky30O3=@XM`E#a`MIRKtvZk z2Mgq1*1;uhPqPnwOTcp^9D_Y!fA3NlD49-jRRpEfOloHlW)mJI1PRrI8p0fck{QAD zW$&0}o@zgP;B_k`^-(F#?7i#EX-I4I$Ja0i6z7f$J14!bx;+?uzy0X*XP z=h<@Z4`B<(3w7L!D<21&xVhGpp(gl9$H*G+;>J?V#E+kVZj7{(2z7mUZ6>(T(*jre z=fOK5g4Ijqvvp7d$QO`T{CXqUMV;xA3&ZfbCTzcTOLqqpf?C!T=1Y}$eLIOI+Nc@` zK{?hAg0DXU-4^kt;Xqr68~E}zy2L-d?Zu{x+<}e|6pF1=-SW^NZ3X+9z>fAhz8rU6 zf!T6)C(w*l>%fN%&q0GsJV$#p9;XvnLBK^_;L$G=CBt11Ym)2hcrW1oz1-FN6?gX{ zH*w)+?tzuK;~G@srR9(-o36sXNxHJI9M-sAi^uJnPww8#YoK>6--Smbq*e6WU`n%| zn>mss<8flVEd+7ye!o$~N>~l6T!JS* z;g8DTlROIIQ)ec0ij!M2#W`2zE3Mpu-ud9fSQ{_I`Y88Evz-rE@yuEtlA#zc2P|&@ zuQCt%d-zRsSYef1)yZGZkfz|Kju*D@ph&EC;WgyW-bR>-ed|G&!E-zTm|LnjMCvr3 z41BqNNC zr>i*V#TPt~_o{!GbAw`TIhm{+&*s4+6r}!NQ}J(@%1oL{Tyo~f#78`siKXrQ;qkDW zJ4;zKmn~*bur^Ysoo!~Ti8fg+TgNsex#Kox>}f`khK1>4ERFD@isKJ*Hg4{0xVsq# zHpRI0N1d#bZD*BqN@Y}+j-iMJi1riI36_vwln_-(-!$SD5k|k-B&UM7(@Cb3JwuC@ zl$MoO1e8Uh_Z`#zhx4fX^G)x`RVH~*`bYRVy3h~V(57OUQmZ9GL1xj*NUT3Hnmxwj;J*D0(2#ZOqV zrk#7#VfbX&t;GOi^TEKY=ebLgXRU*5^DPI3JEm|?8NC2>s-C+lW^}SO|C!mT*RWTc zV`V33>f6ao_>+kCo;anKSX=3jYZ!KbR%c1jaK>mR-9+rQOb&rot0~9#CLaz;K^;df zQuMfdom+Dl+f5-x-B*=9dx%zLpW@*OyH<_SV$IB_fO3biJQ}%wO#L!y)hv@xZdp3& z_>|*{Co%TH*w_O!_TiZP1nc6jFGtd!jI_e5duNbD^7SJJZgG=iRMQd|y~Zg%rD~tu zryfaIt84G$o5N6mdK=v<_4-M=ymCsza EZ^y6i(f|Me diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index ac99db5..5798398 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -228,6 +228,14 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) break; } + switch(dlg->m_InitColorDepth){ + case 0: break; + case 1: t->flags2 |= INIT8BPP; break; + case 2: t->flags2 |= INIT16BPP; break; + case 3: t->flags7 |= INIT24BPP; break; + case 4: t->flags7 |= INIT32BPP; break; + } + switch(dlg->m_DxFilterMode){ case 0: break; case 1: t->flags4 |= BILINEAR2XFILTER; break; @@ -403,8 +411,8 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_FixNCHITTEST) t->flags2 |= FIXNCHITTEST; if(dlg->m_RecoverScreenMode) t->flags2 |= RECOVERSCREENMODE; if(dlg->m_RefreshOnResize) t->flags2 |= REFRESHONRESIZE; - if(dlg->m_Init8BPP) t->flags2 |= INIT8BPP; - if(dlg->m_Init16BPP) t->flags2 |= INIT16BPP; + //if(dlg->m_Init8BPP) t->flags2 |= INIT8BPP; + //if(dlg->m_Init16BPP) t->flags2 |= INIT16BPP; if(dlg->m_BackBufAttach) t->flags2 |= BACKBUFATTACH; if(dlg->m_HandleAltF4) t->flags |= HANDLEALTF4; if(dlg->m_LimitFPS) t->flags2 |= LIMITFPS; @@ -434,6 +442,7 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_CenterToWin) t->flags5 |= CENTERTOWIN; if(dlg->m_Deinterlace) t->flags5 |= DEINTERLACE; if(dlg->m_LimitDdraw) t->flags7 |= LIMITDDRAW; + if(dlg->m_SuppressOverlay) t->flags7 |= SUPPRESSOVERLAY; if(dlg->m_NoPaletteUpdate) t->flags2 |= NOPALETTEUPDATE; if(dlg->m_SurfaceWarn) t->flags3 |= SURFACEWARN; if(dlg->m_CapMask) t->flags3 |= CAPMASK; @@ -534,6 +543,12 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) if(t->flags5 & ENABLESONHOOK) dlg->m_SonProcessMode = 2; if(t->flags5 & INJECTSON) dlg->m_SonProcessMode = 3; + dlg->m_InitColorDepth = 0; + if(t->flags2 & INIT8BPP) dlg->m_InitColorDepth = 1; + if(t->flags2 & INIT16BPP) dlg->m_InitColorDepth = 2; + if(t->flags7 & INIT24BPP) dlg->m_InitColorDepth = 3; + if(t->flags7 & INIT32BPP) dlg->m_InitColorDepth = 4; + dlg->m_HookDI = t->flags & HOOKDI ? 1 : 0; dlg->m_HookDI8 = t->flags & HOOKDI8 ? 1 : 0; dlg->m_EmulateRelMouse = t->flags6 & EMULATERELMOUSE ? 1 : 0; @@ -664,8 +679,8 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_FixNCHITTEST = t->flags2 & FIXNCHITTEST ? 1 : 0; dlg->m_RecoverScreenMode = t->flags2 & RECOVERSCREENMODE ? 1 : 0; dlg->m_RefreshOnResize = t->flags2 & REFRESHONRESIZE ? 1 : 0; - dlg->m_Init8BPP = t->flags2 & INIT8BPP ? 1 : 0; - dlg->m_Init16BPP = t->flags2 & INIT16BPP ? 1 : 0; + //dlg->m_Init8BPP = t->flags2 & INIT8BPP ? 1 : 0; + //dlg->m_Init16BPP = t->flags2 & INIT16BPP ? 1 : 0; dlg->m_BackBufAttach = t->flags2 & BACKBUFATTACH ? 1 : 0; dlg->m_HandleAltF4 = t->flags & HANDLEALTF4 ? 1 : 0; dlg->m_LimitFPS = t->flags2 & LIMITFPS ? 1 : 0; @@ -695,6 +710,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_CenterToWin = t->flags5 & CENTERTOWIN ? 1 : 0; dlg->m_Deinterlace = t->flags5 & DEINTERLACE ? 1 : 0; dlg->m_LimitDdraw = t->flags7 & LIMITDDRAW ? 1 : 0; + dlg->m_SuppressOverlay = t->flags7 & SUPPRESSOVERLAY ? 1 : 0; dlg->m_NoPaletteUpdate = t->flags2 & NOPALETTEUPDATE ? 1 : 0; dlg->m_SurfaceWarn = t->flags3 & SURFACEWARN ? 1 : 0; dlg->m_CapMask = t->flags3 & CAPMASK ? 1 : 0; diff --git a/host/resource b/host/resource index f9845e09a4a38af1f1158e6744cabb3e4d2607e1..0b391aae304a0fe802756954aba977613fc670a9 100644 GIT binary patch delta 205 zcmZqK%k*VG(}s1*o6}Ub_=!3*_%rwbaS($uLnx38VsK^fn>^82dGf!xGLsGXI3~Z7 z<=CuL%)vOhftO`+os7Wb9XcA5?TXkY3$aUq#JCYgSWHfA7M|>oC^y+CP=OOJK3Pyj zAFN}Go*a_s|0Z#uS_!bsqB5{qNV2ibU|Ci}1|tT`$^Xk_Cv~uFHYmBGIXR+OY;wX} Jk;!`V!T=FqJf;8u delta 90 zcmeyepQ&Xp(}s1*oSqDR44w=j3>K3wwg^wY&>=H