From a7f9d2214f5f3215be022cc1889d078d6ff4acf3 Mon Sep 17 00:00:00 2001 From: gho tik Date: Mon, 2 Nov 2015 11:40:21 -0500 Subject: [PATCH] v2_03_10_src Former-commit-id: d21fe6df2093a044d93999a386ea86005eddfa30 --- Include/dxwnd.h | 4 + build/dxwnd.0.ini | 1 + build/dxwnd.dll | 4 +- build/dxwnd.exe | 4 +- build/dxwnd.ini | 25 --- build/exports/Interstate 76.dxw | 29 ++++ build/exports/V2000.dxw | 29 ++++ build/readme-relnotes.txt | 11 ++ build/redist/.gitattributes | 1 + build/redist/ICCVID.DLL | Bin 0 -> 92160 bytes build/redist/_isresce.dll | 3 + build/registry/dxwnd.the Hive.reg | 27 +++ dll/ddraw.cpp | 268 +++++++++++++++--------------- dll/dxhook.cpp | 52 ++++-- dll/dxwcore.cpp | 18 +- dll/dxwnd.cpp | 66 +------- dll/dxwnd.vs2008.suo | Bin 47616 -> 66560 bytes dll/gdi32.cpp | 37 +++-- dll/gdiblt.cpp | 50 +++++- dll/kernel32.cpp | 16 +- dll/syslibs.h | 1 + dll/user32.cpp | 32 ++-- host/Resource.h | Bin 32704 -> 33160 bytes host/TabDebug.cpp | 1 + host/TabLogs.cpp | 3 + host/TargetDlg.cpp | 1 + host/TargetDlg.h | 4 + host/dxwndhost.aps | Bin 154200 -> 154964 bytes host/dxwndhost.h | 3 +- host/dxwndhost.rc | Bin 95264 -> 96376 bytes host/dxwndhost.vs2008.suo | Bin 197632 -> 204984 bytes host/dxwndhostView.cpp | 54 +++++- host/dxwndhostView.h | 1 + host/host.aps | Bin 0 -> 47496 bytes host/resource | Bin 32830 -> 33292 bytes 35 files changed, 457 insertions(+), 288 deletions(-) delete mode 100644 build/dxwnd.ini create mode 100644 build/exports/Interstate 76.dxw create mode 100644 build/exports/V2000.dxw create mode 100644 build/redist/.gitattributes create mode 100644 build/redist/ICCVID.DLL create mode 100644 build/redist/_isresce.dll create mode 100644 build/registry/dxwnd.the Hive.reg create mode 100644 host/host.aps diff --git a/Include/dxwnd.h b/Include/dxwnd.h index 52918e5..41d14ba 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -174,6 +174,7 @@ #define STRESSRESOURCES 0x02000000 // simulates a lack of resources condition, for testing (debug opt.) #define MESSAGEPUMP 0x04000000 // inserts a "message pump" loop between repeated operation that may stop the task on Win7 and greater #define TEXTUREFORMAT 0x08000000 // Apply virtual pixel format to texture surfaces without DDSD_PIXELFORMAT attribute +#define GSKYHACK 0x10000000 // use VIDEOMEMORY+LOCALVIDMEM capability to turn hw acceleration on ... // logging Tflags DWORD: #define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general @@ -189,6 +190,9 @@ #define TRACEHOOKS 0x00000400 // log hook operations #define OUTD3DTRACE 0x00000800 // traces DxWnd direct3d screen handling #define OUTDXWINTRACE 0x00001000 // traces DxWnd internal operations +#define ADDTIMESTAMP 0x20000000 // att timestamp (GetTickCount) to log file +#define OUTDEBUGSTRING 0x40000000 // duplicate logs through OutputDebugString() +#define ERASELOGFILE 0x80000000 // clears old trace file before writing new logs #define EMULATEFLAGS (EMULATEBUFFER | EMULATESURFACE | LOCKEDSURFACE) #define HANDLEFPS (SHOWFPS | SHOWFPSOVERLAY | LIMITFPS | SKIPFPS) diff --git a/build/dxwnd.0.ini b/build/dxwnd.0.ini index bb365c8..2fe96ca 100644 --- a/build/dxwnd.0.ini +++ b/build/dxwnd.0.ini @@ -7,6 +7,7 @@ lang=automatic ;debug=1 ;multiprocesshook=0 ;checkadmin=0 +;debugview=.\DbgView.exe [texture] MinTexX=16 MaxTexX=0 diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 7b88cf6..463aeeb 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:09c3405b326eb5eff358f5713b62cd1107c84ce64625529de44283cab2b64c9a -size 564224 +oid sha256:1f4a7d264c0d0399abc66b1b547cb25224cb2e3138ae59c1ac06234bae23948c +size 567808 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index fcfb1b7..61dbd43 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:be381f4fba85d8c7dcb13682c470713728dd133b38e6d4d1ed65fc6ceb74e771 -size 536064 +oid sha256:c1dcfaa8abb3449b38509567fc3220db7d161443ceebdb0e398458888c4e490f +size 537088 diff --git a/build/dxwnd.ini b/build/dxwnd.ini deleted file mode 100644 index b278890..0000000 --- a/build/dxwnd.ini +++ /dev/null @@ -1,25 +0,0 @@ -[window] -posx=50 -posy=50 -sizx=320 -sizy=200 -lang=default -;lang=automatic -debug=1 -;multiprocesshook=0 -;checkadmin=0 -[texture] -MinTexX=16 -MaxTexX=0 -MinTexY=16 -MaxTexY=0 -[keymapping] -timetoggle=0x72 -altf4=0x73 -timeslow=0x74 -timefast=0x75 -cliptoggle= -refresh= -logtoggle= -plocktoggle= -fpstoggle= diff --git a/build/exports/Interstate 76.dxw b/build/exports/Interstate 76.dxw new file mode 100644 index 0000000..68ceecc --- /dev/null +++ b/build/exports/Interstate 76.dxw @@ -0,0 +1,29 @@ +[target] +title0=Interstate 76 +path0=D:\Games\I76\I76.EXE +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=134217762 +flagg0=2013265920 +flagh0=20 +flagi0=138412036 +flagj0=4224 +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/V2000.dxw b/build/exports/V2000.dxw new file mode 100644 index 0000000..1488319 --- /dev/null +++ b/build/exports/V2000.dxw @@ -0,0 +1,29 @@ +[target] +title0=V2000 +path0=D:\Games\V2000\V2000.exe +launchpath0= +module0= +opengllib0= +notes0= +ver0=0 +coord0=0 +flag0=671088690 +flagg0=1207959680 +flagh0=65556 +flagi0=-2011168764 +flagj0=134221952 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=800 +maxy0=600 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index e5eaa01..bcbc42b 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -725,3 +725,14 @@ add: "Set texture pixel format" flag, makes "Jeff Gordon XS Racing" working on e add: "GDI mode" emulation uses HALFTONE to activate GDI bilinear stretching when "Full Bilinear" filter is activated: slower, but better quality add: preliminary hooking for EnumZBufferFormats ddraw7 method fix: eliminated some handle leakage when injecting launched processes + +v2.03.10 +add: real time logging through OutputDebugString +add: menu command to launch DbgView.exe +add: support for timestamped logs +add: "Erase trace file" flag +fix: handle leakage for primary hdc, causing rapid performance downgrade +fix: log message reorganization +add: SetStretchBltMode HALFTONE in GDI mode to provide bilinear filtered GDI stretching +fix: some GDI mode optimization - should bring performances similar to D3DWindower, with similar configuration +fix: GDI mode bug, crashing when blitting from NULL surface (to do a color fill operation) \ No newline at end of file diff --git a/build/redist/.gitattributes b/build/redist/.gitattributes new file mode 100644 index 0000000..b110a24 --- /dev/null +++ b/build/redist/.gitattributes @@ -0,0 +1 @@ +*.{dll,exe} filter=lfs diff=lfs merge=lfs -text \ No newline at end of file diff --git a/build/redist/ICCVID.DLL b/build/redist/ICCVID.DLL new file mode 100644 index 0000000000000000000000000000000000000000..ae34f204816ba3ef83a94bec83c6a67b208f56e7 GIT binary patch literal 92160 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
VLsN#295y^PEhTkC zddi5A8N)}WWu~U3j~bDlku@?SGdnGFR8IP+telLj>|CgU(W7#5uFuNJy&*ey^q8E{ z*N@G){)W8V8^(+qJ!b5U*N@G+>4v;R-ZVb%rkf{>yLtRAH;x}~y=nY} zTW_9lOaAyunS7xOL*~lk;z%H2JnkcicJgj>%JQpFH`l zNt5rKddHnprcIu5SHa}FrWW2gb=uuirWH)TtDtbk)WW;(nRfT|dkdz|xVLb|Ju~mV z=iXV<@4a{SjC*I!xo76A`|h1JyXfB8bBbrqx$pj2_Z8V@7ZuN)Q+$8PefQf+i)?dC zi|3ZiyT7Eg%vM?|&Mlp1FPT>+m6qWgDbenjXO|u*ljc7t&UY-ZJ05sQdf>r_=RdgM zVaI}p9(mxQhaY|L;fEhv@bDv#KlI3>PdxnSV+$XC?C~cbdHji|9(`ir(~m8Da?#^Y zKK0BKPd)wY!lxHK`{bf$o_p$civs`_Pg(`{MUQ$t$OFZ74N^h zV&&@hR<2s}-m3RMSn>Yq4_B^Uvv$>*57xc^!H4CmKV0ivvv!^HgLUN~o7Y!WZ`n}2Y3s&Ko3~YM-m5ko>?A`gvo_)Lae7bM< zr+fE*vUlHsJ^S_@{B+;`&-U&=@cF(22fx^N@UuhvKl}XffzQ7K7 zKJwKUN51^}(3f9*bNH*TzCH5Q*RC(W{-)-uZ@&HRt8ZPkU%P6KepB<^v2VYt{oYl3 z^oN?G$But@?EB-j-~Vvp=nuz#Ja+u}$?uP!`00leKmL6D$CE!FN6$a;)6YNu_%k$a z6F@57_Y!bl?@z$J?}gj*g9apZmj?bu{xrbVUGSbCv>>UwwD8ya)8fAFg133lA-L|+ z!C&uBhx@t<-sZs%!Sdw?x89#0?&~gin+AUb)m{GZd;R&tUw6UVGz1_>z5?LZ`wPIm ze5srN8@PI4>MlL}UVnP{n{*~`BJu5 zG<1T1lCL1R%3ly%`GV6B3_!`30j}4d0sbZ+7}yN8e48h5R||61ct zzTo(R5x4SXgsc2v?})OYqyy4`FC|ftWs-vv8+hC;qyAXd@NB?*6^|er2V6mzetkA%6^|oZsZ^G82sIz9hEnD(8 z@mFWrUa*x*c5t1QtNQC%x@7s*S-PsfL3jTQ=k)5d)>!?X$Nx>a)1`S&8+Mf8} z`xwRoA7nif@OieLJz38VW7wE$85?tHPd3IdhCLR|*khqR*}+bX9n|(@q1I3qIx?Px z_PvXRUc7{bY7VgY>qA+5d_0SfzKg}TTf*)d8OrYJ8_({#->5u>-^|U)_L|))_MFvmbyBGr9PX= zQs>QNsZ*A+)SQEC=JF6W^WjuBbLLDobHY+KGvy##x;TU_otMg%PMOJ;j$X=^#vNow z9t&Yd?nz}wZl1}Gq%37et~|)1_jY5^Yw}q1lKCv!v6@8}9AkM~y0N_Fc`R??e3n#Sj4gX?Kij`Mf$d*8hwXoU8QU-JXI)RvXI&4iW?eVA*yx)1Z1m36Z1frz zn}0Tw&HoJL--z-rcd^yqXR_5hQ1;a*`(hV!9m!;_jq{mn`D*4`=wiLTuV%eIJ;iQ4 z{S>?PP&K=C(<%1UcTcgWc2%>dJ~+jyf4zxSfAJKnuC8X)Z=YhPj^D&i?Rtux`kV` zI>PPHsZ*!UojZ5vV3ub}!<%w1xr8QB!^69E;}fY7J$hg+6^4IwG$vGg_KdjV3VBww zDYtiTKHu86Uq701?b~<208G2a#l@-aAU*+`kWk-EQs3ick0w>d@6VP^!n}$%y8{o*1BVQ6U<$iS@`1(BX&7TB$zY^_n_Q#ep zm#K8Ub|cP0v$_2HAFun?^xZhcrtVwQFT>#B+Y=Y}U&FsAgr$R6J(H)iXZztxol?kS z$KPP)ppa*dFU3OWP4;TZ;5hygGvi~{U-}2`x7#MY2mAs1XLS2{S%8ed$BXbaB%o!g zvLt>%do>C@fE?_N`r2#)--ngifzMlPns6&(31QhcvwH$I5cG95FS>lpP@ z+b?=_%+u@sMjcaM6Hq_3b3KBpg9gzls-`I=pwRlNF2wV%*HOKBYUq59I<43g>#`)J zZ?`}()~PQlKpBqXmNjnEyn`CmFmg5#OIFQwDzq#q&`ZDENz$1|`en59Jo;ts->F~z zX+57IvxTj93$@%xed5;ZpQS~3PK}J>7d(I(5gW(*bm@gr|DP8YzK?zr%jPMxX6T`l^5yr9= z(ik1LY&1nLqNVHb}QWV1v{%anxM!Ea3ZG7my3t z25FfJy2j@*Xr4y}&D$!=`2{|yOFmL;f4vbIwl_v2(ncn)xfYaG>7R{J*XtFHa>P>) z)fygr$hfQjeDX)RiX-V9gTFMRvhWoDJ|nw#TVtt2vU(3`njRmW=UFHJ59ygdT=IWf zNN%BGYN1b6ZPLB)dLLcV@JXW51aZa5u23b-^kSm%QY5d}6siw1li+D??j*I|vrGd$ z@&}TCwdNE(#mMIn{T0@g`s$e8;}WPZWz_`~>N*B>@qzm8UtQaxE`n2EAJO|C0(!?o zz~A%W2k&(_sLR0A=rSb;8o5wuK+zXMHBH(%~VgUR#dr8~%uG_D~%*flX709f*gvc^-+H^DxQLVFur8s)s)FRC67E z7EjzM+rSv7OV`7AEM0%LU3qOFY_C<+54Gis-$v<-w#6uI!QTI+GR9IFZ-5q2CR?v3 zdy?#ts}2~K?DA7D=MnvmFV!1zfxwK&d5FX=vL*6n&DnFxnG=vZ3hZ(v{g1I+y9ewV5T}StFqs{aCYOeFKuxiMjLK{ zZ3MaVmCU*@eKTS8`iUo!QSKg6%@e$PV6yN5c$ynurzqoVQ@Qw?a#&LHGX{PLz+VFY zjK6jN#pXy$e+ z%oNo=A;W}>5;9207$H-H%n&Lut$xLtluNn-E(KTsSew$VJK!<^EnmkPl^&6RC;--} zL|+cTT9uwyqjCi;H@^~a6(9zH^(npk0ImjH1E6K#SgX?ST0nn5EC6d&1`GsT_ZL9R zhL9%hpZ({ve-7>;`v-Q8e#~CQ5{e)klsxPo*hOJYQPkN#O;PYMGCphG-f5~CJ@$sj-Z?L2oxO8@QjfiJe$poGo$SxgC(E-@_!ihZ z=gq@^TOHK5cV;vu>#A`=CiX~!w*dNt_=u)Yh)>5*Lqx^YSx~b`HFX}L9?{%;(c2s8 z6Dq&ICwKOm-(lwb`S+!D-xrd1w|j4H_ukv?wYA-QXM3F2#`fV}``W#?wezKs@~(F8 zP3_)$+P$~5d+%uX+R*O3pWS;qJ1sm^ce8tMX7}35?!A?r?_@u9`pns1e*NtnG~S;C zvUC1_wo|agHf|7LFaT@!G0;FdUEy7y%dwNCTt;G60!?QGhH! zHUR7Qb8-P#hCBLtzzu*gfU$r)z&OB-fSUj}1I7a;0B!+T0k;CMBo}LPZ@Ud^^(WpA zm;|^3Fd1+sU<%+az*N9AKmni-a5rE&Uc{CQ-G%d zSTn!q8NjmuEceBFU##>6ya-qfSOUOW-wNiw zUs}eitl#Aecxjm~Eybnfw%-C=fEvJefLg#&0M^wX`yTKE;5gs};77noz)ygm0jB_` z0a$;3<}BbBz^{Pc0OtU|14wnW%+7wvXP$8lbcQ_7==!=DJKNv>u73R&c)9v$1UZ-o z$2<%9$UYYA@2Xg_gZ*8Ow?E41X~H~5nV4yYgVu{fj=m8V^{kR?l(r@TKa1CYgIwc_ z!A;FCwn4bj_6$nd7#YWQBwOEz1c z;=46-kr3XcHLGJU!gnK!zC3rTQfDk#=A&lUdL%camcNs4YEB$`B4owtJYw>dQAKc@ zAyA~YISN^1o1>^FucN39NhK}5>gf68bvBA-v_03Xyf%}xEUe8C{2k?sqw?LX%BZE# z+PsVwe+hb4e3*WlmmVKVFYWhY%}-o*vAU$TdD$J^tnB*mZ&m~QPy`Z8y$4jBx^wx&(760r6s#?m$>b>3Zkjr3 zl;Xa-gRE74+rcc9)rKfuFvOR?{jG}$FJ~w)|IxY(@pz_H&}u9XQMQ6AkX0g1p)XPZ zaxsPGaoS4dJY9aMzSnu(^sN$o@f_XVw@nyd5L}fQvIq?mQ=V6$g9MpSq^W_nGk$ls zwVlz|3(jAJEKH1ZhvuS{kY$rJ!X)a!0cb|?;e}kg$y;}xFNC|mV#s#=gu|V)UB6?q zxRf{sv4iPL+-a^4XJM4W`Hfuk`4`Zo0b{`5{b{Yg?2{5F0IyARf12(7lot(Oentv7 zJCrV^uyyAL53%SbvV7BzP@2K?0phg$WvI+_cj$bu^@^y}Pw`O`suo9>ziSDHCkKb8 zhGpgJ;N9qtkEn7Mh&%+5ake0xt!hqBbA2C=a_lWRV4Qmjh0j!LMLJXBHqQMLC>$CX zmV*f4nK)H-HK=i#;M__CfI$fGrnL0@cag6g*AqOjAPXlWhUlba77LP|Is)-cS?Ix1 zvIgItu}XTxv!v&5N0c;oXqlXw2twlY*Iu^uA?axuIj$6$mx*|>!lAVR3O~wq{!xl6 zT@*{Ty9-$`XQ5olGN%x5F%eaIMp}+bC$s6m*%X-25fxeCPZA-amft_npA)^W1ySJ@=e*&pCH}p65OM zL6tg4{u5*Y^RQ(=>v!%!s{x+IU#L4K12X+P@$vb!_rtUuE3;mFIrX+ zdIRwFkpyXM4eo&X4Qjg*T&Z1>qn-hRY8~5;kJfOD7+$}bh%eBis;S9QTahJQM1PT2 zA`K%@yz^BLprlf~_|$@DgG0l#KwB1}0GBc0`gFv@J-9!Lmqie7bKTWSl<%hPQi={@ zb!E5+AQA||M-VFkad|Z|rouQ>#LPdaRCN=HC#;IqALBI((%AI?Dv`OGi$-)4u0nBc zNwuDET?brY49f{ap&l6q%FqmCtUyL}Cej8J{4U`50|^$!Hl+F~+$>6jBn?QGO{~W# zwdkn{$wgf4@8cVFaytM#8gP2RMYvnUAcYphjU8bXA!XREVeRt!SY>2`%#hxvEBhpA z7+I_OrTi#&^@HCrZAo<@;*d4jEovd(AMsKPR=pl|J|w%1&@d87SnEEIsH%HWB3hed0;yWS?+d^SwUQMV zHCg&~wY&98bqjsXb830NnxZAc3ObC`wO>i$38*}&X+%Zkds$6k+!s>P@?=y5u~}pV zg+>lmPb{SMt7oKUTq5de=~vIG(pYM*&>KgGgc-BAtEYkS?yvEM7SP$x8No;N6cCjJ z@d`oA1ca0Hw5(rG-=b3gQco>s_0&>Q?Im2zz!k;-J$;KLT2kFa8Px+B(9^f1`}8#b zT*S(%Ptetav_;JSBR8U>_pm#hR@L7(^khLzcLI#GC7QJ5ik>l%hN2#)`gjDzFrwex z6Vso^pQp5>F;Lp|q@S&Oy#}<13R;+iuT3q9GIrpL_DB(%mPLV#t52U+oQhh|P_;b3 zZN+;U7;^isfKpOlP0+hDqXyF9TUBC1vc#NJ&KvEVUsu!M8!?t*pq;=k+k5iuw((K@ znB+>=Hy@*J3cczxdIN4+PpVrsp~mJH^d>~<)xJwEGIq?F-Mo|FKuA}<+}C&IE9axn zU!?0&5KvdX>UtFG%15`%k*iWkPI4;f!^tlCz0HU4HYIY~Bvk{BmB_YH{SlJUAurOj z7bl|UP?anSNzN%KUh3a%Sp=7gBJh{8LR2gYxx-0Ysp3JDMS%de6(fca$QjgZG55w@XZ)rX09gBuk`A>!L$uG*3 zI_05cpjbaJnpAJWS0n-zNwNnad~~zEd8J+?!Fj3CQ32}o9~tTIR-%!%f*$IpPs62 z$;SO)kivXzv;K>75F>FSpGg8_^k9w~c>OiE(o!#G*p#(relkiPxc541i=)ySSu zz7aryd_($4H-k&7*UksOSRJ^>AY-^+i%avVlyqaNx|LQ=!r1&P3?tR8w1^^Qk8vKs zr}2D4n^z<;yq&}sBMXBNJCC3)b!$ApD03x6=#!xXv^1|U(9s-qD}9u^dBqrpn7Z{t zIg-Q>Q@6g3$ku+62jE{C4FB|C_)P@g&lyQ&hG(pXd7K;@(cwQ5JsxC5QdI+~ib1K$ zfz+5msb?`LDRuolr7dJ?|j@7=jV)F(2Vy!*9|< zC`|sI;M8(_YDn)7alTXxIkZyt+}4iO*S4!#2?B4vPQqh1QbVO=pC$bG?Ze2PGdqx@ zo8jN7gv+9QD7#J?n*@uL1Yw6;w%tXr6HL63$rb~K-&5=077 zwdAs`6ix2LR}3*k1(GuW8y~1R?fbg<6ro#^^c-E14+a&%Vh#XQY$85A@H1Ara&!b4 zewQ~%ihK?{=}Nt(HRPT067ty8Zh8(jxaS|A_3j>txYvp4O9K4IIDA#67^mv;hhRYe zInH;}kVGmFt@$F}$5EiP<}1CiTcL)S<-(nj3#MLRAfeyCVWxqv+0dj&gC4D-8}lEa z^34DhiLD`D+*Visoa7Ah+|hI|<%slX`y{2Ot3bsuJVPPkjZA zm*BseR*1~2C08d+RD#{=Dw?E`$0KXH4}jDw`nS6!F2GA!B0eht=}b@tCMpR@Sdshd zlfM_CuaLN@Qi&F$XeHj(j&E4#q!JoaYv|L8QdW{wGDezUKtiJDA({vyS?iI8(R>z? zF?f)ZMDLGpS_4Z)=4fbHqli&K@B!JCWMS^AIf_5dA|&bYyz4T+?3cjw~s(SB&vo4Spi41q6fY zpW*Te$few8LcO z?tGC86ekR1$&5zY<6Pd#Wo9nMdJ>e|I-XQH6RMoxy#(l_$trhAMfVqAi+HDr>Dkns zFcV6p5#-5e&No6TNQ6m5`7Ii+S}M@)&eyTzd@T*bMBH;yal!=klf{X`WR0iU`8s5R zMIC%)$|GG)ksh5iRsVblF5mw{$a}H0{dwx8X|ZQ}@}b^u)msju6fN1H6uy(-d5G@i zLR$wFdU0@}@3CT3)?T4=OLJhLI(KOqmb)-_zoCqTh$+RYkysy}H3uX{+HOS0Z2yrP zX85}+BO;xw4HRo7yqzOEK`KZ9dx|brIUiz}oQU2$p=q^_+X{`KF@XPw#=nOTz=4JR z3pI)CUueCBq>LW&KD1YOp+)KL7G@C{Fq}aCv_O7lAm7oJFUl($=h%;|hzay@HFXR1 znuFcYTzspI))hWSI=spl|BoS`Ak7xZV*DYxU#-MAQ;!an$i!_DZvTv1>uju))2gC% zwNl+mqZ3%P2|TR^xw-x`RCck5ucD6k{}l4YN?FQ{#_h@5rS6jM5vbJP7xIp`zwZ<6 zKY1^MDmvO#vw(xyU-hN5t5(UkulTOPLJ}0BPw9(|`>J;rb>}{;D=8=~+LzF~n;foJ zCHqJc+I9=Li`>Wqx(nTtjYZOBwH_=VH4qM#Pv*(6e0ot2WHQE|f#DyPKe0+V6B4q^ zF=arA$Y>|PA~K?{K1shrt=0PqlNoOd|Hmewz;eZJ9BoUqqE#CO$z%wnV=ar;ho3O@CK z$l_0K=l;LSi^jt$^k<6)3u-uMgm%xOF1Ga$G?h9Y>c6^pxeJ2GWEWpdEwUJ*Vth<;M+?YoZYk*5$lc&;X`lYMHzHF(?6MnW15o$Rp=ZU8`)0k=t+=O{rwBv}A>LO>F(r zTkr9&8loI5aE$+F>J$98R5G8gn%>CQzwj5x!6KzkC3|F9I{{gQj|_X&kwHpyd(PZ| zvL^OC<(#!uQ`k3~vVH5@GTV!TJELv32ECq9s^Y&Rn`klV$?t zaQ`j!%oi`^%$3S2>61k<3&@k;o0*ZC&yg>BM@#toPL47(uLJD4OCX%WQfP9a8%c#F zfGI4+{5ujoFEPUMc;>Xhr3%vAGGW9NaBmru)awB+)yg8v3I53gh&D+ zmNZ zc#B1z!JwTlCNjJi`Cn?Hy40<-zB#ah9pB${x5>Exz}GMcY}+e9>LR>L>9jqGa%`e)6Dj zK-fSXxbQ>o4qPbvcnt1udI^N9i&fgsbXeHd1?31 z0ciDk&~gn;zOk77tOyh5mNt-1BVie=HNVzfGF6h5v((+4tDsu(z0|YS$&;V(utr{$ z85H*))5udIJ&m=;l&iOu#Y#CU`}UQ*v|YWeL%nUXD0Di>W8ypWbb(Vzv~OQC0!^P( zhIUQDxcCvcBba=+Ld_0IEeXa$FVUW&$GTYIyJ&Z2G}o1>0>!N7V(Gd-l1EyI?}Sy0 zZEgkfn7>mQwI8^%n}3jN!iEb@d7s1=qp&uODynJZwTLe(F^0P1h7#ZSDiz!b0Z4I( zB#yVDo01NIIITBD_7m!DH^th&UafD*iuMkbzAk9}(x<=-MuV9_u~ItG+({KmUra>$ z>&8Pg4N`B*iM4mFE|QXgQHzmCBJOGIf`5jvL{QXHKgQ%DEe#in+# zL)hM)&~!4lB%1T4qh|dg@RwN)3(}%@spx*yqrd8o`A0R&$rk=+Oy~-bY|b-83-Z=qKNjT$Bfdvnxw7q@IuiB@4i4Vt00&b;)6N0(b(R#l1 zP+NY;cUYDJj|O*lzmOlXA@A_8Z2EP<-OXX`6oQ$><%FkNP&`?BG6ae?hl?V+UomNZ zP0NtS-0E#v$}*`$RUySpHNFeA(UjAaS2p_gW@4^wx+13y-+;_gHvcFO81}6E>{$#s z7#3VjT~K&vPpAJ25sdkc18a@(kQEp(Y**iL2$>%B-)njNDMruw_thN!D5!VVskgkR z-qI-?R&U#@-qNMs77~bE-PL3*!r|}-dZiu7U6P~KQGn6Zj^s}1Wg#38j1UhpAwos#{wC{5)v(CkM8V=^?zPZv5qqx z#=UL%(ZN0Kj&|atz3_Iu#I<&`PvZiY`mjXcumrr0!fdn^F{NHN4#WN~=mG&hP3IcX z#4UQXX*{jNLR@SO`uj`{Ai>Tvds{ku?}DpD^n?kkmAFeFw}H=*Lr(bS@Wm3Aw1PX@ z9j%1VztVvzQp+Cs7S^I}c@ekL6i1;{v~(T}2W-9zBkU!ylcu{&TNnLTl+l?cYy=@O+vhaP5o9S~m!J84%P zVpz`;_Oy$Ec2oYD9Zf$*sc#()5{YFDF>>|QvR-0reKbc-U5Tz?7MB&)U3dR^f$%vi z^_DzM9A=iKknB&!lg1F8P{~t0Pm0<5v9LRkr}`@wEJ}!d+kRZ_zZR*%+UV4yEj?ak z^KJs_`CK|Wp%H4+c#=g-%2D?0Ws<-St z_~Ew?d!#*cFp3fbtCh1Y->C2Iz#$v%3}fPH#$tZJ;GmDOORJPNbT?;V^@B_Snhj_EqoXGZ(|+zEyg~}mS*fXB4@#1@qQJ7ae~ z1AKqM0>sn6|0K3wu`H4MI5zhmMR_c<&3goB9%k&iP00T}W2YVjy$>*U@P3rP4^H4- z@PiTXMoh{z8!#-m3;g~X1G76(9wW5oI}nF&31C>H2?7q|75!S2gUM&M0MD(!*9^RC z0KOXatU`UapxzZIzZ`Tlf}W+I%ZvOaptAw=)`RXkl&=LJHQ?ta@U;l|7lO|P;MW7b zt5CiYa<~!kd63Io+67_#C1|H%pcmm_0?H#ieKD#**f=nT;LKXt840K|-s|8^Kf(GGj9`Fc@5i$|t5kBD{SA_Kl3lVY=u0){j{zF`LBK!$q zJ;HK?N`w-GOawF$iJ3%2>=MaTEftl2bfq|@Q$E2FJeA8tAUu@_gqQGBJv$MoUP3~2 z5IsZ}(MNO=y+k+BPkazR#24{Ld=kIJH&sk>AbF5nNIoPdk{8L1Ya@8C7`1e z^pt_FDabDeofV*WD(Ie$@;88w8Q^Co_?iX$bHL|Z@H-ED--z;+kV6&X9>`?@@)tr* zivWKUS@YO@E4Zyzya`vLWrI33g$}dMdtN=Z?pj}oWe>K`^4bV2D-EKws z7PMn4_*si~Z3F%w+F1g>?P0$!`~N!;|25L@LjDH8-3|DSD0eT)-v>PR1K$I{`ylZD z9`$TOeGjAFM^OKtK*yt?=W)>WXXHN#I-dr;e*xXkp#0y##}@GOEckjJ_+JE{FM;0< z@Vy=7cR~)k5buIq_9Fjf$Z0>|UxnNbp!^}o@pa&P19E)}_}_+{-$i}zLGB-*{D=7e z5zu@BQa(d|H$?IU=skv}`3mKaqaD8iKi{EUPXd1*+W80Ydm8P2hB1uc!sm)TomB~f z{JnrcULP%d=be^(SSSqUomtpH!zeh)o24b^LkDe`F z7CO^4P7?3GD;|TZSwD@Q9VMp-;S_9T1!wh*zG84%aMr2Ov$=Cqei%KQKR4ya(X)lY zDFNTH$m!b2W&>#^sLQQvw3GLqi**mI3~^;!sk z8AJBhmR{CAr%!nMU{BM>eUvq(A*%frWzT2Q%RL`?>_rJ`Kbn9^<;Q#9@gG&HZ~dc; zL|SPy5Vv!F#_gQ*xfQmr*-ade98CL~zY@=L&f$5@1HoB8jGl82*K4HUtRF|uIfrlc zx+NGA2InYzF}7Jf>a|#o3ng#IDeu6lV~~S%p!c1lB}kKe$E3XD>P>j~3sZ2PvaMJl zk077zqfD8hPGy+I-~Mkfwf*NzJ$V79etQ9?)?R?A_BxpjsrRTJOY2>EShWwW>B>7! z7n#_I!g)eP8g-kFSXiZM&Qp;-1`A{*^nHxw30r}}`|iKrG=KUz7aK0X#jQW*LcMMg zh`0bJ>q?RCQ=x&VdHlJEVGpeLXdyOU`_Hdqzrc71OIHb4y23uAS=uoPvr=miD*?tY zRUD>@f!d@%ttL>L5U5QI)M^8@x-d0)#OAD11TF-b2^!m7<{n5fZd#|9i- z^QB|%h86K=UqGXBzND9wxIU}R!K8e*|EQ)IV4^jC%{MZX)Up`f3X7>(w8EO;k+M8= zu3U$RUK(D41qbXPmv&$NjXd|$W9|pg>Yi8`xGSp~mQkmYXmtfkMB(kN;7q-)>Bo>a z$}&6Jw@5~W^(QRiR+o6>4R>jHX+`%soQ3fJ!t#(hygUSlqu{czH;u^`CY*HTxh$*@ z;uUCI7S?(&m*cW@bdBP&^aHC&w_^2=MA~T#VUo774xgDDmMKJYr0{(h3 zTd^i7CwL36C;&%^wX%eERg-$#y_W$1lmCsqKl=MBu~u41vH%8bjY!QJWV%CdLLtE6#t0U#g~ad%Y)x#hav8lV1_` zmbh^U!QK5gHMNEcrSd%i@g|_P1KrA}<;EE-kF)zBSbSepPUlD9eejG7$E2yM5nr}v zkL>Id{GamvU84WUY3Y?fg}3uVrO??vQ=_!PqL*Ck!KTBkuKZ;rWqE%|+<~JW*aFc7 z3u4iJnlTy&C+)ZtcR03%rAYxtwKScd#@Kf?@X{_Et4KclA`SD~vqqAw38*LeaPr&j zIj4KSw|4@j6PrFbv6e5NE2+T-Lp^qqwxc%yi&F8j_5=(zVYC%Ba3*K0lU3epJysrj z-`jcQW(A6uA$9i9ijK^{t%Q)#QvsnZ&`(9eCgD3-}O>`Jv=hjD5Yg8 z>4VAG46gTpxgUdehcl6KIUrhfc> zn{w6F$vys`lq;iNr0&WS7)?()g)3x{+GzC}J1mRj!%tEy>Fz8ntqF2f{v*7#*q9qM`gck3qw+{k{GAPMFK zsOwoLn>C%s&`7(fGr!z}`c>dg>9NM+q+KVUi9Y&_oas9jaf|YK#Y9^~ zYVxVot1zgmrW0Cnw8vPz5($ekdqxcgsyi2GNOdg%X{tkX!N&MzoPxs;!;RYCquRZC z6Iz%~M8yCC{z%wm->tq4vmaTl5^PZ= z$ZS@iCVJfuDwXP%Nd?~a!kZZ}*Ivkpz8IVh877sfdZO@0IN;wtvhxSQ|Iuk-U(+qH z+2@qZI}{+I=eZ@g#raNj?D?)0RO3RpEolWU?jDuuMim*&`3Z(0RyaMs#|lb+TOt z*4{=!39S1aE^tC_-=%1~1ZgTcf+O*yis9_prO1YLi<{OI*wDFcA&Zoysp{0oTjlhlDQY83> z;%17a2$qMNX_lfW@94HXhJxeU@;HKSE8>GVu+mm8AaP1to=9+QMNv&f(KtD+YQ;K2 zGqFeyeaQUHBzoEe((VYybLEsAZctKXIEf#WR2@zlT(BmbMD>KwL`IIE>lh{ORwF*?VjSlENPZ}R2MiSbJSa3YoR>TFz^VIO;g|;FA7-~*t zp>_oaC)smZa6Fw}O=vo?=H$V)A~85VDsmeoAM}v+P2^xWm~cOK6borsKQg`xQD|x9 z8+Mq0z4+YrY#ec?ej`CR8O*}0(^s-t^cDpjpfss|CWK*Hxl zFc#ISTfGp(fS8B+cf>SfVUcm|BGxjo<*I1Uoq<<-hvmGvU(Vx!d3?W|!4{Dw26!OH zz!|bm#1^$4X9j*Cg)D?iK|9JdH?1mVXeYP2RR^i~S7D%OM(-p`~z;POwLPA@joaH-ulsa28&-Q@O(B%K;a7*l^5fl2L6 zgz`lh@vM4e>M#&Dfq5PJ)8)cRI6D()Gw~k3oq4aL>cEY^QwM>{G`GzH4PUj*;)2sp zw$0*$)6cZc5_;mXf+GWVh3T5bGW~sFxo3jj%!qUbNgc;eFm{(Ke%H5_)*dWi;c4Ay zJQ#x3nu}6%2TC0!`4D?31?GsS-CPQ>MI63JJcYTF`MS9t5d*+$V1Hu(TrW+pvF54N zcWecqa8hP%F&G-4(Sh0=1GNokhOq+zLFXrr`>qR4j<9%E7O<1aUy+?mK1p^m`3&r& zXE=%&WMQByRt6_1?S#k4T4`h-?g);iXZ|ogIXCNc4YnCT=_AG!5|6BJhClQZ)h~=`?*XFBXt87){lt zM8JT=OAZtMV!MCmw6p6MXg3iDsFoyF+OcDTV<<5d-Fm1d#&!NP%xh@R(Yd=1At9~< zbE+Jj(~z1|;ZsRDdL#@j3mw3eCI^p8$@Y^Qfg44dU^)Ne}G9hYJe|v zW5N!4FU`~nEUHVZlv0t#erBmk!eH3mr@r+L)ZW`g^JHJCbkP5ifOEdzJ{;2j#*)Hm z*Vp4u4Z=)>@d%heU{ZjEv9{C zyie+s_ILW_JZVmhRdLxYH42QU_KaOtET%yvK(Qvk%TFurpy4lSaxXel zeGCXHL$VH52CgP@k)xBQDW!T99iAAAmO&Z>CpfceR z=Sb!9Im@Yms_w2lnkO+dBsNaE@@P+&^;{w0buvt1QJ6_&K*#CP>KzgRe?q`0Ljsoa zK9P!!R|aG{!ZO(|viYrSmEm`j+T&7S>kP&$~&NQ&(9v zpH2y3&%?-R-$fu={-^(D@|UnE`CmV$0+vn5L{a$UyNuIu zf8w6xUgUOgZ*w1TUvl4asl0_>!2ZdSxR<$1{x|F+HjX>R<@3K~-OR*=xI+F(md9Pp z4`qL2bGS?S;n=EGa2Z@BcM;t6hvKD-{O#c1mD|DU$N7S=QeT= zaDN5nQr^SgDzph3g!_bp!dt?pLXU8(*e2d5UWZc;y{Pkgmd2bc2fUQX+_egb}_d}SdNS1`BBh(+kj-4&V_}fZq&NVZaF1OQR!wmLK8SlAf|ugR=!nFdD2|LHk@)S1 z571Rq<*lx(WQo|e8%Qgy^VL=^VPlZ?pL2R>lXmpwIKT0qb9&+PJpVbThq)FEk0!9QYW~Kwn@TvXVHwl*6=F@`S*AVkBGZ}> zziK(twjn%qJJY(?Gwpo`09%GNgEe@sOfe_Nr~iX#=OVtoiD_e-0e3gTJ%D|iX)RL* z!6H84pXb4D1nj*`E8-30`vE)cR;GP$GAGBM#-lqk5g*>dv@amIe;W?fUodSG-q?B9 zZA^QY8l)I7}%UQXS><0f)9aj`U>rvWMj9fAQN6Tyuz z7oi@3^5{ncUxKF}rJWaciep&pIsa%L$IhF{O=P8PHuhv!vD?_M*zedg7z6KThglEn zWdf(>CU7;}dTt9hluzTQ^G*CHAz3gBIYNanN4QC76xxN2!o$MT!cIKC`cI)-xC(Qj zh2nZ~8oQlM<{G#}-p;28RYDSGNR{j!@Ee4T%6O-+SjfO^sh(|O)3{r>EBRc0g0MeHg*tJAc!CvlVcTK*vaF~0$G-=UnITf^PS&EQw? zZ}CU@eeCz#I%voN_5$}CXvj{M&E1E&V}Q4zUDfixFvY)2^K4dyQHI3s#ysb*Y#V!- z9b%udV@%{U&^9+{Si^nDeGW~$1eCqPzm3`Lcf3LvDvS`u2{s{LC=%uh3xqX-BzP*&o>qZXP)QhUDmuYsF-43jar8C`;iQ_{W9e>}u{6u9$D+ zAH@7J4Lm2v|NbkUXRrmbF0X@4J;9!1yJenFKzm}i9B6X`w~Tv_`@fGoi*eAwDjg88Pni|y@bz9WNsHdZLM12rtR*YB7RWvEqDSoebPO)F{ zwStSjG};A ziLuwl=EVLs_R-jFv9HE{8GAZ5K28^x6IU9yAZ}^ghPa30o{QT%z`r)CE-FDWLUD~^ zsp1{Q*yyJqfw!XHk4{%Qm9vzU%6F6>Dvv20F~5rWG-hS2KlYB;_hU_vV<=9c8l@Vo zTCHkT{a*Da;{5{aMByaEAgyq*ADEW=k$)4KHy1wM3){V&ZGgvp0&m*rVh7o~cp|8n zn+C0}$7)v__bX`RW9ZAaaU+DQh3kbpVX`n?s25fUEy8c%=bsctir0xoae`QeHuZ|D zv6}XP_$LvI-0brUtQq|hO+EZ>^cDYIn&M!iBZV{}Lzn=+v`Fy6Fa1V%Kv0X9ilaoU zm?IX6m13>9Ok5{!6#oF4=KUf~ndivqJC=aMoKK(+o5MWlWLL5_tZ6>PHnYF5mt?{tdl%N#PN?-(HPD)Pc3s^~$eL1hbA4UI zyqXf~1pII@lA%9^_)r4A4-OMQs^J|S=MoaOEs)i+0 zMPb!~c{Mq8^~)Qu{t05rin4MFCl^enx^wDkJqs838mj&e;Uk>*=@70$xDsI$!vE2q zW*)Uf__qi5Pa)hh_iWmt8#!h{+Ri~~xp<9fCDN7+O52GvyyhE5c($yjl4IC)=|_Lg z^)A2%5mq3$5gtXTMVN~~zhfvj1a;3wxCY@e1QEf3FdpH3=Y}g^14xGp0^5xJhBOSv)He=B417J zLU@2WzGjKHVSfGcESx$F-_HX8#=t091PiIDB4Z#cL8?!NsHv*O{jUj!cVYH&Z`G8# zsS7Ksa;oPwur99DTT@=!xUja8P0A}R&MP#g%0#jt%Z2->TaaD1%ssDR-pyHT0^hi# z9=7ZCWMO|NueLG_z^cH*yvpo_-kayuXR$^(7B=!Mwv#KX0$|O8321W|05+A1|c;!3^FJX@7CB!u8YN^><)Qb2iEx>o8`Dl&9ne*JC^~D8B{e2Nh?>n>luua26nz<+4Inz$UO_ z^dg0<9PvDCYL~GhmL;c5M($*^U>3{9wVX`>z8u^YvwV~)KuRe}+$ETRv;yVk;BOw% z%8*M?b7b84xToKX;@5Z*ox^$=$KnvDEB!L$zcii~<#D|-5~s^IXiErxXC^I-PE*sC&(ftj$_X+7I{1zfd2N<2)-shIlfisU>VurUgCu`Gy*gR@8bHxh zSq~~vs!^uj2$|9^9oBL_zVo%;$uC<%k#!@)r2q!p$UPoV>ToE~1lO_7_XNTdk~9UUF`5(9qt zL(lQj4gI4Cj<~TV+)}WF_`ZBx`94)!Y=|k>mNc$WgqWhQaT!yF*pS}E@x#}J`k1nf zU#AH1YsE%ID7KA>p><+N(TEa^U#yDfQHJkT#`DX>5WiTA=M!=5!~0ue8%u_V7Bl3` zK}xS;KT~vtddrl^8QzDSaz#8p9Q9z0tFLYGI5A#ql8_&dbCxAg5ULt}Xkbz2> zqGZluMo>&aQ~{r|asQrP)HqCRV?+Dm7soFP^~KL&-~sS_Gji6%h7?pENNGk{rd-n( zq7rKeU+-|jC)as9mTF^{g?hVsDP?$=1AY!LiM_)I<5LnRzz7QBO8^Vr!85oJy{n3*#X9 zl3fj^VMvIn7RL`;woWb&4t}w;%meIlu-0lo)!N3`|FUMZ`}e3Bnsio%2_dnKFBwer zh2)2l&1AR3AnSp$a}v+v_rfKKSMmdp3u($o(uKBlkisBY{ZiXgn=o%TTIb7k~|wz4*xzL zWy5$#+JFc3-yT(4)#7_%GUs%shZ=5_cgAe{s_H` zxQ0A*!kkcFNn+dDl6bTxY_bGt3hIwYn(Iz0;m3$RSSsYfG|lmi=st$`qIY5ZT4f`7 z__guF-9&RABn=%~2OU%PH4bY;Iig5h*B9;?W2yHX(g^DeHTD(~hAUt*SIAKOx>S-d zTQh;N%t(p}IR6Mu>5p6foA*T1+QxB%N`WHkE!K=VH|;d_Am^o_r~9|kE>!ksb^M$X z;>8j182mbl*&yXuXjkOEFSgN!R19!__UmAK)>9&#K_7}Wul_lb67!rgjNi&4<0!hL zG5SJ`?C6IrTDN?InZ$9-iz?{|j0T|AJP>&uHbCAk(@NW8w?Z+Rw{Q$cyrMnU@?{n)4yang~xZ z5jiGcw(ub4L{$;E@Vu-6@g?%O*^3dhj$I?qS88xCZ`=R}=CCpy37F4NdCz}QK3g6U z&&NE2uw8?{Q&Dmu#>nA$A7dAtH}@Dka~u9I@^tJ*%&pFyB`GmdA3U?uMY#Td_@cpi zdJgTDGA7lKYD%@FI#M%Jb5qBs7N)vWr=(6xotgSV>RYMbruLA4~sx`o8pc(!0~YPX8%g zG>gLBrR7@7LQ9>+XSv1FYFTHw2ekadas*WHHnnYpEy*^{X0q9AnYMhJ z+g4$lXREO_*p}H=+gfb*+8(t1(e}9QFSaflZy#b$uwQ1^*{`-I+YRp0~I zIij3#&SB0G&TE`woa>$UIPZ70F~-CYQ@q?waAc(N*ob)z#*@!*!SIJ=e#sqpq)A-@ATvMP+C*iZgD=n43|R zaZ^TphA-omjHZm+GJc)$+l+@Y9?kem#&a3lGP*Ke$#^T{!;GGc?=wOfG#P#dV!p(n zHHplwvMw+vX$7T+veC7*lxD@Y`55I><#v1 z_SKM8(7xWj!G53J=&(C-9FrXT9fur;9q&6%J1%vObYANm>r8XnojJ}4PU3f-Yk})# z*Amxq*BV!=D|(>F)aAx&Er%@oZMWM$cmB$SM0iLCF83O4NO{T{Yk%1O zBHBT4T;;GiZgBV<_c*#7-#LDA2+mmNC})z>;B-0joRgdnJF8u6F3y~y>?xxrZH(Cn zjsDKuXFhFa7SW=#s4SV#=z5Favcd8<%j=e}Epb+z)nT1x{k8Qe>jUzB4FN5>rxAa#G4u7No3C-IDrJ>IbQxrJhP<#*xO;>C7ye zm1dP$V@@z9nzd$~S#M4c7C)Eaa`lDI0_vz z95>@F`wuuCc07aj`@nI+G0J(J)8@={{>J%R=i|=5IET2dagB9ZTzRevSFNkrwa)cB z*PmUxU2nL)aGi3+WsJ&5%gE0t&sdPLGGkrFV;P@7|4$OF9gJZuoC$^mv_poW$S~7z zlcB}%Yr|&47QuSSEtxgicp&qv=nlzmUEc zKJuG%m3b)IzzCVofR9`Q|MVyG4)b1kr7z41=+9V7HN4RZ%UXD%r{EP2SU$3xu*AY6 zjtXPfhG z=O3NVJNG%?b$;PI1<76RDs$c7YILo39dfr;bApSCCqgIwSRN;}&D5@nz$O#vbGM zMwRIjlg?x|Wtk?K8ccVYo;U3>y=MB<^tI`fNt1S2nm)~*mX|g;?H%iBtHP$ST>;OW z3a>oTHpMm{zN68$0sJ4aePR0!zF1|y#IA=dEcOC>2|Vyx$0LrX9nZtU-gSHm52A2t z;6YO0KW=okI3IKV&AH9_20ZFfCv(NR5?slyG*^a;9!S%n-Luo?r!7kJrZuJAp7!gs zhtnQU`#XBb*V5ih>q|>a&q&WtccV|NPA6~Imj0{s-=Rorz`HP<@HT5ervt+%eQ zZnbW+zG;2WI@*?E8*iIz`;+Yz+grBxZC}~?Y$2NlJYD1BgZA{h+FieL-RpYR z^^$9sYoF_&>wVX!u!!$nAy-UBd`2SdA~nOAF)?FuMn%R9^ck%gcVv7^c5xi<;KilP zFw1ba;eNv(438R)7(O?|pg*Wh@ufVP@-%vc&r?pO6s4A>R;7AVSEjb4{wDQ-)W4-3 zNPRQ)Nb1SdGpSL=c%#l}k;gSR8J8McjCWv6^E`B8kMR}bo5l}}r;X7V(M&Rxn`W49 zgjT$6de`)=Ns$(xHY&}SW=qRYD^2@N+Wl#p(w<7&lC~%9NZJ=^r_wG?zao81dV2a~ z^gjF3UpBuDUma^{$5`SuNc5QPI5eftcG{*zpRKni*~g%-Ich&?k8zZ_X1lJ+u)r69 zImXFr!s&(_Lk)VpJ4}z7__Q0+V$+AghyD{9^Mg|$ThQQK3@&R88wb4eC)ShjXfLu|I1+X#doH%6<`i)*9I1V~%aG#Kle^fWpy{LxbZUCvCK0FOV5i zEGZ7yRc^}0l>O*mUr#xl^3Rlv)WfNl8okE5jrSQ3V^sHv=?harS|U9$pUKfTh1sUm zXHs{jzMlF?>UXK4F~OK*bQm-3x%Tn)Lc7~O#Xb#QVy?Z?UTv?j*JFgT3}cigXi=N} zc6g4v?Ds$-585}`H`^b-K+p9$wCtbuBlb`1-SET5?cdq^?5FL_Av%-}l|$o5a3n(a zbPhdy&KQTmVS<--I5N@Sjfb~(JEl0MK`-YzDjn7EM)eM_W0_;6qsh_YXmi}|Sns$C z{qTK`2hlffc0BHQ3SNDy;{`{DW2a*e#sUW%uVXauPsb6*Cys8%F~@QA*kJkpy5Ii- D@$M7t literal 0 HcmV?d00001 diff --git a/build/redist/_isresce.dll b/build/redist/_isresce.dll new file mode 100644 index 0000000..1278e06 --- /dev/null +++ b/build/redist/_isresce.dll @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:011e92e868f1f09904bef59b46972c318c2867c279380182e23bc1fd7eaf1d11 +size 31744 diff --git a/build/registry/dxwnd.the Hive.reg b/build/registry/dxwnd.the Hive.reg new file mode 100644 index 0000000..58b1a93 --- /dev/null +++ b/build/registry/dxwnd.the Hive.reg @@ -0,0 +1,27 @@ +# The Hive registry settings + +[HKEY_LOCAL_MACHINE\SOFTWARE\Rainbow] +[HKEY_LOCAL_MACHINE\SOFTWARE\Rainbow\TheHIVE] +[HKEY_LOCAL_MACHINE\SOFTWARE\Rainbow\TheHIVE\GlobalInfo] +"currentPlayer"="GHO" +"workingGameDirectory"=".\\" + +[HKEY_LOCAL_MACHINE\SOFTWARE\Rainbow\TheHIVE\GHO] +"userInfo"=dword:4ac9fbcb +"displayMode"=dword:000003fb +"profile"=dword:00010020 + +# displaymode = 3F7 (fair) +# displaymode = 3F9 (good) +# displaymode = 3Fa (better) +# displaymode = 3Fb (best) + +# userInfo = 4ac9fbcb (1st level) +# userInfo = 4B49fADB (2nd level) +# userinfo = d249f6d6 (??) + +# profile = 0x00010020 (practice) +# profile = 0x00010000 (normal) +# profile = 0x00010010 (expert) + +# profile = 0x.......1 (flip joystick direction) diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index 7114c21..c10bf79 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -410,41 +410,41 @@ static char *DumpPixelFormat(LPDDSURFACEDESC2 lpddsd) return sBuf; } -static void LogSurfaceAttributes(LPDDSURFACEDESC lpddsd, char *label, int line) +static CHAR *LogSurfaceAttributes(LPDDSURFACEDESC lpddsd, char *label, int line) { - if(!IsTraceDDRAW) return; - OutTrace("SurfaceDesc: %s Flags=%x(%s)", + static char sInfo[1024]; + sprintf(sInfo, "SurfaceDesc: %s Flags=%x(%s)", label, lpddsd->dwFlags, ExplainFlags(lpddsd->dwFlags)); - if (lpddsd->dwFlags & DDSD_BACKBUFFERCOUNT) OutTrace(" BackBufferCount=%d", lpddsd->dwBackBufferCount); - if (lpddsd->dwFlags & DDSD_WIDTH) OutTrace(" Width=%d", lpddsd->dwWidth); - if (lpddsd->dwFlags & DDSD_HEIGHT) OutTrace(" Height=%d", lpddsd->dwHeight); - if (lpddsd->dwFlags & DDSD_PITCH) OutTrace(" Pitch=%d", lpddsd->lPitch); - if (lpddsd->dwFlags & DDSD_MIPMAPCOUNT) OutTrace(" MipMapCount=%d", lpddsd->dwMipMapCount); + if (lpddsd->dwFlags & DDSD_BACKBUFFERCOUNT) sprintf(sInfo, "%s BackBufferCount=%d", sInfo, lpddsd->dwBackBufferCount); + if (lpddsd->dwFlags & DDSD_WIDTH) sprintf(sInfo, "%s Width=%d", sInfo, lpddsd->dwWidth); + if (lpddsd->dwFlags & DDSD_HEIGHT) sprintf(sInfo, "%s Height=%d", sInfo, lpddsd->dwHeight); + if (lpddsd->dwFlags & DDSD_PITCH) sprintf(sInfo, "%s Pitch=%d", sInfo, lpddsd->lPitch); + if (lpddsd->dwFlags & DDSD_MIPMAPCOUNT) sprintf(sInfo, "%s MipMapCount=%d", sInfo, lpddsd->dwMipMapCount); if (lpddsd->dwFlags & DDSD_CAPS) { - OutTrace(" Caps=%x(%s)", lpddsd->ddsCaps.dwCaps, ExplainDDSCaps(lpddsd->ddsCaps.dwCaps)); + sprintf(sInfo, "%s Caps=%x(%s)", sInfo, lpddsd->ddsCaps.dwCaps, ExplainDDSCaps(lpddsd->ddsCaps.dwCaps)); if(lpddsd->dwSize==sizeof(DDSURFACEDESC2)){ LPDDSURFACEDESC2 lpddsd2=(LPDDSURFACEDESC2)lpddsd; - OutTrace(" Caps2=%x(%s)", lpddsd2->ddsCaps.dwCaps2, ExplainDDSCaps2(lpddsd2->ddsCaps.dwCaps2)); - OutTrace(" Caps3=%x(%s)", lpddsd2->ddsCaps.dwCaps3, ExplainDDSCaps3(lpddsd2->ddsCaps.dwCaps3)); + sprintf(sInfo, "%s Caps2=%x(%s)", sInfo, lpddsd2->ddsCaps.dwCaps2, ExplainDDSCaps2(lpddsd2->ddsCaps.dwCaps2)); + sprintf(sInfo, "%s Caps3=%x(%s)", sInfo, lpddsd2->ddsCaps.dwCaps3, ExplainDDSCaps3(lpddsd2->ddsCaps.dwCaps3)); } } - if (lpddsd->dwFlags & DDSD_CKDESTBLT ) OutTrace(" CKDestBlt=(%x,%x)", lpddsd->ddckCKDestBlt.dwColorSpaceLowValue, lpddsd->ddckCKDestBlt.dwColorSpaceHighValue); - if (lpddsd->dwFlags & DDSD_CKDESTOVERLAY ) OutTrace(" CKDestOverlay=(%x,%x)", lpddsd->ddckCKDestOverlay.dwColorSpaceLowValue, lpddsd->ddckCKDestOverlay.dwColorSpaceHighValue); - if (lpddsd->dwFlags & DDSD_CKSRCBLT ) OutTrace(" CKSrcBlt=(%x,%x)", lpddsd->ddckCKSrcBlt.dwColorSpaceLowValue, lpddsd->ddckCKSrcBlt.dwColorSpaceHighValue); - if (lpddsd->dwFlags & DDSD_CKSRCOVERLAY ) OutTrace(" CKSrcOverlay=(%x,%x)", lpddsd->ddckCKSrcOverlay.dwColorSpaceLowValue, lpddsd->ddckCKSrcOverlay.dwColorSpaceHighValue); - if (lpddsd->dwFlags & DDSD_PIXELFORMAT ) OutTrace("%s", DumpPixelFormat((LPDDSURFACEDESC2)lpddsd)); - if (lpddsd->dwFlags & DDSD_LPSURFACE) OutTrace(" Surface=%x", lpddsd->lpSurface); - if (lpddsd->dwFlags & DDSD_ZBUFFERBITDEPTH) OutTrace(" ZBufferBitDepth=%d", lpddsd->dwZBufferBitDepth); - if (lpddsd->dwFlags & DDSD_ALPHABITDEPTH) OutTrace(" AlphaBitDepth=%d", lpddsd->dwAlphaBitDepth); - if (lpddsd->dwFlags & DDSD_REFRESHRATE) OutTrace(" RefreshRate=%d", lpddsd->dwRefreshRate); - if (lpddsd->dwFlags & DDSD_LINEARSIZE) OutTrace(" LinearSize=%d", lpddsd->dwLinearSize); + if (lpddsd->dwFlags & DDSD_CKDESTBLT ) sprintf(sInfo, "%s CKDestBlt=(%x,%x)", sInfo, lpddsd->ddckCKDestBlt.dwColorSpaceLowValue, lpddsd->ddckCKDestBlt.dwColorSpaceHighValue); + if (lpddsd->dwFlags & DDSD_CKDESTOVERLAY ) sprintf(sInfo, "%s CKDestOverlay=(%x,%x)", sInfo, lpddsd->ddckCKDestOverlay.dwColorSpaceLowValue, lpddsd->ddckCKDestOverlay.dwColorSpaceHighValue); + if (lpddsd->dwFlags & DDSD_CKSRCBLT ) sprintf(sInfo, "%s CKSrcBlt=(%x,%x)", sInfo, lpddsd->ddckCKSrcBlt.dwColorSpaceLowValue, lpddsd->ddckCKSrcBlt.dwColorSpaceHighValue); + if (lpddsd->dwFlags & DDSD_CKSRCOVERLAY ) sprintf(sInfo, "%s CKSrcOverlay=(%x,%x)", sInfo, lpddsd->ddckCKSrcOverlay.dwColorSpaceLowValue, lpddsd->ddckCKSrcOverlay.dwColorSpaceHighValue); + if (lpddsd->dwFlags & DDSD_PIXELFORMAT ) sprintf(sInfo, "%s %s", sInfo, DumpPixelFormat((LPDDSURFACEDESC2)lpddsd)); + if (lpddsd->dwFlags & DDSD_LPSURFACE) sprintf(sInfo, "%s Surface=%x", sInfo, lpddsd->lpSurface); + if (lpddsd->dwFlags & DDSD_ZBUFFERBITDEPTH) sprintf(sInfo, "%s ZBufferBitDepth=%d", sInfo, lpddsd->dwZBufferBitDepth); + if (lpddsd->dwFlags & DDSD_ALPHABITDEPTH) sprintf(sInfo, "%s AlphaBitDepth=%d", sInfo, lpddsd->dwAlphaBitDepth); + if (lpddsd->dwFlags & DDSD_REFRESHRATE) sprintf(sInfo, "%s RefreshRate=%d", sInfo, lpddsd->dwRefreshRate); + if (lpddsd->dwFlags & DDSD_LINEARSIZE) sprintf(sInfo, "%s LinearSize=%d", sInfo, lpddsd->dwLinearSize); if (lpddsd->dwSize == sizeof(DDSURFACEDESC2)){ - if (lpddsd->dwFlags & DDSD_TEXTURESTAGE) OutTrace(" TextureStage=%x", ((LPDDSURFACEDESC2)lpddsd)->dwTextureStage); - if (lpddsd->dwFlags & DDSD_FVF) OutTrace(" FVF=%x", ((LPDDSURFACEDESC2)lpddsd)->dwFVF); + if (lpddsd->dwFlags & DDSD_TEXTURESTAGE) sprintf(sInfo, "%s TextureStage=%x", sInfo, ((LPDDSURFACEDESC2)lpddsd)->dwTextureStage); + if (lpddsd->dwFlags & DDSD_FVF) sprintf(sInfo, "%s FVF=%x", sInfo, ((LPDDSURFACEDESC2)lpddsd)->dwFVF); } - - OutTrace("\n"); + + return sInfo; } static void DumpPixFmt(LPDDSURFACEDESC2 lpdds) @@ -452,12 +452,6 @@ static void DumpPixFmt(LPDDSURFACEDESC2 lpdds) OutTrace("PixelFormat: lpddsd=%x %s\n", DumpPixelFormat(lpdds)); } -static void DumpSurfaceAttributes(LPDDSURFACEDESC lpddsd, char *label, int line) -{ - if(!IsDebug) return; - LogSurfaceAttributes(lpddsd, label, line); -} - void DescribeSurface(LPDIRECTDRAWSURFACE lpdds, int dxversion, char *label, int line) { DDSURFACEDESC2 ddsd; @@ -491,8 +485,8 @@ void DescribeSurface(LPDIRECTDRAWSURFACE lpdds, int dxversion, char *label, int break; } if(res)return; - OutTraceDW("Surface %s: ddsd=%x dxversion=%d ", label, lpdds, dxversion); - LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, label, line); + OutTraceDW("Surface %s: ddsd=%x dxversion=%d %s\n", + label, lpdds, dxversion, LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, label, line)); } /* ------------------------------------------------------------------------------ */ @@ -1946,10 +1940,11 @@ HRESULT WINAPI extSetDisplayMode(int version, LPDIRECTDRAW lpdd, HRESULT res = 0; if(IsTraceDDRAW){ - OutTrace("SetDisplayMode: version=%d dwWidth=%i dwHeight=%i dwBPP=%i", - version, dwwidth, dwheight, dwbpp); - if (version==2) OutTrace(" dwRefresh=%i dwFlags=%x\n", dwrefreshrate, dwflags); - else OutTrace("\n"); + char sInfo[81]; + strcpy(sInfo, ""); + if (version==2) sprintf(sInfo, " dwRefresh=%i dwFlags=%x", dwrefreshrate, dwflags); + OutTrace("SetDisplayMode: version=%d dwWidth=%i dwHeight=%i dwBPP=%i%s\n", + version, dwwidth, dwheight, dwbpp, sInfo); } // binkplayer fix @@ -2226,7 +2221,7 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf ddsd.dwHeight = dxw.GetScreenHeight(); // create Primary surface - DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]" , __LINE__); + OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]" , __LINE__)); res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); if(res){ if (res==DDERR_PRIMARYSURFACEALREADYEXISTS){ @@ -2247,13 +2242,24 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf OutTraceDW("CreateSurface: created PRIMARY DDSPrim=%x\n", *lplpdds); if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSPrim", __LINE__); HookDDSurfacePrim(lplpdds, dxversion); + // "Hoyle Casino Empire" opens a primary surface and NOT a backbuffer .... + iBakBufferVersion=dxversion; // v2.03.01 + + // set a global capability value for surfaces that have to blit to primary + // DDSCAPS_OFFSCREENPLAIN seems required to support the palette in memory surfaces + // DDSCAPS_SYSTEMMEMORY makes operations faster, but it is not always good... + dwBackBufferCaps = (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY); + // on WinXP Fifa 99 doesn't like DDSCAPS_SYSTEMMEMORY cap, so better to leave a way to unset it.... + if(dxw.dwFlags5 & NOSYSTEMEMULATED) dwBackBufferCaps &= ~DDSCAPS_SYSTEMMEMORY; + if(dxw.dwFlags5 & GSKYHACK) dwBackBufferCaps = (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM); + + if(dxw.dwFlags5 & GDIMODE) return DD_OK; if(lpDDSEmu_Prim==NULL){ ClearSurfaceDesc((void *)&ddsd, dxversion); ddsd.dwFlags = DDSD_CAPS; ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; - DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[EmuPrim]" , __LINE__); - + OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[EmuPrim]", __LINE__)); res=(*pCreateSurface)(lpdd, &ddsd, &lpDDSEmu_Prim, 0); if(res==DDERR_PRIMARYSURFACEALREADYEXISTS){ OutTraceDW("CreateSurface: ASSERT DDSEmu_Prim already exists\n"); @@ -2286,12 +2292,7 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf if(lpDDSEmu_Back==NULL){ ClearSurfaceDesc((void *)&ddsd, dxversion); ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; - // DDSCAPS_OFFSCREENPLAIN seems required to support the palette in memory surfaces - // DDSCAPS_SYSTEMMEMORY makes operations faster, but it is not always good... - ddsd.ddsCaps.dwCaps = (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY); - // on WinXP Fifa 99 doesn't like DDSCAPS_SYSTEMMEMORY cap, so better to leave a way to unset it.... - if(dxw.dwFlags5 & NOSYSTEMEMULATED) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; - dwBackBufferCaps = ddsd.ddsCaps.dwCaps; + ddsd.ddsCaps.dwCaps = dwBackBufferCaps; ddsd.dwWidth = dxw.GetScreenWidth(); ddsd.dwHeight = dxw.GetScreenHeight(); if(dxw.dwFlags4 & BILINEAR2XFILTER){ @@ -2299,7 +2300,8 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf ddsd.dwWidth = dxw.GetScreenWidth() << 1; ddsd.dwHeight = dxw.GetScreenHeight() << 1; } - DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[EmuBack]" , __LINE__); + + OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[EmuBack]", __LINE__)); res=(*pCreateSurface)(lpdd, &ddsd, &lpDDSEmu_Back, 0); if(res){ @@ -2313,9 +2315,6 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf if (dxw.dwTFlags & OUTPROXYTRACE) HookDDSurfaceGeneric(&lpDDSEmu_Back, dxversion); } - // "Hoyle Casino Empire" opens a primary surface and NOT a backbuffer .... - iBakBufferVersion=dxversion; // v2.03.01 - return DD_OK; } @@ -2333,7 +2332,7 @@ static HRESULT BuildPrimaryDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf if ((lpddsd->dwFlags & DDSD_CAPS) && (lpddsd->ddsCaps.dwCaps & DDSCAPS_3DDEVICE)) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; // create Primary surface - DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]" , __LINE__); + OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Primary]", __LINE__)); res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); if(res){ if (res==DDERR_PRIMARYSURFACEALREADYEXISTS){ @@ -2364,7 +2363,7 @@ static HRESULT BuildPrimaryDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf ddsd.dwHeight = dxw.GetScreenHeight(); ddsd.ddsCaps.dwCaps = 0; if (dxversion >= 4) ddsd.ddsCaps.dwCaps |= DDSCAPS_OFFSCREENPLAIN; - DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Dir FixBuf]" , __LINE__); + OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Dir FixBuf]", __LINE__)); res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); if(res){ OutTraceE("CreateSurface: ERROR on DDSPrim res=%x(%s) at %d\n",res, ExplainDDError(res), __LINE__); @@ -2399,7 +2398,7 @@ static HRESULT BuildBackBufferEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateS ddsd.dwHeight = dxw.GetScreenHeight(); GetPixFmt(&ddsd); - DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Backbuf]" , __LINE__); + OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Backbuf]", __LINE__)); res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); if(res) { OutTraceE("CreateSurface ERROR: res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); @@ -2447,7 +2446,7 @@ static HRESULT BuildBackBufferDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateS ddsd.dwHeight = prim.dwHeight; OutTraceDW("BMX FIX: res=%x(%s) wxh=(%dx%d)\n", res, ExplainDDError(res),ddsd.dwWidth, ddsd.dwHeight); } - DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Backbuf]" , __LINE__); + OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Backbuf]", __LINE__)); res=(*pCreateSurface)(lpdd, &ddsd, lplpdds, 0); if(res) { if ((dxw.dwFlags1 & SWITCHVIDEOMEMORY) && (res==DDERR_OUTOFVIDEOMEMORY)){ @@ -2498,7 +2497,7 @@ static HRESULT BuildGenericEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf return res; } - DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Emu Generic]" , __LINE__); + OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Emu Generic]", __LINE__)); OutTraceDW("CreateSurface: created Emu_Generic dds=%x\n", *lplpdds); if(IsDebug) DescribeSurface(*lplpdds, dxversion, "DDSEmu_Generic", __LINE__); @@ -2523,7 +2522,7 @@ static HRESULT BuildGenericDir(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf { HRESULT res; - DumpSurfaceAttributes((LPDDSURFACEDESC)lpddsd, "[Dir Generic]" , __LINE__); + OutTraceDW("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)lpddsd, "[Dir Generic]", __LINE__)); res = (*pCreateSurface)(lpdd, lpddsd, lplpdds, 0); if(res){ @@ -2575,10 +2574,8 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate BuildGeneric = BuildGenericDir; } - if(IsTraceDDRAW){ - OutTrace("CreateSurface: Version=%d lpdd=%x ", dxversion, lpdd); - LogSurfaceAttributes((LPDDSURFACEDESC)lpddsd, "[CreateSurface]", __LINE__); - } + OutTraceDDRAW("CreateSurface: Version=%d lpdd=%x %s\n", + dxversion, lpdd, LogSurfaceAttributes((LPDDSURFACEDESC)lpddsd, "[CreateSurface]", __LINE__)); // check for lpddsd->dwSize value TargetSize=(dxversion<4)?sizeof(DDSURFACEDESC):sizeof(DDSURFACEDESC2); @@ -2670,10 +2667,12 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate } if(IsTraceDDRAW){ - OutTrace("CreateSurface: created DDSPrim=%x DDSBack=%x", lpDDSPrim, lpDDSBack); - if(dxw.dwFlags1 & (EMULATESURFACE|EMULATEBUFFER)) OutTrace(" DDSEmu_Prim=%x", lpDDSEmu_Prim); - if(dxw.dwFlags1 & EMULATESURFACE) OutTrace(" DDSEmu_Back=%x", lpDDSEmu_Back); - OutTrace("\n"); + char sInfo[256+1]; + sprintf(sInfo, "CreateSurface: created DDSPrim=%x DDSBack=%x", lpDDSPrim, lpDDSBack); + if(dxw.dwFlags1 & (EMULATESURFACE|EMULATEBUFFER)) sprintf(sInfo, "%s DDSEmu_Prim=%x", sInfo, lpDDSEmu_Prim); + if(dxw.dwFlags1 & EMULATESURFACE) sprintf(sInfo, "%s DDSEmu_Back=%x", sInfo, lpDDSEmu_Back); + strcat(sInfo, "\n"); + OutTrace(sInfo); } // rebuild the clipper area @@ -2831,36 +2830,37 @@ HRESULT WINAPI extGetAttachedSurface7(LPDIRECTDRAWSURFACE lpdds, LPDDSCAPS lpdds void BlitError(HRESULT res, LPRECT lps, LPRECT lpd, int line) { - OutTrace("Blt: ERROR %x(%s) at %d", res, ExplainDDError(res), line); + char sInfo[512]; + sprintf(sInfo, "Blt: ERROR %x(%s) at %d", res, ExplainDDError(res), line); if (res==DDERR_INVALIDRECT){ if (lps) - OutTrace(" src=(%d,%d)-(%d,%d)",lps->left, lps->top, lps->right, lps->bottom); + sprintf(sInfo, "%s src=(%d,%d)-(%d,%d)", sInfo, lps->left, lps->top, lps->right, lps->bottom); else - OutTrace(" src=(NULL)"); + sprintf(sInfo, "%s src=(NULL)", sInfo); if (lpd) - OutTrace(" dest=(%d,%d)-(%d,%d)",lpd->left, lpd->top, lpd->right, lpd->bottom); + sprintf(sInfo, "%s dest=(%d,%d)-(%d,%d)", sInfo, lpd->left, lpd->top, lpd->right, lpd->bottom); else - OutTrace(" dest=(NULL)"); + sprintf(sInfo, "%s dest=(NULL)", sInfo); } - OutTrace("\n"); + strcat(sInfo, "\n"); + OutTrace(sInfo); return; } void BlitTrace(char *label, LPRECT lps, LPRECT lpd, int line) { - extern HANDLE hTraceMutex; - WaitForSingleObject(hTraceMutex, INFINITE); - OutTrace("Blt: %s", label); + char sInfo[512]; + sprintf(sInfo, "Blt: %s", label); if (lps) - OutTrace(" src=(%d,%d)-(%d,%d)",lps->left, lps->top, lps->right, lps->bottom); + sprintf(sInfo, "%s src=(%d,%d)-(%d,%d)", sInfo, lps->left, lps->top, lps->right, lps->bottom); else - OutTrace(" src=(NULL)"); + sprintf(sInfo, "%s src=(NULL)", sInfo); if (lpd) - OutTrace(" dest=(%d,%d)-(%d,%d)",lpd->left, lpd->top, lpd->right, lpd->bottom); + sprintf(sInfo, "%s dest=(%d,%d)-(%d,%d)", sInfo, lpd->left, lpd->top, lpd->right, lpd->bottom); else - OutTrace(" dest=(NULL)"); - OutTrace(" at %d\n", line); - ReleaseMutex(hTraceMutex); + sprintf(sInfo, "%s dest=(NULL)", sInfo); + sprintf(sInfo, "%s at %d\n", sInfo, line); + OutTrace(sInfo); return; } @@ -2924,7 +2924,7 @@ HRESULT WINAPI PrimaryStretchBlt(LPDIRECTDRAWSURFACE lpdds, LPRECT lpdestrect, L res=(*pCreateSurface)(lpPrimaryDD, (LPDDSURFACEDESC)&ddsd, &lpddsTmp, NULL); if(res) { OutTraceE("CreateSurface: ERROR %x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - if(IsDebug) DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Gateway]" , __LINE__); + OutTraceB("CreateSurface: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Gateway]", __LINE__)); return res; } // stretch-blit to target size on OFFSCREENPLAIN temp surface @@ -3226,9 +3226,8 @@ HRESULT WINAPI extFlip(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWSURFACE lpddssrc, res2=(*pCreateSurfaceMethod(lpdds))(lpPrimaryDD, &ddsd, &lpddsTmp, NULL); if(res2) { OutTraceE("CreateSurface: ERROR %x(%s) at %d\n", res2, ExplainDDError(res2), __LINE__); - OutTrace("Size=%d lpPrimaryDD=%x lpDDSBack=%x\n", ddsd.dwSize, lpPrimaryDD, lpDDSBack); - LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[FlipBuf]", __LINE__); - //dxw.dwFlags4 &= ~NOFLIPEMULATION; + OutTraceE("Size=%d lpPrimaryDD=%x lpDDSBack=%x %s\n", + ddsd.dwSize, lpPrimaryDD, lpDDSBack, LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[FlipBuf]", __LINE__)); } //OutTrace("DEBUG: copied surface size=(%dx%d)\n", ddsd.dwWidth, ddsd.dwHeight); // copy front buffer @@ -3317,13 +3316,11 @@ HRESULT WINAPI extBltFast(LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, CleanRect(&lpsrcrect,__LINE__); if(IsTraceDDRAW){ - OutTrace("BltFast: dest=%x%s src=%x%s dwTrans=%x(%s) (x,y)=(%d,%d) ", - lpdds, ToPrim?"(PRIM)":"", lpddssrc, FromPrim?"(PRIM)":"", dwtrans, ExplainBltFastFlags(dwtrans), dwx, dwy); - if (lpsrcrect) - OutTrace("srcrect=(%d,%d)-(%d,%d)\n", - lpsrcrect->left, lpsrcrect->top, lpsrcrect->right, lpsrcrect->bottom); - else - OutTrace("srcrect=(NULL)\n"); + char sRect[81]; + if (lpsrcrect) sprintf(sRect, "(%d,%d)-(%d,%d)", lpsrcrect->left, lpsrcrect->top, lpsrcrect->right, lpsrcrect->bottom); + else strcpy(sRect, "(NULL)"); + OutTrace("BltFast: dest=%x%s src=%x%s dwTrans=%x(%s) (x,y)=(%d,%d) srcrect=%s\n", + lpdds, ToPrim?"(PRIM)":"", lpddssrc, FromPrim?"(PRIM)":"", dwtrans, ExplainBltFastFlags(dwtrans), dwx, dwy, sRect); } // consistency check .... @@ -3460,11 +3457,11 @@ HRESULT WINAPI extSetPalette(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWPALETTE lpdd mySetPalette(0, 256, lpentries); // v2.02.76: necessary for "Requiem Avenging Angel" in SURFACEEMULATION mode } // Apply palette to backbuffer surface. This is necessary on some games: "Duckman private dick", "Total Soccer 2000", ... - if (lpDDSBack) { - OutTraceDW("SetPalette: apply PRIMARY palette lpDDP=%x to DDSBack=%x\n", lpddp, lpDDSBack); - res=(*pSetPalette)(lpDDSBack, lpddp); - if(res) OutTraceE("SetPalette: ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - } + if (lpDDSBack){ + OutTraceDW("SetPalette: apply PRIMARY palette lpDDP=%x to DDSBack=%x\n", lpddp, lpDDSBack); + res=(*pSetPalette)(lpDDSBack, lpddp); + if(res) OutTraceE("SetPalette: ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + } // add a reference to simulate what would happen in reality.... lpdds->AddRef(); res=DD_OK; @@ -3499,7 +3496,8 @@ HRESULT WINAPI extSetEntries(LPDIRECTDRAWPALETTE lpddp, DWORD dwflags, DWORD dws // e.g. dungeon keeper loading screen, Warcraft II splash, ... // GHO: but refreshing cause flickering when GDI was used without updating the primary surface // e.g. Tomb Raider 2 intro titles, Virtua Fighter PC, ... - if ((dxw.dwFlags1 & EMULATESURFACE) && !(dxw.dwFlags2 & NOPALETTEUPDATE)) dxw.ScreenRefresh(); + // v2.03.10: do not blit also in case of GDI mode + if ((dxw.dwFlags1 & EMULATESURFACE) && !(dxw.dwFlags2 & NOPALETTEUPDATE) && !(dxw.dwFlags5 & GDIMODE)) dxw.ScreenRefresh(); } return res; } @@ -3536,18 +3534,16 @@ HRESULT WINAPI extSetClipper(LPDIRECTDRAWSURFACE lpdds, LPDIRECTDRAWCLIPPER lpdd HRESULT WINAPI extLock(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACEDESC lpDDSurfaceDesc, DWORD flags, HANDLE hEvent) { HRESULT res; - BOOL IsPrim; - IsPrim=dxw.IsAPrimarySurface(lpdds); CleanRect(&lprect, __LINE__); - if(IsTraceDW){ - OutTrace("Lock: lpdds=%x%s flags=%x(%s) lpDDSurfaceDesc=%x", - lpdds, (IsPrim ? "(PRIM)":""), flags, ExplainLockFlags(flags), lpDDSurfaceDesc); - if (lprect) - OutTrace(" rect=(%d,%d)-(%d,%d)\n", lprect->left, lprect->top, lprect->right, lprect->bottom); - else - OutTrace(" rect=(NULL)\n"); + if(IsTraceDDRAW){ + BOOL IsPrim=dxw.IsAPrimarySurface(lpdds); + char sRect[81]; + if (lprect) sprintf_s(sRect, 80, "(%d,%d)-(%d,%d)", lprect->left, lprect->top, lprect->right, lprect->bottom); + else strcpy(sRect, "(NULL)"); + OutTrace("Lock: lpdds=%x%s flags=%x(%s) lpDDSurfaceDesc=%x rect=%s\n", + lpdds, (IsPrim ? "(PRIM)":""), flags, ExplainLockFlags(flags), lpDDSurfaceDesc, sRect); } res=(*pLock)(lpdds, lprect, lpDDSurfaceDesc, flags, hEvent); @@ -3557,8 +3553,8 @@ HRESULT WINAPI extLock(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACEDESC OutTraceDW("Lock RETRY: ret=%x(%s)\n", res, ExplainDDError(res)); } if(res) OutTraceE("Lock ERROR: ret=%x(%s)\n", res, ExplainDDError(res)); - DumpSurfaceAttributes(lpDDSurfaceDesc, "[Locked]" , __LINE__); - OutTraceB("Lock: lPitch=%d lpSurface=%x\n", lpDDSurfaceDesc->lPitch, lpDDSurfaceDesc->lpSurface); + OutTraceB("Lock: lPitch=%d lpSurface=%x %s\n", + lpDDSurfaceDesc->lPitch, lpDDSurfaceDesc->lpSurface, LogSurfaceAttributes(lpDDSurfaceDesc, "[Locked]", __LINE__)); if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK; return res; @@ -3578,12 +3574,12 @@ HRESULT WINAPI extLockDir(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACED // to find out whether it is the primary or not, using lpdds==lpPrimaryDD->GetGDISurface(&lpDDSPrim); if(IsTraceDDRAW){ - OutTrace("Lock: lpdds=%x flags=%x(%s) lpDDSurfaceDesc=%x", - lpdds, flags, ExplainLockFlags(flags), lpDDSurfaceDesc); - if (lprect) - OutTrace(" rect=(%d,%d)-(%d,%d)\n", lprect->left, lprect->top, lprect->right, lprect->bottom); - else - OutTrace(" rect=(NULL)\n"); + BOOL IsPrim=dxw.IsAPrimarySurface(lpdds); + char sRect[81]; + if (lprect) sprintf_s(sRect, 80, "(%d,%d)-(%d,%d)", lprect->left, lprect->top, lprect->right, lprect->bottom); + else strcpy(sRect, "(NULL)"); + OutTrace("Lock: lpdds=%x%s flags=%x(%s) lpDDSurfaceDesc=%x rect=%s\n", + lpdds, (IsPrim ? "(PRIM)":""), flags, ExplainLockFlags(flags), lpDDSurfaceDesc, sRect); } // V2.02.43: Empire Earth does some test Lock operations apparently before the primary surface is created @@ -3605,8 +3601,7 @@ HRESULT WINAPI extLockDir(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACED ddsd.dwWidth = dxw.GetScreenWidth(); ddsd.dwHeight = dxw.GetScreenHeight(); ddsd.ddsCaps.dwCaps = 0; - //if (SurfaceDescrSize(lpdds)==sizeof(DDSURFACEDESC2)) ddsd.ddsCaps.dwCaps |= DDSCAPS_OFFSCREENPLAIN; - DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Dir FixBuf]" , __LINE__); + OutTraceB("Lock: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[Dir FixBuf]" , __LINE__)); res=(*pCreateSurface1)(lpPrimaryDD, (DDSURFACEDESC *)&ddsd, (LPDIRECTDRAWSURFACE *)&lpDDSBuffer, 0); if(res){ OutTraceE("CreateSurface: ERROR on DDSBuffer res=%x(%s) at %d\n",res, ExplainDDError(res), __LINE__); @@ -3638,7 +3633,7 @@ HRESULT WINAPI extLockDir(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACED res=(*pLock)(lpdds, lprect, lpDDSurfaceDesc, flags, hEvent); if(res) OutTraceE("Lock ERROR: ret=%x(%s)\n", res, ExplainDDError(res)); - DumpSurfaceAttributes((LPDDSURFACEDESC)lpDDSurfaceDesc, "[Locked]" , __LINE__); + OutTraceB("Lock: %s\n", LogSurfaceAttributes((LPDDSURFACEDESC)lpDDSurfaceDesc, "[Locked]" , __LINE__)); if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK; return res; @@ -3655,16 +3650,14 @@ HRESULT WINAPI extUnlock(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRAWSURFAC if ((dxversion == 4) && lprect) CleanRect(&lprect,__LINE__); if(IsTraceDDRAW){ - OutTrace("Unlock(%d): lpdds=%x%s ", dxversion, lpdds, (IsPrim ? "(PRIM)":"")); + char sRect[81]; if (dxversion == 4){ - if (lprect){ - OutTrace("rect=(%d,%d)-(%d,%d)\n", lprect->left, lprect->top, lprect->right, lprect->bottom); - } - else - OutTrace("rect=(NULL)\n"); + if (lprect) sprintf_s(sRect, 80, "rect=(%d,%d)-(%d,%d)", lprect->left, lprect->top, lprect->right, lprect->bottom); + else strcpy(sRect, "rect=(NULL)"); } else - OutTrace("lpvoid=%x\n", lprect); + sprintf_s(sRect, 80, "lpvoid=%x", lprect); + OutTrace("Unlock(%d): lpdds=%x%s %s\n", dxversion, lpdds, (IsPrim ? "(PRIM)":""), sRect); } res=(*pUnlock)(lpdds, lprect); @@ -3712,16 +3705,14 @@ HRESULT WINAPI extUnlockDir(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRAWSUR if ((dxversion >= 4) && lprect) CleanRect(&lprect,__LINE__); if(IsTraceDDRAW){ - OutTrace("Unlock: lpdds=%x%s ", lpdds, (IsPrim ? "(PRIM)":"")); + char sRect[81]; if (dxversion == 4){ - if (lprect){ - OutTrace("rect=(%d,%d)-(%d,%d)\n", lprect->left, lprect->top, lprect->right, lprect->bottom); - } - else - OutTrace("rect=(NULL)\n"); + if (lprect) sprintf_s(sRect, 80, "rect=(%d,%d)-(%d,%d)", lprect->left, lprect->top, lprect->right, lprect->bottom); + else strcpy(sRect, "rect=(NULL)"); } else - OutTrace("lpvoid=%x\n", lprect); + sprintf_s(sRect, 80, "lpvoid=%x", lprect); + OutTrace("Unlock(%d): lpdds=%x%s %s\n", dxversion, lpdds, (IsPrim ? "(PRIM)":""), sRect); } if(dxw.dwFlags1 & LOCKEDSURFACE){ @@ -4183,12 +4174,11 @@ HRESULT WINAPI extSetColorKey(LPDIRECTDRAWSURFACE lpdds, DWORD flags, LPDDCOLORK BOOL IsPrim; IsPrim=dxw.IsAPrimarySurface(lpdds); if(IsTraceDDRAW){ - OutTrace("SetColorKey: lpdds=%x%s flags=%x(%s) ", - lpdds, (IsPrim ? "(PRIM)" : ""), flags, ExplainColorKeyFlag(flags)); - if (lpDDColorKey) - OutTrace("colors=(L:%x,H:%x)\n",lpDDColorKey->dwColorSpaceLowValue, lpDDColorKey->dwColorSpaceHighValue); - else - OutTrace("colors=(NULL)\n"); + char sInfo[81]; + if (lpDDColorKey) sprintf(sInfo, "(L:%x,H:%x)",lpDDColorKey->dwColorSpaceLowValue, lpDDColorKey->dwColorSpaceHighValue); + else strcpy(sInfo, "(NULL)"); + OutTrace("SetColorKey: lpdds=%x%s flags=%x(%s) colors=%s\n", + lpdds, (IsPrim ? "(PRIM)" : ""), flags, ExplainColorKeyFlag(flags), sInfo); } res=(*pSetColorKey)(lpdds, flags, lpDDColorKey); @@ -4490,7 +4480,7 @@ HRESULT WINAPI extGetSurfaceDesc(GetSurfaceDesc_Type pGetSurfaceDesc, LPDIRECTDR return res; } - LogSurfaceAttributes(lpddsd, "GetSurfaceDesc", __LINE__); + OutTraceDDRAW("GetSurfaceDesc: lpdds=%x %s\n", lpdds, LogSurfaceAttributes(lpddsd, "GetSurfaceDesc", __LINE__)); if (IsPrim) { OutTraceDW("GetSurfaceDesc: fixing PRIMARY surface\n"); @@ -4524,7 +4514,9 @@ HRESULT WINAPI extGetSurfaceDesc(GetSurfaceDesc_Type pGetSurfaceDesc, LPDIRECTDR } } - if(IsFixed) LogSurfaceAttributes(lpddsd, "GetSurfaceDesc [FIXED]", __LINE__); + if(IsFixed){ + OutTraceDW("GetSurfaceDesc: lpdds=%x %s\n", lpdds, LogSurfaceAttributes(lpddsd, "GetSurfaceDesc [FIXED]", __LINE__)); + } return DD_OK; } diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 25179a3..1a1f4ca 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -153,27 +153,33 @@ static void OutTraceHeader(FILE *fp) fprintf(fp, "***\n"); } +#define DXWMAXLOGSIZE 4096 + void OutTrace(const char *format, ...) { va_list al; static char path[MAX_PATH]; static FILE *fp=NULL; // GHO: thread safe??? + char sBuf[DXWMAXLOGSIZE+1]; DWORD tFlags; + static GetTickCount_Type pGetTick; // check global log flag - if(!(dxw.dwTFlags & OUTTRACE)) return; + if(!(dxw.dwTFlags & (OUTTRACE|OUTDEBUGSTRING))) return; tFlags = dxw.dwTFlags; dxw.dwTFlags = 0x0; // to avoid possible log recursion while loading C runtime libraries!!! WaitForSingleObject(hTraceMutex, INFINITE); if (fp == NULL){ + char *OpenMode = (tFlags & ERASELOGFILE) ? "w+" : "a+"; + pGetTick = GetTickCount; // save function pointer GetCurrentDirectory(MAX_PATH, path); strcat(path, "\\dxwnd.log"); - fp = fopen(path, "a+"); + fp = fopen(path, OpenMode); if (fp==NULL){ // in case of error (e.g. current dir on unwritable CD unit)... strcpy(path, GetDxWndPath()); strcat(path, "\\dxwnd.log"); - fp = fopen(path, "a+"); + fp = fopen(path, OpenMode); } if (fp==NULL) return; // last chance: do not log... @@ -181,11 +187,18 @@ void OutTrace(const char *format, ...) OutTraceHeader(fp); } va_start(al, format); - vfprintf(fp, format, al); + //vfprintf(fp, format, al); + vsprintf_s(sBuf, DXWMAXLOGSIZE, format, al); + sBuf[DXWMAXLOGSIZE]=0; // just in case of log truncation va_end(al); + if(tFlags & OUTTRACE) { + if(tFlags & ADDTIMESTAMP) fprintf(fp, "%08.8d: ", (*pGetTick)()); + fputs(sBuf, fp); + fflush(fp); + } + if(tFlags & OUTDEBUGSTRING) OutputDebugString(sBuf); ReleaseMutex(hTraceMutex); - fflush(fp); dxw.dwTFlags = tFlags; // restore settings } @@ -775,23 +788,25 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp // v2.1.93: adjust clipping region if(IsTraceW){ - OutTrace("WindowProc[%x]: WinMsg=[0x%x]%s(%x,%x)", hwnd, message, ExplainWinMessage(message), wparam, lparam); + char sPos[161]; + sPos[160]=0; + sPos[0]=0; switch(message){ case WM_WINDOWPOSCHANGING: case WM_WINDOWPOSCHANGED: LPWINDOWPOS wp; wp = (LPWINDOWPOS)lparam; - OutTrace(" pos=(%d,%d) size=(%dx%d) flags=%x(%s)", wp->x, wp->y, wp->cx, wp->cy, wp->flags, ExplainWPFlags(wp->flags)); + sprintf_s(sPos, 160, " pos=(%d,%d) size=(%dx%d) flags=%x(%s)", wp->x, wp->y, wp->cx, wp->cy, wp->flags, ExplainWPFlags(wp->flags)); break; case WM_MOVE: - OutTrace(" pos=(%d,%d)", HIWORD(lparam), LOWORD(lparam)); + sprintf_s(sPos, 160, " pos=(%d,%d)", HIWORD(lparam), LOWORD(lparam)); break; case WM_SIZE: static char *modes[5]={"RESTORED", "MINIMIZED", "MAXIMIZED", "MAXSHOW", "MAXHIDE"}; - OutTrace(" mode=SIZE_%s size=(%dx%d)", modes[wparam % 5], HIWORD(lparam), LOWORD(lparam)); - break; + sprintf_s(sPos, 160, " mode=SIZE_%s size=(%dx%d)", modes[wparam % 5], HIWORD(lparam), LOWORD(lparam)); + break; } - OutTrace("\n"); + OutTrace("WindowProc[%x]: WinMsg=[0x%x]%s(%x,%x) %s\n", hwnd, message, ExplainWinMessage(message), wparam, lparam, sPos); } if(dxw.dwFlags3 & FILTERMESSAGES){ @@ -1219,7 +1234,7 @@ LONG WINAPI myUnhandledExceptionFilter(LPEXCEPTION_POINTERS ExceptionInfo) switch(ExceptionInfo->ExceptionRecord->ExceptionCode){ 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 0xc0000096: // CLI Priviliged instruction exception (Resident Evil), FB (Asterix & Obelix) case 0xc000001d: // FEMMS (eXpendable) case 0xc0000005: // Memory exception (Tie Fighter) int cmdlen; @@ -1235,6 +1250,8 @@ LONG WINAPI myUnhandledExceptionFilter(LPEXCEPTION_POINTERS ExceptionInfo) VirtualProtect(target, 10, oldprot, &oldprot); if(!FlushInstructionCache(GetCurrentProcess(), target, cmdlen)) OutTrace("UnhandledExceptionFilter: FlushInstructionCache ERROR target=%x, err=%x\n", target, GetLastError()); + // v2.03.10 skip replaced opcode + ExceptionInfo->ContextRecord->Eip += cmdlen; // skip ahead op-code length return EXCEPTION_CONTINUE_EXECUTION; break; default: @@ -1707,12 +1724,13 @@ void HookInit(TARGETMAP *target, HWND hwnd) #endif if(IsTraceDW){ - OutTrace("HookInit: path=\"%s\" module=\"%s\" dxversion=%s pos=(%d,%d) size=(%d,%d)", - target->path, target->module, dxversions[dxw.dwTargetDDVersion], - target->posx, target->posy, target->sizx, target->sizy); - if(hwnd) OutTrace(" hWnd=%x(hdc=%x) dxw.hParentWnd=%x(hdc=%x) desktop=%x(hdc=%x)\n", + char sInfo[1024]; + strcpy(sInfo, ""); + if(hwnd) sprintf(sInfo, " hWnd=%x(hdc=%x) dxw.hParentWnd=%x(hdc=%x) desktop=%x(hdc=%x)", hwnd, GetDC(hwnd), dxw.hParentWnd, GetDC(dxw.hParentWnd), GetDesktopWindow(), GetDC(GetDesktopWindow())); - else OutTrace("\n"); + OutTrace("HookInit: path=\"%s\" module=\"%s\" dxversion=%s pos=(%d,%d) size=(%d,%d)%s\n", + target->path, target->module, dxversions[dxw.dwTargetDDVersion], + target->posx, target->posy, target->sizx, target->sizy, sInfo); if (dxw.dwFlags4 & LIMITSCREENRES) OutTrace("HookInit: max resolution=%s\n", (dxw.MaxScreenRes<6)?Resolutions[dxw.MaxScreenRes]:"unknown"); } diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index 1aa22da..2836fd6 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -916,10 +916,13 @@ POINT dxwCore::SubCoordinates(POINT p1, POINT p2) void dxwCore::DumpPalette(DWORD dwcount, LPPALETTEENTRY lpentries) { + char sInfo[(14*256)+1]; + sInfo[0]=0; for(DWORD idx=0; idx 100)) return; @@ -1069,9 +1073,11 @@ void dxwCore::SetVSyncDelays(UINT RefreshRate) Reminder=(1000+Reminder)-(iRefreshDelays[iRefreshDelayCount]*gdwRefreshRate); iRefreshDelayCount++; } while(Reminder && (iRefreshDelayCountShowOverlay(GetDC(hWnd), rect.right, rect.bottom); + this->ShowOverlay(hdc, rect.right, rect.bottom); } void dxwCore::ShowOverlay(HDC hdc, int w, int h) diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 16e2f03..a547dd9 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.09" +#define VERSION "2.03.10" #define DDTHREADLOCK 1 //#define LOCKTHREADS @@ -56,6 +56,8 @@ BOOL APIENTRY DllMain( HANDLE hmodule, LPVOID preserved ) { + HANDLE hCurrentThread; + if(dwreason == DLL_PROCESS_DETACH){ UnmapViewOfFile(pMapping); CloseHandle(hMapping); @@ -63,36 +65,8 @@ BOOL APIENTRY DllMain( HANDLE hmodule, if(dwreason != DLL_PROCESS_ATTACH) return TRUE; - SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST); // trick to reduce concurrency problems at program startup - -#ifdef LOCKTHREADS - DWORD currentPID = GetCurrentProcessId(); - DWORD currentTID = GetCurrentThreadId(); - if(currentTID && currentPID){ - int ThreadCount=0; - HANDLE hThreadSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, NULL); - if(hThreadSnapshot != INVALID_HANDLE_VALUE){ - DWORD result = 0; - THREADENTRY32 tEntry; - tEntry.dwSize = sizeof(THREADENTRY32); - for (BOOL success = Thread32First(hThreadSnapshot, &tEntry); - !result && success && GetLastError() != ERROR_NO_MORE_FILES; - success = Thread32Next(hThreadSnapshot, &tEntry)){ - if ((tEntry.th32ThreadID != currentTID) && (tEntry.th32OwnerProcessID == currentPID)){ - HANDLE th; - th=OpenThread(THREAD_SUSPEND_RESUME, FALSE, tEntry.th32ThreadID); - ThreadCount++; - SuspendThread(th); - CloseHandle(th); - } - } - CloseHandle(hThreadSnapshot); - //char sMsg[81]; - //sprintf(sMsg,"suspended threads=%d", ThreadCount); - //MessageBox(0, sMsg, "info", MB_OK | MB_ICONEXCLAMATION); - } - } -#endif + hCurrentThread = GetCurrentThread(); + SetThreadPriority(hCurrentThread, THREAD_PRIORITY_HIGHEST); // trick to reduce concurrency problems at program startup hInst = (HINSTANCE)hmodule; // optimization: disables DLL_THREAD_ATTACH and DLL_THREAD_DETACH notifications for the specified DLL @@ -119,35 +93,9 @@ BOOL APIENTRY DllMain( HANDLE hmodule, if(!hDDLockMutex) hDDLockMutex = CreateMutex(0, FALSE, "DDLock_Mutex"); } InjectHook(); - SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL); - -#ifdef LOCKTHREADS - if(currentTID && currentPID){ - int ThreadCount=0; - HANDLE hThreadSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, NULL); - if(hThreadSnapshot != INVALID_HANDLE_VALUE){ - DWORD result = 0; - THREADENTRY32 tEntry; - tEntry.dwSize = sizeof(THREADENTRY32); - for (BOOL success = Thread32First(hThreadSnapshot, &tEntry); - !result && success && GetLastError() != ERROR_NO_MORE_FILES; - success = Thread32Next(hThreadSnapshot, &tEntry)){ - if ((tEntry.th32ThreadID != currentTID) && (tEntry.th32OwnerProcessID == currentPID)){ - HANDLE th; - th=OpenThread(THREAD_SUSPEND_RESUME, FALSE, tEntry.th32ThreadID); - ThreadCount++; - ResumeThread(th); - CloseHandle(th); - } - } - CloseHandle(hThreadSnapshot); - //char sMsg[81]; - //sprintf(sMsg,"resumed threads=%d", ThreadCount); - //MessageBox(0, sMsg, "info", MB_OK | MB_ICONEXCLAMATION); - } - } -#endif + SetThreadPriority(hCurrentThread, THREAD_PRIORITY_NORMAL); + CloseHandle(hCurrentThread); return true; } diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 0be041d4e2f0d09ee090114309279e2baa9b3614..442910e345932411a5e9ad94ef2773f7d77cdfc9 100644 GIT binary patch delta 12624 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 delta 1768 zcmaKsZA_b06vyv1&y#yZwb!rQvRpdy(#*+d4Uo5U$opiB26bO>5tON=6e2}MVP zb1qDj_QZvl;VN19f{BhNMomnBt$tV{Fh_kEa|{w=h}m0A-3%Y7|65vQByy8qo^$@^ zJm==#d+v3el3f9*J9{H%j0r-+z?cLh3d{$C!H{;r`UQ74$b(WkUn4|8WE8utNhy^` ziwH}DLMw4w$s@lO*ZslC_)iM2a8cQ{Lv_mi+$eJO;hAE?U&>Xgbr})otYS{z8g_E= z-4?c=!Z!~*9rkHfDK@+SXC^F&(o~@RQWl1KPivDj8iX=vP1jnwAtz9izFe~zinOQ% z^yTD}a}+JqgG_bCbQjAhp33`V=rYo#@>FtpY%;0^si)jb=N-E!IHu5ZJ@J%i%^=H1 zRqChK&0OIkWn-kO8rVC?X*znn`kk#HO8S$ja|gTq>Z$yMD!9o0o-sYxeO&nCJ)l1Sbf6E!$e$y=un`F)*Pbnz9VjD?}X;Zm-pk(x9z z^=5NUpE-8WhYkn*UVD}Hp0?5b)91;D0^Z(ide&{jA#JDj@8fCeA0?!l-pZ!rKBuSN zOo!_ebO*;p_o1$RCSgOnw0H~h4lyisVVLY8TULkaw?!-4A>P6o8!jtcfxR|z&J=jl zrQ}2TOD1QdlfOuRH@5RqYCc+~Nrn7KBvH8q5A8K~bV?#)mqDF9mcY%TXT*3H!4p7q z?MZy!58J{IwY0g#AG$Up2wVi0fDe$NHTk6Fb=MOAHh{H0sP=6@H6-Y{0gpt zNpKzf25x{Ua1%^}(9G_d$27Nv694~ay5k=p zuP2L=CTdqoOC25vwePEwE2XLPms2=B7+SSbsr+focx(%1w9y;aR!j}e+Ha;KlP|AS zF|>wWv4)D(>}_n9*iiArcj{?oY&`|1jWpb+ixF}o_*&1z1yjAAYRS`I5|GDhGINe}>i$(HNAoCjb3~67&uOHO{sqkCI*left, lprc->top, lprc->right, lprc->bottom); - else - OutTrace("NULL\n"); + char sRect[81]; + if(lprc) sprintf(sRect, "(%d,%d)-(%d,%d)", lprc->left, lprc->top, lprc->right, lprc->bottom); + else strcpy(sRect, "NULL"); + OutTrace("ExtTextOutA: hdc=%x pos=(%d,%d) String=\"%s\" rect=%s\n", hdc, X, Y, lpString, sRect); } if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc)) && !gFixed){ @@ -1839,11 +1849,10 @@ BOOL WINAPI extExtTextOutW(HDC hdc, int X, int Y, UINT fuOptions, const RECT *lp { RECT rc; if(IsTraceDW){ - OutTrace("ExtTextOutW: hdc=%x pos=(%d,%d) String=\"%ls\" rect=", hdc, X, Y, lpString); - if(lprc) - OutTrace("(%d,%d)-(%d,%d)\n", lprc->left, lprc->top, lprc->right, lprc->bottom); - else - OutTrace("NULL\n"); + char sRect[81]; + if(lprc) sprintf(sRect, "(%d,%d)-(%d,%d)", lprc->left, lprc->top, lprc->right, lprc->bottom); + else strcpy(sRect, "NULL"); + OutTrace("ExtTextOutW: hdc=%x pos=(%d,%d) String=\"%ls\" rect=%s\n", hdc, X, Y, lpString, sRect); } if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc)) && !gFixed){ diff --git a/dll/gdiblt.cpp b/dll/gdiblt.cpp index 134994b..e3f7816 100644 --- a/dll/gdiblt.cpp +++ b/dll/gdiblt.cpp @@ -18,6 +18,52 @@ extern GetDC_Type pGetDC; extern ReleaseDC_Type pReleaseDC; extern Unlock1_Type pUnlock1; +//#define HDC_CACHE_OPTIMIZED + +#ifdef HDC_CACHE_OPTIMIZED +void BlitToWindow(HWND w, LPDIRECTDRAWSURFACE s) +{ + static HDC thdc = NULL; + HDC shdc; + static HWND LastWindow = NULL; + RECT client; + HRESULT res; + BOOL ret; + + if(!s) return; // for surface color fill + ret=(*pGetClientRect)(w, &client); + if(!ret) OutTrace("GetClientRect error=%d\n", GetLastError()); + res=(*pGetDC)(s, &shdc); + if(res) OutTrace("ddraw GetDC error lpdds=%x res=%x(%s)\n", s, res, ExplainDDError(res)); + if(w != LastWindow){ + if(LastWindow){ + ret=(*pGDIReleaseDC)(LastWindow, thdc); + if(!ret) OutTrace("GDI ReleaseDC error=%d\n", GetLastError()); + } + LastWindow = w; + thdc=(*pGDIGetDC)(w); + if(!thdc) OutTrace("GDI GetDC error=%d\n", GetLastError()); + } + if(dxw.dwFlags5 & CENTERTOWIN){ + int x, y; + x = (client.right - dxw.GetScreenWidth()) >> 1; // right-shift 1 bit means divide by 2! + y = (client.bottom - dxw.GetScreenHeight()) >> 1; + ret=(*pGDIBitBlt)(thdc, x, y, dxw.GetScreenWidth(), dxw.GetScreenHeight(), shdc, 0, 0, SRCCOPY); + if(!ret) OutTrace("BitBlt error=%d\n", GetLastError()); + } + else{ + if(dxw.dwFlags5 & BILINEARFILTER) { + ret=SetStretchBltMode(thdc, HALFTONE); + if((!ret) || (ret==ERROR_INVALID_PARAMETER)) OutTrace("GDI SetStretchBltMode error=%d\n", GetLastError()); + } + ret=(*pGDIStretchBlt)(thdc, 0, 0, client.right, client.bottom, shdc, 0, 0, dxw.GetScreenWidth(), dxw.GetScreenHeight(), SRCCOPY); + if(!ret) OutTrace("GDI StretchBlt error=%d\n", GetLastError()); + } + dxw.ShowOverlay(thdc); + res=(*pReleaseDC)(s, shdc); + if(res) OutTrace("ddraw ReleaseDC error lpdds=%x res=%x(%s)\n", s, res, ExplainDDError(res)); +} +#else void BlitToWindow(HWND w, LPDIRECTDRAWSURFACE s) { HDC shdc, thdc; @@ -25,7 +71,7 @@ void BlitToWindow(HWND w, LPDIRECTDRAWSURFACE s) HRESULT res; BOOL ret; - (*pUnlock1)(s, NULL); + if(!s) return; // for surface color fill ret=(*pGetClientRect)(w, &client); if(!ret) OutTrace("GetClientRect error=%d\n", GetLastError()); res=(*pGetDC)(s, &shdc); @@ -53,4 +99,4 @@ void BlitToWindow(HWND w, LPDIRECTDRAWSURFACE s) ret=(*pGDIReleaseDC)(w, thdc); if(!ret) OutTrace("GDI ReleaseDC error=%d\n", GetLastError()); } - +#endif diff --git a/dll/kernel32.cpp b/dll/kernel32.cpp index 1247f80..5850c55 100644 --- a/dll/kernel32.cpp +++ b/dll/kernel32.cpp @@ -617,10 +617,14 @@ FARPROC WINAPI extGetProcAddress(HMODULE hModule, LPCSTR proc) break; #ifndef ANTICHEATING case SYSLIBIDX_KERNEL32: - if ((DWORD)proc == 0x022D){ // "IsDebuggerPresent" + if ((DWORD)proc == 0x0305){ // "IsDebuggerPresent" OutTraceDW("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), extIsDebuggerPresent); return (FARPROC)extIsDebuggerPresent; } + if ((DWORD)proc == 0x0050){ // "CheckRemoteDebuggerPresent" + OutTraceDW("GetProcAddress: hooking proc=%s at addr=%x\n", ProcToString(proc), extCheckRemoteDebuggerPresent); + return (FARPROC)extCheckRemoteDebuggerPresent; + } #endif case SYSLIBIDX_OLE32: if ((DWORD)proc == 0x0011){ // "CoCreateInstance" @@ -819,10 +823,11 @@ BOOL WINAPI extCreateProcessA( OutTrace("CreateProcess: event=%x(%s)\n", debug_event.dwDebugEventCode, ExplainDebugEvent(debug_event.dwDebugEventCode)); switch(debug_event.dwDebugEventCode){ case EXIT_PROCESS_DEBUG_EVENT: + //OutTrace("CreateProcess: event=%x(%s) process terminated\n", debug_event.dwDebugEventCode, ExplainDebugEvent(debug_event.dwDebugEventCode)); bContinueDebugging=false; - OutTrace("CreateProcess: process terminated\n", res); break; case CREATE_PROCESS_DEBUG_EVENT: + //OutTrace("CreateProcess: event=%x(%s) process started\n", debug_event.dwDebugEventCode, ExplainDebugEvent(debug_event.dwDebugEventCode)); GetModuleFileName(GetModuleHandle("dxwnd"), path, MAX_PATH); OutTrace("CreateProcess: injecting path=%s\n", path); if(!Inject(lpProcessInformation->dwProcessId, path)){ @@ -832,7 +837,7 @@ BOOL WINAPI extCreateProcessA( extern LPVOID GetThreadStartAddress(HANDLE); DWORD TargetHandle; DWORD EndlessLoop; - EndlessLoop=0x9090FEEB; // assembly for JMP to here, NOP, NOP + EndlessLoop=0x9090FEEB; // assembly for JMP to here, NOP, NOP SIZE_T BytesCount; TargetHandle = (DWORD)OpenProcess( PROCESS_QUERY_INFORMATION|PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE, @@ -858,6 +863,7 @@ BOOL WINAPI extCreateProcessA( CloseHandle(((CREATE_PROCESS_DEBUG_INFO *)&debug_event.u)->hFile); break; case EXIT_THREAD_DEBUG_EVENT: + //OutTrace("CreateProcess: event=%x(%s) injection terminated\n", debug_event.dwDebugEventCode, ExplainDebugEvent(debug_event.dwDebugEventCode)); #ifdef LOCKINJECTIONTHREADS if(TargetHandle && StartAddress){ if(dxw.dwFlags5 & FREEZEINJECTEDSON){ @@ -874,6 +880,7 @@ BOOL WINAPI extCreateProcessA( #endif bContinueDebugging=false; case EXCEPTION_DEBUG_EVENT: + //OutTrace("CreateProcess: event=%x(%s)\n", debug_event.dwDebugEventCode, ExplainDebugEvent(debug_event.dwDebugEventCode)); { LPEXCEPTION_DEBUG_INFO ei; ei=(LPEXCEPTION_DEBUG_INFO)&debug_event.u; @@ -889,6 +896,9 @@ BOOL WINAPI extCreateProcessA( } break; case LOAD_DLL_DEBUG_EVENT: + //OutTrace("CreateProcess: event=%x(%s) dll=%s address=%x\n", + // debug_event.dwDebugEventCode, ExplainDebugEvent(debug_event.dwDebugEventCode), + // ((LOAD_DLL_DEBUG_INFO *)&debug_event.u)->lpImageName, ((LOAD_DLL_DEBUG_INFO *)&debug_event.u)->lpBaseOfDll); CloseHandle(((LOAD_DLL_DEBUG_INFO *)&debug_event.u)->hFile); break; case CREATE_THREAD_DEBUG_EVENT: diff --git a/dll/syslibs.h b/dll/syslibs.h index a699a50..2710520 100644 --- a/dll/syslibs.h +++ b/dll/syslibs.h @@ -544,6 +544,7 @@ extern BOOL WINAPI extGetVersionExA(LPOSVERSIONINFOA); extern BOOL WINAPI extGetVersionExW(LPOSVERSIONINFOW); extern void WINAPI extGlobalMemoryStatus(LPMEMORYSTATUS); extern int WINAPI extIsDebuggerPresent(void); +extern BOOL WINAPI extCheckRemoteDebuggerPresent(HANDLE, PBOOL); extern HMODULE WINAPI extLoadLibraryA(LPCTSTR); extern HMODULE WINAPI extLoadLibraryExA(LPCTSTR, HANDLE, DWORD); extern HMODULE WINAPI extLoadLibraryW(LPCWSTR); diff --git a/dll/user32.cpp b/dll/user32.cpp index 4c45f67..834e23f 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -1713,11 +1713,13 @@ LONG WINAPI extEnumDisplaySettings(LPCTSTR lpszDeviceName, DWORD iModeNum, DEVMO LONG WINAPI extChangeDisplaySettingsA(DEVMODEA *lpDevMode, DWORD dwflags) { if(IsTraceDDRAW){ - OutTrace("ChangeDisplaySettingsA: lpDevMode=%x flags=%x(%s)", lpDevMode, dwflags, ExplainChangeDisplaySettingsFlags(dwflags)); - if (lpDevMode) OutTrace(" DeviceName=%s fields=%x(%s) size=(%d x %d) bpp=%d", + 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("\n"); + OutTrace("ChangeDisplaySettingsA: lpDevMode=%x flags=%x(%s)%s\n", + lpDevMode, dwflags, ExplainChangeDisplaySettingsFlags(dwflags), sInfo); } if(dxw.Windowize) @@ -1729,11 +1731,13 @@ LONG WINAPI extChangeDisplaySettingsA(DEVMODEA *lpDevMode, DWORD dwflags) LONG WINAPI extChangeDisplaySettingsW(DEVMODEW *lpDevMode, DWORD dwflags) { if(IsTraceDDRAW){ - OutTrace("ChangeDisplaySettingsW: lpDevMode=%x flags=%x(%s)", lpDevMode, dwflags, ExplainChangeDisplaySettingsFlags(dwflags)); - if (lpDevMode) OutTrace(" DeviceName=%ls fields=%x(%s) size=(%d x %d) bpp=%d", + 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("\n"); + OutTrace("ChangeDisplaySettingsW: lpDevMode=%x flags=%x(%s)%s\n", + lpDevMode, dwflags, ExplainChangeDisplaySettingsFlags(dwflags), sInfo); } if(dxw.Windowize) @@ -1745,11 +1749,13 @@ LONG WINAPI extChangeDisplaySettingsW(DEVMODEW *lpDevMode, DWORD dwflags) LONG WINAPI extChangeDisplaySettingsExA(LPCTSTR lpszDeviceName, DEVMODEA *lpDevMode, HWND hwnd, DWORD dwflags, LPVOID lParam) { if(IsTraceDDRAW){ - OutTrace("ChangeDisplaySettingsExA: DeviceName=%s lpDevMode=%x flags=%x(%s)", lpszDeviceName, lpDevMode, dwflags, ExplainChangeDisplaySettingsFlags(dwflags)); - if (lpDevMode) OutTrace(" DeviceName=%s fields=%x(%s) size=(%d x %d) bpp=%d", + 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("\n"); + OutTrace("ChangeDisplaySettingsExA: DeviceName=%s lpDevMode=%x flags=%x(%s)%s\n", + lpszDeviceName, lpDevMode, dwflags, ExplainChangeDisplaySettingsFlags(dwflags), sInfo); } if(dxw.Windowize) @@ -1761,11 +1767,13 @@ LONG WINAPI extChangeDisplaySettingsExA(LPCTSTR lpszDeviceName, DEVMODEA *lpDevM LONG WINAPI extChangeDisplaySettingsExW(LPCTSTR lpszDeviceName, DEVMODEW *lpDevMode, HWND hwnd, DWORD dwflags, LPVOID lParam) { if(IsTraceDDRAW){ - OutTrace("ChangeDisplaySettingsExW: DeviceName=%ls lpDevMode=%x flags=%x(%s)", lpszDeviceName, lpDevMode, dwflags, ExplainChangeDisplaySettingsFlags(dwflags)); - if (lpDevMode) OutTrace(" DeviceName=%ls fields=%x(%s) size=(%d x %d) bpp=%d", + 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("\n"); + OutTrace("ChangeDisplaySettingsExW: DeviceName=%ls lpDevMode=%x flags=%x(%s)%s\n", + lpszDeviceName, lpDevMode, dwflags, ExplainChangeDisplaySettingsFlags(dwflags), sInfo); } if(dxw.Windowize) diff --git a/host/Resource.h b/host/Resource.h index f4f11c7bb121752e75f7bc3e95125447e2c8970e..d179af7027991c8af5d281c77b2d5d1bc917348e 100644 GIT binary patch delta 158 zcmX@`pRuEvX~UhE$pX=Ayul3K43P{T42}%W4BnFk1(YWz#IQ|f5>l9K=f=kx%n-s5 zG+9txezJlH8>7)=eMv=rSB4;<>R<*}1|J502KUM91vJ5Wg2d#69T{AJFoeOA!51hG z((O38FiaIJFOn^@`CiNs{>cU@BCJjfp+Kzm_StressResources); DDX_Check(pDX, IDC_NOSYSTEMMEMORY, cTarget->m_NoSystemMemory); DDX_Check(pDX, IDC_NOSYSTEMEMULATED, cTarget->m_NoSystemEmulated); + DDX_Check(pDX, IDC_GSKYHACK, cTarget->m_GSkyHack); } BEGIN_MESSAGE_MAP(CTabDebug, CDialog) diff --git a/host/TabLogs.cpp b/host/TabLogs.cpp index fa8be17..5d618ba 100644 --- a/host/TabLogs.cpp +++ b/host/TabLogs.cpp @@ -42,6 +42,9 @@ void CTabLogs::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_OUTDEBUG, cTarget->m_OutDebug); DDX_Check(pDX, IDC_CURSORTRACE, cTarget->m_CursorTrace); DDX_Check(pDX, IDC_LOGENABLED, cTarget->m_LogEnabled); + DDX_Check(pDX, IDC_OUTDEBUGSTRING, cTarget->m_OutDebugString); + DDX_Check(pDX, IDC_ERASELOGFILE, cTarget->m_EraseLogFile); + DDX_Check(pDX, IDC_ADDTIMESTAMP, cTarget->m_AddTimeStamp); DDX_Check(pDX, IDC_OUTWINMESSAGES, cTarget->m_OutWinMessages); DDX_Check(pDX, IDC_OUTDWTRACE, cTarget->m_OutDWTrace); DDX_Check(pDX, IDC_IMPORTTABLE, cTarget->m_ImportTable); diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index 8191f9f..5e32b06 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -97,6 +97,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_DisableGammaRamp = FALSE; m_AutoRefresh = FALSE; m_TextureFormat = FALSE; + m_GSkyHack = FALSE; m_FixWinFrame = FALSE; m_EnableClipping = FALSE; m_CursorClipping = FALSE; diff --git a/host/TargetDlg.h b/host/TargetDlg.h index d7d5024..f73818a 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -38,6 +38,9 @@ public: BOOL m_OutDebug; BOOL m_CursorTrace; BOOL m_LogEnabled; + BOOL m_EraseLogFile; + BOOL m_AddTimeStamp; + BOOL m_OutDebugString; BOOL m_OutWinMessages; BOOL m_OutDWTrace; BOOL m_OutD3DTrace; @@ -77,6 +80,7 @@ public: BOOL m_DisableGammaRamp; BOOL m_AutoRefresh; BOOL m_TextureFormat; + BOOL m_GSkyHack; BOOL m_FixWinFrame; BOOL m_EnableClipping; BOOL m_CursorClipping; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index 409a30b7392c865bd87b8692b7b5d22acff97af0..1321bf443cdcdced4824e18fc6b6a8ab818d43e6 100644 GIT binary patch delta 3975 zcmZuz3viUx6+Y)KZk}Kw$?hiE-E1O|@XS6!vI!x{W_J^oJT}?gkRXsvNFX4P@DkBs zl8DYYMM3aV?>Hcp)>fxub#R?(d8w^~8c?y?DR!Kwt=6cW+UeA`R)n5=H-DCBlG*?K z=ljm{-t*u8zw&&_d#6(l`?5>J4Eie9`u27V^sU|FjM`mMhn*Mn8rl8br*>{I4tt{! ze`lmU+M?B4~k|={zNkp52!@fZMYH&Hr%N>xWFrUB4 zAMq>53F!(Vccr^vrqcbLtxdsD+@=&}DJ<09qHN0HW~H}kfEzO6Kyz?1R|RCoF<<^< zHn$yaiGvgA+zyzH{Nvxu&dyT!s(`)PE?V;H8jzBOGj1Xc^=wl(Ix+HU(CInSXfNV7DlW8lU9cb_ZA! z=;Xq=?M}!??l_ZWvMD;^2{%StJ?&w+WN!OXDBwM3ELh0La!l-2~>n+@+n-Pr9P+#C%BPcf5XHokXuHLSjnr+W?aVCn9aH>1fF>yiyt!U*>dEM zjpkxCKV`OJ4ZmzQv0CKcjpi{Aa_hxBR)@UiqBY+;C5_rBxn(k!qZE9+$6{lCHl0)j`8$OFKNm%{L@V`v{wUOP0oUM2i!LMi9tLv<4o^?o*ont%9+k#`SkX;_ku zKQUaaB~9jk9oAaWr|6_TZ#$CBGkR~HFyZU=r}CX67EL`y>T{DSX7SHQ=4#QhdGS4S zG{wL-CKMxoBB7Z0pA$+Bx9y+w$>m)MC66E16jSU^`yWWY(l>y}K7+ z4v5M&X2r(XA0BQRtH#<6PM=K5nzn(ZAzfL+t9gj&fu?@^w*c-`5{8{DQCh z?~^Wo!jXC4gAK5ie!J-hFakA%h2Rbt0Gs00(|tdzg3ZL=$+N#HiPe2`JyWj(;z10D zSdOUGVTLdjp<85BqTZ;3d!UUrUH*+gAMAxYDO#U+GYu_h5?`ia`NBC6fOL3c29Vtd z_+cmXz%I&QqdMe$ue#qzS+|O|bj)6ChYoUheZnC~MeT;|>T07D8z5e$je<}BanD?w zEe2{axnLa?^WbDLTVarz=_mU>O0}8F+9*CuK_eazx2B^PH;VprEXPO0PtwtaKNasv z?HQ3alf-G^orw$af*6$A@5Pfdu>^<2A7|n++$mutU88 zXgnFy-xQu~Ywty|a0GLTq;bKH7v}UAl9H^tokfvmjC2k6mMUqo}}?d zpP;x%4K_&SgReEu!_#_R(aWA><|EVc?-`kRDQlvq%f(Ebp$3a& z$;6jsY_Z7bWHWRT(iWDp#rkZb9;_5AJDHQcS}BG)X*9Pl6DOp+v`n0rvZ+dpN%{P8 zaZSpPs)cnmNvIRmQodLxx}+@iiXkQI#R(~|)Qj^{j;s)4QrZIInw0yRh4nU)RUuJ* H8_WGafMWR7 delta 3047 zcmY*Z3s6+&6+Y*#E`mHO2<%g+g24y-lHElG7WOWzJa)Ug!1`jNqQ*2a8m(ri!9}CZ zOpR54o0DN0v~5y5lSy0MOia;=tuv{$(O}1!I)tIxI@5M0)0jSNqy+l^ce!k2hWp*` z`_6yP`OiIYXE6Qld+8^<1+Jh3-PIesFLmzh-muRWv)E%6H@knRaQ4F(z(VQ^OXl;Z z8wwA`S_59cZ!OquPNx;L2!3zOE4RoIS&?jzrbr&ISK)S;qi{JIYzc&tF%C#qv`~AS z661sng$Gr^1#^?aS8BN-Q)ruG!BjPu1+tQX)8$-N$W97hspqmmjv{vW<<6Esqp0a} zLaw4kJmKb8v%jT9QQeS-!0vA;PUA6d3w(|J@shD@EcbE& z7O*qL1ERKGNCdX{h0A7#id4Cv zhi{m&VlLYXSi;WgOK~ZyG!(KCeI_nb-X{6ma^-ETTgyM7%jSkk&P&n4o;T3;PNP^YMOM zSQ$yVUb|QHV0S`$N{skh`FB%v7jz)A4(D4sQ+A8LJ}gX!1)?dnAf_#%|VI zV$xV)D?7v4Ha1jZ!0n0AlG@sYVN*oH9c=d&pOpOnnHb(OPnv#b6I(a47q`_+Q-1Qs zw%aN>%+4MuW1nolrV9P+gJ*_R@-92MLrsYn+2=c|RcDCF&;C{=e@K*lbGKSfngVv= z`BIj?^8&lI^C>kZFOm1cZzT3;_o8VTIuoz&d0S0{M-%P)s%E@_ z#M}FQGu|~eyGP9}{Z3?ZCHi`{&O|@BaA1Q z6v<(iQY4o>PLVw3JglB!2m3Nu?_vFP3O2;);lkj^i{ zd2~4&D{wjeH5;ASMdlo|q8T5WGW?#(A!(awV7dPs$ybRxBUKY-xWA*rBS}9{X)zx7>wKVW1kEUZT4L0Ci`ZQlX_9HLeqYei*PRZCL zO-<3LjDxf$ohN$B$Ggw;@X#&?f7Cbf(0HSI($<8hMf~+9-20tfe!RHLFJ)#(4`b9D zmdd1`K21LfOD64(3V?~tbR#U4O2=NKe+YDZk5!y7Y0qs2xO0l#V5YfOC4e9N2l&lq zQRO}?&|c@ea^MT04L|}00`;(~CzRE*a0qNSg^Z=-uqoz)S z^w}&dPJ6%;KRp*ICkufv#DQ1{=0|<1s*Wch`>4JG%hf@gmfJo@7SqYpu<7y z1YUPjPlu$_zL5qnT0{LpJME)EftE%Z;iwsHL>gMd3%$jwzS=~(PA=|hMyhPX)!N1R z0M7)emy6Obx@kb*7thfZfpxoROyGe%G%3&r;NG;HtnHaML$Uc0`L8dt_b{eh{go|ZI~tn zKDbY&b;AEA)d(EbP?x~F`P3`$&LSERI9x?n1Qt1IY@KA&M4b}FswF)wUoXwqoJg`| zd}RTyJE>jG50QPTY%hz@Qj diff --git a/host/dxwndhost.h b/host/dxwndhost.h index 0932920..df7477c 100644 --- a/host/dxwndhost.h +++ b/host/dxwndhost.h @@ -23,10 +23,11 @@ extern int MessageBoxLangArg(UINT, UINT, UINT, ...); // the (limited) IPC space and allow for more record entryes (currently 255). #define MAX_NOTES 1024 +#define MAX_TITLE 80 typedef struct PRIVATEMAP { - char title[40+1]; + char title[MAX_TITLE+1]; char launchpath[MAX_PATH+1]; char notes[MAX_NOTES+1]; }PRIVATEMAP; diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index 615043a74427ad717d06a46bb83a180c534974f6..736880d83e3be67eedf3fc86b6150bb170a6ccfc 100644 GIT binary patch delta 602 zcmYk3KTK0m7{$-E?=@8mR3i>0gohgjVjrM|C?rp)r2$J)Ax$mz4^Ue9(-NtJdt)L) zQ~gZpSQ7^)Q-g^v{$Vo?8Xa78=tPKv!OcMuPhS`El6$}VzI^AN^SiZu{qKQZ_jF0h z>5`iB?5POuA`b(T$Y7CmR(idC((s(ZtbyKzAu#2CAk3mO`%#}Rc?8fJ}sq0f>I14MzZ1Q%K~7I2 ehABSQ1g7QB$LMiC(e)FaDG$ecUWZSrZ@K^2F{e5J delta 208 zcmezIfpx(P)(ryEo99XM*|F;}tWfzfjE{3zSW4e=A04WOca z2@{wN87zQ$w=)|v7=TnxTEH^-R$>pM3D}4RAFj#klBy;<#IsC(kYG1`LM|iUcv6-BSA4O&Kg0bQsJh`%lrH-lfXOxA{xzofVVMY!KVNjGysR1^|j=OltrD diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index c0f885500483e051b708f3ec6d55e4a83daebaf7..e2e0e660cd5d17b7fac397fed92c744d2cea46a6 100644 GIT binary patch delta 32102 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 J-@vx4{{t<_q^JM@ delta 23394 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 Ipa13jFAoQKyZ`_I diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index 2e689d1..09c3231 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -35,6 +35,13 @@ TARGETMAP *pTargets; // idem. #define LOCKINJECTIONTHREADS +// beware: it must operate upon count+1 sized arrays +char *strnncpy(char *dest, char *src, size_t count) +{ + dest[count]=0; + return strncpy(dest, src, count); +} + static char *Escape(char *s) { static char tmp[1024]; @@ -223,6 +230,9 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_OutDebug) t->tflags |= OUTDEBUG; if(dlg->m_CursorTrace) t->tflags |= OUTCURSORTRACE; if(dlg->m_LogEnabled) t->tflags |= OUTTRACE; + if(dlg->m_OutDebugString) t->tflags |= OUTDEBUGSTRING; + if(dlg->m_EraseLogFile) t->tflags |= ERASELOGFILE; + if(dlg->m_AddTimeStamp) t->tflags |= ADDTIMESTAMP; if(dlg->m_OutWinMessages) t->tflags |= OUTWINMESSAGES; if(dlg->m_OutDWTrace) t->tflags |= OUTDXWINTRACE; if(dlg->m_OutDDRAWTrace) t->tflags |= OUTDDRAWTRACE; @@ -276,6 +286,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_DisableGammaRamp) t->flags2 |= DISABLEGAMMARAMP; if(dlg->m_AutoRefresh) t->flags |= AUTOREFRESH; if(dlg->m_TextureFormat) t->flags5 |= TEXTUREFORMAT; + if(dlg->m_GSkyHack) t->flags5 |= GSKYHACK; if(dlg->m_FixWinFrame) t->flags |= FIXWINFRAME; if(dlg->m_EnableClipping) t->flags |= ENABLECLIPPING; if(dlg->m_CursorClipping) t->flags |= CLIPCURSOR; @@ -429,6 +440,9 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_OutDebug = t->tflags & OUTDEBUG ? 1 : 0; dlg->m_CursorTrace = t->tflags & OUTCURSORTRACE ? 1 : 0; dlg->m_LogEnabled = t->tflags & OUTTRACE ? 1 : 0; + dlg->m_OutDebugString = t->tflags & OUTDEBUGSTRING ? 1 : 0; + dlg->m_EraseLogFile = t->tflags & ERASELOGFILE ? 1 : 0; + dlg->m_AddTimeStamp = t->tflags & ADDTIMESTAMP ? 1 : 0; dlg->m_OutWinMessages = t->tflags & OUTWINMESSAGES ? 1 : 0; dlg->m_OutDWTrace = t->tflags & OUTDXWINTRACE ? 1 : 0; dlg->m_OutD3DTrace = t->tflags & OUTD3DTRACE ? 1 : 0; @@ -483,6 +497,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_DisableGammaRamp = t->flags2 & DISABLEGAMMARAMP ? 1 : 0; dlg->m_AutoRefresh = t->flags & AUTOREFRESH ? 1 : 0; dlg->m_TextureFormat = t->flags5 & TEXTUREFORMAT ? 1 : 0; + dlg->m_GSkyHack = t->flags5 & GSKYHACK ? 1 : 0; dlg->m_FixWinFrame = t->flags & FIXWINFRAME ? 1 : 0; dlg->m_EnableClipping = t->flags & ENABLECLIPPING ? 1 : 0; dlg->m_CursorClipping = t->flags & CLIPCURSOR ? 1 : 0; @@ -1045,9 +1060,9 @@ void CDxwndhostView::OnModify() dlg.m_LaunchPath = TitleMaps[i].launchpath; SetDlgFromTarget(&TargetMaps[i], &dlg); if(dlg.DoModal() == IDOK && dlg.m_FilePath.GetLength()){ - strncpy(TitleMaps[i].title, dlg.m_Title, 40); - strncpy(TitleMaps[i].notes, dlg.m_Notes, MAX_NOTES); - strncpy(TitleMaps[i].launchpath, dlg.m_LaunchPath, MAX_PATH); + strnncpy(TitleMaps[i].title, (char *)dlg.m_Title.GetString(), MAX_TITLE); + strnncpy(TitleMaps[i].notes, (char *)dlg.m_Notes.GetString(), MAX_NOTES); + strnncpy(TitleMaps[i].launchpath, (char *)dlg.m_LaunchPath.GetString(), MAX_PATH); SetTargetFromDlg(&TargetMaps[i], &dlg); CListCtrl& listctrl = GetListCtrl(); listitem.mask = LVIF_TEXT | LVIF_IMAGE; @@ -1136,6 +1151,28 @@ void CDxwndhostView::OnDeleteLog() _unlink(FilePath); } +void CDxwndhostView::OnDebugView() +{ + PROCESS_INFORMATION pinfo; + STARTUPINFO sinfo; + char exepath[MAX_PATH+1]; + char folderpath[MAX_PATH+1]; + ZeroMemory(&sinfo, sizeof(sinfo)); + sinfo.cb = sizeof(sinfo); + GetPrivateProfileString("window", "debugview", "DbgView.exe", exepath, MAX_PATH, InitPath); + strcpy_s(folderpath, sizeof(folderpath), exepath); + PathRemoveFileSpec(folderpath); + if(strlen(folderpath)==0) strcpy(folderpath, ".\\"); + if(!CreateProcessA(NULL, exepath, 0, 0, false, CREATE_DEFAULT_ERROR_MODE, NULL, folderpath, &sinfo, &pinfo)){ + char sInfo[81]; + sprintf(sInfo, "Error %d starting DebugView", GetLastError()); + MessageBox(sInfo, "Error", MB_ICONERROR|MB_OK); + return; + } + CloseHandle(pinfo.hProcess); + CloseHandle(pinfo.hThread); +} + #define strcasecmp lstrcmpi void CDxwndhostView::OnSort() @@ -1312,7 +1349,7 @@ void CDxwndhostView::OnProcessKill() pos = listctrl.GetFirstSelectedItemPosition(); i = listctrl.GetNextSelectedItem(pos); - strncpy(FilePath,TargetMaps[i].path,MAX_PATH); + strnncpy(FilePath, TargetMaps[i].path, MAX_PATH); lpProcName=FilePath; while (lpNext=strchr(lpProcName,'\\')) lpProcName=lpNext+1; @@ -1345,9 +1382,9 @@ void CDxwndhostView::OnAdd() } memset(&TargetMaps[i],0,sizeof(TARGETMAP)); // clean up, just in case.... if(dlg.DoModal() == IDOK && dlg.m_FilePath.GetLength()){ - strncpy(TitleMaps[i].title, dlg.m_Title, 40); - strncpy(TitleMaps[i].notes, dlg.m_Notes, MAX_NOTES); - strncpy(TitleMaps[i].launchpath, dlg.m_LaunchPath, MAX_PATH); + strnncpy(TitleMaps[i].title, (char *)dlg.m_Title.GetString(), MAX_TITLE); + strnncpy(TitleMaps[i].notes, (char *)dlg.m_Notes.GetString(), MAX_NOTES); + strnncpy(TitleMaps[i].launchpath, (char *)dlg.m_LaunchPath.GetString(), MAX_PATH); SetTargetFromDlg(&TargetMaps[i], &dlg); CListCtrl& listctrl = GetListCtrl(); listitem.mask = LVIF_TEXT | LVIF_IMAGE; @@ -1640,6 +1677,9 @@ void CDxwndhostView::OnRButtonDown(UINT nFlags, CPoint point) case ID_PLOG_DELETE: OnDeleteLog(); break; + case ID_PLOG_DEBUGVIEW: + OnDebugView(); + break; case ID_TASK_KILL: OnKill(); break; diff --git a/host/dxwndhostView.h b/host/dxwndhostView.h index 136a3b6..6403141 100644 --- a/host/dxwndhostView.h +++ b/host/dxwndhostView.h @@ -73,6 +73,7 @@ protected: afx_msg void OnSort(); afx_msg void OnViewLog(); afx_msg void OnDeleteLog(); + afx_msg void OnDebugView(); afx_msg void OnRButtonDown(UINT nFlags, CPoint point); afx_msg void OnRun(); afx_msg void OnClearAllLogs(); diff --git a/host/host.aps b/host/host.aps new file mode 100644 index 0000000000000000000000000000000000000000..6612bec2fa00c55ab0f4ded405ddaf8026c07b0b GIT binary patch literal 47496 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 delta 35 rcmeBaVcOTgw81WR^SZcW{F4px#Wugl^AMW6Cr@m0UxUcxsK!kI6mSoP