From 44e77fc10776b7168b7dec1e79afb526242d42ab Mon Sep 17 00:00:00 2001 From: gho tik Date: Wed, 4 Jun 2014 12:39:04 -0400 Subject: [PATCH] v2_02_69_src Former-commit-id: c1edbb88ce2c054b9b2f6ad21d88c7a728bb6ba6 --- build/dxwnd.dll | 2 +- build/dxwnd.exe | 4 +- build/exports/Final Odyssey.dxw | 26 + build/exports/Flying Heroes.dxw | 26 + build/exports/Forsaken (HW).dxw | 26 + build/exports/Genocide (ORIGINAL).dxw | 26 + build/exports/Genocide (REMIXED VERSION).dxw | 26 + build/exports/House of the Dead 2.dxw | 26 + build/exports/Hydro Thunder.dxw | 26 + build/exports/Jazz Jackrabbit 2.dxw | 26 + build/exports/Star Wars Tie Fighter.dxw | 26 + build/exports/Vangers.dxw | 12 +- build/exports/dxwnd.ini | 5 - build/readme-relnotes.txt | 4 + debug/dxwnd.ini | 706 +++++++++++++++++++ dll/dxhook.cpp | 110 ++- dll/dxwcore.cpp | 20 +- dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 224256 -> 231936 bytes dll/user32.cpp | 36 +- host/dxwndhost.vs2008.suo | Bin 132608 -> 133120 bytes 21 files changed, 1040 insertions(+), 95 deletions(-) create mode 100644 build/exports/Final Odyssey.dxw create mode 100644 build/exports/Flying Heroes.dxw create mode 100644 build/exports/Forsaken (HW).dxw create mode 100644 build/exports/Genocide (ORIGINAL).dxw create mode 100644 build/exports/Genocide (REMIXED VERSION).dxw create mode 100644 build/exports/House of the Dead 2.dxw create mode 100644 build/exports/Hydro Thunder.dxw create mode 100644 build/exports/Jazz Jackrabbit 2.dxw create mode 100644 build/exports/Star Wars Tie Fighter.dxw delete mode 100644 build/exports/dxwnd.ini create mode 100644 debug/dxwnd.ini diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 4421b84..24693b1 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:92c5b76a318057e79899b97495911e8dff4065bbdbabb3c1b6bf4cab149fd4aa +oid sha256:459b90a107f873f78fcc7c496ce3f123d26d81bb920d47861f61eef1ae212a2d size 469504 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 4fe63f0..41ba1ea 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d3ce05096cb9020cf4b2c5ade4ca3fa8bf2bf80773b8bd709d6c4c50e1fc653d -size 536064 +oid sha256:098ce50e059091915a8a4ba91e8bbf8d4f8beb450acf641d471c0202627e080e +size 535552 diff --git a/build/exports/Final Odyssey.dxw b/build/exports/Final Odyssey.dxw new file mode 100644 index 0000000..9686a8a --- /dev/null +++ b/build/exports/Final Odyssey.dxw @@ -0,0 +1,26 @@ +[target] +title0=Final Odyssey +path0=D:\Games\Final odyssey\FinalOdy.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=134267425 +flagg0=134217728 +flagh0=20 +flagi0=4 +tflag0=6146 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Flying Heroes.dxw b/build/exports/Flying Heroes.dxw new file mode 100644 index 0000000..1ac1a59 --- /dev/null +++ b/build/exports/Flying Heroes.dxw @@ -0,0 +1,26 @@ +[target] +title0=Flying Heroes +path0=D:\Games\Flying_Heroes\fh.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=151011364 +flagg0=1207959552 +flagh0=20 +flagi0=4 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Forsaken (HW).dxw b/build/exports/Forsaken (HW).dxw new file mode 100644 index 0000000..025c461 --- /dev/null +++ b/build/exports/Forsaken (HW).dxw @@ -0,0 +1,26 @@ +[target] +title0=Forsaken (HW) +path0=D:\Games\Forsaken\ForsakenHW.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=411058208 +flagg0=1207959808 +flagh0=20 +flagi0=4 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Genocide (ORIGINAL).dxw b/build/exports/Genocide (ORIGINAL).dxw new file mode 100644 index 0000000..8dcd06c --- /dev/null +++ b/build/exports/Genocide (ORIGINAL).dxw @@ -0,0 +1,26 @@ +[target] +title0=Genocide (ORIGINAL) +path0=D:\Games\genocide\original vanilla (1998)\Genocide\genocide.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=134218272 +flagg0=1207959552 +flagh0=20 +flagi0=4 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Genocide (REMIXED VERSION).dxw b/build/exports/Genocide (REMIXED VERSION).dxw new file mode 100644 index 0000000..796cbf1 --- /dev/null +++ b/build/exports/Genocide (REMIXED VERSION).dxw @@ -0,0 +1,26 @@ +[target] +title0=Genocide (REMIXED VERSION) +path0=D:\Games\genocide\remixed version (1999)\genocide\genocide.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=134218272 +flagg0=1207959552 +flagh0=20 +flagi0=4 +tflag0=6402 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/House of the Dead 2.dxw b/build/exports/House of the Dead 2.dxw new file mode 100644 index 0000000..aadf8b6 --- /dev/null +++ b/build/exports/House of the Dead 2.dxw @@ -0,0 +1,26 @@ +[target] +title0=House of the Dead 2 +path0=D:\Games\HOD2\Hod2.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=738197536 +flagg0=1207959552 +flagh0=20 +flagi0=4 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Hydro Thunder.dxw b/build/exports/Hydro Thunder.dxw new file mode 100644 index 0000000..3210cd5 --- /dev/null +++ b/build/exports/Hydro Thunder.dxw @@ -0,0 +1,26 @@ +[target] +title0=Hydro Thunder +path0=D:\Games\Hydro Thunder\hydro.exe +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=704643104 +flagg0=1207959552 +flagh0=20 +flagi0=4 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Jazz Jackrabbit 2.dxw b/build/exports/Jazz Jackrabbit 2.dxw new file mode 100644 index 0000000..a01a21a --- /dev/null +++ b/build/exports/Jazz Jackrabbit 2.dxw @@ -0,0 +1,26 @@ +[target] +title0=Jazz Jackrabbit 2 +path0=D:\Games\Jazz Jackrabbit 2\JAZZ2.EXE +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=671097376 +flagg0=1207959552 +flagh0=20 +flagi0=4 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/Star Wars Tie Fighter.dxw b/build/exports/Star Wars Tie Fighter.dxw new file mode 100644 index 0000000..801f2d7 --- /dev/null +++ b/build/exports/Star Wars Tie Fighter.dxw @@ -0,0 +1,26 @@ +[target] +title0=Star Wars Tie Fighter +path0=D:\Games\TIE95\TIE95.EXE +module0= +opengllib0= +ver0=0 +coord0=0 +flag0=134217843 +flagg0=1207959568 +flagh0=20 +flagi0=4261892 +tflag0=6466 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=6 +winver0=0 +maxres0=-1 diff --git a/build/exports/Vangers.dxw b/build/exports/Vangers.dxw index d7459f7..e1db5cd 100644 --- a/build/exports/Vangers.dxw +++ b/build/exports/Vangers.dxw @@ -3,13 +3,13 @@ title0=Vangers path0=D:\Games\Vangers\road.exe module0= opengllib0= -ver0=0 +ver0=1 coord0=0 -flag0=402653219 -flagg0=671088640 +flag0=136315424 +flagg0=1207959552 flagh0=20 -flagi0=0 -tflag0=67 +flagi0=524288 +tflag0=0 initx0=0 inity0=0 minx0=0 @@ -22,3 +22,5 @@ sizx0=800 sizy0=600 maxfps0=0 initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/exports/dxwnd.ini b/build/exports/dxwnd.ini deleted file mode 100644 index df58168..0000000 --- a/build/exports/dxwnd.ini +++ /dev/null @@ -1,5 +0,0 @@ -[window] -posx=1423 -posy=111 -sizx=320 -sizy=826 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 7c58451..feeee6b 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -445,3 +445,7 @@ fixed logic for EnumDisplayModes implementation: now screen resolutions and, for v2.02.68 added screen resolution choice: either a set of SVGA resolutions (mostly for 3:4 monitors), HDTV resolutions (mostly for 16:9 monitors) or the native set of resolutions offered by your monitor / video card. + +v2.02.69 +improved exception catching to intercept memory violation exceptions and to neutralize offending code. Thank again to olly didasm lib, now the assembly instruction length is automatically determined so that the opcode can be replaced by the correct number of NOP instructions. If this doesn't mean much for you, just consider that this makes playable the Win95 (patched) release of "Star Wars Tie Fighter". +fixed FillRect user32 call - brings some improvements to Imperialism (still far from being acceptable). diff --git a/debug/dxwnd.ini b/debug/dxwnd.ini new file mode 100644 index 0000000..f0228e4 --- /dev/null +++ b/debug/dxwnd.ini @@ -0,0 +1,706 @@ +[target] +title0=Genocide +path0=D:\Games\genocide\genocide.exe +module0= +opengllib0= +ver0=0 +coord0=1 +flag0=268435490 +flagg0=1207959552 +flagh0=65556 +flagi0=2097157 +tflag0=6403 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +title1=WarWind +path1=D:\Games\WarWind\WW.EXE +module1= +opengllib1= +ver1=0 +coord1=0 +flag1=134234656 +flagg1=1207959552 +flagh1=20 +flagi1=4 +tflag1=6403 +initx1=0 +inity1=0 +minx1=0 +miny1=0 +maxx1=0 +maxy1=0 +posx1=50 +posy1=50 +sizx1=800 +sizy1=600 +maxfps1=0 +initts1=0 +winver1=0 +maxres1=-1 +title2=Galapagos +path2=D:\Games\Galapagos\GALA.EXE +module2= +opengllib2= +ver2=0 +coord2=0 +flag2=671090720 +flagg2=1207959552 +flagh2=20 +flagi2=4 +tflag2=0 +initx2=0 +inity2=0 +minx2=0 +miny2=0 +maxx2=0 +maxy2=0 +posx2=50 +posy2=50 +sizx2=800 +sizy2=600 +maxfps2=0 +initts2=0 +winver2=0 +maxres2=-1 +title3=Vangers +path3=D:\Games\Vangers\road.exe +module3= +opengllib3= +ver3=1 +coord3=0 +flag3=136315424 +flagg3=1207959552 +flagh3=20 +flagi3=524288 +tflag3=0 +initx3=0 +inity3=0 +minx3=0 +miny3=0 +maxx3=0 +maxy3=0 +posx3=50 +posy3=50 +sizx3=800 +sizy3=600 +maxfps3=0 +initts3=0 +winver3=0 +maxres3=-1 +title4=House of the Dead 2 +path4=*Hod2.exe +module4= +opengllib4= +ver4=0 +coord4=0 +flag4=754974752 +flagg4=1207959552 +flagh4=20 +flagi4=4 +tflag4=0 +initx4=0 +inity4=0 +minx4=0 +miny4=0 +maxx4=0 +maxy4=0 +posx4=50 +posy4=50 +sizx4=800 +sizy4=600 +maxfps4=0 +initts4=0 +winver4=0 +maxres4=-1 +title5=House of the Dead +path5=D:\Games\house of the dead\thotd.exe +module5= +opengllib5= +ver5=0 +coord5=0 +flag5=671089184 +flagg5=1207959680 +flagh5=4 +flagi5=4 +tflag5=6147 +initx5=0 +inity5=0 +minx5=0 +miny5=0 +maxx5=0 +maxy5=0 +posx5=50 +posy5=50 +sizx5=800 +sizy5=600 +maxfps5=0 +initts5=0 +winver5=0 +maxres5=-1 +title6=5th Element +path6=D:\Games\5th Element\PC.EXE +module6= +opengllib6= +ver6=0 +coord6=0 +flag6=134217760 +flagg6=1207959552 +flagh6=4 +flagi6=4 +tflag6=6147 +initx6=0 +inity6=0 +minx6=0 +miny6=0 +maxx6=0 +maxy6=0 +posx6=50 +posy6=50 +sizx6=800 +sizy6=600 +maxfps6=0 +initts6=0 +winver6=0 +maxres6=-1 +title7=Hydro Thunder +path7=D:\Games\Hydro Thunder\hydro.exe +module7= +opengllib7= +ver7=0 +coord7=0 +flag7=671088672 +flagg7=1207959552 +flagh7=20 +flagi7=4 +tflag7=0 +initx7=0 +inity7=0 +minx7=0 +miny7=0 +maxx7=0 +maxy7=0 +posx7=50 +posy7=50 +sizx7=800 +sizy7=600 +maxfps7=0 +initts7=0 +winver7=0 +maxres7=-1 +title8=Warcraft II BNE +path8=*Warcraft II BNE.exe +module8= +opengllib8= +ver8=0 +coord8=0 +flag8=134218272 +flagg8=1207959552 +flagh8=20 +flagi8=4 +tflag8=0 +initx8=0 +inity8=0 +minx8=0 +miny8=0 +maxx8=0 +maxy8=0 +posx8=50 +posy8=50 +sizx8=800 +sizy8=600 +maxfps8=0 +initts8=0 +winver8=0 +maxres8=-1 +title9=Virtua Fighter PC +path9=D:\Games\Virtua Fighter\VFPC.EXE +module9= +opengllib9= +ver9=0 +coord9=0 +flag9=134218272 +flagg9=134217744 +flagh9=20 +flagi9=4 +tflag9=0 +initx9=0 +inity9=0 +minx9=0 +miny9=0 +maxx9=0 +maxy9=0 +posx9=50 +posy9=50 +sizx9=800 +sizy9=600 +maxfps9=0 +initts9=0 +winver9=0 +maxres9=-1 +title10=Total Soccer 2000 (DirectX) +path10=D:\Games\Total Soccer 2000\SOCCERDX.EXE +module10= +opengllib10= +ver10=1 +coord10=0 +flag10=134234784 +flagg10=1208025344 +flagh10=20 +flagi10=12 +tflag10=0 +initx10=0 +inity10=0 +minx10=0 +miny10=0 +maxx10=0 +maxy10=0 +posx10=50 +posy10=50 +sizx10=800 +sizy10=600 +maxfps10=0 +initts10=2 +winver10=0 +maxres10=-1 +title11=Genocide (ORIGINAL FIXED) +path11=D:\Games\genocide\original vanilla (1998)\Genocide\genocide.exe +module11= +opengllib11= +ver11=0 +coord11=0 +flag11=134218272 +flagg11=1207959552 +flagh11=20 +flagi11=4 +tflag11=6403 +initx11=0 +inity11=0 +minx11=0 +miny11=0 +maxx11=0 +maxy11=0 +posx11=50 +posy11=50 +sizx11=800 +sizy11=600 +maxfps11=0 +initts11=0 +winver11=0 +maxres11=-1 +title12=Genocide (ORIGINAL BUGGED) +path12=D:\Games\genocide\original vanilla (1998)\Genocide\genocide.orig.exe +module12= +opengllib12= +ver12=0 +coord12=0 +flag12=134218272 +flagg12=1207959552 +flagh12=20 +flagi12=4 +tflag12=0 +initx12=0 +inity12=0 +minx12=0 +miny12=0 +maxx12=0 +maxy12=0 +posx12=50 +posy12=50 +sizx12=800 +sizy12=600 +maxfps12=0 +initts12=0 +winver12=0 +maxres12=-1 +title13=Genocide (REMIXED VERSION) +path13=D:\Games\genocide\remixed version (1999)\genocide\genocide.exe +module13= +opengllib13= +ver13=0 +coord13=0 +flag13=134218272 +flagg13=1207959552 +flagh13=20 +flagi13=4194308 +tflag13=6403 +initx13=0 +inity13=0 +minx13=0 +miny13=0 +maxx13=0 +maxy13=0 +posx13=50 +posy13=50 +sizx13=800 +sizy13=600 +maxfps13=0 +initts13=0 +winver13=0 +maxres13=-1 +title14=Final Fantasy VII +path14=D:\Games\Final Fantasy 7\ff7.exe +module14= +opengllib14= +ver14=0 +coord14=0 +flag14=713032224 +flagg14=1208090880 +flagh14=65541 +flagi14=4194308 +tflag14=6147 +initx14=0 +inity14=0 +minx14=0 +miny14=0 +maxx14=0 +maxy14=0 +posx14=50 +posy14=50 +sizx14=800 +sizy14=600 +maxfps14=0 +initts14=0 +winver14=0 +maxres14=-1 +title15=Final Fighter +path15=D:\Games\FinalFighter\FinalFighter.exe +module15= +opengllib15= +ver15=1 +coord15=0 +flag15=-1476394464 +flagg15=1209008128 +flagh15=20 +flagi15=4 +tflag15=0 +initx15=0 +inity15=0 +minx15=0 +miny15=0 +maxx15=0 +maxy15=0 +posx15=50 +posy15=50 +sizx15=800 +sizy15=600 +maxfps15=0 +initts15=0 +winver15=0 +maxres15=-1 +title16=Flight Simulator 98 +path16=D:\Games\Flight Simulator 98\FLTSIM98.EXE +module16= +opengllib16= +ver16=0 +coord16=0 +flag16=679477282 +flagg16=1207959552 +flagh16=20 +flagi16=4 +tflag16=0 +initx16=0 +inity16=0 +minx16=0 +miny16=0 +maxx16=0 +maxy16=0 +posx16=50 +posy16=50 +sizx16=800 +sizy16=600 +maxfps16=0 +initts16=0 +winver16=0 +maxres16=-1 +title17=Flying Heroes +path17=D:\Games\Flying_Heroes\fh.exe +module17= +opengllib17= +ver17=0 +coord17=0 +flag17=419446820 +flagg17=1207959552 +flagh17=20 +flagi17=4 +tflag17=0 +initx17=0 +inity17=0 +minx17=0 +miny17=0 +maxx17=0 +maxy17=0 +posx17=50 +posy17=50 +sizx17=800 +sizy17=600 +maxfps17=0 +initts17=0 +winver17=0 +maxres17=-1 +title18=Final Fantasy VIII +path18=D:\Games\Final Fantasy VIII\FF8.exe +module18= +opengllib18= +ver18=0 +coord18=0 +flag18=134218272 +flagg18=1207959552 +flagh18=20 +flagi18=4 +tflag18=0 +initx18=0 +inity18=0 +minx18=0 +miny18=0 +maxx18=0 +maxy18=0 +posx18=50 +posy18=50 +sizx18=800 +sizy18=600 +maxfps18=0 +initts18=0 +winver18=0 +maxres18=-1 +title19=Jazz Jackrabbit 2 +path19=D:\Games\Jazz Jackrabbit 2\JAZZ2.EXE +module19= +opengllib19= +ver19=0 +coord19=0 +flag19=671097376 +flagg19=1207959552 +flagh19=20 +flagi19=4 +tflag19=0 +initx19=0 +inity19=0 +minx19=0 +miny19=0 +maxx19=0 +maxy19=0 +posx19=50 +posy19=50 +sizx19=800 +sizy19=600 +maxfps19=0 +initts19=0 +winver19=0 +maxres19=-1 +title20=Jazz Jackrabbit 3D +path20=D:\Games\Jazz Jackrabbit 3D\System\Jazz3d.exe +module20= +opengllib20= +ver20=9 +coord20=0 +flag20=134217728 +flagg20=134217728 +flagh20=20 +flagi20=4 +tflag20=0 +initx20=0 +inity20=0 +minx20=0 +miny20=0 +maxx20=0 +maxy20=0 +posx20=50 +posy20=50 +sizx20=800 +sizy20=600 +maxfps20=0 +initts20=0 +winver20=0 +maxres20=-1 +title21=Moon Child +path21=D:\Games\Moonchld\MC.EXE +module21= +opengllib21= +ver21=0 +coord21=0 +flag21=134218272 +flagg21=1207959552 +flagh21=20 +flagi21=4718592 +tflag21=6211 +initx21=0 +inity21=0 +minx21=0 +miny21=0 +maxx21=0 +maxy21=0 +posx21=50 +posy21=50 +sizx21=800 +sizy21=600 +maxfps21=0 +initts21=0 +winver21=0 +maxres21=-1 +title22=Motocross Madness +path22=D:\Games\Motocross Madness\GAME\MCM.EXE +module22= +opengllib22= +ver22=0 +coord22=0 +flag22=134218272 +flagg22=1207959552 +flagh22=20 +flagi22=4194308 +tflag22=64 +initx22=0 +inity22=0 +minx22=0 +miny22=0 +maxx22=0 +maxy22=0 +posx22=50 +posy22=50 +sizx22=800 +sizy22=600 +maxfps22=0 +initts22=0 +winver22=0 +maxres22=-1 +title23=Diablo +path23=D:\Games\Diablo\Diablo.exe +module23= +opengllib23= +ver23=1 +coord23=0 +flag23=138428450 +flagg23=1108344848 +flagh23=20 +flagi23=0 +tflag23=0 +initx23=0 +inity23=0 +minx23=0 +miny23=0 +maxx23=0 +maxy23=0 +posx23=50 +posy23=50 +sizx23=640 +sizy23=480 +maxfps23=0 +initts23=0 +winver23=0 +maxres23=0 +title24=Star Wars Tie Fighter +path24=D:\Games\TIE95\TIE95.EXE +module24= +opengllib24= +ver24=0 +coord24=0 +flag24=134217843 +flagg24=1207959568 +flagh24=20 +flagi24=4261892 +tflag24=6466 +initx24=0 +inity24=0 +minx24=0 +miny24=0 +maxx24=0 +maxy24=0 +posx24=50 +posy24=50 +sizx24=800 +sizy24=600 +maxfps24=0 +initts24=6 +winver24=0 +maxres24=-1 +title25=Imperialism +path25=D:\Games\Imperialism\Imperialism.exe +module25= +opengllib25= +ver25=0 +coord25=0 +flag25=1610744353 +flagg25=134217728 +flagh25=32788 +flagi25=4194308 +tflag25=6211 +initx25=0 +inity25=0 +minx25=0 +miny25=0 +maxx25=0 +maxy25=0 +posx25=50 +posy25=50 +sizx25=800 +sizy25=600 +maxfps25=0 +initts25=0 +winver25=0 +maxres25=-1 +title26=Imperialism II +path26=D:\Games\Imperialism 2\imperialism II.exe +module26= +opengllib26= +ver26=0 +coord26=0 +flag26=679485474 +flagg26=1207959552 +flagh26=32788 +flagi26=4 +tflag26=0 +initx26=0 +inity26=0 +minx26=0 +miny26=0 +maxx26=0 +maxy26=0 +posx26=50 +posy26=50 +sizx26=800 +sizy26=600 +maxfps26=0 +initts26=0 +winver26=0 +maxres26=0 +title27=Premier Manager 98 +path27=D:\Games\Premier Manager 98\MANAGER.EXE +module27= +opengllib27= +ver27=0 +coord27=0 +flag27=671088674 +flagg27=1207959552 +flagh27=32784 +flagi27=4194304 +tflag27=6403 +initx27=0 +inity27=0 +minx27=0 +miny27=0 +maxx27=0 +maxy27=0 +posx27=50 +posy27=50 +sizx27=800 +sizy27=600 +maxfps27=0 +initts27=0 +winver27=0 +maxres27=0 +[window] +posx=986 +posy=424 +sizx=320 +sizy=200 diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 4749200..7d28008 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -23,6 +23,16 @@ dxwCore dxw; +typedef char *(*Geterrwarnmessage_Type)(unsigned long, unsigned long); +typedef int (*Preparedisasm_Type)(void); +typedef void (*Finishdisasm_Type)(void); +typedef unsigned long (*Disasm_Type)(const unsigned char *, unsigned long, unsigned long, t_disasm *, int, t_config *, int (*)(tchar *, unsigned long)); + +Geterrwarnmessage_Type pGeterrwarnmessage; +Preparedisasm_Type pPreparedisasm; +Finishdisasm_Type pFinishdisasm; +Disasm_Type pDisasm; + extern void InitScreenParameters(); void HookModule(HMODULE, int); static void RecoverScreenMode(); @@ -1120,9 +1130,32 @@ static void LockScreenMode(DWORD dmPelsWidth, DWORD dmPelsHeight, DWORD dmBitsPe } } -// to do: find a logic in the exception codes (0xc0000095 impies a bitmask ?) -// idem for ExceptionFlags -// generalize, find OPCODE length and set number of NOPs accordingly! +static HMODULE LoadDisasm() +{ + HMODULE disasmlib; + #define MAX_FILE_PATH 512 + char sSourcePath[MAX_FILE_PATH+1]; + char *p; + DWORD dwAttrib; + + dwAttrib = GetFileAttributes("dxwnd.dll"); + if (dwAttrib != INVALID_FILE_ATTRIBUTES && !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY)) return NULL; + GetModuleFileName(GetModuleHandle("dxwnd"), sSourcePath, MAX_FILE_PATH); + p=&sSourcePath[strlen(sSourcePath)-strlen("dxwnd.dll")]; + strcpy(p, "disasm.dll"); + disasmlib=(*pLoadLibraryA)(sSourcePath); + if(!disasmlib) { + OutTraceDW("DXWND: Load lib=\"%s\" failed err=%d\n", sSourcePath, GetLastError()); + return NULL; + } + pGeterrwarnmessage=(Geterrwarnmessage_Type)(*pGetProcAddress)(disasmlib, "Geterrwarnmessage"); + pPreparedisasm=(Preparedisasm_Type)(*pGetProcAddress)(disasmlib, "Preparedisasm"); + pFinishdisasm=(Finishdisasm_Type)(*pGetProcAddress)(disasmlib, "Finishdisasm"); + pDisasm=(Disasm_Type)(*pGetProcAddress)(disasmlib, "Disasm"); + //OutTraceDW("DXWND: Load disasm.dll ptrs=%x,%x,%x,%x\n", pGeterrwarnmessage, pPreparedisasm, pFinishdisasm, pDisasm); + + return disasmlib; +} LONG WINAPI myUnhandledExceptionFilter(LPEXCEPTION_POINTERS ExceptionInfo) { @@ -1130,33 +1163,25 @@ LONG WINAPI myUnhandledExceptionFilter(LPEXCEPTION_POINTERS ExceptionInfo) ExceptionInfo->ExceptionRecord->ExceptionCode, ExceptionInfo->ExceptionRecord->ExceptionAddress); DWORD oldprot; + static HMODULE disasmlib = NULL; PVOID target = ExceptionInfo->ExceptionRecord->ExceptionAddress; switch(ExceptionInfo->ExceptionRecord->ExceptionCode){ - case 0xc0000094: // ??? - if(!VirtualProtect(target, 4, PAGE_READWRITE, &oldprot)) return EXCEPTION_CONTINUE_SEARCH; // error condition - //if (*(char *)target==0xF7) // ???? - *(USHORT *)target = (USHORT)0x9090; // IDIV reg -> NOP, NOP (Ultim@te Race Pro) - VirtualProtect(target, 4, oldprot, &oldprot); - return EXCEPTION_CONTINUE_EXECUTION; - break; - case 0xc0000095: // DIV by 0 (divide overflow) exception - if(!VirtualProtect(target, 4, PAGE_READWRITE, &oldprot)) return EXCEPTION_CONTINUE_SEARCH; // error condition - //if (*(char *)target==0xF7) // ???? - *(USHORT *)target = (USHORT)0x9090; // IDIV reg -> NOP, NOP (SonicR) - VirtualProtect(target, 4, oldprot, &oldprot); - return EXCEPTION_CONTINUE_EXECUTION; - break; - case 0xc0000096: // Priviliged instruction exception - if(!VirtualProtect(target, 4, PAGE_READWRITE, &oldprot)) return EXCEPTION_CONTINUE_SEARCH; // error condition - //if (*(char *)target==0xFA) // ???? - *(char *)target = (char)0x90; // CLI -> NOP (Resident Evil) - VirtualProtect(target, 4, oldprot, &oldprot); - return EXCEPTION_CONTINUE_EXECUTION; - break; - case 0xc000001d: // eXpendable (instruction FEMMS) - if(!VirtualProtect(target, 4, PAGE_READWRITE, &oldprot)) return EXCEPTION_CONTINUE_SEARCH; // error condition - *(USHORT *)target = (USHORT)0x9090; // FEMMS -> NOP, NOP (eXpendable) - VirtualProtect(target, 4, oldprot, &oldprot); + case 0xc0000094: // IDIV reg (Ultim@te Race Pro) + case 0xc0000095: // DIV by 0 (divide overflow) exception (SonicR) + case 0xc0000096: // CLI Priviliged instruction exception (Resident Evil) + case 0xc000001d: // FEMMS (eXpendable) + case 0xc0000005: // Memory exception (Tie Fighter) + int cmdlen; + t_disasm da; + if(!disasmlib){ + if (!(disasmlib=LoadDisasm())) return EXCEPTION_CONTINUE_SEARCH; + (*pPreparedisasm)(); + } + if(!VirtualProtect(target, 10, PAGE_READWRITE, &oldprot)) return EXCEPTION_CONTINUE_SEARCH; // error condition + cmdlen=(*pDisasm)((BYTE *)target, 10, 0, &da, 0, NULL, NULL); + OutTrace("UnhandledExceptionFilter: NOP opcode=%x len=%d\n", *(BYTE *)target, cmdlen); + memset((BYTE *)target, 0x90, cmdlen); + VirtualProtect(target, 10, oldprot, &oldprot); return EXCEPTION_CONTINUE_EXECUTION; break; default: @@ -1354,21 +1379,8 @@ LRESULT CALLBACK MessageHook(int code, WPARAM wParam, LPARAM lParam) static void ReplaceRDTSC() { - typedef char *(*Geterrwarnmessage_Type)(unsigned long, unsigned long); - typedef int (*Preparedisasm_Type)(void); - typedef void (*Finishdisasm_Type)(void); - typedef unsigned long (*Disasm_Type)(const unsigned char *, unsigned long, unsigned long, t_disasm *, int, t_config *, int (*)(tchar *, unsigned long)); typedef BOOL (WINAPI *GetModuleInformation_Type)(HANDLE, HMODULE, LPMODULEINFO, DWORD); - HMODULE disasmlib; - #define MAX_FILE_PATH 512 - char sSourcePath[MAX_FILE_PATH+1]; - char *p; - Geterrwarnmessage_Type pGeterrwarnmessage; - Preparedisasm_Type pPreparedisasm; - Finishdisasm_Type pFinishdisasm; - Disasm_Type pDisasm; - DWORD dwAttrib; unsigned char *opcodes; t_disasm da; MODULEINFO mi; @@ -1377,21 +1389,7 @@ static void ReplaceRDTSC() DWORD dwSegSize; DWORD oldprot; - dwAttrib = GetFileAttributes("dxwnd.dll"); - if (dwAttrib != INVALID_FILE_ATTRIBUTES && !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY)) return; - GetModuleFileName(GetModuleHandle("dxwnd"), sSourcePath, MAX_FILE_PATH); - p=&sSourcePath[strlen(sSourcePath)-strlen("dxwnd.dll")]; - strcpy(p, "disasm.dll"); - disasmlib=(*pLoadLibraryA)(sSourcePath); - if(!disasmlib) { - OutTraceDW("DXWND: Load lib=\"%s\" failed err=%d\n", sSourcePath, GetLastError()); - return; - } - pGeterrwarnmessage=(Geterrwarnmessage_Type)(*pGetProcAddress)(disasmlib, "Geterrwarnmessage"); - pPreparedisasm=(Preparedisasm_Type)(*pGetProcAddress)(disasmlib, "Preparedisasm"); - pFinishdisasm=(Finishdisasm_Type)(*pGetProcAddress)(disasmlib, "Finishdisasm"); - pDisasm=(Disasm_Type)(*pGetProcAddress)(disasmlib, "Disasm"); - //OutTraceDW("DXWND: Load disasm.dll ptrs=%x,%x,%x,%x\n", pGeterrwarnmessage, pPreparedisasm, pFinishdisasm, pDisasm); + if (!(disasmlib=LoadDisasm())) return; // getting segment size psapilib=(*pLoadLibraryA)("psapi.dll"); diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index 6888f0e..c407801 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -573,7 +573,7 @@ void dxwCore::MapClient(LPRECT rect) { RECT client; int w, h; - (*pGetClientRect)(hWnd, &client); + if(!(*pGetClientRect)(hWnd, &client)) return; w = client.right ? client.right : iSizX; h = client.bottom ? client.bottom : iSizY; rect->left= rect->left * w / (int)dwScreenWidth; @@ -586,7 +586,7 @@ void dxwCore::MapClient(int *nXDest, int *nYDest, int *nWDest, int *nHDest) { RECT client; int w, h; - (*pGetClientRect)(hWnd, &client); + if(!(*pGetClientRect)(hWnd, &client)) return; w = client.right ? client.right : iSizX; h = client.bottom ? client.bottom : iSizY; *nXDest= *nXDest * w / (int)dwScreenWidth; @@ -599,7 +599,7 @@ void dxwCore::MapClient(LPPOINT lppoint) { RECT client; int w, h; - (*pGetClientRect)(hWnd, &client); + if(!(*pGetClientRect)(hWnd, &client)) return; w = client.right ? client.right : iSizX; h = client.bottom ? client.bottom : iSizY; lppoint->x = (lppoint->x * w) / (int)dwScreenWidth; @@ -610,7 +610,7 @@ void dxwCore::MapClient(int *nXDest, int *nYDest) { RECT client; int w, h; - (*pGetClientRect)(hWnd, &client); + if(!(*pGetClientRect)(hWnd, &client)) return; w = client.right ? client.right : iSizX; h = client.bottom ? client.bottom : iSizY; *nXDest= *nXDest * w / (int)dwScreenWidth; @@ -621,7 +621,7 @@ void dxwCore::UnmapClient(LPPOINT lppoint) { RECT client; int w, h; - (*pGetClientRect)(hWnd, &client); + if(!(*pGetClientRect)(hWnd, &client)) return; w = client.right ? client.right : iSizX; h = client.bottom ? client.bottom : iSizY; if(w) lppoint->x = (lppoint->x * (int)dwScreenWidth) / w; @@ -632,7 +632,7 @@ void dxwCore::UnmapClient(int *nXDest, int *nYDest) { RECT client; int w, h; - (*pGetClientRect)(hWnd, &client); + if(!(*pGetClientRect)(hWnd, &client)) return; w = client.right ? client.right : iSizX; h = client.bottom ? client.bottom : iSizY; if(w) *nXDest= *nXDest * (int)dwScreenWidth / w; @@ -643,7 +643,7 @@ void dxwCore::UnmapClient(LPRECT lpRect) { RECT client; int w, h; - (*pGetClientRect)(hWnd, &client); + if(!(*pGetClientRect)(hWnd, &client)) return; w = client.right ? client.right : iSizX; h = client.bottom ? client.bottom : iSizY; if(w) { @@ -660,7 +660,7 @@ void dxwCore::MapWindow(LPRECT rect) { RECT client; POINT upleft = {0,0}; - (*pGetClientRect)(hWnd, &client); + if(!(*pGetClientRect)(hWnd, &client)) return; (*pClientToScreen)(hWnd, &upleft); rect->left= upleft.x + ((rect->left * client.right) / (int)dwScreenWidth); rect->top= upleft.y + ((rect->top * client.bottom) / (int)dwScreenHeight); @@ -672,7 +672,7 @@ void dxwCore::MapWindow(int *nXDest, int *nYDest, int *nWDest, int *nHDest) { RECT client; POINT upleft = {0,0}; - (*pGetClientRect)(hWnd, &client); + if(!(*pGetClientRect)(hWnd, &client)) return; (*pClientToScreen)(hWnd, &upleft); *nXDest= upleft.x + ((*nXDest * client.right) / (int)dwScreenWidth); *nYDest= upleft.y + ((*nYDest * client.bottom) / (int)dwScreenHeight); @@ -684,7 +684,7 @@ void dxwCore::MapWindow(LPPOINT lppoint) { RECT client; POINT upleft = {0,0}; - (*pGetClientRect)(hWnd, &client); + if(!(*pGetClientRect)(hWnd, &client)) return; (*pClientToScreen)(hWnd, &upleft); lppoint->x = upleft.x + ((lppoint->x * client.right) / dwScreenWidth); lppoint->y = upleft.y + ((lppoint->y * client.bottom) / dwScreenHeight); diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 2e43788..cabc65e 100644 --- a/dll/dxwnd.cpp +++ b/dll/dxwnd.cpp @@ -24,7 +24,7 @@ along with this program. If not, see . #include "dxwnd.h" #include "dxwcore.hpp" -#define VERSION "2.02.68" +#define VERSION "2.02.69" #define DDTHREADLOCK 1 diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index e56b738e5657eabf3a005731f8b3fea99f6fe79e..a53db6aeb3ced34db4fc17c23925a945ceb3d1be 100644 GIT binary patch delta 11189 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 delta 4966 zcmeI0e{ht=8OPse_b!GsIqoh2({LOYNJ110A%=_%A%=huQz~bQR>QA=!5@`YpiX5% zOU{T&p=$Kt9t27wggA)QgxI_)if5oG0kztysdn0kI-*AESaq~&((iM(q&JRb{HN_d zeP$l^d!OBXclX)n-F-u7lPlDl)?7hp9n&W`T!D?l-k249p0s6I(c8iej-F&Mjt*d)8Q`%MmYyC-pAq5gAX}BLd6}OFAPrd*)2Y*qeu?5L`IR{_WP+wXRk%| zMz~nw>b4KJtcT#*UYSjIDef*)c^utFNqjtq7IE=>8q0+TRaW?C*~ zRBkNlv2aq9C(oDozDMh2%7JiQb^#yhrwwgQlzR7)vJ7{UWqIIUcsg9-#=$!&lLk7L zFmdpGYVUHXAhq2?ik`BmnFgsXLW-OEX(I2~MI-IXO>~gB(52kAdka-7o>`#Aa{F+V z8hMYBxw((L+&@hv)8_bWTC`5(!YNo$#Wq>O4pMf_cKQu*_t~n-u4W zVyC3{De4;&{&2d_UhYwwl-ZB#3hask6-DpOG?MFfVy5|J>Qz}m34)x-FUmgm=Te63 zPljEcp}M}!JEp0nJf{{pJCwL~S zd@H{7*R#7^kK>ki5amA|Q^kCr#O=WzHGoWz* zez9B^5J%gTBl+~cb7+m8G7PaRgkSC8V7i)Pr#z<)I_QO=1Kj@TMV0T2oyiYycCTu5 z??IOCg-ZsDhuc@@bkt9zwpUdWR~%Dw`L7MSl27&Fyd6q|SjK%zMlQ69ti@IdFDapH z{(QH}IuE16vaBj=nY9Gh&oXP36|iPm*ICP^SIzJ`5bj0Y<@cI z&dlJYK3%t2=_psu)@!+f^zUVtN5;xm#*OA@bQNA^j%ZAN6S!4lNIG zz@>L3(es$iD+$qa=~N0Ad9t{0D-I$#bGfKV@3%kk>lBLj^XhzhX{bxm50DxQEN+;m z^SH&U$Au5QR^*Jce|Ys;b)(1BrRyB$A26I6>YMr|+SLMy-Ct3qiPe<&@?&qmm*GQ-H@9xUMOS&1&U7>`$5kmooDTmHv{<8I!o$!~x5=<8p+lzK&IGp0FxxQcdlXu3 zw_}FwhknGg`y$R7tzQ6sX&|}dlaYH}L5n3Bwha0#!#svv0_HWW&@cqSnr!sc1U3`8 z0(G+!Se3gGs|Kt#@H^1u&|*QuWNr(gOHnQ|Yzp+Hrrk}3)q$-xY-0lZrD59)Q)qWT zbO7a^Wd^RpkL{-6A;V%JgkFNWXAP5&#J8c(LHUkh3!x7~i+ya^3g}M^b9nfR4Qicy zkd*S;T5{XfKK+Q(?yl4WnrqTk3FG?59hs+B<0_wp6i3q%UU5=x;(Yzn5ggj6LX9$? zLiik60c;`4)2t498rb!Q$u2C1#_4a}WSG>4pv5*BCeLH&IVg7?7`BMCbH`#zRYblo}=voeDh@5HnnugN32YM>XUc)33uS1J{EG+){SEn?- zWgb`fVyw_zo<^C=r>K@WCz-=e9(NYBWa9|KCPDk5#U>dheT$$gQBE^V`j$gWmS1dG z0dx(t*j0u}->V%~qje#~N&}_yD(DiFKQ|203PDSt*C()zhBYU!O@?hrV7m?5lfd>F z*5SaO%5IAN*1$&-8a`pzQwi*dVLb`#IcSM>Zvy+XVSh19J|aGamIV9EuoOA!Hoz0% z82t9Y#XdI;-OzHA$~*Z5m|Q>}opEMmsn(PtOP+a!pRkzz5|P;!CILYCe3cF6X*wxNpCry1!Igc zFl+*J5L)bJVY0M4IQl3BxMfh`=ED0hbWht$YxSq8|G%{Ux0hBUGG6v_9sECcX~oC* zx&&_gFJ`dhF4sz<=VzT-!lj-u`F3pDBYuE^|7og>cdEKzp&|6KrlZF9V z?-=%;#~h6F0Q(KJaDvH}Tn>-@NrW;zfn~@E2g@@|Zlm#r6&rRV*c8L28+Hp=rD1ao zn}_kOpn;1Gyaue!u$6`_0$XL+8p9TY{migi4f{3NZHBcQwhFAn=!X+n7jzcttj7$z T3i<%F*dZ?muTVvDCNBLaGoYlw diff --git a/dll/user32.cpp b/dll/user32.cpp index c51118b..2428eef 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -1091,10 +1091,16 @@ static HWND WINAPI extCreateWindowCommon( // v2.02.30: fix (Fable - lost chapters) Fable creates a bigger win with negative x,y coordinates. if ( ( - ((x<=0)&&(y<=0)) || ((x==CW_USEDEFAULT)&&(y==CW_USEDEFAULT)) + ((x<=0)&&(y<=0)) + || + ((x==CW_USEDEFAULT)&&(y==CW_USEDEFAULT)) ) && - ((nWidth>=(int)dxw.GetScreenWidth())&&(nHeight>=(int)dxw.GetScreenHeight())) + ( + ((nWidth>=(int)dxw.GetScreenWidth())&&(nHeight>=(int)dxw.GetScreenHeight())) + || + ((nWidth==CW_USEDEFAULT)&&(nHeight==CW_USEDEFAULT)) // good for Imperialism, but is it general? + ) && !(dwExStyle & WS_EX_CONTROLPARENT) // Diablo fix && @@ -1350,21 +1356,21 @@ int WINAPI extFillRect(HDC hdc, const RECT *lprc, HBRUSH hbr) // when not in fullscreen mode, just proxy the call // better not: some games may use excessive coordinates: see "Premier Manager 98" - // if(!dxw.IsFullScreen()) return (*pFillRect)(hdc, lprc, hbr); + // if(!dxw.IsFullScreen() && !dxw.IsDesktop(WindowFromDC(hdc))) return (*pFillRect)(hdc, lprc, hbr); memcpy(&rc, lprc, sizeof(rc)); - 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(); - if(dxw.IsFullScreen()){ - // ???? how to handle FillRect for primary window ??? - //if(hdc==(*pGDIGetDC)(dxw.GethWnd())) { - // dxw.MapClient(&rc); - //} - //else - if(OBJ_DC == GetObjectType(hdc)) dxw.MapWindow(&rc); - //else dxw.MapClient(&rc); + + if(dxw.IsRealDesktop(WindowFromDC(hdc))) { + OutTraceDW("FillRect: remapped hdc to virtual desktop\n"); + hdc=(*pGDIGetDC)(dxw.GethWnd()); + } + + if(OBJ_DC == GetObjectType(hdc)){ + if(rc.left < 0) rc.left = 0; + if(rc.top < 0) rc.top = 0; + if((DWORD)rc.right > dxw.GetScreenWidth()) rc.right = dxw.GetScreenWidth(); + if((DWORD)rc.bottom > dxw.GetScreenHeight()) rc.bottom = dxw.GetScreenHeight(); + dxw.MapClient(&rc); OutTraceDW("FillRect: fixed rect=(%d,%d)-(%d,%d)\n", rc.left, rc.top, rc.right, rc.bottom); } diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index a7cb00ea5de331805e9eddb9d0180dfdef485424..1f8d2bf0e1cf7ccd54084420dd0e9781337b40dd 100644 GIT binary patch delta 10776 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
%eWz9{L}W4DjI>3>O3Qsv(#f|2 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 CC7BTb