From 31be74561d8a022bb69ea1b22bffaaa138e7fb23 Mon Sep 17 00:00:00 2001 From: Pavol Marko Date: Sat, 16 Oct 2010 23:21:58 -0700 Subject: [PATCH] Fixed hooking vtables with unaligned thunk entries, and returning references in manual hooks. (bug 4655, r=dvander) --- core/AMBuilder | 4 + core/sourcehook/generate/sh_memfuncinfo.h | 2 +- core/sourcehook/generate/sh_memfuncinfo.hxx | 2 +- core/sourcehook/generate/shworker.exe | Bin 352256 -> 178176 bytes .../generate/shworker/msvc9/shworker.sln | 20 + .../generate/shworker/msvc9/shworker.vcproj | 207 ++++++ .../sourcehook/generate/shworker/shworker.cpp | 4 +- core/sourcehook/generate/sourcehook.h | 106 +-- core/sourcehook/generate/sourcehook.hxx | 42 +- core/sourcehook/sh_list.h | 2 +- core/sourcehook/sh_memfuncinfo.h | 2 +- core/sourcehook/sh_memory.h | 2 +- core/sourcehook/sh_pagealloc.h | 47 +- core/sourcehook/sh_stack.h | 2 +- core/sourcehook/sh_string.h | 2 +- core/sourcehook/sh_tinyhash.h | 2 +- core/sourcehook/sourcehook.cpp | 462 +++---------- core/sourcehook/sourcehook.h | 106 +-- core/sourcehook/sourcehook_hookmangen.cpp | 2 +- core/sourcehook/sourcehook_hookmangen.h | 2 +- core/sourcehook/sourcehook_hookmangen_x86.h | 2 +- core/sourcehook/sourcehook_impl.h | 14 +- core/sourcehook/sourcehook_impl_chook.h | 2 +- .../sourcehook/sourcehook_impl_chookidman.cpp | 111 ++++ core/sourcehook/sourcehook_impl_chookidman.h | 2 +- .../sourcehook_impl_chookmaninfo.cpp | 84 +++ .../sourcehook/sourcehook_impl_chookmaninfo.h | 73 +-- core/sourcehook/sourcehook_impl_ciface.h | 2 +- core/sourcehook/sourcehook_impl_cleanuptask.h | 29 + core/sourcehook/sourcehook_impl_cproto.cpp | 145 ++++ core/sourcehook/sourcehook_impl_cproto.h | 2 +- core/sourcehook/sourcehook_impl_cvfnptr.cpp | 253 +++++++ core/sourcehook/sourcehook_impl_cvfnptr.h | 54 +- core/sourcehook/sourcehook_pibuilder.h | 2 +- core/sourcehook/test/Makefile | 12 +- core/sourcehook/test/main.cpp | 2 + core/sourcehook/test/test.sln | 26 + core/sourcehook/test/test.vcproj | 619 ++++++++++++++++++ core/sourcehook/test/testoddthunks.cpp | 163 +++++ core/sourcehook/test/testrefret.cpp | 288 +++++--- temp/sourcehook/sourcehook_impl_cleanuptask.h | 29 + 41 files changed, 2253 insertions(+), 679 deletions(-) create mode 100644 core/sourcehook/generate/shworker/msvc9/shworker.sln create mode 100644 core/sourcehook/generate/shworker/msvc9/shworker.vcproj create mode 100644 core/sourcehook/sourcehook_impl_chookidman.cpp create mode 100644 core/sourcehook/sourcehook_impl_chookmaninfo.cpp create mode 100644 core/sourcehook/sourcehook_impl_cleanuptask.h create mode 100644 core/sourcehook/sourcehook_impl_cproto.cpp create mode 100644 core/sourcehook/sourcehook_impl_cvfnptr.cpp create mode 100644 core/sourcehook/test/test.sln create mode 100644 core/sourcehook/test/test.vcproj create mode 100644 core/sourcehook/test/testoddthunks.cpp create mode 100644 temp/sourcehook/sourcehook_impl_cleanuptask.h diff --git a/core/AMBuilder b/core/AMBuilder index 471cecc..be83383 100644 --- a/core/AMBuilder +++ b/core/AMBuilder @@ -23,6 +23,10 @@ for i in MMS.sdkInfo: 'provider/provider_ep2.cpp', 'sourcehook/sourcehook.cpp', 'sourcehook/sourcehook_hookmangen.cpp', + 'sourcehook/sourcehook_impl_chookidman.cpp', + 'sourcehook/sourcehook_impl_chookmaninfo.cpp', + 'sourcehook/sourcehook_impl_cproto.cpp', + 'sourcehook/sourcehook_impl_cvfnptr.cpp', 'gamedll_bridge.cpp', 'vsp_bridge.cpp' ] diff --git a/core/sourcehook/generate/sh_memfuncinfo.h b/core/sourcehook/generate/sh_memfuncinfo.h index 8614d93..13c40a6 100644 --- a/core/sourcehook/generate/sh_memfuncinfo.h +++ b/core/sourcehook/generate/sh_memfuncinfo.h @@ -1,5 +1,5 @@ /* ======== SourceHook ======== -* Copyright (C) 2004-2008 Metamod:Source Development Team +* Copyright (C) 2004-2010 Metamod:Source Development Team * No warranties of any kind * * License: zlib/libpng diff --git a/core/sourcehook/generate/sh_memfuncinfo.hxx b/core/sourcehook/generate/sh_memfuncinfo.hxx index 19e6e1e..086a25d 100644 --- a/core/sourcehook/generate/sh_memfuncinfo.hxx +++ b/core/sourcehook/generate/sh_memfuncinfo.hxx @@ -1,5 +1,5 @@ /* ======== SourceHook ======== -* Copyright (C) 2004-2008 Metamod:Source Development Team +* Copyright (C) 2004-2010 Metamod:Source Development Team * No warranties of any kind * * License: zlib/libpng diff --git a/core/sourcehook/generate/shworker.exe b/core/sourcehook/generate/shworker.exe index a251da14479b56dd75dd15f925de69e066c036c2..4362910d82b3e70d72f6e042d8b592d2b3434708 100644 GIT binary patch literal 178176 zcmeFaeSBP1wfH^BOwwsP?M&$a0|Xdl&_F7tBtpUjOiGdlNXtypB!#vKFGXXhwKOwr zfi|>E!p-zBUc49Y&#QQaD_*&Z3W``1uxU!tLR(5vX{{(;QFly%R-iAoCC_*5bLK5C zSnu;ZpU?Bh6QyU)eqDR*wbxpE?X~uqcjE&#yUk{E@ZZRY&9;fB{8j3IKm4EFWKTc; zr_*guP2TyDO*!>DKeC|xbDjPbE5GpBl{bIhf9uW5mwzGRzvVXn%II?c=a&1cuW$5! z{tHWQyJXt5DFLhLpMT^Y|MAKhoyq_Hcv^So+r0nrw14UR0?*&v*U@=Y=X*LI*6CmF zd_h0gcm9oM!{=^om%2$vLp3&AeU8I6b?}M$WZD}xd(PCH$qXvjW{a4qe>%a_!+#;t zWVG^|pLsmwFZr|yc0kViyK?2%dRxHo99Dg%5A=6W#`IU$iA-)*_wBIRVp|=?K6y9Iqs+L%pt)a`yh8!fCLKMnM;B@_JMuXOcLzwr?0UW_4OS+zb&>cr?tPWWOHl3 z)wO=mzaw_Q)w6xIyJUM<{mV`bXKbshKelb8WY3X9v7l+BsEO3QxEzl)X!{whf&SgLdGF=;fpq#iJ2@Ugc-btLaw+g(6c8xIauX& z-*+E9G&VK27k<&K=!PvW8_;=TYkVHsC|H?mOm1TUON#n*o{Ud2Tnxi0bLb3(8=BRtG!@(G zpls-!t);QU6H>Q=E2=lD>-7)EqIj2g zu-4}W0Rz=nIc#mMTbve}8;!-%@u8OTR&QsX+WQ=XuJzKqx2PZ7&=~ZyyX5y%e^;+MuQiN@~4DgFqvo z#%sMR?Z)SA1CB!562Zfw6d=~DHyH;yM%veZdX8=BBYG9hR8pq=64j45~CTSN0`@t%Qad7yfMw@Tbcfa$U?;QD)@zN_pulyzWO6T-V z%-Tp%UvTegd!qEL#QdBNTX?WWB#=!7Ps)rs<2BCVLK>spc#W#;u!RO{PUNa{$t8;d zn|?5}($;U#V^kSSTs`|&`D6Eh{5)f>W7wXU>u3y7J<*)g5K@2Grtz=yUB>l}uo}=Q z4r88^k^_M6jIZ{^+q|(4Jdi}+fWv1q=DoKxK22b{p{;e1@y8{g#)ux!Gwd>&9Sv%O z*+_@Yn#;jjy_Py`1GNsDTFYE({$bUqb%fOQW{r}~Rt@mqTkFUqs^t8~j(@N!Pd)N8 znJ-_kzw<1nE!1f2Qn!PPa2Jm;ZO98MBia70;=1nb+j>~ zvZ$pQ)?(Icql3khXw_@SVc1zH{Vn!iHiSd!Icg=>MVA*cIA_2Sw58xN7erVF=xq|# z;5CM1-3Q8}-j#XfcgsjG5@_dnVIBoWU(rBtOJ}~Zo7GuhT+O1RaG^PTSW(f7MT5b< z)p_ceOJi-a#+182(1nj3wq$3D<>J-jId)k&)AJXvzoP95tJ0#Uu!5D z2-$aqRr?Dz+t7UUpWxqCugxx*hQ+U8@zZyp#r|T^Kv)>pEc-x6-6$OcHvMYIr-GJ% zE*%&L^1`u@pG5;hyAUPE&!gP3>YRX;>V_Opx|!M%7Ux|Avfw z0X-*NX9TxVarHgs7zF$OP{-}ZnBf!>EIdnFXBLUXoM{IqE%ukeoBdZq`(ao*`PHoC ztt4l_ItCJI@egmnq(z^eQJ>7e@v;EVP!Pfa`-=h=1gKwr zRn%vHCDfp9kS41Gej$o=$gmo{R@(*~c3Z3Q!V=`TH?6ZY3NLbL0quhyt&>$6ds-&a z%R(+-4few>_rhCZ+eeDF1z%bPIO$19@$#TwCMafrm*l?hic9quF>$KNH=7 zr+5v86AJ>a2K94c`+$OKoCxJ4``8j9%^9MfKOsVCLE3ID*`e$d->_BQ`cd|t$yD~7 zDP?b~)b^R$9@4Lnq0WNW7nkhs7(tSF8(yyILgw(#`bShNPPmFnLo)BG^%qlQ{JSsnw**PxTG98o>2=G)TaJO%8(%9c`;2i zw?8V4?lskwcvnWB5_A%&qoOyl7A zAs!65`sKFNLmE)s_)Cms#(v>7AKi3fGL_6V&tsFREZB8GaH+6O2R0y2k; zTli74U{F%qmr^>cUe={OQu;xi-ax)zO25xKZKeqUp?x8RL+U@%O`DB`DXhp>+jL^UC0#<_#M|&l$veRAx zj(W)gN8LPn7Y8EhS_TIA^?=>Lid!Zl?&XDMg`AzL9NcE~v7U-6ry2EuWnuLWnzooF zOmKqlx_fS+ibXKvcefw-JG||M0+5LZtE0)l_LvFVqXOGQfd_f0?@}Hn)81fVa};<} z)K`Ij?9iJ`$Y}Fnv&{^e7(18+fn^Qqqh^&9^kwn2fe;*|9yC>`3k2@d+dUQ{EucN) zAoLj08AKL~!DE?Bat1bMsA1Xx-1R^O7Inw}jTR3UX-ZP*aVH`(w5a~Bb`u(I&S7(zR+v*c;KAN`N>UEkeUlv%Z2`Us;|G}O^ zP_Z_!6g=Dn9ztZ#(wOo!sC!b`v&b$a+n1htbG4zvTZP7(`ZVS>{eCi4bRx{_o=Y24 zo>_7t#OH~~v8W@9s!tmqoxePsMt^#uW{xva-=!o77sQLOT_$UELCC_oS3N89lEivp z66>d{M@iRMx3H2;hG(dy0Bm6vff!a7A}&nCr!i~J%YpzpaDFN~JufLDmWfqw{$xBN zPR~w~Cq0`g_b@}sX4Z^KxO6^%)g=*szgfOxYWsT)nuldm{QW3O8FVR>D`-m5<(cZM zj1-nG^jA8HdHB>4u$zg7^DOArqD@!?HXcw%(8<9TV(HECfI9NthXZw%5_*{csI%2J z#*_(E-0Y1-@u5K7k^<@%;{kPx36$_wLBrP3m^w$T02vbiRiH{n0reib_$Y!I4^unM zVocw*@qpU-uEx}aK%J}h)9(a8ou~eTF=b+^?bLuOvw)h?{_J=_m6;BAuIADEP@t5Dg%m$Z)tMRY6<{LxHgt}9G9gii<5 ziw9CTL%$BGA`AEo>H?)Hj_gWhr&oT)@_g$@NiwKo!BoSM1#Vfz{xq-E45HsG*)gU4 z@$rz}e@G9qn3}SHOGTB+5S$mPAA+t_(c$D$ooTf@ zx&49h+MQ{(t0x8ZNf?i?=7J<^{qw>u9(5pw|0p&S0poX5*u(z)O>9gE#wS!4fLhoX z4aOy^Y7`i`rv}FUCroVIWP;&SpUa#Sne6QGep2myCyTO0+tDlYOIAw@k^?&5Y{{$F z$T&1ttiDHy2?jJ6~_s!`oPJ*$KcEHAj zU|gnr6N7QN+W%HIHXbtD|9g`XwZI6NVEB~X1jC$^u~b&3R?<-h|4dO?k=2qnIiP1K z$biHWAggx_XDe58>1zVKUZJLp8qiDMJEiG;)GXHSNP=lYe;>Ub~2{-#Asf2r7E8ojH}d%;q2*s?(tK?#=n`x+TToq5%@b` zd|LgG5))vfQbk9BaoMSX;kLloYl7iZU#FcEZH%R|D&MZCKN{4URB6colACy-Z%Qtu1;rW? zL2*c3YnBGr%Xm-QK9?*aX#q)CWbc5-Z`dlWWm!Xa?7$v+IBgHzv|}cU>ro1)ZKB&q z8f6oGgCxr)`c&XOUYMVQ@_0OOlt;T`!5mxjHy_@H4e+~cT1xhFzK(s|8|;tHY;He* zO+ro4D!Oy%JwR$#q%^7Z6g7@gG2d$kthjvm-j!2tXvkTjM=_IV~`H{>3 zz8dcC+sJ-S%&`x2I8iPaw*Q6}8`Re|(MgG(W=i1Dkh1rHR7EQfG^=V;36es!6lzAv zGkXZBbLpXD5?wBB{{;<(RlP3j!#!jf#TL+DDOzzcTCpFyxY+x#jbHH+_IGUKz|lb6 zfZFyai~-mXIWZKQQ8ipzkd~u<@JE*P+CZs?xfN*K_kJFGpCP^|Dgs|-VGS)JrQ~q= zxq{8La~^1J-vJ~o>K-l4T+Oiq1;&o}(m`THyHU=t!rdGG6N-(VCikj|Z3|M>~Z{KjI2@_kU>wS*JEnCxjf1Z+ewpxA@}p3 zN*~#F=`D(jdKy^%VgAb|p8tOzZ~niUIsfVL#EzbbRQ7C+=BamB^G3dQ%*bQ%IR_1K zeC%j4+P(I_*k2CrT(bH!E4Na>-0TQ$<9vG))pEKV+2@UnpR?ihcb;yGP8a@Y^qFsw z!zSj99K*@%8r8XlAk>+ta}0g_KQflQu3wjI;2NoKzD3^G4G4ma+-75iGkz)mtnZ>D zdz|C$m5%rdhjERsH5hh8UGXYMJmieeaX?_kwT@ueDQV7BT0AH9Gl^OA34UT%*+9y# zK|Qm)e$DB&$Z1BU6NaOI-_|1)MczhhmkLNtBd+e4rje)AxOiM-=abI2|~dFp^U~yGzcDk?J*h(7!wEM9(#+={!;M8)$TNW z!8#w*a~G9!S~c}7%HRSBL(Bj4jFRmMZ$da5euwx7ieSlfLv?h%frK69hS~;C7{?8@ znEK{0^!hyD0jnZD!k~IEe}OQ-cfZVFJn?3yQRj%ycNtJmv&X1(;bKS6FqPO=4~O#Z zry=lIpA#R0rydlboEgB=g?IzF#Hqj)d^d7dOX5za`|13akoqSI_vRy*ofr-e$eJ-- zB{SM9glC>|d&gPTiUnT%J~OtUc?8Y=pmurgmu$fzx77}F##u{xcjb#_PX8fG7|k3QZs~ z8c6kDFslD+&Hnwm|AwsoGu(B=-x{wPb546UcTF{F@msuzy2De~xghJXn!yV*s>Q}& zeo_j*4-+!yITL&ETO5Ffj3s4*HMVZZq-TEwAHuXa^eBUg{ZMh}K^%UOLZifCqq^7Z zvMn*sv1Ac_4}I_zVAwX21px0^B8$0n!b2;yvz4=B1Oz5sMf3z3eOa$NMoYY`#;GCr z$~Quukv*tLQO8u=!HwGD5vNh>H=K!ZPTb>u8b9$&dU6=k9$PpEm)DZ*@j7R`&K0lo zq-cQo9yi}_(TMI(M9&3U^hDT@rbLe=T;N=|HQq?h2s~tz%e1baEsu+(jg&n8a<)8f zPTXJ8O*Ve6jva7t=&VuDE7f4yX2m!6Ti1T#oz?xS!95 zW%`=fa`)+$MNje629K=#W2VbGPW7?7a4f?SN_fwbBGJ8M?d$a>oqN!m2PX-;g-|bo z&MzG6?e)@XPtvn%zSq7jxDN;0AF>;bUmkCB2s0St{w?%n%F~UMOUhH^+}-kO$@#O5 z94$kq;eUl=sD6nY&Jv$zAWnjHqXp+*G9{%+qKU9C9`+}~1@UkofxxfwB*KO9aB-pv z`R`4HXT`&%I79J==4bsNg)?|b@g!6H$&_LT(Wm@kbm3IYm{6w>ag;1y#6D3CG@e{`%wf5l8P? z!&3)xuBjTxxs3lxjlXXAlWn@qR<+>+iA{>S+J5+j*4`NdRXMgr{iHbw&ziQeC8sTw zn7c>*cX-eG|M9o2e{o?dJ+;1NebqWcYMAYzW|#jXKXA@d`}Bsi65EDaP-CfJH_X#GSl(9H{%bAuTHsu#SVBM-RlWcE+#v#IN?oYfh+=FOuHn)FVwf#OXoatMvc|Df%u0oxIT;S>Wrs9Q)%%zHE3VKZIBE;Zf81m?M94P5QIL|vtSOq(@s zEWp}3M%8^x?JOZV=k(P@Pp=XL!)LP z#@ynIigWM=CCmQXqPJ1SbBaY~4WDUDf;fzqwfYj7R@-a8nqEBfdfvL{Tc)?Kh&e6t zOnIl_@npgCg;DSfal8XOvy<>N6A3goU@%qtS$M|W(j+W_Y*@~6KW#V846&;Np53TZ zk*T#QXuh3<#+ii1RFYHrkV*YwWgSEP>A9|v?2O&vjvcWBq7Ggoh64`)2@bJ9INP*_hYz%_^k*RfYd9t%^^^q4PP=&yt zJ z%yP7fa2l`teAj?yoka;+WU_n(WRzES&K=RdZxl6&Y{Pci&@~QdnK!w0NqnKq8Y*_kl~Sxk&dIVXfbq|3+=zpJ&-O^UX~jx} z1Cg_hs!|MEU8kYK=UN(kFO=CoJXN+04)@cqvSpA_i@u*XfWXa(y`2+%W|5{9p(0Pb zF4O)X`iE!zJ*V5yQ;$T?6YaowNxccrFfMCR&wWYHzvw~62a*2~6)$$b0Ne3Kdw z0r{pf1xp0z{6R4Z+Y)uo^vgh{H)o*o^bGqe^{1!mUjp1h=}t5SVk|+8paZ%#W`HBH zwGqh3ZlpKll~yE_0w&wSx8#~p`&la-aHyRK=8#9*}|^#HFjV>zfhw|bn|@TxDG-F z?@9#8Jfhqr%uqaJ`~(`#7pywt^E{a0aQCr)Q1sh)lb3MSdH(M0k&lTvIgAJh6L%;_ zh3uECY}rAr zuLu@Krjfq#+twbdA4(u{h>=Nns|KOqIU(o_o0R|57)$gza!SS1orNUjTE|jK26JJ=^%u3Ja{y6K}O}^;A(HiD_FGe z4*rcHIHjL=*wx7%&e};5C6uUeV%_&=B+|l+j8}VK@F>-{v%L(ynY2_3LbfQ3pXS1fq{FsKNOQ1@EMw#AXNC0YoRo*v#fcE*x84Z#1Rh zYbakcBo6Y#2AP{-J$!&aKVxqU@E&<(o@D5+>Y-1guJJ;Vn5!z`@dUGvEOPfO0*`V` zdFr^-z#Ib^&&nalJF;K>-=gy_S`c)K4$Og>w=#Oe*ukfeRZnTKx@aP-rm%DY1tpR_ z2q#ZswSH{Fsq*h)N0jo!6cW5Vda_c*c2KNl$PM!0R9*=+`U8HP7^SH)Ie0mG{deS; z;e{fOM3OkR)`p4+orA_cmT0nUD7mbYEqY;SBZ__{N(+*e$$UqS zO@z@2&y)S=p`PtgN6G%-^JH6cI!xOUd?7MT4Q7-pI%515##m?^qvkBB1qOA^h&T4P z6Om~>d#JS=#C(ZbMMs(?)V6Iidk~55OGSr?ByY0!3u9V|6OL9?Ay8*31QGtIwh5=* zHJD!p+a0K_b|5~#I6l8LUR(djqnrZAYpVxq zD@59wdV6|0wEe;TJYp45@;s}gWDmU~=iFc3vT+OZM*p#{dRycIu@XAiJBghza=KAl zk4^hwNEan+^SV6Dl&zeuVLYtz8#ZlJ0?zOf48)F)M6iQbj-XPqmna^w8Q1tn zCL8^gNA{kx`GS7Y8H}oWYFr>i&x_qzVT=0QPrn3EAJYOrK;jTjm!z+>lA+}X`vru$ z7d0x^Xf8HRgIuCeWHss8m(UY>*ienQ7NkL3b+udKxp_b_37ss z4H2yH6v>kK(o5L}3$GY1?%5yxqZQsS5t+R{E4osL%r8pD%(MGS%$J)vtg!O=vN|#A zHhYU+lXzjD{k5XOhN2hjFNf?q!|FStw-Xo`+v*85Nj&J||HG1znV*3I5aTV=zC$!i;s1;nK$q|9zic7jjEOK%7)qlE$vyT95i-PsSB6F|*XD6^VZK zW`=&&n5m$7G88md$^J&=UdshjW)B7I)YvomdRrm9vUqE0Z!09XAl@44ZLN&gu86lT z>up`kDE*;kR3g7aoqdl$>C`HmC#Ax{d_0*NJn)oOr;KM3&guDu*;X1Ne)hXEy)~f zWaY~XBnLa?mB}1I09bCtN+0ker$*FSLeN>;J2_^NNz3@t@`E*V%xLi?R$H;n9F>BW z>%ECtIfOl1s*z4)1zD<*eifYu0rGuzD8}`cQgR-Ze~bOxQcBEf{Yj(OiI3x_EABIw~8ioRwSkHuuogf+L9w1#9%3x=?FcewMZ$BgK zan(W=z8CGg0m};Zq~BUg9EJLFy~NF+blLO5cV8JB_ANQ-uy5-v8M~g^D(hJmCN4Jg zL&)Qh(WT?pM^bu6@RgNV2UD-Y4fh3qz3StVX2!1;*}vK;?EDR|Z!Gr~Eu-Xc?4;a% z^3A9@0WWl31ix))0`|{uVge|Q>xQiycG1~R=kQ};?UxuchG+G>75#mDdFm#VB^Do- z(Sq^JSK}3_#QjJ1*SPM(CoCQ?{p=LMRMB7x&e!hMaHa;ClmL`!PjKqb;cD#nP&iW=19&jqIm55&K_re&rQ!S_Y>@HkoyT{BJ0cpEaoxx;)pqs zyMw>vLI+o&c6e!wn3D6K1l7>_N%Izi3X)AaKVQ%+be{hcP3JcYa=9u-BX=gq9f@XM z=#a*yCg;po<5g(H1i`w!p>2H{MJyESMuRbzE}7>Yp)||>@biuXm>}fJCC|y|IX6|tvi}TtDXT{;zYnh7c0yz(8tT?VPD4_&P^lcaez}bnwjM* zGL7H*IH1YJrm$3JyWCGZ!+6@gq?QodOy5$!2<6PFW`0=BIQSFTtlCcon`8N zCb@0t_g#W=#{~B?{e}q{doGgciy#choR1Zm^N}`rW}iRB=N;I%#Kp}L(Gzm7)T7$g z*}Xq{d2mw&5vSS42CUr`6-U-kNE{c^t~mbN(o&cZqBL zIxl1ML@R>>krE^1FTa%fYl_P+r~YZ~r%xO9VkO#U%<+uure7LCf3D$xcO;V6+jKfD zZI0J?25P)H!Cg^ba3Ja%Z?vQ?5|J- z#2F*j>XCV6a7p*Qa*u$qm(?0Dwvo^&ru4GlORG=Mc!deq*1b3~Tk?~3khv@9GQ7t4p<9ZnZl349#+EHJ6den_E# zp=YU^SR5!DdJ-y4MEG%*SX8P5XO;tyyJxEmeSwAizk&SkNP^%(kpH(N@^@+ECtp!8 z>Tt0;v}&6ASUg=ni3_pznYhriWa8tbxy|ww4TSWONrl?_10cMihMG8ikF5D(VHo{8Of$`GdyLX*j)j?+;u+S6c}^rMYVB1zhL^ve8SSp;nt|XJ%{i4z2NUm-TAR61bM^vn))2*z2;8S zS6LERZ`(50TVZ;=1xBs63TwUXi``uzw=#I$-9Lr$*WX=bb9X<%FT z+?hFze)grs_FZfzrl~d*3~4|b0s{rf^<&L=s_4pTsx+f0STEMy;YMasO<|g9{H&m} zGG3vYV*5+{>(!KVfX(RWE>n~vqbaslQoj_uPOl;#gzF30-)U-2TrJBcrfiXmVk#$6 z7*n|dx4TC|e1;^7C4qT&XvCy?|IlsF$iUTAsU9`d`NC*M(Yin_j3za5hKNJ5(E1hQ zKrBpVbWxDx&L|3!d_^Bb*6A)EN+K#_d5!6E8C~wwT@JF>JS8OkhZMZJKGcGuq|SXn zXxbAz8ZA#&7LtpUapPCd>#VRAVpt?>1Nyrwkz!;rVXrz*ob_w z8+>qFMMnipfY4K*QEwQ2Cwm<|>jh#pJzZN(U%}S8NUCr-B31lF?@HN4XwQz4k>N9B zIZV?E>P~jGmr}3@_k7x%CHHE{A>U5*OJK8_6L-;bpz%i@#Dzg6dd zWpqCCH^#nn4I2(vbf$d?>yojnb?6fSZH_bf?NIHv1ZqmwGkpOT8eu-e!k7Q#YYan!vZBHf3Mha6ouh%0G)M!^}WHi*rA#!~aV5 zi<=~?r(4!<`T6c1+yQJH6#r2+V&WD6eR>J_dV*xgv%GVjYrR~AUwl<_&KxoIP*L2j?wcw zUj2*4);H~s)2W_vM75ixvZzt}lZe=qRa&y&7?d%lZ-A3?bRyk2&}NA>{1l0mRS1PdwL4A&|4iiS1D9RC}x(>3Rgv|KfsT#=72r;yR|#%#%qLp#ucza zJlP>PpRv$q2(dYW2VqKIXIBwC9=WsUaP;%)0bWWr2iN%UR_o^X#F@4M+w^6N> zqFs{L&M)J7kN5%vOhDAFqkw1y2w(stpZd>VfFydi4BFnIJ3%N>9{*-sHvE0auu{;5 zF!&4xr`T343}6a!zqV-}&lC$F#bJsDFQ*#_g6LzkC5H~9j`P8{T+DmSnCmlE7sw6; z_WlF*$;PKUL`u29hYNgo)T=vbfdp{n6!uM~hi*LTVlvvqRX{HQ)_-A5YW>F!6sKo% z)+qh0+TsF>0}G5-kQ+YEilUQBHV-Xky&7}y&_XEqjX9-8vHehRSLf+$9wk+KvG<;3 z^beKjf}AsPip|g1T^uu=OSn~kNNw35Skfn7-IJwQ|4<%}v;tTtx2t&>Nd==Qsj2UxI@(k-4$BbxKb2M(E(*!V<{SVU!@ zuMpG)M(KcsQj|SZ>8PSy+$;*`zN9Xd)tR}6%IHk?P=7^N7_T!P7=Nh#j7w|*DI9K z>wV1(HGcvaGxR+{$RQAN!Kk9LLW(|cccYQnbl1COa+2H2BrdG&W%AYP_BA;`7-t^F zpyvB#K|IAQo$n$vPAEKh)ZOzV=`W)Z)`V}Ms!Dd--f~!ryXRg?AkF^im*#GZ(^9`X zww^>hYn{r#(lGRW$yydD9NKKEhlN7{Q#~vk`dRYFCs_V$R--jWqwLTBlvIXd%;@hUNt4@nAz3rO?W0|G} zNJZvpktIJwP9T_wA!$i;RhF0W^@5W*(P^M8(g$cQvU*FUiR_|#{;y4vu!kIIy5lvP7nb~AqB-R=8{pID+vy5g>{0e?2YO9Q2 z7444a5X2JOQWf_wngUSnVG6u$;xIP9x^>AQJtECR61gJsL`?Zo?sSQ3X=^RnzC;c_ ztk4##fTd7zUPMtJqZ8n1*{@xV;0MCxFke1Q%P`QT+(gq2pTX}7kSI3D#^E{%jTvA8KRp)quC#yU!9m=Sw6)a?vx3JD^_@MpVjVh^Q+r3 z2MgPEZt=@tz1Cpkowiq9jx7J6_ zQ77?&=-wP9_)vQ!96-S_L68(q1M7NQtCT|G#9Ql)Y2pikdvm2 z>P88j#g@<+0%sBJo>|{gD37 zc2~l@?M}XpQ6Xx+`dSA=-b<+!VvJCGcChxQ>NwCm<8J5hIYy&XyN)`HW5d&>dt;3= z5pv=~al3ZM>~!FtyIQVKFJI`0=HV1GJhlA1s3U&Wusu$s!V;fhmm}@y=~A2s(1GE} zEo#wL;R%koUGjwoUFVFh)&(XR133Q=ceJS0RvF$F<3Gr)-Ok|E&ZvBk;Vj+t3bX6@ zRmOGB_!Iyo)Ww+RE5AYDsB!@Ab&m400EM6s!d-ad95Hd7H@4Xu?29-zp0&}_>+78% zi}FV~WjA`=JtH#zTui^l;qE@j@8SH!*Mug@+Q|H!WahJjW_jQv>m}T_cOgy?I|uk; zg8G~wPSOd(jTp|d8@y2`?j1B6xtS0ndB@V-dm}rLoj91<)TVx2VdH#nZ=JWd6;+OS zo}Cm>=h4(K(@YODGJ5zYsgSQbm}#|mp5dW`=$X27iJ(7hJYd~ch4-@qGE%RVEBD9}{A%25}uDIk3rGZm2!b;x-vzZYk+s0Vy>&f+UCZ?Ua=JidczKN+kXJM z+_jwY6woSMHt&~3O8=WO*HiVV^|a7hPscXgQ-I_;e`S5gOqSCQb2$~TI7+SMRLpYn z+tl62AYk{39$w0FTB^!%Y;S+STu!C3oXTWZt?EAu;ue4=RMSXc1(twNb4We=Du64} zeum0n%V{eJ9*lb8?G94ng`C;PKj$3&D4)PsMx<2y5>kW3(bM9E!_(u-o$|KA$s%ia z8cmM%cX@4z8i(<|yXOE+CH=o8nmsrr8a5hOt>>=n9=@*N&YTyq&d4i0OHOWGT5%E4d5;vJ49KGN@ri zr=+D`kG`~hC3e71%k-30`>D2#OIY2+vl*7&V3AFNvp-unV12hpU_7IKK1YE zQc=$%Wt6V`ru_R&sYp9s^$kkEU&@S6Ns=*%AcxM63N^Z(#Iv$M_-o`0^@)Y7335(@ zOB$s=9L_JxdXy@^==z!yz9 z%w0XV(kVMn^FSm1DS=~ymvG{j)IRW ze_Bl>uyLOl35@@p^!oY-?U&z^@ngUImJHvgF1%^n;m^w&{@4C8(eV4wusiq^mL>_z zn9TgMG%Vn=ehXC2F4LeHpJdSl_KmRwF%=|^#l^3dOh^zo&14V+`0%CmkJy1g+MeT2 zuM#Wpe2SmB3g*uK{hN!6S$bGH^7E0=g2 zRZ9!iVR6u+aGexZm4Ak9aE4%-Wj$f#F-M_S_^jj#Z>1SO+u5t&AF-{)TLPKvQ~aY% z{{Bszum|(U*ykDV!t{7I9O$Lv6pJ_S>b6GOtv_QBd*e(|h_7*7u+8258im)J*P3$` zln$i5528EV=ZIX@UfirXTd_L!HO>CDCDO^%$zqW|<;OJ8Uh&Vmm{TNx>rqjJuGUTD z(u6PB#M9CQ2PAT2ooqt%A@w>aGMiu`La8QfG|_G|Ye&=?sm(S;rlj5iK&VQ6BUPJ2 z>jr9vGyq#bvtiy3o<#D7tq)QGw>|LnkLaf(H)QCiVkVzJKYig}A&FDbPgC>R3BMoA z7kINQ;Nhl{x7ggbG&RMS2ja^e@#U_;T2Btc9jx`{GluwbUwnB%e7Rrcpue*1{la2K z%Qbe6;K|74jq0LC%1lzBFwULe%WLda?IB8BofJY>o56^8lgM}c0$6Ep=x?Jld7Aoj znx0|@MjJsZEo$N-{f<0Bx9gZB{GNXN99vxM5+Wkc;r+s2f)8xKN&K58^s;`wBL+|f zVL~7&t(LK+(;SnbR z8@O{^Mc&3q75<2)VsgY)F*V|>m=bYROp6wefbn!+XN+k>_cbCrg?EN#h-QoQha|j3 zeJ~tZAmDBv%SuiX33G&`O=au0FKJd%A*@7=-4f#={LHJhlNHZsfV1N5(wd3cE$i!?x{Uo_iWk8hOwz$jg+I|_sQugm z_t*kiF7K^h)kgSqqmveizPD1#{nYe%FimxA{hx@9W+>*!AVtz*4d<5)8A}{RR*luil zWhi#c*_ro@lL_TmjgME(cwQGe#JA+cL%6_r#kk#P-vYVyy_Ks@K1HqT8a< zmZ-?5W&39P=7e{8(H1-3Zp}@&dL#>#*nW)L4QFbfTVFWgI3uLmHU72T6JoD4uJ-hO zK!qRcw!GzX-cIPSD;x^9s0ynrU=;0)I2ot6Wb?b4j==C9H)6 zjITyz6{11dLI$3k>%3gNp>dqt2PPMl#8)z5J~^X2W~}zXM8q!hWKJ*jqURekg9HK} zbU)N5@5IbHG9#=1V4P{Z4Lj1V?qr79;q!e z*oK#+_{10B6Hiojor8lOZgT-X7ZOcvf08+)QIOy@YFt74y4f;_#%43Bmqz}~S?7m0 zLhF9$wcW8q4v|uAYyMG}Ue9_pWtw!X01VkDh1470Lp6k31Z1vNE*5o}QNin8Qgu)S zGRN|(yse@aD}KXtwgP47P?X`=n-_b7F0 z`_DRlPesQu?>r1;<4f1Wx%-XTlrZrrNfY673BaEkJ_k7*8H>+Rf?jG(L+-Y*yc-`_cG3LyG@DhtF@+3O=6&5b*gFk8$yNXS!52KBc0@=RK4#@hM3Y z;d2_mpBg^p`wV08dG+;K_?*>1ry2GUfnV*cA#pT5-ypGBHPZcPd=5zQ55*_`(F+lq z(Iea)Y~9oPib?3E8#Vl3Om%v zSbdry8fS=;k+3{V6;KzE3OZm;-XwG4JjA?Kzck3ZWcWo-@Cr!OFcs}|2p!}7ZhE}q>3^m^ z_PD8!J-&F1KK4`b$*VnK>SOv!T%em!9|H!5+$nKP?Kw`pgK+LS+za6#0(Lj&tFFPh z6@n`LSxe*P`05Jv;tvr{sT*u@^Skr0#A=ztC+Rpjhttf(g_h^y4&N3vFi#VQ+!d6~ z@wKkU<)1$Lw!?k)C?`ISK9yTu>s>ur1c=%pvCOsHj?wC~w{j8WaqcrEFgv&CC`Y)l zil5q|9t>mW$h^+?0C(K+3>k*wr?EfS6OOO6Eka?CnH9^nXQZ}ZRQLF&VBY0yw!qdB z{RqgIC2Au_9UoiwPzXbV4cg2 zqmo3pp*`X)FO9jg8|xyFPAji3;=uS-X+}gPO$FuC&9kCK($yR;7 zF0};@@(jq%EDyQ5ZWiKzNS!EzE_Ks?Q{qe-b&Zbe)( zfK}Z#I$6Ud&8*hJf1Hc!2(DybsEHm`iQ~1_EJ$^!zjCh0U|bxxPBP96hF$9_^!PHM zh@7r{!*;2|_8K!MySU!bBACUKO>Fc%m1J+Zhh&@E7IkTWaICNoaUw6@3vY`fxJ z6{=afraSfZiA$Dj1}9@1NGihC6aM1ACWD`b()PCcQAck}E$;ewU_E#^Qsc2zf{q9$ zW^yx^H#*z>G#~CE%Xl!*EssfDGa5GT53J{eH@#Xt0qbS)g zm|3B|3uY{_VH{M?{U=tI>cC<*Rmon64^XG1rC+K8wLfwQZrkp+znKiL@Z+W5tcMBbGc!KEyF? zygMML1A{eMlBv__3S*>hRGS>?LaM>!!J4p^CIy?w8@j5;fVpnI@Z`l?e3=GJ*`F86 z9=1B*>>zR}URyX=JByxd>Ji)$VqN&P)fPtyt#`(@Ikfw$D#XIhk*JF!(Pq_Gr8&J^ zPGB7~=z9v1WC;DWXVTx&H2vK)ivHGE^k-T{p({On)BFhmlr_NQ%3ye<>P(L9LKqqa zck-v2g-0yIlTP+BkW3+&>&aj%O*pHyrNJDEY%^-`KuKNr&v|V$ec^w>1@9~SmDZLf zbvZvQZlPRh)%SBcnF)h_9vZ-?7Jtg@V|U4Ryfx)$dVwZmNR!QF<;F>P5U;0XZbeZ< zoPYckpWql3-+eV#j**;@)DvWHoYB~ETT3q#4ncq9HvajjO`R@m>7ZQn?r&r#oiDEn zS|a>*l0^zaT@c`6V@op1Wbyj4d)(b~fi5e}=Kf*{X*!U+S`Fj7fdQ=m{0c#J6pPii zT2*gha1ZIP8V#4x%bBd_M|Hl~gsWA6d~Q6MWR-z%&DtTZE}=l3`X&~}j$&%M8g+$t zS*rLsn7tV97aa*FnscPBI<-a@C7McJZs&#BdW^p04?(#2XC8i#CjHAF_Ma838gii0 zO5PUeHB?D`FZXP3zgcj#aS|$B#XXTrx;J-SjE@)ibU(kDdp^$XuoWF7&_efi5=CzP zJvp|noVgeX?}_fAzhsO2LcbHblA+0;VIFNUSOEoO7u);nX0~yy&)(m&y~`Ecw#r$w zjp_9b%hdvUc@i^eJf)dfl3%#H2WjC-x$-e`B@Ov#Q*58~Ack+@p7KN@L2bo+Tf7vl zOY;&z47?=%poVIA4NKl{TXh-rr2_RI;DHF&JfygxSzY|2?3z%`Txv_{>%gCnD!ON@ zN2?)DMiTXb;&8M2shBG~)X+UwI+C2n+G^9B+y~=r#6I+eYFYdErMbI@1Q?0fG6z&N zSeYD?p%OJCp%y)|QbzW-Sbozmk|Rti+9!KnwFA`K42zL)}ArGN%$oBW!g z#cL_|)tQ6o$YCMQqU@|Oqk2<<#8RWeh2g=#W}0Y#%gQ1|d*<@AVhv;nAb%{yg_TPo zfP~lDPg+0LCRrF!aFr?u-Vd^l+6&2tuYbgIb?i%HANF_smT^1g}tqIjd!K>`iuT%_`H# zfJ_jJUI%3b)&RhqP*k`v4Rl?y?x_KNC(4VypmQmUtDTWqvxaZ|jba3=7s~jBj2atb zGcdftZ*?`bbPza^g5@})YN^JhA8V_$d`WRvRwyj8(ngsTl#v5Lwa_eM4Dz~Wl;pb! z$rpot#M8fh+I%n96f#G)j1VwIO13sokF+XT#5`&mtO+fu)bf1F-X*H zSz0!fAul3bS?{*4<#J0_zW8+wi^eMgS8n(VY|Q0rPU~sScpol%JzVxWV^Z80n-OBLimvrW<+=JA-_(-H!s}OsO!rzJc$WbuZ=Rms?ZcaUdZj2swKa^e}^_?{NK8~=1@HV{==8o{7h=e zq#}pGJo^M*^wl3smE3BB+56z{#InE#A~G&Tz&^A9QvV|s@uY3x$;_+o`?hqtT$2@P}#nL*1Pq0iKjNMs? z&zq^#s-`!@0zbh0Wcs|u1ANCAv~{13v5!Mj{NJ+g)7hK4PiHRv-j_oMoM&)UaG0~B zXRo6}hR(T>Co;*H61>i}?qkMj(5Ne<6(70L2f7rk(GPGob*r$CVq>8LWqckr_Yv$BWbb?RK0Y&s2zY$gruM7j`==g@OFSnWHh#I;U-j%lG5c`4ojUX>fDoIO zeIT|*$6V`m6`gKW&Z5jDLh-ks1Pb}&Lu~D(e6Z!g&Aoi~OGHP;W*UZN+O1*->eD-x zIyqXpiGwK}0Jm8CqpS#r+E;)KM1v3QtNvkGtbBC_n(sh-UDc!sfvp~F3VvEB3t!RV5B*!gJ_ z59USx7R_hl zt#yB53m?~VLO27r`Lc;eT=s0fXS&!{{CtlgZ&N;%C6Y1l(*VEj$u)k(g*&fXTa3O7 zZN&sH|FvX)$;g#b!QJycO1+-<6^6EV`|Cr$d*krdYPTW#5g)uts6#k<>uJiRE-Tz+4~|T*ZubO zeHaI3+Fsum$=&w`pcGsPS)6;g&mWo0+qp%&op-p;!}lv}7gP?|F5$n6H~e0PTDjqv z#*6dG&kUdY`rhH6@J@2n@#M|J)A;QH1z+w<)K9*RgU;6r0u8;|C@1Hrr5(!}1}bwn zvEbB=x!Vj*j0d%UCE=u8rO_haTdWrf6op$>VRaK8;9+&6Fy8yMLK@pzEkZztMP82` zV8d3KT3cdt|Au+!ooS5%d3potf(B;!* zXPITiixL^{(PeWft4bcCZ_I^0b*GC_b@?uex=}(3NG1`v?(9!?;}WL>v+5w?IYWDq z?<=Uq=kBie&X+wYW8E}HG8cz%lK&4qnpG{LsS~|h&0QGuEuNDE|>F3 z5Tr}2%pd3E0!21P%<}l-`CipH<9S8eN9!0fp2AZdPxE-q-X*oi8_z5MJn?w+WrL~l zw7mIu#`AjRIOEBgXgmw0<5QWR`^IbbJ5qbR@#K8Sc-%k8nxOmskQz`H^-V;7ClU2y z=B#QewwWR{fJyKA;c%jh59c7 zc`X7wrSY9R9w1fH-+1HuO5zm9H^8oR4BGx8wZ|J@m1O+=@ySW!!0#s-ANz%WNi$El z-Kax_0_#v=NZh*g%^+S3$YqhU2WxDP!psM27U(_9VjVf7FZ$s6Q#nj`T%VAbDUZ8eCS~|$pv2v=NNh09yfBv`l zdtBph;e_~;F9b_a;u87#sz%}Spe3=+JZLgeSg~&+6mHp_jY9E6%|PL+|2_tV{(t#< zD8wL|L}5Q9_2DS20)W4ZLh$FjE@QuHDG##$%lcjhQ?G4t>cNZTLQIaxrz@Lmd-$RV zTT%JmtrXGrLTfAg$&a&|SmenGM5cQBO?{y(-KBg=BpJmyN@J+u66pAn1L+G^jHt6{ z3&+x8FfpoU`-1&l(}IItllkPx-gu27z;B6aPRx5ltvbjt$+|aL9VZ}HTXf1#9Xy7< z#y@&l(eO-dKHUal&<}aZRBS4#cjoMb0zAr98XN7@1;R z6EJ2ZZp?|FWh_y>x!gd=Csg>7%4Yc}l4+~CCpPbZBew2<4PQ;!qZ{>?7K-ZQZyAZY zM)m{;BcC6vIUvw5ib{6*@{vhjeBKG8>3}vgVBy(gT6nf(S$H~kL3;DvU_^prRgH5# zrid}h({-R==#!L4`UCIp`ZtZQjn%Wce=R+%bF5*_Ob+X=oOt>8W11{u8mgz!>xO?I z_h`zwge9NX@Qt$b45?L(7x%?AEL-HX+!5zSBHQ6)2vbYlXZV+ zCOxD>_(svgIwv+|4hFc)v-%3|>F|~u4i3n7?B>1MHI?)3Nkx4o6+~4_V%~4minoOd z-mr1uXw+q4eW)4@l4gW}%Cl+UM)_V*Y@M>Ls?m-Q30K+1s^Sm9*vg#v?C~*nkzkCk z+(!?XmmUVAZ+6}q?353!+){?Nc{lL^QwW(Dc8<(b!v+xvhFcTM6&BTPbQDiSc&_og zoRcEFW<7?GZgFGv6;SgP=|OzNn)b7j)1Ds0jM||E%u_Z&o7ZmD{6kDzqTOB>6cn9z}jT!s0;ie}KtaFX-E`qZdZ5iXFX}xR9ftjLt`LPI`cj z^elzDzK6l5 z=)n(%4#-!bkDTm1JvGPL<^z#lN zuvqG+z~Ex(1 zh%ti|=$~9K7-~Pb9Xj4aWvmd!!Hy}cuct)ba|7ZIw(6O6z%SopV^#fI8pTBEBIJ^0 zAkM>iOVO}-=O8K8TC3q^Y>&|-CW8R(V=U)F&UNHe&?oYcQ@&#HyX^i~3z}xaEA9_0 zpaBUVNr*E9oFvr1LB8CFC4cJU5LfIafj;(ZU@55{xvh{VpE&6b$bG3HwG>7#Y~@{d z_a(R;aj2AT^>SL}vvMKSWnz3O&i`$y4^B9?y$5xB4a#e_*P?FJkUAIupKow?@0||O zT<=S?S)WQOA?WX2X72(yC$_%sMXZuHYi*%WU0P!NPQ)%rb zF6i=@pBp&GnB$cj$>{xZX#jsQJ}n`^9)qFglKm~9sStF47_7xM?XdMwpn{*h4+UoN zP`~B`N4n+P>4|PVQE5Et&D*{w#HWyL-pe?633l!3GdGNk=#RFNBJ-46Zq6I?b-%`M zSUu&}^QC>q%Ae9OFvbTz35XBsj+t2>RgG=I*E%NwrM#@alh3^MG)S`e3<-(xWj|bf z9^`9iI8dl_e*mx#YWV3%2F51A=+jMD?LDiL69tp-i}P}E!pDq0xw>rCRI{a68CT4bmj4i22 zv*tQc;ABFJQ)SZyz}Q*iB=f00`LfJ;fFV(^MEXUhLQ66Y!M|cq&Lcw{p>HQa3e47_ zw(qd%&>^`q2n88-Cy|&35(&>uhuscRZvChI?(Q9+CLO8!M6!A+qLZp=S8Av7n^h3b-RhGM+&6rgRT)k~C2d+sNb7-q@?s<)8YH@?Rlu z?$AsG6RsWJTy_e1;9&f9{;BW6V1!vg&+%uuXkK$L*^9{^T&Gli%Iyvq9(*Czg7626 zKRKY;f?28$HQw0ErI_yS|BJZyfsd-V8vZxQCRt!%7YrB#Bx+O?sL_BD1Goqqq7vK~ zNk}z-Rp>TSOJNtV5=gvR%;vI6TWxKttrTr-t1ay#h*mHmn4qFk|DsY&+q6!)v__>N zXym@%Gj}(CtnKqWzxVCu2cPVnJ9qw^IdkUBnKNh3d~FCd4PrZbP`?C!)4mTU+fFBw zYzUejYmd#u@EAnYhgcLOh+0fP1JHB;624aLSf`nj&~bvf>00#l1ma=wzpLeL%>kg4 z524xW{#x|V2~tf^MvA&Zs$F;Qpb)!tas<;5xzz}-XxQ; zlK~>%!2C?X#}Tuq;bibwENa z|L*2hJz=N6M$#t^7>M;^DYq%9;YqOUL#bw0AD%)sjy9;jmXNOpo-hS|#1-yV=&Zs| z)=Zo)Sd5QLGONiLeI&yX!p2K7Z^{e=?!wgEn zxhTT|b5+CLx`E%kO}lW6yvZ6Jk{gdMgA2QyCcV*q;j)J@t=L zvp~*Oq44w{$(tM(qN?2*rn_?w^6YEDhjo;DK$+5;T@}=On6Hxhs7{?|!9hFKa!K{s z7Thf@xOtlfPlO$9D>Di38U#FZkqgr?nz5g^3^i9nnnn5blIGZiQ4SH}0H>I;%#i=OEPz9g4Cfs5Wz z{k-^)82D#`2Q9C?4lma430^#iOU`3S1nRS>QtpjgMybnSk~gW`)zp;W_*-;AniuaT zp%&w&4i?&w=*JC?NyuYbv_3^0$tB;Q;u5u@NEUhjpQO2j6k3$Z^$gAbTAHhua=|ox zv<%w29s({(4V0<$_cfwKPL~-_ti0{!gNnrc8TO3w?{Srwx0?0xAY1B!z7vq^vk8=3 zOam6EW2^e{m8eM^CqF<}{%>YTyQW{BHKnHeLJ+|X1mz$3r8JplMb7Z@Nd~`61)keCQD%Zp0xI7wrn8zzoPxhV zs$d?2*VYz1h|NR4wqWz$$tbF&nDe59Rq5z~R;Bn@{ftqmr+ys;{)peTG^`gpuEn)x8x7f@lcuU5~8euSr$#-|5G_h^?sc2K@gr~yE;$j72unyE1( z*{)GbM{3Ln7ZX~1m}gQci7h2DTZzH&=Jr$ht}nP>gq!S#jiZav_;e4{`1nX@YkZ!G z`maUX6Nveb*(#ps@-DL~X!@6#B{!KhE4hHppBF8e#E#dL*gc{{p8T=cy-kccA2+w8 zOGK#}&5|-&zf)d{pxwfcHXJE@C$u8Cs*ecrI|g>gXlbRGt(pt+Tx@Dt-Oc~s44Jq5 z7X>ZKVtDRnObImnI0+;&^|wbZ!BNfnWpKy;@()Yt7~oeStYtQiE}Dd>F)6?4nm_~n>|fB}pK1E@VlhEVpmeYBpIFI^XgHvJ zTLrjFN@I&Ixh7WPXsGH{e|wN9KVnY_vQnpi{#0cPj#b*e@%1EV8@*&|to zKFxbgKrRPfH1is@WrW?RlBcMm&A))^9IgJD{DFcONgMOqCtJ9Q6i@cKRM+$Fci6FQS457|Kso8}~|!W~iU|r38UpSNr8d@+$O^ zRDVw=p*`vb@1T}koBx8!$^xio7V7~g)^jf76KA<6Cc=I&hzE6hm|w&Od_Tv{>V#fi zR8y%bSWKF7HEPiJV@iJ?F5g{!W&9n&?Jwhyou>08(j4rg)aM4JdBjfh3~83=23*&| z1nkB3%o*HIo(i=_mh9Sj{OR1*Y~m<;i94X?vHUE<)##BgNsV|Wx~?VolukdlFa3CI zK+J`1qt#n(wDgv7H1SS+EF@CnGq*JOU>{V|Y^VZi@*wbr+u)r8cuSM;RnOafP6-O_ znJ8z1t7tph5X!lLl9%`5ariLAwnIJkT^g;O9{YC$)G~8jp6PQ%{m0Z$f^nCbL0H^^)Esj}{aqXu^<#Yh zv~gmr=Z*vPveA^&*~GJqt(c0Z9gMrech^jyEN_{*Vmz0#q2(FXxtSDTtlPObB~-)5 zanY)t=9(UtdJDa+XIDv&=W%E8*^XLj#9@Rh@zwPAoNbZQ^R#nLv+@}2DQFT#HTrw1 zQycv5hN|JM{t=GF@uB%mT=&@OAMSt;TH&r(NpE!;dq947084^n)edz5wXoCy6sOq| zAB8H3t&ZN%5NiIkx!pCadFgdao^8>{C|5J42?{tY?22ZnbY7}cgVL^OkyCxd`IO2^ zJgNf7#Gv@oRN0gru-3ZNRFZN+vaQHXVn^JqPF_I73O56R0>qGiK85O4J2BfNMCZOI zjffJFAUI=|d~k$^1&;#0+RT?q@qatiM!MG=F5hvoUBV?4PT5q}WhT%i-Mc>ESetFE zzgGMx`h4*;qsfQw4YhARB~H)=iL2$DdtivqbWmOFpC)^!_EAy z4wK$SknG?yVfB%RIe-eQUAx<)^f{!~y(??4@NICsE_D%0ARTuG_u)$P;_7KCRnyi1 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

hGaRG5`CGu1lW}P4w(q&)(&; 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 diff --git a/core/sourcehook/generate/shworker/msvc9/shworker.sln b/core/sourcehook/generate/shworker/msvc9/shworker.sln new file mode 100644 index 0000000..87f5ddc --- /dev/null +++ b/core/sourcehook/generate/shworker/msvc9/shworker.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shworker", "shworker.vcproj", "{7CD76E64-A9DF-47DB-8A68-36297C67E557}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7CD76E64-A9DF-47DB-8A68-36297C67E557}.Debug|Win32.ActiveCfg = Debug|Win32 + {7CD76E64-A9DF-47DB-8A68-36297C67E557}.Debug|Win32.Build.0 = Debug|Win32 + {7CD76E64-A9DF-47DB-8A68-36297C67E557}.Release|Win32.ActiveCfg = Release|Win32 + {7CD76E64-A9DF-47DB-8A68-36297C67E557}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/core/sourcehook/generate/shworker/msvc9/shworker.vcproj b/core/sourcehook/generate/shworker/msvc9/shworker.vcproj new file mode 100644 index 0000000..b174ea4 --- /dev/null +++ b/core/sourcehook/generate/shworker/msvc9/shworker.vcproj @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/sourcehook/generate/shworker/shworker.cpp b/core/sourcehook/generate/shworker/shworker.cpp index be328ef..5e0047c 100644 --- a/core/sourcehook/generate/shworker/shworker.cpp +++ b/core/sourcehook/generate/shworker/shworker.cpp @@ -743,7 +743,7 @@ int main(int argc, const char **argv) const char *action = argv[1]; - if (strcasecmp(action, "hopter") == 0) + if (stricmp(action, "hopter") == 0) { const char *filenamein = argv[2]; const char *filenameout = argv[3]; @@ -751,7 +751,7 @@ int main(int argc, const char **argv) return action_hopter(argsnum, filenamein, filenameout); } - else if (strcasecmp(action, "iter") == 0) + else if (stricmp(action, "iter") == 0) { const char *filenamein = argv[2]; const char *filenameout = argv[3]; diff --git a/core/sourcehook/generate/sourcehook.h b/core/sourcehook/generate/sourcehook.h index 275cdf4..ba28315 100644 --- a/core/sourcehook/generate/sourcehook.h +++ b/core/sourcehook/generate/sourcehook.h @@ -1,5 +1,5 @@ /* ======== SourceHook ======== -* Copyright (C) 2004-2008 Metamod:Source Development Team +* Copyright (C) 2004-2010 Metamod:Source Development Team * No warranties of any kind * * License: zlib/libpng @@ -307,6 +307,20 @@ namespace SourceHook }; }; + template struct ReferenceUtil + { + typedef T plain_type; + typedef T* pointer_type; + typedef T& reference_type; + }; + + template struct ReferenceUtil + { + typedef T plain_type; + typedef T* pointer_type; + typedef T& reference_type; + }; + struct IHookContext { virtual ISHDelegate *GetNext() = 0; @@ -480,7 +494,7 @@ namespace SourceHook * @return Override Return Pointer the hookfunc should use (may differ from overrideRetPtr * when the hook func is being called as part of a recall */ - virtual IHookContext *SetupHookLoop(IHookManagerInfo *hi, void *vfnptr, void *thisptr, void **origentry, + virtual IHookContext *SetupHookLoop(IHookManagerInfo *hi, void *vfnptr, void *thisptr, void **origCallAddr, META_RES *statusPtr, META_RES *prevResPtr, META_RES *curResPtr, const void *origRetPtr, void *overrideRetPtr) = 0; @@ -579,10 +593,14 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) // only call these from the hook handlers directly! +#define MAKE_NOREF_VALUE(rettype) \ + *reinterpret_cast< ::SourceHook::ReferenceUtil::pointer_type >(0) + // If a hook on a function which returns a reference does not want to specify a return value, // it can use this macro. // ONLY USE THIS WITH MRES_IGNORED AND MRES_HANDLED !!! -#define RETURN_META_NOREF(result, rettype) do { SET_META_RESULT(result); return reinterpret_cast(*SH_GLOB_SHPTR); } while(0) +#define RETURN_META_NOREF(result, rettype) \ + RETURN_META_VALUE(result, MAKE_NOREF_VALUE(rettype)) // Why take a memfuncptr instead of iface and func when we have to deduce the iface anyway now? // Well, without it, there'd be no way to specify which overloaded version we want in _VALUE @@ -1163,7 +1181,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN0(hookname, rettype) \ @@ -1196,7 +1214,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN0_vafmt(hookname, rettype) \ @@ -1368,7 +1386,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN1(hookname, rettype, param1) \ @@ -1401,7 +1419,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN1_vafmt(hookname, rettype, param1) \ @@ -1573,7 +1591,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN2(hookname, rettype, param1, param2) \ @@ -1606,7 +1624,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN2_vafmt(hookname, rettype, param1, param2) \ @@ -1778,7 +1796,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN3(hookname, rettype, param1, param2, param3) \ @@ -1811,7 +1829,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN3_vafmt(hookname, rettype, param1, param2, param3) \ @@ -1983,7 +2001,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN4(hookname, rettype, param1, param2, param3, param4) \ @@ -2016,7 +2034,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN4_vafmt(hookname, rettype, param1, param2, param3, param4) \ @@ -2188,7 +2206,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN5(hookname, rettype, param1, param2, param3, param4, param5) \ @@ -2221,7 +2239,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN5_vafmt(hookname, rettype, param1, param2, param3, param4, param5) \ @@ -2393,7 +2411,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN6(hookname, rettype, param1, param2, param3, param4, param5, param6) \ @@ -2426,7 +2444,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN6_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6) \ @@ -2598,7 +2616,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN7(hookname, rettype, param1, param2, param3, param4, param5, param6, param7) \ @@ -2631,7 +2649,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN7_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7) \ @@ -2803,7 +2821,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN8(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8) \ @@ -2836,7 +2854,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN8_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8) \ @@ -3008,7 +3026,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN9(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ @@ -3041,7 +3059,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN9_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ @@ -3213,7 +3231,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN10(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ @@ -3246,7 +3264,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN10_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ @@ -3418,7 +3436,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN11(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ @@ -3451,7 +3469,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN11_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ @@ -3623,7 +3641,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN12(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ @@ -3656,7 +3674,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN12_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ @@ -3828,7 +3846,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN13(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ @@ -3861,7 +3879,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN13_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ @@ -4033,7 +4051,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN14(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ @@ -4066,7 +4084,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN14_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ @@ -4238,7 +4256,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN15(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ @@ -4271,7 +4289,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN15_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ @@ -4443,7 +4461,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN16(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ @@ -4476,7 +4494,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN16_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ @@ -6737,12 +6755,6 @@ SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Para namespace SourceHook { - template - void SetOverrideResult(ISourceHook *shptr, const RetType res) - { - *reinterpret_cast(shptr->GetOverrideRetPtr()) = res; - } - // SetOverrideResult used to be implemented like this: // SetOverrideResult(shptr, memfuncptr, return); // normally the compiler can deduce the return type from memfuncptr, but (at least msvc8) failed when it was a reference @@ -6767,6 +6779,14 @@ namespace SourceHook } }; + // For manual hooks: + // The rettype is passed in manually + template + OverrideFunctor SetOverrideResult() + { + return OverrideFunctor(); + } + template OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)()) { diff --git a/core/sourcehook/generate/sourcehook.hxx b/core/sourcehook/generate/sourcehook.hxx index 60bf039..921942c 100755 --- a/core/sourcehook/generate/sourcehook.hxx +++ b/core/sourcehook/generate/sourcehook.hxx @@ -1,5 +1,5 @@ /* ======== SourceHook ======== -* Copyright (C) 2004-2008 Metamod:Source Development Team +* Copyright (C) 2004-2010 Metamod:Source Development Team * No warranties of any kind * * License: zlib/libpng @@ -307,6 +307,20 @@ namespace SourceHook }; }; + template struct ReferenceUtil + { + typedef T plain_type; + typedef T* pointer_type; + typedef T& reference_type; + }; + + template struct ReferenceUtil + { + typedef T plain_type; + typedef T* pointer_type; + typedef T& reference_type; + }; + struct IHookContext { virtual ISHDelegate *GetNext() = 0; @@ -480,7 +494,7 @@ namespace SourceHook * @return Override Return Pointer the hookfunc should use (may differ from overrideRetPtr * when the hook func is being called as part of a recall */ - virtual IHookContext *SetupHookLoop(IHookManagerInfo *hi, void *vfnptr, void *thisptr, void **origentry, + virtual IHookContext *SetupHookLoop(IHookManagerInfo *hi, void *vfnptr, void *thisptr, void **origCallAddr, META_RES *statusPtr, META_RES *prevResPtr, META_RES *curResPtr, const void *origRetPtr, void *overrideRetPtr) = 0; @@ -579,10 +593,14 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) // only call these from the hook handlers directly! +#define MAKE_NOREF_VALUE(rettype) \ + *reinterpret_cast< ::SourceHook::ReferenceUtil::pointer_type >(0) + // If a hook on a function which returns a reference does not want to specify a return value, // it can use this macro. // ONLY USE THIS WITH MRES_IGNORED AND MRES_HANDLED !!! -#define RETURN_META_NOREF(result, rettype) do { SET_META_RESULT(result); return reinterpret_cast(*SH_GLOB_SHPTR); } while(0) +#define RETURN_META_NOREF(result, rettype) \ + RETURN_META_VALUE(result, MAKE_NOREF_VALUE(rettype)) // Why take a memfuncptr instead of iface and func when we have to deduce the iface anyway now? // Well, without it, there'd be no way to specify which overloaded version we want in _VALUE @@ -1163,7 +1181,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN$1(hookname, rettype@[$2,1,$1:, param$2@]) \ @@ -1196,7 +1214,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN$1_vafmt(hookname, rettype@[$2,1,$1:, param$2@]) \ @@ -1415,12 +1433,6 @@ SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(@[$2,1,$1|, :Param$2@]@[$1!=0:, @].. namespace SourceHook { - template - void SetOverrideResult(ISourceHook *shptr, const RetType res) - { - *reinterpret_cast(shptr->GetOverrideRetPtr()) = res; - } - // SetOverrideResult used to be implemented like this: // SetOverrideResult(shptr, memfuncptr, return); // normally the compiler can deduce the return type from memfuncptr, but (at least msvc8) failed when it was a reference @@ -1444,6 +1456,14 @@ namespace SourceHook *reinterpret_cast::type *>(shptr->GetOverrideRetPtr()) = res; } }; + + // For manual hooks: + // The rettype is passed in manually + template + OverrideFunctor SetOverrideResult() + { + return OverrideFunctor(); + } @[$1,0,$a: template OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)(@[$2,1,$1|, :Param$2@])) diff --git a/core/sourcehook/sh_list.h b/core/sourcehook/sh_list.h index 1e56b9d..21d57c0 100644 --- a/core/sourcehook/sh_list.h +++ b/core/sourcehook/sh_list.h @@ -1,5 +1,5 @@ /* ======== SourceMM ======== -* Copyright (C) 2004-2008 Metamod:Source Development Team +* Copyright (C) 2004-2010 Metamod:Source Development Team * No warranties of any kind * * License: zlib/libpng diff --git a/core/sourcehook/sh_memfuncinfo.h b/core/sourcehook/sh_memfuncinfo.h index 8614d93..13c40a6 100644 --- a/core/sourcehook/sh_memfuncinfo.h +++ b/core/sourcehook/sh_memfuncinfo.h @@ -1,5 +1,5 @@ /* ======== SourceHook ======== -* Copyright (C) 2004-2008 Metamod:Source Development Team +* Copyright (C) 2004-2010 Metamod:Source Development Team * No warranties of any kind * * License: zlib/libpng diff --git a/core/sourcehook/sh_memory.h b/core/sourcehook/sh_memory.h index f69d273..f3e03d0 100644 --- a/core/sourcehook/sh_memory.h +++ b/core/sourcehook/sh_memory.h @@ -1,5 +1,5 @@ /* ======== SourceHook ======== -* Copyright (C) 2004-2008 Metamod:Source Development Team +* Copyright (C) 2004-2010 Metamod:Source Development Team * No warranties of any kind * * License: zlib/libpng diff --git a/core/sourcehook/sh_pagealloc.h b/core/sourcehook/sh_pagealloc.h index 15400fc..0becac7 100644 --- a/core/sourcehook/sh_pagealloc.h +++ b/core/sourcehook/sh_pagealloc.h @@ -1,6 +1,9 @@ #ifndef __SH_PAGEALLOC_H__ #define __SH_PAGEALLOC_H__ +#include "sh_list.h" +#include "sh_memory.h" + # if SH_XP == SH_XP_WINAPI # include # elif SH_XP == SH_XP_POSIX @@ -53,6 +56,7 @@ namespace SourceHook bool isolated; // may contain only one AU size_t minAlignment; AUList allocUnits; + bool isRE; // true: RE, otherwise: RW void CheckGap(size_t gap_begin, size_t gap_end, size_t reqsize, size_t &smallestgap_pos, size_t &smallestgap_size, size_t &outAlignBytes) @@ -122,9 +126,11 @@ namespace SourceHook void *alignedAUBegin = reinterpret_cast( AUBegin + ((minAlignment - AUBegin % minAlignment) % minAlignment) ); - + if (addr == alignedAUBegin) { + DebugCleanMemory(reinterpret_cast(startPtr) + iter->begin_offset, + iter->size); allocUnits.erase(iter); return true; } @@ -133,6 +139,26 @@ namespace SourceHook return false; } + void DebugCleanMemory(unsigned char* start, size_t size) + { + bool wasRE = isRE; + if (isRE) + { + SetRW(); + } + + unsigned char* end = start + size; + for (unsigned char* p = start; p != end; ++p) + { + *p = 0xCC; + } + + if (wasRE) + { + SetRE(); + } + } + bool Contains(void *addr) { return addr >= startPtr && addr < reinterpret_cast(reinterpret_cast(startPtr) + size); @@ -146,6 +172,18 @@ namespace SourceHook VirtualFree(startPtr, 0, MEM_RELEASE); #endif } + + void SetRE() + { + SetMemAccess(startPtr, size, SH_MEM_READ | SH_MEM_EXEC); + isRE = true; + } + + void SetRW() + { + SetMemAccess(startPtr, size, SH_MEM_READ | SH_MEM_WRITE); + isRE = false; + } }; typedef List ARList; @@ -178,6 +216,7 @@ namespace SourceHook if (newRegion.startPtr) { + newRegion.SetRW(); m_Regions.push_back(newRegion); return true; } @@ -210,7 +249,7 @@ namespace SourceHook } public: - CPageAlloc(size_t minAlignment = 1 /* power of 2 */ ) : m_MinAlignment(minAlignment) + CPageAlloc(size_t minAlignment = 4 /* power of 2 */ ) : m_MinAlignment(minAlignment) { #if SH_XP == SH_XP_POSIX m_PageSize = sysconf(_SC_PAGESIZE); @@ -262,7 +301,7 @@ namespace SourceHook { if (iter->Contains(ptr)) { - SetMemAccess(iter->startPtr, iter->size, SH_MEM_READ | SH_MEM_EXEC); + iter->SetRE(); break; } } @@ -274,7 +313,7 @@ namespace SourceHook { if (iter->Contains(ptr)) { - SetMemAccess(iter->startPtr, iter->size, SH_MEM_READ | SH_MEM_WRITE); + iter->SetRW(); break; } } diff --git a/core/sourcehook/sh_stack.h b/core/sourcehook/sh_stack.h index e6269e6..5322db2 100644 --- a/core/sourcehook/sh_stack.h +++ b/core/sourcehook/sh_stack.h @@ -1,5 +1,5 @@ /* ======== SourceMM ======== -* Copyright (C) 2004-2008 Metamod:Source Development Team +* Copyright (C) 2004-2010 Metamod:Source Development Team * No warranties of any kind * * License: zlib/libpng diff --git a/core/sourcehook/sh_string.h b/core/sourcehook/sh_string.h index 79f96b8..6d6a8a5 100755 --- a/core/sourcehook/sh_string.h +++ b/core/sourcehook/sh_string.h @@ -1,5 +1,5 @@ /* ======== SourceMM ======== -* Copyright (C) 2004-2008 Metamod:Source Development Team +* Copyright (C) 2004-2010 Metamod:Source Development Team * No warranties of any kind * * License: zlib/libpng diff --git a/core/sourcehook/sh_tinyhash.h b/core/sourcehook/sh_tinyhash.h index 67f3adf..60b919c 100644 --- a/core/sourcehook/sh_tinyhash.h +++ b/core/sourcehook/sh_tinyhash.h @@ -1,5 +1,5 @@ /* ======== SourceMM ======== -* Copyright (C) 2004-2008 Metamod:Source Development Team +* Copyright (C) 2004-2010 Metamod:Source Development Team * No warranties of any kind * * License: zlib/libpng diff --git a/core/sourcehook/sourcehook.cpp b/core/sourcehook/sourcehook.cpp index 8bb9035..58f8086 100644 --- a/core/sourcehook/sourcehook.cpp +++ b/core/sourcehook/sourcehook.cpp @@ -1,5 +1,5 @@ /* ======== SourceHook ======== -* Copyright (C) 2004-2008 Metamod:Source Development Team +* Copyright (C) 2004-2010 Metamod:Source Development Team * No warranties of any kind * * License: zlib/libpng @@ -41,373 +41,33 @@ namespace SourceHook namespace Impl { - ////////////////////////////////////////////////////////////////////////// - // CProto - ////////////////////////////////////////////////////////////////////////// - void CProto::Fill(const ProtoInfo *pProto) - { - if (pProto == NULL) - m_Version = -1; - - m_ParamsPassInfo.clear(); - - if (pProto->paramsPassInfo[0].size == 0) - { - // Version 1 - m_Version = 0; - m_Convention = pProto->convention; - m_NumOfParams = pProto->numOfParams; - - m_RetPassInfo.size = pProto->retPassInfo.size; - m_RetPassInfo.type = pProto->retPassInfo.type; - m_RetPassInfo.flags = GetRealFlags(pProto->retPassInfo); - - m_RetPassInfo.pNormalCtor = NULL; - m_RetPassInfo.pCopyCtor = NULL; - m_RetPassInfo.pDtor = NULL; - m_RetPassInfo.pAssignOperator = NULL; - - - m_ParamsPassInfo.resize(pProto->numOfParams); - - for (int i = 1; i <= pProto->numOfParams; ++i) - { - m_ParamsPassInfo[i-1].size = pProto->paramsPassInfo[i].size; - m_ParamsPassInfo[i-1].type = pProto->paramsPassInfo[i].type; - m_ParamsPassInfo[i-1].flags = GetRealFlags(pProto->paramsPassInfo[i]); - - m_ParamsPassInfo[i-1].pNormalCtor = NULL; - m_ParamsPassInfo[i-1].pCopyCtor = NULL; - m_ParamsPassInfo[i-1].pDtor = NULL; - m_ParamsPassInfo[i-1].pAssignOperator = NULL; - } - } - else if (pProto->paramsPassInfo[0].size == 1) - { - // Version 2 - m_Version = 1; - m_Convention = pProto->convention; - m_NumOfParams = pProto->numOfParams; - - m_RetPassInfo.size = pProto->retPassInfo.size; - m_RetPassInfo.type = pProto->retPassInfo.type; - m_RetPassInfo.flags = pProto->retPassInfo.flags; - - m_RetPassInfo.pNormalCtor = pProto->retPassInfo2.pNormalCtor; - m_RetPassInfo.pCopyCtor = pProto->retPassInfo2.pCopyCtor; - m_RetPassInfo.pDtor = pProto->retPassInfo2.pDtor; - m_RetPassInfo.pAssignOperator = pProto->retPassInfo2.pAssignOperator; - - m_ParamsPassInfo.resize(pProto->numOfParams); - - for (int i = 1; i <= pProto->numOfParams; ++i) - { - m_ParamsPassInfo[i-1].size = pProto->paramsPassInfo[i].size; - m_ParamsPassInfo[i-1].type = pProto->paramsPassInfo[i].type; - m_ParamsPassInfo[i-1].flags = pProto->paramsPassInfo[i].flags; - - m_ParamsPassInfo[i-1].pNormalCtor = pProto->paramsPassInfo2[i].pNormalCtor; - m_ParamsPassInfo[i-1].pCopyCtor = pProto->paramsPassInfo2[i].pCopyCtor; - m_ParamsPassInfo[i-1].pDtor = pProto->paramsPassInfo2[i].pDtor; - m_ParamsPassInfo[i-1].pAssignOperator = pProto->paramsPassInfo2[i].pAssignOperator; - } - } - else - { - // Unknown - m_Version = -1; - } - } - - // Basic compat test - // Other than this, we assume that the plugins know what they're doing - bool CProto::operator == (const CProto &other) const - { - if (m_Version < 0 || other.GetVersion() < 0) - return false; - - if (m_NumOfParams != other.GetNumOfParams()) - return false; - - if (m_Convention != ProtoInfo::CallConv_Unknown && other.GetConvention() != ProtoInfo::CallConv_Unknown && - m_Convention != other.GetConvention()) - return false; - - if (GetRealSize(GetRet()) != GetRealSize(other.GetRet())) - return false; - - for (int i = 0; i < m_NumOfParams; ++i) - { - if (GetRealSize(GetParam(i)) != GetRealSize(other.GetParam(i))) - return false; - if (GetParam(i).type != PassInfo::PassType_Unknown && other.GetParam(i).type != PassInfo::PassType_Unknown) - { - if (GetParam(i).type != other.GetParam(i).type) - return false; - if (GetParam(i).flags != other.GetParam(i).flags) - return false; - } - } - - return true; - } - - bool CProto::ExactlyEqual(const CProto &other) const - { - if (m_Version != other.m_Version || - m_NumOfParams != other.m_NumOfParams || - m_Convention != other.m_Convention || - GetRet() != other.GetRet()) - { - return false; - } - - for (int i = 0; i < m_NumOfParams; ++i) - { - if(GetParam(i) != other.GetParam(i)) - return false; - } - - return true; - } - - ////////////////////////////////////////////////////////////////////////// - // CHookManager - ////////////////////////////////////////////////////////////////////////// - void CHookManager::SetInfo(int hookman_version, int vtbloffs, int vtblidx, - ProtoInfo *proto, void *hookfunc_vfnptr) - { - m_Version = hookman_version; - m_VtblOffs = vtbloffs; - m_VtblIdx = vtblidx; - m_Proto = proto; - m_HookfuncVfnptr = hookfunc_vfnptr; - } - ////////////////////////////////////////////////////////////////////////// // CVfnPtrList ////////////////////////////////////////////////////////////////////////// - CVfnPtr &CVfnPtrList::GetVfnPtr(void *vfnptr) + CVfnPtr *CVfnPtrList::GetVfnPtr(void *vfnptr) { iterator iter = find(vfnptr); if (iter == end()) { + // No vfnptr info object found + // --> create a new one CVfnPtr newVfnPtr(vfnptr); - push_back(newVfnPtr); - - return back(); - } - else - { - return *iter; - } - } - ////////////////////////////////////////////////////////////////////////// - // CVfnPtr - ////////////////////////////////////////////////////////////////////////// - - void CVfnPtr::AddHookMan(CHookManager *pHookMan) - { - List::iterator iter; - - // Don't accept invalid hook managers - if (!*pHookMan) - return; - - // Check whether this hook manager already exists; if yes, ignore. - iter = m_HookMans.find(pHookMan); - if (iter != m_HookMans.end()) - return; - - // It doesn't -> add it. Add it to the end of its version group. - for (iter = m_HookMans.begin(); iter != m_HookMans.end(); ++iter) - { - if ((*iter)->GetVersion() < pHookMan->GetVersion()) - break; - } - - bool isBeginning = iter == m_HookMans.begin(); - - m_HookMans.insert(iter, pHookMan); - - if (isBeginning) - { - pHookMan->IncrRef(this); - if (m_HookMans.size() > 1) + if (newVfnPtr.Init()) { - // If another hookman was used until now but this one is better - // (which it is because it's the first -> it has a higher version) - // -> switch! + push_back(newVfnPtr); - List::iterator second = m_HookMans.begin(); - ++second; - - (*second)->DecrRef(this); - } - - // Make sure that this vfnptr points at it - Patch(pHookMan->GetHookFunc()); - } - } - - bool CVfnPtr::HookManRemoved(CHookManager *pHookMan) - { - // Don't accept invalid hook managers - if (!*pHookMan) - return true; - - List::iterator iter = m_HookMans.find(pHookMan); - if (iter == m_HookMans.end()) - return true; // Didn't exist here anyway - - if (iter == m_HookMans.begin()) - { - // It is the first one! - pHookMan->DecrRef(this); - m_HookMans.erase(iter); - - if (m_HookMans.empty()) - return false; // No more hookmans -> let SH delete us - - // Activate second -> now first hookman - m_HookMans.front()->IncrRef(this); - Patch(m_HookMans.front()->GetHookFunc()); - } - else - { - m_HookMans.erase(iter); - } - return true; - } - - bool CVfnPtr::Patch(void *newValue) - { - if (!SetMemAccess(m_Ptr, sizeof(void*), SH_MEM_READ | SH_MEM_WRITE)) - { - return false; - } - - *reinterpret_cast(m_Ptr) = newValue; - - return true; - } - - CIface &CVfnPtr::GetIface(void *iface) - { - List::iterator iter = m_IfaceList.find(iface); - if (iter == m_IfaceList.end()) - { - CIface newIface(iface); - if (iface == NULL) - { - m_IfaceList.push_front(newIface); - return m_IfaceList.front(); + return &(back()); } else { - m_IfaceList.push_back(newIface); - return m_IfaceList.back(); + // Initialization failed. + return NULL; } } else { - return *iter; - } - } - - ////////////////////////////////////////////////////////////////////////// - // CHookIdManager - ////////////////////////////////////////////////////////////////////////// - CHookIDManager::CHookIDManager() - { - } - - int CHookIDManager::New(const CProto &proto, int vtbl_offs, int vtbl_idx, void *vfnptr, - void *adjustediface, Plugin plug, int thisptr_offs, ISHDelegate *handler, bool post) - { - Entry tmp(proto, vtbl_offs, vtbl_idx, vfnptr, adjustediface, plug, thisptr_offs, handler, post); - - size_t cursize = m_Entries.size(); - for (size_t i = 0; i < cursize; ++i) - { - if (m_Entries[i].isfree) - { - m_Entries[i] = tmp; - return static_cast(i) + 1; - } - } - - m_Entries.push_back(tmp); - return static_cast(m_Entries.size()); // return size() because hookid = id+1 anyway - } - - bool CHookIDManager::Remove(int hookid) - { - int realid = hookid - 1; - if (realid < 0 || realid >= static_cast(m_Entries.size()) || m_Entries[realid].isfree) - return false; - - m_Entries[realid].isfree = true; - - // :TODO: remove free ids from back sometimes ?? - - return true; - } - - const CHookIDManager::Entry * CHookIDManager::QueryHook(int hookid) - { - int realid = hookid - 1; - if (realid < 0 || realid >= static_cast(m_Entries.size()) || m_Entries[realid].isfree) - return NULL; - - return &m_Entries[realid]; - } - - void CHookIDManager::FindAllHooks(CVector &output, const CProto &proto, int vtbl_offs, - int vtbl_idx, void *adjustediface, Plugin plug, int thisptr_offs, ISHDelegate *handler, bool post) - { - // oh my god, a lot of parameters... - size_t cursize = m_Entries.size(); - for (size_t i = 0; i < cursize; ++i) - { - if (!m_Entries[i].isfree && m_Entries[i].proto == proto && m_Entries[i].vtbl_offs == vtbl_offs && - m_Entries[i].vtbl_idx == vtbl_idx && m_Entries[i].adjustediface == adjustediface && m_Entries[i].plug == plug && - m_Entries[i].thisptr_offs == thisptr_offs && m_Entries[i].handler->IsEqual(handler) && m_Entries[i].post == post) - { - output.push_back(static_cast(i) + 1); - } - } - } - - void CHookIDManager::FindAllHooks(CVector &output) - { - size_t cursize = m_Entries.size(); - for (size_t i = 0; i < cursize; ++i) - { - if (!m_Entries[i].isfree) - output.push_back(static_cast(i) + 1); - } - } - - void CHookIDManager::FindAllHooks(CVector &output, Plugin plug) - { - size_t cursize = m_Entries.size(); - for (size_t i = 0; i < cursize; ++i) - { - if (!m_Entries[i].isfree && m_Entries[i].plug == plug) - output.push_back(static_cast(i) + 1); - } - } - - - void CHookIDManager::RemoveAll(void *vfnptr) - { - size_t cursize = m_Entries.size(); - for (size_t i = 0; i < cursize; ++i) - { - if (!m_Entries[i].isfree && m_Entries[i].vfnptr == vfnptr) - m_Entries[i].isfree = true; + return &(*iter); } } @@ -480,9 +140,18 @@ namespace SourceHook break; } - CVfnPtr &vfnPtr = m_VfnPtrs.GetVfnPtr(cur_vfnptr); - vfnPtr.AddHookMan(m_HookManList.GetHookMan(hookManager)); - CIface &ifaceinst = vfnPtr.GetIface(adjustediface); + CVfnPtr *vfnPtr = m_VfnPtrs.GetVfnPtr(cur_vfnptr); + if (!vfnPtr) + { + // Could not create the vfnptr info object. + // This could be because a thunk generation on GCC + // has failed. See sourcehook_impl_cvfnptr.cpp + // for details. + return false; + } + + vfnPtr->AddHookMan(m_HookManList.GetHookMan(hookManager)); + CIface &ifaceinst = vfnPtr->GetIface(adjustediface); // Add the hook CHook hook(plug, thisptr_offs, handler, @@ -588,9 +257,7 @@ namespace SourceHook ctx_iter->VfnPtrRemoved(&(*vfnptr_iter)); } - vfnptr_iter->Revert(); - - m_VfnPtrs.erase(vfnptr_iter); + RevertAndRemoveVfnPtr(vfnptr_iter); } } @@ -598,6 +265,52 @@ namespace SourceHook return true; } + List::iterator CSourceHookImpl::RevertAndRemoveVfnPtr(List::iterator vfnptr_iter) + { + ICleanupTask *cleanupTask = vfnptr_iter->GetCleanupTask(); + + // Some vfnptrs require cleanup. + // Concrete case: on GCC, when the original vtable entry is not even + // we generate an even-aligned thunk to call the original function. + // If the vfnptr is being removed from a pre hook on the vfnptr + // we have to delay the cleanup of this thunk until the hook loop is done + // (because the orig function call mechanism is going to use the thunk). + + if (cleanupTask != NULL) + { + // If this vfnptr is in use in one of the hook loops running at the moment + // Schedule it for removal on the DEEPEST hook loop. + + size_t numOfContexts = m_ContextStack.size(); + // m_ContextStack.at(0) is the deepest hook context + // m_ContextStack.at(size-1) = m_ContextStack.front is the uppermost + + bool cleanupImmedieately = true; + + CVfnPtr *vfnPtrObjAddr = &(*vfnptr_iter); + for (size_t i = 0; i < numOfContexts; ++i) + { + CHookContext &context = m_ContextStack.at(i); + if (context.pVfnPtr == vfnPtrObjAddr) + { + // Found a hook context using this vfnptr at the moment. + context.m_CleanupTask = cleanupTask; + cleanupImmedieately = false; // Delay the cleanup + break; + } + } + + if (cleanupImmedieately) + { + cleanupTask->CleanupAndDeleteThis(); + } + } + + // Do the work + vfnptr_iter->Revert(); + return m_VfnPtrs.erase(vfnptr_iter); + } + void CSourceHookImpl::SetRes(META_RES res) { *m_ContextStack.front().pCurRes = res; @@ -675,10 +388,9 @@ namespace SourceHook // This vfnptr has no more hook managers // and asks to be removed. - vfnptr_iter->Revert(); - m_HookIDMan.RemoveAll(vfnptr_iter->GetPtr()); - vfnptr_iter = m_VfnPtrs.erase(vfnptr_iter); + + vfnptr_iter = RevertAndRemoveVfnPtr(vfnptr_iter); } else { @@ -710,7 +422,12 @@ namespace SourceHook void CSourceHookImpl::ResetIgnoreHooks(void *vfnptr) { if (!m_ContextStack.empty() && m_ContextStack.front().m_State == CHookContext::State_Ignore) - m_ContextStack.pop(); + { + // Actually use EndContext + // instead of m_ContextStack.pop directly + // because it runs the cleanup task if neccesary + EndContext(&(m_ContextStack.front())); + } } void *CSourceHookImpl::GetOrigVfnPtrEntry(void *vfnptr) @@ -753,7 +470,7 @@ namespace SourceHook curCtx.m_State = CHookContext::State_Dead; } - IHookContext *CSourceHookImpl::SetupHookLoop(IHookManagerInfo *hi, void *vfnptr, void *thisptr, void **origentry, META_RES *statusPtr, + IHookContext *CSourceHookImpl::SetupHookLoop(IHookManagerInfo *hi, void *vfnptr, void *thisptr, void **origCallAddr, META_RES *statusPtr, META_RES *prevResPtr, META_RES *curResPtr, const void *origRetPtr, void *overrideRetPtr) { CHookContext *pCtx = NULL; @@ -781,7 +498,8 @@ namespace SourceHook } else { - *origentry = (*vfnptr_iter)->GetOrigEntry(); + *origCallAddr = (*vfnptr_iter)->GetOrigCallAddr(); + oldctx->pVfnPtr = *vfnptr_iter; } oldctx->pOrigRet = origRetPtr; @@ -839,7 +557,7 @@ namespace SourceHook else { pCtx->pVfnPtr = *vfnptr_iter; - *origentry = pCtx->pVfnPtr->GetOrigEntry(); + *origCallAddr = pCtx->pVfnPtr->GetOrigCallAddr(); pCtx->pIface = pCtx->pVfnPtr->FindIface(thisptr); } @@ -855,6 +573,9 @@ namespace SourceHook void CSourceHookImpl::EndContext(IHookContext *pCtx) { + // Do clean up task, if any is associated with this context + m_ContextStack.front().DoCleanupTaskAndDeleteIt(); + // Then remove it m_ContextStack.pop(); } @@ -1085,9 +806,22 @@ namespace SourceHook { if (pVfnPtr == vfnptr) { - pVfnPtr = NULL; + // Don't set pVfnPtr = NULL here! + // It may be used still. + // RevertAndRemoveVfnPtr uses it to find the hook context + // to which to attach the cleanup task of the vfnptr. + + //pVfnPtr = NULL; m_State = State_Dead; } } + + void CHookContext::DoCleanupTaskAndDeleteIt() + { + if (m_CleanupTask != NULL) + { + m_CleanupTask->CleanupAndDeleteThis(); + } + } } } diff --git a/core/sourcehook/sourcehook.h b/core/sourcehook/sourcehook.h index 275cdf4..ba28315 100644 --- a/core/sourcehook/sourcehook.h +++ b/core/sourcehook/sourcehook.h @@ -1,5 +1,5 @@ /* ======== SourceHook ======== -* Copyright (C) 2004-2008 Metamod:Source Development Team +* Copyright (C) 2004-2010 Metamod:Source Development Team * No warranties of any kind * * License: zlib/libpng @@ -307,6 +307,20 @@ namespace SourceHook }; }; + template struct ReferenceUtil + { + typedef T plain_type; + typedef T* pointer_type; + typedef T& reference_type; + }; + + template struct ReferenceUtil + { + typedef T plain_type; + typedef T* pointer_type; + typedef T& reference_type; + }; + struct IHookContext { virtual ISHDelegate *GetNext() = 0; @@ -480,7 +494,7 @@ namespace SourceHook * @return Override Return Pointer the hookfunc should use (may differ from overrideRetPtr * when the hook func is being called as part of a recall */ - virtual IHookContext *SetupHookLoop(IHookManagerInfo *hi, void *vfnptr, void *thisptr, void **origentry, + virtual IHookContext *SetupHookLoop(IHookManagerInfo *hi, void *vfnptr, void *thisptr, void **origCallAddr, META_RES *statusPtr, META_RES *prevResPtr, META_RES *curResPtr, const void *origRetPtr, void *overrideRetPtr) = 0; @@ -579,10 +593,14 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) // only call these from the hook handlers directly! +#define MAKE_NOREF_VALUE(rettype) \ + *reinterpret_cast< ::SourceHook::ReferenceUtil::pointer_type >(0) + // If a hook on a function which returns a reference does not want to specify a return value, // it can use this macro. // ONLY USE THIS WITH MRES_IGNORED AND MRES_HANDLED !!! -#define RETURN_META_NOREF(result, rettype) do { SET_META_RESULT(result); return reinterpret_cast(*SH_GLOB_SHPTR); } while(0) +#define RETURN_META_NOREF(result, rettype) \ + RETURN_META_VALUE(result, MAKE_NOREF_VALUE(rettype)) // Why take a memfuncptr instead of iface and func when we have to deduce the iface anyway now? // Well, without it, there'd be no way to specify which overloaded version we want in _VALUE @@ -1163,7 +1181,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN0(hookname, rettype) \ @@ -1196,7 +1214,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN0_vafmt(hookname, rettype) \ @@ -1368,7 +1386,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN1(hookname, rettype, param1) \ @@ -1401,7 +1419,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN1_vafmt(hookname, rettype, param1) \ @@ -1573,7 +1591,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN2(hookname, rettype, param1, param2) \ @@ -1606,7 +1624,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN2_vafmt(hookname, rettype, param1, param2) \ @@ -1778,7 +1796,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN3(hookname, rettype, param1, param2, param3) \ @@ -1811,7 +1829,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN3_vafmt(hookname, rettype, param1, param2, param3) \ @@ -1983,7 +2001,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN4(hookname, rettype, param1, param2, param3, param4) \ @@ -2016,7 +2034,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN4_vafmt(hookname, rettype, param1, param2, param3, param4) \ @@ -2188,7 +2206,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN5(hookname, rettype, param1, param2, param3, param4, param5) \ @@ -2221,7 +2239,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN5_vafmt(hookname, rettype, param1, param2, param3, param4, param5) \ @@ -2393,7 +2411,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN6(hookname, rettype, param1, param2, param3, param4, param5, param6) \ @@ -2426,7 +2444,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN6_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6) \ @@ -2598,7 +2616,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN7(hookname, rettype, param1, param2, param3, param4, param5, param6, param7) \ @@ -2631,7 +2649,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN7_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7) \ @@ -2803,7 +2821,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN8(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8) \ @@ -2836,7 +2854,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN8_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8) \ @@ -3008,7 +3026,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN9(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ @@ -3041,7 +3059,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN9_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9) \ @@ -3213,7 +3231,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN10(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ @@ -3246,7 +3264,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN10_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10) \ @@ -3418,7 +3436,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN11(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ @@ -3451,7 +3469,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN11_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11) \ @@ -3623,7 +3641,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN12(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ @@ -3656,7 +3674,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN12_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12) \ @@ -3828,7 +3846,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN13(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ @@ -3861,7 +3879,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN13_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13) \ @@ -4033,7 +4051,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN14(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ @@ -4066,7 +4084,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN14_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14) \ @@ -4238,7 +4256,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN15(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ @@ -4271,7 +4289,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN15_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15) \ @@ -4443,7 +4461,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN16(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ @@ -4476,7 +4494,7 @@ SourceHook::CallClass *SH_GET_CALLCLASS(T *p) __SourceHook_ParamInfosM_##hookname, 0, __SH_EPI, __SourceHook_ParamInfos2M_##hookname }; \ void __SoureceHook_FHM_SetOverrideResult##hookname(::SourceHook::ISourceHook *shptr, rettype value) \ { \ - ::SourceHook::SetOverrideResult(shptr, value); \ + ::SourceHook::SetOverrideResult()(shptr, value); \ } #define SH_DECL_MANUALEXTERN16_vafmt(hookname, rettype, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10, param11, param12, param13, param14, param15, param16) \ @@ -6737,12 +6755,6 @@ SH_CALL2(Y *ptr, MFP mfp, RetType(X::*mfp2)(Param1, Param2, Param3, Param4, Para namespace SourceHook { - template - void SetOverrideResult(ISourceHook *shptr, const RetType res) - { - *reinterpret_cast(shptr->GetOverrideRetPtr()) = res; - } - // SetOverrideResult used to be implemented like this: // SetOverrideResult(shptr, memfuncptr, return); // normally the compiler can deduce the return type from memfuncptr, but (at least msvc8) failed when it was a reference @@ -6767,6 +6779,14 @@ namespace SourceHook } }; + // For manual hooks: + // The rettype is passed in manually + template + OverrideFunctor SetOverrideResult() + { + return OverrideFunctor(); + } + template OverrideFunctor SetOverrideResult(RetType (Iface::*mfp)()) { diff --git a/core/sourcehook/sourcehook_hookmangen.cpp b/core/sourcehook/sourcehook_hookmangen.cpp index ecc1765..287a643 100644 --- a/core/sourcehook/sourcehook_hookmangen.cpp +++ b/core/sourcehook/sourcehook_hookmangen.cpp @@ -1,5 +1,5 @@ /* ======== SourceHook ======== -* Copyright (C) 2004-2009 Metamod:Source Development Team +* Copyright (C) 2004-2010 Metamod:Source Development Team * No warranties of any kind * * License: zlib/libpng diff --git a/core/sourcehook/sourcehook_hookmangen.h b/core/sourcehook/sourcehook_hookmangen.h index 6caf2d4..9e565f7 100644 --- a/core/sourcehook/sourcehook_hookmangen.h +++ b/core/sourcehook/sourcehook_hookmangen.h @@ -1,5 +1,5 @@ /* ======== SourceHook ======== -* Copyright (C) 2004-2008 Metamod:Source Development Team +* Copyright (C) 2004-2010 Metamod:Source Development Team * No warranties of any kind * * License: zlib/libpng diff --git a/core/sourcehook/sourcehook_hookmangen_x86.h b/core/sourcehook/sourcehook_hookmangen_x86.h index d9d15d7..e98393b 100644 --- a/core/sourcehook/sourcehook_hookmangen_x86.h +++ b/core/sourcehook/sourcehook_hookmangen_x86.h @@ -1,6 +1,6 @@ /* ======== SourceHook ======== * vim: set ts=4 : -* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved. +* Copyright (C) 2004-2010 AlliedModders LLC. All rights reserved. * No warranties of any kind * * License: zlib/libpng diff --git a/core/sourcehook/sourcehook_impl.h b/core/sourcehook/sourcehook_impl.h index 5d225cc..cf5579e 100644 --- a/core/sourcehook/sourcehook_impl.h +++ b/core/sourcehook/sourcehook_impl.h @@ -1,5 +1,5 @@ /* ======== SourceHook ======== -* Copyright (C) 2004-2008 Metamod:Source Development Team +* Copyright (C) 2004-2010 Metamod:Source Development Team * No warranties of any kind * * License: zlib/libpng @@ -189,6 +189,10 @@ namespace SourceHook { struct CHookContext : IHookContext { + CHookContext() : m_CleanupTask(NULL) + { + } + enum State { State_Born, @@ -224,6 +228,8 @@ namespace SourceHook bool m_CallOrig; + ICleanupTask *m_CleanupTask; + void SkipPaused(List::iterator &iter, List &list) { while (iter != list.end() && iter->IsPaused()) @@ -238,12 +244,13 @@ namespace SourceHook void *GetOverrideRetPtr(); const void *GetOrigRetPtr(); bool ShouldCallOrig(); + void DoCleanupTaskAndDeleteIt(); }; class CVfnPtrList : public List { public: - CVfnPtr &GetVfnPtr(void *p); + CVfnPtr *GetVfnPtr(void *p); }; typedef CStack HookContextStack; @@ -259,6 +266,7 @@ namespace SourceHook bool SetHookPaused(int hookid, bool paused); CHookManList::iterator RemoveHookManager(CHookManList::iterator iter); + List::iterator RevertAndRemoveVfnPtr(List::iterator vfnptr_iter); public: CSourceHookImpl(); virtual ~CSourceHookImpl(); @@ -308,7 +316,7 @@ namespace SourceHook void DoRecall(); - IHookContext *SetupHookLoop(IHookManagerInfo *hi, void *vfnptr, void *thisptr, void **origentry, META_RES *statusPtr, + IHookContext *SetupHookLoop(IHookManagerInfo *hi, void *vfnptr, void *thisptr, void **origCallAddr, META_RES *statusPtr, META_RES *prevResPtr, META_RES *curResPtr, const void *origRetPtr, void *overrideRetPtr); void EndContext(IHookContext *pCtx); diff --git a/core/sourcehook/sourcehook_impl_chook.h b/core/sourcehook/sourcehook_impl_chook.h index e1ea76e..2050ed7 100644 --- a/core/sourcehook/sourcehook_impl_chook.h +++ b/core/sourcehook/sourcehook_impl_chook.h @@ -1,5 +1,5 @@ /* ======== SourceHook ======== -* Copyright (C) 2004-2008 Metamod:Source Development Team +* Copyright (C) 2004-2010 Metamod:Source Development Team * No warranties of any kind * * License: zlib/libpng diff --git a/core/sourcehook/sourcehook_impl_chookidman.cpp b/core/sourcehook/sourcehook_impl_chookidman.cpp new file mode 100644 index 0000000..29a3d09 --- /dev/null +++ b/core/sourcehook/sourcehook_impl_chookidman.cpp @@ -0,0 +1,111 @@ +/* ======== SourceHook ======== +* Copyright (C) 2004-2010 Metamod:Source Development Team +* No warranties of any kind +* +* License: zlib/libpng +* +* Author(s): Pavol "PM OnoTo" Marko +* Contributors: Scott "Damaged Soul" Ehlert +* ============================ +*/ + +#include "sourcehook_impl.h" + +namespace SourceHook +{ + namespace Impl + { + CHookIDManager::CHookIDManager() + { + } + + int CHookIDManager::New(const CProto &proto, int vtbl_offs, int vtbl_idx, void *vfnptr, + void *adjustediface, Plugin plug, int thisptr_offs, ISHDelegate *handler, bool post) + { + Entry tmp(proto, vtbl_offs, vtbl_idx, vfnptr, adjustediface, plug, thisptr_offs, handler, post); + + size_t cursize = m_Entries.size(); + for (size_t i = 0; i < cursize; ++i) + { + if (m_Entries[i].isfree) + { + m_Entries[i] = tmp; + return static_cast(i) + 1; + } + } + + m_Entries.push_back(tmp); + return static_cast(m_Entries.size()); // return size() because hookid = id+1 anyway + } + + bool CHookIDManager::Remove(int hookid) + { + int realid = hookid - 1; + if (realid < 0 || realid >= static_cast(m_Entries.size()) || m_Entries[realid].isfree) + return false; + + m_Entries[realid].isfree = true; + + // :TODO: remove free ids from back sometimes ?? + + return true; + } + + const CHookIDManager::Entry * CHookIDManager::QueryHook(int hookid) + { + int realid = hookid - 1; + if (realid < 0 || realid >= static_cast(m_Entries.size()) || m_Entries[realid].isfree) + return NULL; + + return &m_Entries[realid]; + } + + void CHookIDManager::FindAllHooks(CVector &output, const CProto &proto, int vtbl_offs, + int vtbl_idx, void *adjustediface, Plugin plug, int thisptr_offs, ISHDelegate *handler, bool post) + { + // oh my god, a lot of parameters... + size_t cursize = m_Entries.size(); + for (size_t i = 0; i < cursize; ++i) + { + if (!m_Entries[i].isfree && m_Entries[i].proto == proto && m_Entries[i].vtbl_offs == vtbl_offs && + m_Entries[i].vtbl_idx == vtbl_idx && m_Entries[i].adjustediface == adjustediface && m_Entries[i].plug == plug && + m_Entries[i].thisptr_offs == thisptr_offs && m_Entries[i].handler->IsEqual(handler) && m_Entries[i].post == post) + { + output.push_back(static_cast(i) + 1); + } + } + } + + void CHookIDManager::FindAllHooks(CVector &output) + { + size_t cursize = m_Entries.size(); + for (size_t i = 0; i < cursize; ++i) + { + if (!m_Entries[i].isfree) + output.push_back(static_cast(i) + 1); + } + } + + void CHookIDManager::FindAllHooks(CVector &output, Plugin plug) + { + size_t cursize = m_Entries.size(); + for (size_t i = 0; i < cursize; ++i) + { + if (!m_Entries[i].isfree && m_Entries[i].plug == plug) + output.push_back(static_cast(i) + 1); + } + } + + + void CHookIDManager::RemoveAll(void *vfnptr) + { + size_t cursize = m_Entries.size(); + for (size_t i = 0; i < cursize; ++i) + { + if (!m_Entries[i].isfree && m_Entries[i].vfnptr == vfnptr) + m_Entries[i].isfree = true; + } + } + + } +} diff --git a/core/sourcehook/sourcehook_impl_chookidman.h b/core/sourcehook/sourcehook_impl_chookidman.h index 20dfeba..03f0bc5 100644 --- a/core/sourcehook/sourcehook_impl_chookidman.h +++ b/core/sourcehook/sourcehook_impl_chookidman.h @@ -1,5 +1,5 @@ /* ======== SourceHook ======== -* Copyright (C) 2004-2008 Metamod:Source Development Team +* Copyright (C) 2004-2010 Metamod:Source Development Team * No warranties of any kind * * License: zlib/libpng diff --git a/core/sourcehook/sourcehook_impl_chookmaninfo.cpp b/core/sourcehook/sourcehook_impl_chookmaninfo.cpp new file mode 100644 index 0000000..639b7a2 --- /dev/null +++ b/core/sourcehook/sourcehook_impl_chookmaninfo.cpp @@ -0,0 +1,84 @@ +/* ======== SourceHook ======== +* Copyright (C) 2004-2010 Metamod:Source Development Team +* No warranties of any kind +* +* License: zlib/libpng +* +* Author(s): Pavol "PM OnoTo" Marko +* Contributors: Scott "Damaged Soul" Ehlert +* ============================ +*/ + +#include "sourcehook_impl.h" + +namespace SourceHook +{ + namespace Impl + { + CHookManager::CHookManager(Plugin ownerPlugin, HookManagerPubFunc pubFunc) + : m_OwnerPlugin(ownerPlugin), m_PubFunc(pubFunc), m_Version(-1) + { + // Query pubfunc + // -> Should call SetInfo and set all the other variables! + if (m_PubFunc(false, this) != 0) + { + // Error! + m_Version = -1; + } + } + + void CHookManager::SetInfo(int hookman_version, int vtbloffs, int vtblidx, + ProtoInfo *proto, void *hookfunc_vfnptr) + { + m_Version = hookman_version; + m_VtblOffs = vtbloffs; + m_VtblIdx = vtblidx; + m_Proto = proto; + m_HookfuncVfnptr = hookfunc_vfnptr; + } + + void CHookManager::Register() + { + m_PubFunc(true, this); + } + + void CHookManager::Unregister() + { + m_PubFunc(true, NULL); + } + + void CHookManager::IncrRef(CVfnPtr *pVfnPtr) + { + m_VfnPtrs.push_back(pVfnPtr); + if (m_VfnPtrs.size() == 1) + Register(); + } + + void CHookManager::DecrRef(CVfnPtr *pVfnPtr) + { + m_VfnPtrs.remove(pVfnPtr); + if (m_VfnPtrs.empty()) + Unregister(); + } + + CHookManager *CHookManList::GetHookMan(Plugin plug, HookManagerPubFunc pubFunc) + { + CHookManager hm(plug, pubFunc); + return GetHookMan(hm); + } + + CHookManager *CHookManList::GetHookMan(CHookManager &hm) + { + iterator iter = find(hm); + if (iter == end()) + { + push_back(hm); + return &(back()); + } + else + { + return &(*iter); + } + } + } +} diff --git a/core/sourcehook/sourcehook_impl_chookmaninfo.h b/core/sourcehook/sourcehook_impl_chookmaninfo.h index 03de9d7..6a805ea 100644 --- a/core/sourcehook/sourcehook_impl_chookmaninfo.h +++ b/core/sourcehook/sourcehook_impl_chookmaninfo.h @@ -1,5 +1,5 @@ /* ======== SourceHook ======== -* Copyright (C) 2004-2008 Metamod:Source Development Team +* Copyright (C) 2004-2010 Metamod:Source Development Team * No warranties of any kind * * License: zlib/libpng @@ -46,7 +46,7 @@ namespace SourceHook }; // *** Interface *** - inline CHookManager(Plugin ownerPlugin, HookManagerPubFunc pubFunc); + CHookManager(Plugin ownerPlugin, HookManagerPubFunc pubFunc); inline bool operator==(const Descriptor &other) const; inline bool operator==(const CHookManager &other) const; @@ -60,11 +60,11 @@ namespace SourceHook inline void *GetHookFunc() const; inline HookManagerPubFunc GetPubFunc() const; - inline void Register(); - inline void Unregister(); + void Register(); + void Unregister(); - inline void IncrRef(CVfnPtr *pVfnPtr); - inline void DecrRef(CVfnPtr *pVfnPtr); + void IncrRef(CVfnPtr *pVfnPtr); + void DecrRef(CVfnPtr *pVfnPtr); List &GetVfnPtrList() { @@ -79,22 +79,11 @@ namespace SourceHook class CHookManList : public List { public: - inline CHookManager *GetHookMan(Plugin plug, HookManagerPubFunc pubFunc); - inline CHookManager *GetHookMan(CHookManager &hm); + CHookManager *GetHookMan(Plugin plug, HookManagerPubFunc pubFunc); + CHookManager *GetHookMan(CHookManager &hm); }; - // *** Implementation *** - inline CHookManager::CHookManager(Plugin ownerPlugin, HookManagerPubFunc pubFunc) - : m_OwnerPlugin(ownerPlugin), m_PubFunc(pubFunc), m_Version(-1) - { - // Query pubfunc - // -> Should call SetInfo and set all the other variables! - if (m_PubFunc(false, this) != 0) - { - // Error! - m_Version = -1; - } - } + // *** Implementation **/ inline CHookManager::operator bool() const { @@ -147,50 +136,6 @@ namespace SourceHook { return m_PubFunc; } - - inline void CHookManager::Register() - { - m_PubFunc(true, this); - } - - inline void CHookManager::Unregister() - { - m_PubFunc(true, NULL); - } - - inline void CHookManager::IncrRef(CVfnPtr *pVfnPtr) - { - m_VfnPtrs.push_back(pVfnPtr); - if (m_VfnPtrs.size() == 1) - Register(); - } - - inline void CHookManager::DecrRef(CVfnPtr *pVfnPtr) - { - m_VfnPtrs.remove(pVfnPtr); - if (m_VfnPtrs.empty()) - Unregister(); - } - - inline CHookManager *CHookManList::GetHookMan(Plugin plug, HookManagerPubFunc pubFunc) - { - CHookManager hm(plug, pubFunc); - return GetHookMan(hm); - } - - inline CHookManager *CHookManList::GetHookMan(CHookManager &hm) - { - iterator iter = find(hm); - if (iter == end()) - { - push_back(hm); - return &(back()); - } - else - { - return &(*iter); - } - } } } diff --git a/core/sourcehook/sourcehook_impl_ciface.h b/core/sourcehook/sourcehook_impl_ciface.h index 7f3c069..978c16a 100644 --- a/core/sourcehook/sourcehook_impl_ciface.h +++ b/core/sourcehook/sourcehook_impl_ciface.h @@ -1,5 +1,5 @@ /* ======== SourceHook ======== -* Copyright (C) 2004-2008 Metamod:Source Development Team +* Copyright (C) 2004-2010 Metamod:Source Development Team * No warranties of any kind * * License: zlib/libpng diff --git a/core/sourcehook/sourcehook_impl_cleanuptask.h b/core/sourcehook/sourcehook_impl_cleanuptask.h new file mode 100644 index 0000000..7f3e0fe --- /dev/null +++ b/core/sourcehook/sourcehook_impl_cleanuptask.h @@ -0,0 +1,29 @@ +/* ======== SourceHook ======== +* Copyright (C) 2004-2010 Metamod:Source Development Team +* No warranties of any kind +* +* License: zlib/libpng +* +* Author(s): Pavol "PM OnoTo" Marko +* ============================ +*/ + +#ifndef __SOURCEHOOK_IMPL_CLEANUPTASK_H__ +#define __SOURCEHOOK_IMPL_CLEANUPTASK_H__ + + +namespace SourceHook +{ + namespace Impl + { + class ICleanupTask + { + public: + virtual void CleanupAndDeleteThis() = 0; + }; + } +} + +// __SOURCEHOOK_IMPL_CLEANUPTASK_H__ +#endif + diff --git a/core/sourcehook/sourcehook_impl_cproto.cpp b/core/sourcehook/sourcehook_impl_cproto.cpp new file mode 100644 index 0000000..ff8af28 --- /dev/null +++ b/core/sourcehook/sourcehook_impl_cproto.cpp @@ -0,0 +1,145 @@ +/* ======== SourceHook ======== +* Copyright (C) 2004-2010 Metamod:Source Development Team +* No warranties of any kind +* +* License: zlib/libpng +* +* Author(s): Pavol "PM OnoTo" Marko +* ============================ +*/ + +#include "sourcehook_impl.h" + +namespace SourceHook +{ + namespace Impl + { + void CProto::Fill(const ProtoInfo *pProto) + { + if (pProto == NULL) + m_Version = -1; + + m_ParamsPassInfo.clear(); + + if (pProto->paramsPassInfo[0].size == 0) + { + // Version 1 + m_Version = 0; + m_Convention = pProto->convention; + m_NumOfParams = pProto->numOfParams; + + m_RetPassInfo.size = pProto->retPassInfo.size; + m_RetPassInfo.type = pProto->retPassInfo.type; + m_RetPassInfo.flags = GetRealFlags(pProto->retPassInfo); + + m_RetPassInfo.pNormalCtor = NULL; + m_RetPassInfo.pCopyCtor = NULL; + m_RetPassInfo.pDtor = NULL; + m_RetPassInfo.pAssignOperator = NULL; + + + m_ParamsPassInfo.resize(pProto->numOfParams); + + for (int i = 1; i <= pProto->numOfParams; ++i) + { + m_ParamsPassInfo[i-1].size = pProto->paramsPassInfo[i].size; + m_ParamsPassInfo[i-1].type = pProto->paramsPassInfo[i].type; + m_ParamsPassInfo[i-1].flags = GetRealFlags(pProto->paramsPassInfo[i]); + + m_ParamsPassInfo[i-1].pNormalCtor = NULL; + m_ParamsPassInfo[i-1].pCopyCtor = NULL; + m_ParamsPassInfo[i-1].pDtor = NULL; + m_ParamsPassInfo[i-1].pAssignOperator = NULL; + } + } + else if (pProto->paramsPassInfo[0].size == 1) + { + // Version 2 + m_Version = 1; + m_Convention = pProto->convention; + m_NumOfParams = pProto->numOfParams; + + m_RetPassInfo.size = pProto->retPassInfo.size; + m_RetPassInfo.type = pProto->retPassInfo.type; + m_RetPassInfo.flags = pProto->retPassInfo.flags; + + m_RetPassInfo.pNormalCtor = pProto->retPassInfo2.pNormalCtor; + m_RetPassInfo.pCopyCtor = pProto->retPassInfo2.pCopyCtor; + m_RetPassInfo.pDtor = pProto->retPassInfo2.pDtor; + m_RetPassInfo.pAssignOperator = pProto->retPassInfo2.pAssignOperator; + + m_ParamsPassInfo.resize(pProto->numOfParams); + + for (int i = 1; i <= pProto->numOfParams; ++i) + { + m_ParamsPassInfo[i-1].size = pProto->paramsPassInfo[i].size; + m_ParamsPassInfo[i-1].type = pProto->paramsPassInfo[i].type; + m_ParamsPassInfo[i-1].flags = pProto->paramsPassInfo[i].flags; + + m_ParamsPassInfo[i-1].pNormalCtor = pProto->paramsPassInfo2[i].pNormalCtor; + m_ParamsPassInfo[i-1].pCopyCtor = pProto->paramsPassInfo2[i].pCopyCtor; + m_ParamsPassInfo[i-1].pDtor = pProto->paramsPassInfo2[i].pDtor; + m_ParamsPassInfo[i-1].pAssignOperator = pProto->paramsPassInfo2[i].pAssignOperator; + } + } + else + { + // Unknown + m_Version = -1; + } + } + + // Basic compat test + // Other than this, we assume that the plugins know what they're doing + bool CProto::operator == (const CProto &other) const + { + if (m_Version < 0 || other.GetVersion() < 0) + return false; + + if (m_NumOfParams != other.GetNumOfParams()) + return false; + + if (m_Convention != ProtoInfo::CallConv_Unknown && other.GetConvention() != ProtoInfo::CallConv_Unknown && + m_Convention != other.GetConvention()) + return false; + + if (GetRealSize(GetRet()) != GetRealSize(other.GetRet())) + return false; + + for (int i = 0; i < m_NumOfParams; ++i) + { + if (GetRealSize(GetParam(i)) != GetRealSize(other.GetParam(i))) + return false; + if (GetParam(i).type != PassInfo::PassType_Unknown && other.GetParam(i).type != PassInfo::PassType_Unknown) + { + if (GetParam(i).type != other.GetParam(i).type) + return false; + if (GetParam(i).flags != other.GetParam(i).flags) + return false; + } + } + + return true; + } + + bool CProto::ExactlyEqual(const CProto &other) const + { + if (m_Version != other.m_Version || + m_NumOfParams != other.m_NumOfParams || + m_Convention != other.m_Convention || + GetRet() != other.GetRet()) + { + return false; + } + + for (int i = 0; i < m_NumOfParams; ++i) + { + if(GetParam(i) != other.GetParam(i)) + return false; + } + + return true; + } + + } +} diff --git a/core/sourcehook/sourcehook_impl_cproto.h b/core/sourcehook/sourcehook_impl_cproto.h index b11b925..cb436f1 100644 --- a/core/sourcehook/sourcehook_impl_cproto.h +++ b/core/sourcehook/sourcehook_impl_cproto.h @@ -1,5 +1,5 @@ /* ======== SourceHook ======== -* Copyright (C) 2004-2008 Metamod:Source Development Team +* Copyright (C) 2004-2010 Metamod:Source Development Team * No warranties of any kind * * License: zlib/libpng diff --git a/core/sourcehook/sourcehook_impl_cvfnptr.cpp b/core/sourcehook/sourcehook_impl_cvfnptr.cpp new file mode 100644 index 0000000..5159b0c --- /dev/null +++ b/core/sourcehook/sourcehook_impl_cvfnptr.cpp @@ -0,0 +1,253 @@ +/* ======== SourceHook ======== +* Copyright (C) 2004-2010 Metamod:Source Development Team +* No warranties of any kind +* +* License: zlib/libpng +* +* Author(s): Pavol "PM OnoTo" Marko +* ============================ +*/ + +#include "sourcehook_impl.h" + +namespace SourceHook +{ + namespace Impl + { + CPageAlloc CVfnPtr::ms_AlignedPageAllocator(8); + + CVfnPtr::CVfnPtr(void *ptr) + : m_Ptr(ptr), m_OrigEntry(*reinterpret_cast(m_Ptr)), + m_OrigCallThunk(NULL) + { + } + + CVfnPtr::~CVfnPtr() + { + if (!m_HookMans.empty()) + m_HookMans.front()->DecrRef(this); + } + + bool CVfnPtr::Init() + { + // Initalize the vfn ptr info object. + + // If we're running on GCC and the original vtable entry is odd + // we have a problem. + // The hook functions use non-virtual member function pointers to + // call the original function (see sourcehook.hxx, SH_SETUP_MFP and SH_CALL_ORIG) + // GCC has the same format for virtual and non-virtual MFPs: + // virtual ones have an odd value as "funcptr" where the offset into the vtable is encoded + // non-virtual ones have the direct function pointer as "funcptr", assuming that it is even + + // When m_OrigEntry is odd, GCC's runtime MFP calling code interpretes it as a virtual + // function call though we want to call the function in a non-virtual way + // (the original function call mechanism between the pre and post hook loop has to bypass + // the virtual calling mechanism in order to call the original function). + +#if SH_COMP==SH_COMP_GCC + if ((((ptrdiff_t)m_OrigEntry) & 1) != 0) + { + // Odd orig entry. + if (SH_PTRSIZE != 4) + { + // We only have code for IA32 atm! + return false; + } + + // Generate a new thunk + m_OrigCallThunk = ms_AlignedPageAllocator.Alloc(5); + ms_AlignedPageAllocator.SetRW(m_OrigCallThunk); + + unsigned char* thunkBase = reinterpret_cast(m_OrigCallThunk); + *(thunkBase + 0) = 0xE9; // offset jump, immediate operand + ptrdiff_t *offsetAddr = reinterpret_cast(thunkBase + 1); + + // destination = src + offset + 5 + // <=> offset = destination - src - 5 + *offsetAddr = + (reinterpret_cast(m_OrigEntry) - thunkBase) - 5; + + ms_AlignedPageAllocator.SetRE(m_OrigCallThunk); + } +#endif + return true; + } + + class CVfnPtrOrigThunkCleanup : public ICleanupTask + { + CPageAlloc *m_Allocator; + void *m_AddrToFree; + + public: + CVfnPtrOrigThunkCleanup(CPageAlloc *allocator, void *addrToFree) : + m_Allocator(allocator), m_AddrToFree(addrToFree) + { + } + + virtual void CleanupAndDeleteThis() + { + m_Allocator->Free(m_AddrToFree); + delete this; + } + }; + + ICleanupTask* CVfnPtr::GetCleanupTask() + { + if (m_OrigCallThunk != NULL) + { + return new CVfnPtrOrigThunkCleanup(&ms_AlignedPageAllocator, m_OrigCallThunk); + } + else + { + return NULL; + } + } + + void* CVfnPtr::GetOrigCallAddr() const + { + if (m_OrigCallThunk) + { + return m_OrigCallThunk; + } + else + { + return m_OrigEntry; + } + } + + bool CVfnPtr::Revert() + { + // Only patch the vfnptr back if the module is still in memory + // If it's not, do not remove stuff like we did before + // First off we did it wrong (shutdown the whole hookman, uh..) and secondly applications may be + // confused by RemoveHook returning false then (yeah, I know, I made this one up, no one checks for RemoveHook error) + if (ModuleInMemory(reinterpret_cast(m_Ptr), SH_PTRSIZE)) + { + return Patch(m_OrigEntry); + } + else + { + return true; + } + } + + CIface *CVfnPtr::FindIface(void *iface) + { + List::iterator iter = m_IfaceList.find(iface); + if (iter == m_IfaceList.end()) + return NULL; + else + return &(*iter); + } + + void CVfnPtr::AddHookMan(CHookManager *pHookMan) + { + List::iterator iter; + + // Don't accept invalid hook managers + if (!*pHookMan) + return; + + // Check whether this hook manager already exists; if yes, ignore. + iter = m_HookMans.find(pHookMan); + if (iter != m_HookMans.end()) + return; + + // It doesn't -> add it. Add it to the end of its version group. + for (iter = m_HookMans.begin(); iter != m_HookMans.end(); ++iter) + { + if ((*iter)->GetVersion() < pHookMan->GetVersion()) + break; + } + + bool isBeginning = iter == m_HookMans.begin(); + + m_HookMans.insert(iter, pHookMan); + + if (isBeginning) + { + pHookMan->IncrRef(this); + if (m_HookMans.size() > 1) + { + // If another hookman was used until now but this one is better + // (which it is because it's the first -> it has a higher version) + // -> switch! + + List::iterator second = m_HookMans.begin(); + ++second; + + (*second)->DecrRef(this); + } + + // Make sure that this vfnptr points at it + Patch(pHookMan->GetHookFunc()); + } + } + + bool CVfnPtr::HookManRemoved(CHookManager *pHookMan) + { + // Don't accept invalid hook managers + if (!*pHookMan) + return true; + + List::iterator iter = m_HookMans.find(pHookMan); + if (iter == m_HookMans.end()) + return true; // Didn't exist here anyway + + if (iter == m_HookMans.begin()) + { + // It is the first one! + pHookMan->DecrRef(this); + m_HookMans.erase(iter); + + if (m_HookMans.empty()) + return false; // No more hookmans -> let SH delete us + + // Activate second -> now first hookman + m_HookMans.front()->IncrRef(this); + Patch(m_HookMans.front()->GetHookFunc()); + } + else + { + m_HookMans.erase(iter); + } + return true; + } + + bool CVfnPtr::Patch(void *newValue) + { + if (!SetMemAccess(m_Ptr, sizeof(void*), SH_MEM_READ | SH_MEM_WRITE)) + { + return false; + } + + *reinterpret_cast(m_Ptr) = newValue; + + return true; + } + + CIface &CVfnPtr::GetIface(void *iface) + { + List::iterator iter = m_IfaceList.find(iface); + if (iter == m_IfaceList.end()) + { + CIface newIface(iface); + if (iface == NULL) + { + m_IfaceList.push_front(newIface); + return m_IfaceList.front(); + } + else + { + m_IfaceList.push_back(newIface); + return m_IfaceList.back(); + } + } + else + { + return *iter; + } + } + } +} diff --git a/core/sourcehook/sourcehook_impl_cvfnptr.h b/core/sourcehook/sourcehook_impl_cvfnptr.h index edb1c7c..1575728 100644 --- a/core/sourcehook/sourcehook_impl_cvfnptr.h +++ b/core/sourcehook/sourcehook_impl_cvfnptr.h @@ -1,5 +1,5 @@ /* ======== SourceHook ======== -* Copyright (C) 2004-2008 Metamod:Source Development Team +* Copyright (C) 2004-2010 Metamod:Source Development Team * No warranties of any kind * * License: zlib/libpng @@ -13,6 +13,8 @@ #include "sh_list.h" #include "sh_memory.h" +#include "sh_pagealloc.h" +#include "sourcehook_impl_cleanuptask.h" namespace SourceHook { @@ -20,9 +22,12 @@ namespace SourceHook { class CVfnPtr { + static CPageAlloc ms_AlignedPageAllocator; + // *** Data *** void *m_Ptr; void *m_OrigEntry; + void *m_OrigCallThunk; // See Init() method List m_HookMans; List m_IfaceList; @@ -31,17 +36,21 @@ namespace SourceHook typedef void* Descriptor; // *** Interface *** - inline CVfnPtr(void *ptr); - inline ~CVfnPtr(); + CVfnPtr(void *ptr); + ~CVfnPtr(); + bool Init(); inline bool operator==(const Descriptor &other); inline void *GetPtr() const; inline void *GetOrigEntry() const; + void *GetOrigCallAddr() const; inline List &GetIfaceList(); inline const List &GetIfaceList() const; - inline CIface *FindIface(void *iface); + CIface *FindIface(void *iface); CIface &GetIface(void *iface); bool Patch(void *newValue); - inline bool Revert(); + bool Revert(); + + ICleanupTask *GetCleanupTask(); void AddHookMan(CHookManager *pHookMan); // If this returns false, it means that there is no hook manager left @@ -50,16 +59,6 @@ namespace SourceHook }; // *** Implementation *** - inline CVfnPtr::CVfnPtr(void *ptr) - : m_Ptr(ptr), m_OrigEntry(*reinterpret_cast(m_Ptr)) - { - } - - inline CVfnPtr::~CVfnPtr() - { - if (!m_HookMans.empty()) - m_HookMans.front()->DecrRef(this); - } inline bool CVfnPtr::operator==(const Descriptor &other) { @@ -85,31 +84,6 @@ namespace SourceHook { return m_IfaceList; } - - inline bool CVfnPtr::Revert() - { - // Only patch the vfnptr back if the module is still in memory - // If it's not, do not remove stuff like we did before - // First off we did it wrong (shutdown the whole hookman, uh..) and secondly applications may be - // confused by RemoveHook returning false then (yeah, I know, I made this one up, no one checks for RemoveHook error) - if (ModuleInMemory(reinterpret_cast(m_Ptr), SH_PTRSIZE)) - { - return Patch(m_OrigEntry); - } - else - { - return true; - } - } - - inline CIface *CVfnPtr::FindIface(void *iface) - { - List::iterator iter = m_IfaceList.find(iface); - if (iter == m_IfaceList.end()) - return NULL; - else - return &(*iter); - } } } diff --git a/core/sourcehook/sourcehook_pibuilder.h b/core/sourcehook/sourcehook_pibuilder.h index df9e7a5..7b88c00 100644 --- a/core/sourcehook/sourcehook_pibuilder.h +++ b/core/sourcehook/sourcehook_pibuilder.h @@ -1,5 +1,5 @@ /* ======== SourceHook ======== -* Copyright (C) 2004-2008 Metamod:Source Development Team +* Copyright (C) 2004-2010 Metamod:Source Development Team * No warranties of any kind * * License: zlib/libpng diff --git a/core/sourcehook/test/Makefile b/core/sourcehook/test/Makefile index e85f092..d5d4c39 100644 --- a/core/sourcehook/test/Makefile +++ b/core/sourcehook/test/Makefile @@ -9,8 +9,8 @@ INCLUDE = -I. -I.. MAX_PARAMS=20 BINARY = sourcehook_test -OBJECTS = main.cpp sourcehook.cpp sourcehook_hookmangen.cpp $(shell ls -t test*.cpp) -HEADERS = ../sh_list.h ../sh_tinyhash.h ../sh_memory.h ../sh_string.h ../sh_vector.h ../sourcehook_impl.h ../FastDelegate.h ../sourcehook.h ../sh_memfuncinfo.h +OBJECTS = main.cpp sourcehook.cpp sourcehook_hookmangen.cpp sourcehook_impl_chookmaninfo.cpp sourcehook_impl_chookidman.cpp sourcehook_impl_cproto.cpp sourcehook_impl_cvfnptr.cpp $(shell ls -t test*.cpp) +HEADERS = ../sh_list.h ../sh_tinyhash.h ../sh_memory.h ../sh_string.h ../sh_vector.h ../sourcehook_impl.h ../FastDelegate.h ../sourcehook.h ../sh_memfuncinfo.h ../sh_pagealloc.h ifeq "$(DEBUG)" "true" BIN_DIR = Debug @@ -48,10 +48,18 @@ all: mkdir -p $(BIN_DIR) ln -sf ../sourcehook.cpp ln -sf ../sourcehook_hookmangen.cpp + ln -sf ../sourcehook_impl_chookidman.cpp + ln -sf ../sourcehook_impl_chookmaninfo.cpp + ln -sf ../sourcehook_impl_cproto.cpp + ln -sf ../sourcehook_impl_cvfnptr.cpp $(MAKE) $(BINARY) rm -f $(BINARY) rm -f sourcehook.cpp rm -f sourcehook_hookmangen.cpp + rm -f sourcehook_impl_chookidman.cpp + rm -f sourcehook_impl_chookmaninfo.cpp + rm -f sourcehook_impl_cproto.cpp + rm -f sourcehook_impl_cvfnptr.cpp ln -sf $(BIN_DIR)/$(BINARY) $(BINARY) diff --git a/core/sourcehook/test/main.cpp b/core/sourcehook/test/main.cpp index 9b2ba82..dc1fb88 100644 --- a/core/sourcehook/test/main.cpp +++ b/core/sourcehook/test/main.cpp @@ -49,6 +49,7 @@ DECL_TEST(RefRet); DECL_TEST(VPHooks); DECL_TEST(CPageAlloc); // in testhookmangen.cpp DECL_TEST(HookManGen); +DECL_TEST(OddThunks); int main(int argc, char *argv[]) { @@ -73,6 +74,7 @@ int main(int argc, char *argv[]) DO_TEST(VPHooks); DO_TEST(CPageAlloc); DO_TEST(HookManGen); + DO_TEST(OddThunks); cout << endl << "----" << endl << "Passed: " << passed << endl << "Failed: " << failed << endl; cout << "Total: " << passed + failed << endl; diff --git a/core/sourcehook/test/test.sln b/core/sourcehook/test/test.sln new file mode 100644 index 0000000..327a99a --- /dev/null +++ b/core/sourcehook/test/test.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "test", "test.vcproj", "{456BBA64-FF14-4292-8443-3BA79E4D84CC}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug_NoDebugRuntimeLib|Win32 = Debug_NoDebugRuntimeLib|Win32 + Debug|Win32 = Debug|Win32 + DebugOpt|Win32 = DebugOpt|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {456BBA64-FF14-4292-8443-3BA79E4D84CC}.Debug_NoDebugRuntimeLib|Win32.ActiveCfg = Debug_NoDebugRuntimeLib|Win32 + {456BBA64-FF14-4292-8443-3BA79E4D84CC}.Debug_NoDebugRuntimeLib|Win32.Build.0 = Debug_NoDebugRuntimeLib|Win32 + {456BBA64-FF14-4292-8443-3BA79E4D84CC}.Debug|Win32.ActiveCfg = Debug|Win32 + {456BBA64-FF14-4292-8443-3BA79E4D84CC}.Debug|Win32.Build.0 = Debug|Win32 + {456BBA64-FF14-4292-8443-3BA79E4D84CC}.DebugOpt|Win32.ActiveCfg = DebugOpt|Win32 + {456BBA64-FF14-4292-8443-3BA79E4D84CC}.DebugOpt|Win32.Build.0 = DebugOpt|Win32 + {456BBA64-FF14-4292-8443-3BA79E4D84CC}.Release|Win32.ActiveCfg = Release|Win32 + {456BBA64-FF14-4292-8443-3BA79E4D84CC}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/core/sourcehook/test/test.vcproj b/core/sourcehook/test/test.vcproj new file mode 100644 index 0000000..4e937b6 --- /dev/null +++ b/core/sourcehook/test/test.vcproj @@ -0,0 +1,619 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/core/sourcehook/test/testoddthunks.cpp b/core/sourcehook/test/testoddthunks.cpp new file mode 100644 index 0000000..c0e3917 --- /dev/null +++ b/core/sourcehook/test/testoddthunks.cpp @@ -0,0 +1,163 @@ +#include +#include "sourcehook_test.h" +#include "sh_pagealloc.h" +#include "testevents.h" + +namespace +{ + StateList g_States; + SourceHook::ISourceHook *g_SHPtr; + SourceHook::Plugin g_PLID; + + MAKE_STATE(State_Func_Called); + MAKE_STATE(State_Pre1_Called); + MAKE_STATE(State_Pre2_Called); + + int g_CallNumber; + + class Test + { + public: + virtual void Func() + { + ADD_STATE(State_Func_Called); + } + }; + + Test *g_pInst; + + void Handler_Func_Pre1() + { + ADD_STATE(State_Pre1_Called); + } + + SH_DECL_HOOK0_void(Test, Func, SH_NOATTRIB, 0); + + void Handler_Func_Pre2() + { + ADD_STATE(State_Pre2_Called); + + ++g_CallNumber; + if (g_CallNumber == 2) + { + // REMOVE ourselves + SH_REMOVE_HOOK(Test, Func, g_pInst, SH_STATIC(Handler_Func_Pre1), false); + SH_REMOVE_HOOK(Test, Func, g_pInst, SH_STATIC(Handler_Func_Pre2), false); + } + + // Call again. + g_pInst->Func(); + } + + Test *MyInstanceFactory() + { + return new Test; + } + + SourceHook::CPageAlloc g_ThunkAllocator(2); + void *g_OddThunkMemory = NULL; + void *g_OddThunk = NULL; + + // Guarantees that Func() + // has a vtable entry showing to an ODD address + void PatchFuncWithOddThunk() + { + g_OddThunkMemory = g_ThunkAllocator.Alloc(10); + unsigned char* base = reinterpret_cast(g_OddThunkMemory); + + if (((ptrdiff_t)base) & 1) + { + // ODD, ok. + } + else + { + // EVEN. make odd. + base += 1; + } + + // Get vtable entry pointer + SourceHook::MemFuncInfo info = {true, -1, 0, 0}; + SourceHook::GetFuncInfo(g_pInst, &Test::Func, info); + + void *adjustediface = NULL; + void **cur_vtptr = NULL; + void **cur_vfnptr = NULL; + + adjustediface = reinterpret_cast(reinterpret_cast(g_pInst) + info.thisptroffs); + + cur_vtptr = *reinterpret_cast( + reinterpret_cast(adjustediface) + info.vtbloffs); + cur_vfnptr = reinterpret_cast(cur_vtptr + info.vtblindex); + + + // Original function + void *origEntry = *cur_vfnptr; + + // Now generate the jump code + g_ThunkAllocator.SetRW(g_OddThunkMemory); + + *(base + 0) = 0xE9; // offset jump, immediate operand + ptrdiff_t *offsetAddr = reinterpret_cast(base + 1); + + // destination = src + offset + 5 + // <=> offset = destination - src - 5 + *offsetAddr = + (reinterpret_cast(origEntry) - base) - 5; + + g_ThunkAllocator.SetRE(g_OddThunkMemory); + + g_OddThunk = reinterpret_cast(base); + + // Now set the odd thunk as new vtable entry + SourceHook::SetMemAccess((void*)cur_vfnptr, sizeof(void*), SH_MEM_READ | SH_MEM_WRITE); + *cur_vfnptr = g_OddThunk; + } + + void FreeOddThunk() + { + g_ThunkAllocator.Free(g_OddThunkMemory); + g_OddThunk = NULL; + } +} + +bool TestOddThunks(std::string &error) +{ + GET_SHPTR(g_SHPtr); + g_PLID = 1337; + + g_CallNumber = 0; + + g_pInst = MyInstanceFactory(); + + PatchFuncWithOddThunk(); + + SH_ADD_HOOK(Test, Func, g_pInst, SH_STATIC(Handler_Func_Pre1), false); + SH_ADD_HOOK(Test, Func, g_pInst, SH_STATIC(Handler_Func_Pre2), false); + + g_pInst->Func(); + + CHECK_STATES((&g_States, + // FIRST func() call + new State_Pre1_Called(), + new State_Pre2_Called(), // calls Func() again + + // SECOND func() call + new State_Pre1_Called(), + new State_Pre2_Called(), // removes hooks and calls Func() again + + // THIRD func() call + new State_Func_Called(), + + // SECOND func() call + new State_Func_Called(), + + // FIRST func() call + new State_Func_Called(), + NULL), "Part 1"); + + delete g_pInst; + FreeOddThunk(); + + return true; +} + diff --git a/core/sourcehook/test/testrefret.cpp b/core/sourcehook/test/testrefret.cpp index 597c0bd..f47c0df 100644 --- a/core/sourcehook/test/testrefret.cpp +++ b/core/sourcehook/test/testrefret.cpp @@ -49,6 +49,11 @@ namespace } }; + SH_DECL_HOOK0(Test, Func1, SH_NOATTRIB, 0, int&); + SH_DECL_MANUALHOOK0(Manual_Test_Func1, 0, 0, 0, int&); + SH_DECL_HOOK1(Test, Func2, SH_NOATTRIB, 0, const int&, int); + SH_DECL_MANUALHOOK1(Manual_Test_Func2, 1, 0, 0, const int&, int); + class CHook { public: @@ -76,12 +81,18 @@ namespace RETURN_META_VALUE(MRES_OVERRIDE, m_Var); } - virtual const int& Func2_Pre1(int p1) + virtual const int& Func2_PreRecall_OverrideRet_Normal(int p1) { ADD_STATE(State_Func2_Pre1(p1, &m_Var)); RETURN_META_VALUE_NEWPARAMS(MRES_OVERRIDE, m_Var, static_cast(&Test::Func2), (1337)); } + virtual const int& Func2_PreRecall_OverrideRet_Manual(int p1) + { + ADD_STATE(State_Func2_Pre1(p1, &m_Var)); + RETURN_META_VALUE_MNEWPARAMS(MRES_OVERRIDE, m_Var, Manual_Test_Func2, (1337)); + } + virtual const int& Func2_Post1(int p1) { ADD_STATE(State_Func2_Post1(p1, &META_RESULT_ORIG_RET(int&), &META_RESULT_OVERRIDE_RET(int&))); @@ -89,117 +100,220 @@ namespace } }; - SH_DECL_HOOK0(Test, Func1, SH_NOATTRIB, 0, int&); - SH_DECL_HOOK1(Test, Func2, SH_NOATTRIB, 0, const int&, int); - Test *MyTestFactory() { return new Test; } } -bool TestRefRet(std::string &error) +class TesterRefRet { - GET_SHPTR(g_SHPtr); - g_PLID = 1; - - Test *pTest = MyTestFactory(); - CAutoPtrDestruction apd(pTest); +public: + Test *pTest; CHook hook; - int &ret1 = pTest->Func1(); - ADD_STATE(State_Func1_Ret(&ret1)); + TesterRefRet() + { + pTest = NULL; + } - CHECK_STATES((&g_States, - new State_Func1(&pTest->m_Var1), - new State_Func1_Ret(&pTest->m_Var1), - NULL), "Part 1"); + bool doTests(std::string &error) + { + GET_SHPTR(g_SHPtr); + g_PLID = 1; - // Now add Func1_Pre1, which supercedes and returns hook.m_Var - SH_ADD_HOOK(Test, Func1, pTest, SH_MEMBER(&hook, &CHook::Func1_Pre1), false); + pTest = MyTestFactory(); + CAutoPtrDestruction apd(pTest); - int &ret2 = pTest->Func1(); - ADD_STATE(State_Func1_Ret(&ret2)); - - CHECK_STATES((&g_States, - new State_Func1_Pre1(&hook.m_Var), // Pre1 says that it's going to override with hook.m_Var - new State_Func1(&pTest->m_Var1), // Function says that it's going to return pTest->m_Var1 - new State_Func1_Ret(&hook.m_Var), // hook.m_Var is returned - NULL), "Part 2"); + int &ret1 = pTest->Func1(); + ADD_STATE(State_Func1_Ret(&ret1)); - // Now add Func1_Post1, which only reports orig ret and override ret - SH_ADD_HOOK(Test, Func1, pTest, SH_MEMBER(&hook, &CHook::Func1_Post1), true); + CHECK_STATES((&g_States, + new State_Func1(&pTest->m_Var1), + new State_Func1_Ret(&pTest->m_Var1), + NULL), "Part 1"); - int &ret3 = pTest->Func1(); - ADD_STATE(State_Func1_Ret(&ret3)); - - CHECK_STATES((&g_States, - new State_Func1_Pre1(&hook.m_Var), // Pre1 says that it's going to override with hook.m_Var - new State_Func1(&pTest->m_Var1), // Function says that it's going to return pTest->m_Var1 - new State_Func1_Post1(&pTest->m_Var1, &hook.m_Var), // origret(=p1) is what it wanted to - // return, overrideret(=p2) is pre1's var - new State_Func1_Ret(&hook.m_Var), // hook.m_Var is returned - NULL), "Part 3"); + // Now add Func1_Pre1, which supercedes and returns hook.m_Var + AddHook__Test_Func1__Func1_Pre(); - // Now add Func1_Pre2, which supercedes and returns g_Var (it also sets the override ret from pre1 to 1337) - // and add Func1_Post2, which overrides and returns hook.m_Var again. + int &ret2 = pTest->Func1(); + ADD_STATE(State_Func1_Ret(&ret2)); + + CHECK_STATES((&g_States, + new State_Func1_Pre1(&hook.m_Var), // Pre1 says that it's going to override with hook.m_Var + new State_Func1(&pTest->m_Var1), // Function says that it's going to return pTest->m_Var1 + new State_Func1_Ret(&hook.m_Var), // hook.m_Var is returned + NULL), "Part 2"); - SH_ADD_HOOK(Test, Func1, pTest, SH_MEMBER(&hook, &CHook::Func1_Pre2), false); - SH_ADD_HOOK(Test, Func1, pTest, SH_MEMBER(&hook, &CHook::Func1_Post2), true); + // Now add Func1_Post1, which only reports orig ret and override ret + AddHook__Test_Func1__Func1_Post(); - int &ret4 = pTest->Func1(); - ADD_STATE(State_Func1_Ret(&ret4)); + int &ret3 = pTest->Func1(); + ADD_STATE(State_Func1_Ret(&ret3)); + + CHECK_STATES((&g_States, + new State_Func1_Pre1(&hook.m_Var), // Pre1 says that it's going to override with hook.m_Var + new State_Func1(&pTest->m_Var1), // Function says that it's going to return pTest->m_Var1 + new State_Func1_Post1(&pTest->m_Var1, &hook.m_Var), // origret(=p1) is what it wanted to + // return, overrideret(=p2) is pre1's var + new State_Func1_Ret(&hook.m_Var), // hook.m_Var is returned + NULL), "Part 3"); - CHECK_STATES((&g_States, - new State_Func1_Pre1(&hook.m_Var), // Pre1 says that it's going to override with hook.m_Var - new State_Func1_Pre2(MRES_OVERRIDE, // current status - &hook.m_Var, // override ret (which it set to 1337) - &g_Var), // what it's going to ret, AND supercede with + // Now add Func1_Pre2, which supercedes and returns g_Var (it also sets the override ret from pre1 to 1337) + // and add Func1_Post2, which overrides and returns hook.m_Var again. - new State_Func1_Post1(&g_Var, &g_Var), // origret(=p1) is what pre2 superceded with, - // so overrideret(=p2) has to be the same - new State_Func1_Post2(&hook.m_Var), // post2 is going to override with hook.m_Var again - new State_Func1_Ret(&hook.m_Var), // ==>>> hook.m_Var is returned - NULL), "Part 4"); + AddHook__Test_Func1__Func1_Pre2(); + AddHook__Test_Func1__Func1_Post2(); - CHECK_COND(hook.m_Var == 1337, "Part 4.1"); - - // Through a callclass - SourceHook::CallClass *cc1 = SH_GET_CALLCLASS(pTest); - int &ret5 = SH_CALL(cc1, &Test::Func1)(); - ADD_STATE(State_Func1_Ret(&ret5)); + int &ret4 = pTest->Func1(); + ADD_STATE(State_Func1_Ret(&ret4)); - CHECK_STATES((&g_States, - new State_Func1(&pTest->m_Var1), - new State_Func1_Ret(&pTest->m_Var1), - NULL), "Part 5"); + CHECK_STATES((&g_States, + new State_Func1_Pre1(&hook.m_Var), // Pre1 says that it's going to override with hook.m_Var + new State_Func1_Pre2(MRES_OVERRIDE, // current status + &hook.m_Var, // override ret (which it set to 1337) + &g_Var), // what it's going to ret, AND supercede with - SH_RELEASE_CALLCLASS(cc1); + new State_Func1_Post1(&g_Var, &g_Var), // origret(=p1) is what pre2 superceded with, + // so overrideret(=p2) has to be the same + new State_Func1_Post2(&hook.m_Var), // post2 is going to override with hook.m_Var again + new State_Func1_Ret(&hook.m_Var), // ==>>> hook.m_Var is returned + NULL), "Part 4"); - //////////////////////////////////////////////////////////////////////////////////////// - // Func2 tests - const int &ret21 = pTest->Func2(500); - ADD_STATE(State_Func2_Ret(&ret21)); + CHECK_COND(hook.m_Var == 1337, "Part 4.1"); + + // Through a callclass + SourceHook::CallClass *cc1 = SH_GET_CALLCLASS(pTest); + int &ret5 = SH_CALL(cc1, &Test::Func1)(); + ADD_STATE(State_Func1_Ret(&ret5)); - CHECK_STATES((&g_States, - new State_Func2(500, &pTest->m_Var2), - new State_Func2_Ret(&pTest->m_Var2), - NULL), "Part 6"); + CHECK_STATES((&g_States, + new State_Func1(&pTest->m_Var1), + new State_Func1_Ret(&pTest->m_Var1), + NULL), "Part 5"); - SH_ADD_HOOK(Test, Func2, pTest, SH_MEMBER(&hook, &CHook::Func2_Pre1), false); - SH_ADD_HOOK(Test, Func2, pTest, SH_MEMBER(&hook, &CHook::Func2_Post1), true); + SH_RELEASE_CALLCLASS(cc1); - const int &ret22 = pTest->Func2(500); - ADD_STATE(State_Func2_Ret(&ret22)); + //////////////////////////////////////////////////////////////////////////////////////// + // Func2 tests + const int &ret21 = pTest->Func2(500); + ADD_STATE(State_Func2_Ret(&ret21)); - CHECK_STATES((&g_States, - new State_Func2_Pre1(500, &hook.m_Var), // p1 was 500; it's going to override with hook.m_Var; and also change p1 to 1337 - new State_Func2(1337, &pTest->m_Var2), // p1 was 1337; it's going to ret pTest->m_Var2 - new State_Func2_Post1(1337, // p1 was 1337 - &pTest->m_Var2, // orig ret was pTest->m_Var2 - &hook.m_Var), // override ret was hook.m_Var - new State_Func2_Ret(&hook.m_Var), // really returned hook.m_Var - NULL), "Part 7"); - - return true; + CHECK_STATES((&g_States, + new State_Func2(500, &pTest->m_Var2), + new State_Func2_Ret(&pTest->m_Var2), + NULL), "Part 6"); + + AddHook__Test_Func2__Func2_Pre1(); + AddHook__Test_Func2__Func2_Post1(); + + const int &ret22 = pTest->Func2(500); + ADD_STATE(State_Func2_Ret(&ret22)); + + CHECK_STATES((&g_States, + new State_Func2_Pre1(500, &hook.m_Var), // p1 was 500; it's going to override with hook.m_Var; and also change p1 to 1337 + new State_Func2(1337, &pTest->m_Var2), // p1 was 1337; it's going to ret pTest->m_Var2 + new State_Func2_Post1(1337, // p1 was 1337 + &pTest->m_Var2, // orig ret was pTest->m_Var2 + &hook.m_Var), // override ret was hook.m_Var + new State_Func2_Ret(&hook.m_Var), // really returned hook.m_Var + NULL), "Part 7"); + + return true; + } + + virtual void AddHook__Test_Func1__Func1_Pre() = 0; + virtual void AddHook__Test_Func1__Func1_Post() = 0; + + virtual void AddHook__Test_Func1__Func1_Pre2() = 0; + virtual void AddHook__Test_Func1__Func1_Post2() = 0; + + virtual void AddHook__Test_Func2__Func2_Pre1() = 0; + virtual void AddHook__Test_Func2__Func2_Post1() = 0; +}; + +class TesterRefRetNonManual : public TesterRefRet +{ +public: + void AddHook__Test_Func1__Func1_Pre() + { + SH_ADD_HOOK(Test, Func1, pTest, SH_MEMBER(&hook, &CHook::Func1_Pre1), false); + } + + void AddHook__Test_Func1__Func1_Post() + { + SH_ADD_HOOK(Test, Func1, pTest, SH_MEMBER(&hook, &CHook::Func1_Post1), true); + } + + void AddHook__Test_Func1__Func1_Pre2() + { + SH_ADD_HOOK(Test, Func1, pTest, SH_MEMBER(&hook, &CHook::Func1_Pre2), false); + } + + void AddHook__Test_Func1__Func1_Post2() + { + SH_ADD_HOOK(Test, Func1, pTest, SH_MEMBER(&hook, &CHook::Func1_Post2), true); + } + + void AddHook__Test_Func2__Func2_Pre1() + { + SH_ADD_HOOK(Test, Func2, pTest, SH_MEMBER(&hook, &CHook::Func2_PreRecall_OverrideRet_Normal), false); + } + + void AddHook__Test_Func2__Func2_Post1() + { + SH_ADD_HOOK(Test, Func2, pTest, SH_MEMBER(&hook, &CHook::Func2_Post1), true); + } +}; + +class TesterRefRetManual : public TesterRefRet +{ +public: + void AddHook__Test_Func1__Func1_Pre() + { + SH_ADD_MANUALHOOK(Manual_Test_Func1, pTest, SH_MEMBER(&hook, &CHook::Func1_Pre1), false); + } + + void AddHook__Test_Func1__Func1_Post() + { + SH_ADD_MANUALHOOK(Manual_Test_Func1, pTest, SH_MEMBER(&hook, &CHook::Func1_Post1), true); + } + + void AddHook__Test_Func1__Func1_Pre2() + { + SH_ADD_MANUALHOOK(Manual_Test_Func1, pTest, SH_MEMBER(&hook, &CHook::Func1_Pre2), false); + } + + void AddHook__Test_Func1__Func1_Post2() + { + SH_ADD_MANUALHOOK(Manual_Test_Func1, pTest, SH_MEMBER(&hook, &CHook::Func1_Post2), true); + } + + void AddHook__Test_Func2__Func2_Pre1() + { + SH_ADD_MANUALHOOK(Manual_Test_Func2, pTest, SH_MEMBER(&hook, &CHook::Func2_PreRecall_OverrideRet_Manual), false); + } + + void AddHook__Test_Func2__Func2_Post1() + { + SH_ADD_MANUALHOOK(Manual_Test_Func2, pTest, SH_MEMBER(&hook, &CHook::Func2_Post1), true); + } +}; + +bool TestRefRet(std::string &error) +{ + TesterRefRet *testerNonManual = new TesterRefRetNonManual; + bool resNonManual = testerNonManual->doTests(error); + if (!resNonManual) + { + return false; + } + + TesterRefRet *testerManual = new TesterRefRetManual; + bool resManual = testerManual->doTests(error); + if (!resManual) + { + return false; + } + return true; } diff --git a/temp/sourcehook/sourcehook_impl_cleanuptask.h b/temp/sourcehook/sourcehook_impl_cleanuptask.h new file mode 100644 index 0000000..7f3e0fe --- /dev/null +++ b/temp/sourcehook/sourcehook_impl_cleanuptask.h @@ -0,0 +1,29 @@ +/* ======== SourceHook ======== +* Copyright (C) 2004-2010 Metamod:Source Development Team +* No warranties of any kind +* +* License: zlib/libpng +* +* Author(s): Pavol "PM OnoTo" Marko +* ============================ +*/ + +#ifndef __SOURCEHOOK_IMPL_CLEANUPTASK_H__ +#define __SOURCEHOOK_IMPL_CLEANUPTASK_H__ + + +namespace SourceHook +{ + namespace Impl + { + class ICleanupTask + { + public: + virtual void CleanupAndDeleteThis() = 0; + }; + } +} + +// __SOURCEHOOK_IMPL_CLEANUPTASK_H__ +#endif +

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%0DRK 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