From 059b8ca0f6b3229ffc499477d22cbe78c10541f1 Mon Sep 17 00:00:00 2001 From: Andrzej Janik Date: Tue, 8 Jul 2025 19:19:49 +0200 Subject: [PATCH] Make sure it is possible to log 32bit PhysX (#374) --- dark_api/src/lib.rs | 2 +- format/src/lib.rs | 3 +- ptx/src/test/spirv_run/mod.rs | 2 +- zluda/src/impl/driver.rs | 2 +- zluda_dump/src/lib.rs | 4 +- zluda_dump/src/log.rs | 2 +- zluda_dump_common/src/lib.rs | 46 ++++---------------- zluda_inject/build.rs | 1 - zluda_inject/tests/helpers/direct_cuinit.rs | 1 + zluda_inject/tests/helpers/do_cuinit.rs | 1 + zluda_inject/tests/helpers/nvcuda.lib | Bin 71050 -> 0 bytes zluda_redirect/src/lib.rs | 7 +-- 12 files changed, 19 insertions(+), 52 deletions(-) delete mode 100644 zluda_inject/tests/helpers/nvcuda.lib diff --git a/dark_api/src/lib.rs b/dark_api/src/lib.rs index bc28355..b90cb53 100644 --- a/dark_api/src/lib.rs +++ b/dark_api/src/lib.rs @@ -227,7 +227,7 @@ dark_api! { [1] = get_module_from_cubin( module: *mut cuda_types::cuda::CUmodule, fatbinc_wrapper: *const cuda_types::dark_api::FatbincWrapper - ) -> (), + ) -> cuda_types::cuda::CUresult, [2] = cudart_interface_fn2( pctx: *mut cuda_types::cuda::CUcontext, dev: cuda_types::cuda::CUdevice diff --git a/format/src/lib.rs b/format/src/lib.rs index d3d1982..004e3af 100644 --- a/format/src/lib.rs +++ b/format/src/lib.rs @@ -428,8 +428,9 @@ impl CudaDisplay for CUmemcpy3DOperand_st { CudaDisplay::write(unsafe { &self.op.ptr }, fn_name, index, writer)?; } _ => { + const CU_MEMCPY_3D_OP_SIZE: usize = mem::size_of::(); CudaDisplay::write( - &unsafe { mem::transmute::<_, [u8; 32]>(self.op) }, + &unsafe { mem::transmute::<_, [u8; CU_MEMCPY_3D_OP_SIZE]>(self.op) }, fn_name, index, writer, diff --git a/ptx/src/test/spirv_run/mod.rs b/ptx/src/test/spirv_run/mod.rs index a2f4a11..8cd88eb 100644 --- a/ptx/src/test/spirv_run/mod.rs +++ b/ptx/src/test/spirv_run/mod.rs @@ -500,7 +500,7 @@ macro_rules! dynamic_fns { $( #[allow(dead_code)] unsafe fn $fn_name(&self, $($arg_id : $arg_type),*) -> Result<$ret_type, libloading::Error> { - let func = unsafe { self.lib.get:: $ret_type>(concat!(stringify!($fn_name), "\0").as_bytes()) }; + let func = unsafe { self.lib.get:: $ret_type>(concat!(stringify!($fn_name), "\0").as_bytes()) }; func.map(|f| f($($arg_id),*) ) } )* diff --git a/zluda/src/impl/driver.rs b/zluda/src/impl/driver.rs index 556609e..3c89848 100644 --- a/zluda/src/impl/driver.rs +++ b/zluda/src/impl/driver.rs @@ -106,7 +106,7 @@ impl ::dark_api::cuda::CudaDarkApi for DarkApi { unsafe extern "system" fn get_module_from_cubin( module: *mut cuda_types::cuda::CUmodule, fatbinc_wrapper: *const cuda_types::dark_api::FatbincWrapper, - ) -> () { + ) -> cuda_types::cuda::CUresult { todo!() } diff --git a/zluda_dump/src/lib.rs b/zluda_dump/src/lib.rs index c6cda0c..f3ed4ea 100644 --- a/zluda_dump/src/lib.rs +++ b/zluda_dump/src/lib.rs @@ -286,7 +286,7 @@ impl DarkApiDump { fatbinc_wrapper: *const cuda_types::dark_api::FatbincWrapper, state: &mut trace::StateTracker, fn_logger: &mut FnCallLog, - _result: (), + _result: CUresult, ) { fn_logger.try_(|fn_logger| unsafe { trace::record_submodules_from_wrapped_fatbin(*module, fatbinc_wrapper, fn_logger, state) @@ -391,7 +391,7 @@ impl ::dark_api::cuda::CudaDarkApi for DarkApiDump { [1] = get_module_from_cubin( module: *mut cuda_types::cuda::CUmodule, fatbinc_wrapper: *const cuda_types::dark_api::FatbincWrapper // FatbincWrapper - ) -> (), + ) -> cuda_types::cuda::CUresult, [6] = get_module_from_cubin_ext1( result: *mut cuda_types::cuda::CUmodule, fatbinc_wrapper: *const cuda_types::dark_api::FatbincWrapper, // FatbincWrapper diff --git a/zluda_dump/src/log.rs b/zluda_dump/src/log.rs index 6ce7be2..0bc5113 100644 --- a/zluda_dump/src/log.rs +++ b/zluda_dump/src/log.rs @@ -380,7 +380,7 @@ impl Display for ErrorEntry { observed, } => write!( f, - "Unexpected field {}. Expected one of: {{{}}}, observed: {}", + "Unexpected field {}. Expected one of: [{}], observed: {}", field_name, expected .iter() diff --git a/zluda_dump_common/src/lib.rs b/zluda_dump_common/src/lib.rs index 19d62b4..3f75dd1 100644 --- a/zluda_dump_common/src/lib.rs +++ b/zluda_dump_common/src/lib.rs @@ -1,6 +1,6 @@ use cuda_types::cuda::{CUerror, CUresult, CUresultConsts, CUuuid}; use dark_api::ByteVecFfi; -use std::{num::NonZero, ptr, sync::LazyLock}; +use std::{ffi::c_void, num::NonZero, ptr, sync::LazyLock}; pub fn get_export_table() -> Option<::dark_api::zluda_dump::ZludaDumpInternal> { static CU_GET_EXPORT_TABLE: LazyLock< @@ -117,7 +117,7 @@ impl ReprUsize for *const T { extern "C" fn format_status(x: usize) -> ByteVecFfi { let mut writer = Vec::new(); - format::CudaDisplay::write(&x, "", 0, &mut writer).ok(); + format::CudaDisplay::write(&Self::from_usize(x).cast::(), "", 0, &mut writer).ok(); ByteVecFfi::new(writer) } } @@ -169,15 +169,9 @@ impl ReprUsize for () { () } - extern "C" fn format_status(x: usize) -> ByteVecFfi { + extern "C" fn format_status(_: usize) -> ByteVecFfi { let mut writer = Vec::new(); - format::CudaDisplay::write( - &cuda_types::cublas::cublasStatus_t::from_usize(x), - "", - 0, - &mut writer, - ) - .ok(); + format::CudaDisplay::write(&(), "", 0, &mut writer).ok(); ByteVecFfi::new(writer) } } @@ -193,13 +187,7 @@ impl ReprUsize for u32 { extern "C" fn format_status(x: usize) -> ByteVecFfi { let mut writer = Vec::new(); - format::CudaDisplay::write( - &cuda_types::cublas::cublasStatus_t::from_usize(x), - "", - 0, - &mut writer, - ) - .ok(); + format::CudaDisplay::write(&Self::from_usize(x), "", 0, &mut writer).ok(); ByteVecFfi::new(writer) } } @@ -215,13 +203,7 @@ impl ReprUsize for i32 { extern "C" fn format_status(x: usize) -> ByteVecFfi { let mut writer = Vec::new(); - format::CudaDisplay::write( - &cuda_types::cublas::cublasStatus_t::from_usize(x), - "", - 0, - &mut writer, - ) - .ok(); + format::CudaDisplay::write(&Self::from_usize(x), "", 0, &mut writer).ok(); ByteVecFfi::new(writer) } } @@ -237,13 +219,7 @@ impl ReprUsize for u64 { extern "C" fn format_status(x: usize) -> ByteVecFfi { let mut writer = Vec::new(); - format::CudaDisplay::write( - &cuda_types::cublas::cublasStatus_t::from_usize(x), - "", - 0, - &mut writer, - ) - .ok(); + format::CudaDisplay::write(&Self::from_usize(x), "", 0, &mut writer).ok(); ByteVecFfi::new(writer) } } @@ -259,13 +235,7 @@ impl ReprUsize for *mut std::ffi::c_void { extern "C" fn format_status(x: usize) -> ByteVecFfi { let mut writer = Vec::new(); - format::CudaDisplay::write( - &cuda_types::cublas::cublasStatus_t::from_usize(x), - "", - 0, - &mut writer, - ) - .ok(); + format::CudaDisplay::write(&Self::from_usize(x), "", 0, &mut writer).ok(); ByteVecFfi::new(writer) } } diff --git a/zluda_inject/build.rs b/zluda_inject/build.rs index c79d2d2..b971a65 100644 --- a/zluda_inject/build.rs +++ b/zluda_inject/build.rs @@ -43,7 +43,6 @@ fn main() -> Result<(), VarError> { rustc_cmd.arg(r"-lucrt"); } rustc_cmd - .arg("-ldylib=nvcuda") .arg("-C") .arg(format!("opt-level={}", opt_level)) .arg("-L") diff --git a/zluda_inject/tests/helpers/direct_cuinit.rs b/zluda_inject/tests/helpers/direct_cuinit.rs index 8341a60..cf0517e 100644 --- a/zluda_inject/tests/helpers/direct_cuinit.rs +++ b/zluda_inject/tests/helpers/direct_cuinit.rs @@ -1,5 +1,6 @@ #![crate_type = "bin"] +#[link(name = "nvcuda", kind = "raw-dylib")] extern "system" { fn cuInit(flags: u32) -> u32; } diff --git a/zluda_inject/tests/helpers/do_cuinit.rs b/zluda_inject/tests/helpers/do_cuinit.rs index 468d56c..d9f2167 100644 --- a/zluda_inject/tests/helpers/do_cuinit.rs +++ b/zluda_inject/tests/helpers/do_cuinit.rs @@ -1,5 +1,6 @@ #![crate_type = "cdylib"] +#[link(name = "nvcuda", kind = "raw-dylib")] extern "system" { fn cuInit(flags: u32) -> u32; } diff --git a/zluda_inject/tests/helpers/nvcuda.lib b/zluda_inject/tests/helpers/nvcuda.lib deleted file mode 100644 index b793c56e227f0c0374d75e2d6f88c58f5e86a9fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71050 zcmeHwd7M?nmH+o5ZitGA#%N;D5SN4~bT^2G7?y?>1tblk<2aH>_eGvI@AbTXO)znc z<2WQSZc*bFMMOkI<3b|h5=C61h^UB>xP`b7R8&Mo+<%{{x>a>*xy8G@?)?6l{(KI+ zd+OBr)^cjOb*k#_H#k>nntEinLwlQl{pI)3W7EQ zj4pUg(1nA*={Jvp(|I)zG#g-aeosLcoD5DM_64VpdVHlnhP-ce2t(l8o_C034&e%7(F*x(DUoTY4t=1 zS`IM!TYW+c0Y)$MPUs?l(TfnY<`r=I$4CfT2rzne?}TOoj9yzV==DJmG#g;F_I^R@ zx`NXi-N9*XBRH*V1*bO`fzw<2gVWnn!Rf_jaC&(rIK4C%oL=q)K^p)@Yq|;AxB;9# zSPD+-7l6|{XM)rF3&CmQOmN!J3Qq5j1gCe_fz!K7!0Eld;IyGDINdV~obKHSPWSW! zr+asSpfdqRpRN@2c@J>nNEa;<|5VQ$kw5eIp$HTzs=@sDg%s_Bju^615+8=^0061+17(LxA=$Sd-bbk+U zx^FTBEe9C=c~C-g07mzh1wHUII6Zg>I4v0lPD}R$r~6+Arw2{|rw3<)(~?DC6z$QQ z6K-59XnrF&&8q>Y8+(G&yjkEh|9)_K_)&0LFcX~a*cY5`ssX3lj{v9J9tNkI3*dCi z3*hvJ2@tdrV07!zf^J?5PPd#4PPaY`PPYvMryG`m(~W0=(}K<5bjQWubkl5bTF?`m zZeIXSzaI=i^8rRzt`~IGatJyBV087Kf*x7{PFH^lPIDH4)79sK)0}#6x^4wH&3Xl# zu00W)t|@@iwX4Bt_Be35W*s=qnhZ{}mxI%FqrqwJ84$D%V03+7L36u<)Ad(?(+v~B z>EWZnY1uB|^!VQ3^yn;b`b!@OngcL;tWQF-07j4Y74-O3;Pl842wDU@vIx-*Ma_rzb}4{Uk9pwKb22#fr~{|n&H<<0>mleqM2vdX2#HjneoUmyX zr)b*?66%d;+up!kLj>J@0yr(+08V!=1*gSlgVS9Lz-e(Wa9UFar#H$F^eVvUt#cFF z3^4lV0SR3SFj}`-(3>N{>D70^>9v!<>BVK>^wL0ZdSxO6Ed>~TFj3GuJ;7Kc9Rxx15p|spEZvmQc>tqNRtWlZBJkY@g^3z%;HMNf_Qd_=QK$FW-vhnnMQ``_UCHl7$I=t9kFhm5yksF(v7E?|9*_0Yy zoYvZ2j)&)3bCdHe`SR&X-VHHhPAHahEo0(oDuQD8SgC#|trPR<; zDR;WE0{Y~U5NRhuv@AHAC$_Drly5B;OK9>j4ZVguQSb1LShe+Liq*4Mil~)>PP%LB z4Mdr8n{DYg;utVah!In_3SMaPQOb5 zQ|(j_P3yQ~zEI|atnT%jyj+Qs#26p@Vi;T*L)O|+#Wptf8jn61m2Pf1EEY|1QX5(s zD}Me&bg^e*clyzi;jNF&9Fkm#qJ5FA^d}-CTXLtck$OyQaxA3A_>_EG zIVNdSoD@kTEmGK%hT{q)M>pXS?MdPc8{K3&;q=kuiwdiuGFFWPJ zSXNp*<#H6w5q~h#!dO&`e0HRCT8?tl!dR9TPg-iUjvBj`YmE5f$xK5{{c(j{Oa7FC z?7N#<4PL4=O&C$a*k+tsoxWN-eYHmV#1o0#7MJS>3HuX2?J$)H9&BMVUjKnQdjElT z{Qd(C1>(`dsAca8V`8qY*2o*vUt42n5RaCI8kz_8;D#GYYU+JCsWI}xpBz0_ewdJ_ zOlpig@h3-wnT!&-_>r;VSQYh^>J%adA@knvM3&p_FISGZDrg-0-1orx)1N zQVR)=DS1p>D)1Su5KA7V%$QO__$c%YBAGOP zQ<%0k6{HNn=19$>^M%vY3mSQF!v&}op?Hitv{_aUeWH3239X1QEV+^S7S=-~n)s7P z!qCKo>@=};pq7{~n(&0nN2*J{F9|gHBqbU~C+lL#56xGLENE(PAWt3%kxn8+)7dau zO?25*)Oggow2V|{aL%~u!;sSF5N!ueu<%*=F$Px6W%PU1S4vSC8b7xd-ee#=zjwrB+BnxA|Xozg-6XQ}j zo*_D0WvOC~#|WZvb>lQd1W-yKjXx&W>WOG`12J?_S&>)(jmMk02g~J?SpEB1Ljz^_ zbQ(%F@zNMTm?kmf6%gn(=7L$n~YBL`XiHQp|}f z+|JxrBlH=}ba_!VZWL-8zR+5gCJHoZdaVbGZA3A|Im1bl)4~+472?E9a&KUW0!fwi z=i8g>k;T%q99tPv=}9t8uZDKXpEbRCAOl$C6XsY;>YbVcVBS<@nD3T zyDqsDWf`&~T5_#zar1;c-+s$wDa(+RgIAI?`RJ1o?UJiY#Auro+gjvOIen741dr{t zFr_pnMN$A;(Oqn|bHdcDIi_aCrDbIG5n3^>wMUrY(!rn9wH8rzcBZ6aUR(z`2 zV4CtnoiuAsiX_#ngxxgPSfwnVO|1!+>Le^vw${=ppS@C4VEZEV!D&9hXpjTjcbW=Xx{%cVFsO?5@aqfh4e ze0l1)QodLco9?N+5oE^YJK?QJl;=pxkxl4#MmE8gy-t($Y-%H&jwMLzUucxwDSa}v z(cV+4qdZgk_*}lsdp;$rIi}>$=H}tKmX^u6rqh%xDa>dBO#`)T-Qf3~NcY`h`T&Xyd3 zn=WndyAg*8Vuw#K8r)EsDqEWsi?tY>xR~#A^>L-v z;pG`43e1R@tcWE_(&3UA_4zhm6qhaIh#@;k4ta3HrTJ?irzdP`J-xQx(3L!z+62?o zM|o0Olukoj9(MY;;iHDNw~gW+CwT&jaGe-FdBu~`qgvVSHQr|&l`Ay!=IZi@^s%jR z!4bEaM4ruw<7t*|%^{LZi4JID$uL<&c6dv%Ew+R$o|K*t&k*}l)SzQ?97)~LD^baE zWEy*6~_(=#hsXse;SCdf_*wB#52n6B_BKukullZgjFC8%axV+7w;G% zzT~;mcFt)mJ50uAW>_i}OXJI>e1Ywiv>3Kra%@jZ8K?G+ZE9+7%@vwXXUhXk<^1%R zZwGA~7njDgx0Lg(r6TKr_+g~VWn~IzjB&+sTwwjE*l#L&(=7;W#r+$#^8SqsQ(+V@NYox7l4ai5Z6(>vIZFW4`AUxfW2P@ zX1)q6e+?M)Ixw5vD6kgjx(?|62GF<`Xk7;^dK1|HEnw=~K=X^h%$I?=F9E$?1~$A5 zbXx;#*a$5B09dddIP)D~;rqbMjX>)LVC4J2x_5vj?*e__1G;ViX59m9ycg(q53tL< zz?t^~D?bH#d=AY244CmbF!(c|*OS1ECxJCj0%KPIw|@-mwHY{PGq7 zM?mu?VA#jNil>2r&j5>80Q)}$T<{dI`6;0JX<*JXK#%)@$@c-v?*j(?8JP2DpnN~@ z^aH>l4+6uM0DCS4UcVnW;Q?UwgTSICK<_;wti2IvoDbB@1A5*F%$f(>KOcDXVPNJ0 zVBb4{nwx+lZU-K|4Jh0Uyl@LJ;Sa#dKLAJH3aq^uIQbUf;ah=Ww*kv;0M5D**t`I^ z_zqz9O+e2Dz=GR>!M_LQ{~lO>C9wP|;DoDyJ+B58U_j;iFT;Pi9fr&Q&M?VbgvJBY! zabVV?K%c(=bN&MKc?_8K7|{1o;Ht-gA&&ry9s!QrA;SC}BD}OqgweZ3Sh8z`y>^SR zpjU*#E)nMSh%mWlgt{IP&e<(O{q7O&+dV=}uLw`~jIe392)%ZU@ZpXTrgV$2dFKdc z?-*faw+Qt+MYw&Z2p4yc&~4`kXYCwe-|i7sZ2~UXHbU=hBMi94$u#ZBAneN!ul=|PTD3yx37So zeFaQ@2$*vPaL=Vc`4ZsK%Yp7!0)2i5T=6?#yGwwFzX0mK1ZIB;bXy2qdNHs+yXEF> zVDNgN-`|0&{thf-{m-4i2~Pk6mjjPI0nA$ttXl?rzHNk4w~MfPy9i^qkMP*`5teNe zVNlly^Segav=lgRDX`)bVB)91&$|E-x}Z1q!~Xa-zJYI|5B9~k&;z?*SL}wK*c}H& z2S)ox-;DOb*YS<0ceG#hHSC2wuqXD7_QpQZx1wIS6}RIy+=4&g4%~@9;vW1N_hT{c z#=W=?4`2!I!Xo?$58)9!j0dq4kKzVgj7xC|=HVjz7Qe%lxCskzIc~(&xDIo04QAn5 z%*OSYi{Ila+>9$Q9|uG`Vms`N??>BX2OJW0M>p(*ZSes%;}d+0kMJQjp&64AV+xvZ zHvR|a;D7Pon2F!uJp2;B#s&Bl&d0gUjZ5K6SJbsJ`*go1J`d-vGIu4&=2!>)9hNB+aL|vm17>NcP zjnD8oj=@p*3W!EwG@__WGzMew1-`_wI5_%lbOO3X|Av#Xb2JG*!7fn_C!u@vA2<;^ zMgNY8*fBaD-@$=60PUELpJD@MpcVg#653G4kJxn@+AI2c zv}@EO+CAzO^^A6l_K5b3z7`!G9TEK?+KBg27Y&F8Mu$a%qGz!RuVWqFz*@YCx9~RJ z!+N}fckxfWfama6Jdc<0B39!SyoQ(XD*lc&_y_)m3;)mV{?G3Izu4V2*qWO--OVk2J#GES!DLJ0SRvJLw7-Xnja{2Syw zn+P-PWlT#xTk0^km{%;Bnq9IP$<&szbBLEhU{@Lo*IVukm747}NF8h^R_`P<^(i|w zlOEW)=idqMZ9kgpORWyI66W0yR! zIeNHZjK1F`EaEg#SBr12tVc>*396Zwo2{ulu%@Isfn$k2w=aYD& zO|7kPvn9cP4SYy2Js`>!M3{5am>JG)J##qvJh~GUau9^>Lvs{4o&)8BAUBbju`0Og zOhvG-f0F^+)nLsgInSQ4Q6{wp&QIM};@QID+xFs{Hf-tOKe>QFW+u57LwK|($iYqBWm2Xo%#S0>q&ufo(?d*`m=lo)n@H9HS~F1guJphv0Z%*1 zsuRu|bV_U|%uc*+?|u!5)57pRNM_>6P$@Cp;)-3-$sQ`T<^Aw%q?6?)yJ-hdZ!u1e zr`aje0_GlMnHKL@Dgz~~nhU0EVN8{`ho&tF8dj5(sZ4}#7zoJtR8_wHKV{Y@@w7$B z)Tx3uTHL7CG>>M`KWq3~WsN4TRNfaRu2?Hb`%+~<`b8b41iP-oY&G7iH!8TQLFpBD zJcRCIprYQp7OWwI-^svlwWM{+xb`?AZ!A*~lEE(W@-nGLDeSpmj$ct`PTZulGgp%V zmTG=SoyRyN`aHX`b~9BoVC9=*n6$&|w|EnMvXNZlw%?woQIsVl9l^l@01=ed^3mlXdF zL%kQp%%5+giO7<3%@w<@jqmv~H3aT{a|G?e9GYAm<_P+3a7zIfe7CsReo&VixYx~0 z1l!~5VfhlFwgY?NJT=L-*SfmB84T>iWkD_?+hA+yR(o#K__#?7gnY4 zjf$30*x~>?W8uUR$5t#pzYNS2WvuXZU#|QXZt;>4=+2<<#w1@1&t@YjCU12!-VG(w z%D80fqL3W-PB?PYo9Fgeg)YL_nH6<4o(gmKo7zEvt)x;k*>FsDEn6Yx4rMdYvRR=^ zFaw*&ZDSVE5-zno5#Y>I6kG1+wNhoSJqT&vLW2nLY~;2#@~KR#04ED7ByAU7(s-N` zL^Xy}1F1cz z<8h|9MX|Sh#Li4{==_{<4$X-s`riv{EBoaR0#WZ&dCFLvV-{YC5tZfDjxmTgm!GnVDqety&Np1#E>Az6>?65c<8yT zepUrQ-0z8u>5u2}EKj`R(Znn7yA1WFmX2u2y)LR!9ENfe+L9vm+;K|F%w({$A&O&q z(~|&W#WLZ^^#ZjTr}$pqd0MDg*$IY{Oh_=bIx1H?Qx#|*T$%`<`h^1h_-tf1J>sqo zN5-RyuCXQ>td&s3l{eALQb3!Crq~j8;5#Q zox@*(VIC?D`c3uqO?)?%%p7TYB);k#J;B-uns`aIW*ubT-emRS5=yF99j!GN*Qy;! z-EpQWGdfRO%Iv%Xp@}&pg`4j6)M<4_c^O&PwakwE>K{McX`R>PJZ1&#u9DRAqUu1E`1GZ6ox^=w8`Pv#e|xO3qw);>b@sCqkX-HCJ04p9(^Q&Ha6VEY1$g5b zv#b}R~JhB=>WGDMlLO9Dxs9CLX&y4DD6Dj>?GSS>~MjyFO>Yc3tL{5{wKmq`&3F&47Rt4#1!k4isO84 z#`|p<>mxGSpClEl@4-~=LuxW)J>DbzHK1g^Djh*83z9)U?L)sJ#J>vU@eHZ&3bJ)o zGR^jQgXnD`_7x-iG7+)bMSVZ=CLGJ_BiYI#L`?B$czUFyHWDFfyk-cN^6SVr^dce2 zlW!g(iutl3c-ntMFGJ8NRh}7=B*n9RCGJgcilf%C$wd?jMfp}Vh+?@Iz98j^A?h1q zW-sOy6x#bDFXb~JO^=Hd(UT41PD{-eZBG~{Fa|_iBGOuh@VWdzEe@5CD$;F4t4{2^`5qEO*uj_aCpu_8GYHE5Lf8zFy z-o5J%m%o0}t$F4)7~8Ppgl-YA1H|7U&GF>+Q~Hcg9x(*KdGaCo8-gCg4#_v?%DFx@ zlGh8sasX=*#x`Ja`z=Z221>c^0KO!0>~9EqFX;kcH|)rtyXj0Fh~0Z^58&w}em4O7 zT+?$*zNu7fD^4l*KB)2F-lIp2Jthe^{umZZ2P2>>|J4J)w)~d{0fsacr?noEZ{Fvc ztMS!WGzR-)Y3l-+;~@Y~?NrI(c@sE^OdXS9F_p{!&0&Av;{S?2rX3iRJh8tn7zb?C zY1xjllA5~16YF7C(uG^e;-n6g|HPN_CtkI8j(=~hy*-vBzy8tV>|UD;2%fw#}*nXKR1hv%`YbgD|+DKNmG;U>OSvSy+wKst6G?tt;YW3u2 zWk>_mXl}NE-T=1ONF8S-DfRVju$h9YF9Xji%o3i(0oaja>MataC_5CVo5bk| zOAJ`YP9~03bUJsHSw~$;FR~Ya?h>g3tT5CM?`+{%S?bVQ+C^jWt1NVRWycBiz`H6O zXCn=P)ITe$tpO=^z8`=d64BYCqfxdZkAX35H;KqzM)h4D1Wx~~Fn|61?U>DZdlEG2 zlhhd5a~HD8-6>wO^QS7TK%4GGu!O&vLTS{>N-;EI?m>{mZY!-ld-;X>`aKDfy*H{V zO!<0Yjb{e}_!`CZ+!$O9Zpc>llDK-uSyfn}R`+!m%jz(7E-SQ`z`SQ~g{Jq(5diYD zGOSPw-^YVxWi9hq5W@S0#IyGM>GI2t7qXIXQoN4nQBr1FY-YSK!Rp+0{w;#kk?lNW zmAw__>4m1LrDB2IJWHxg|E$a^Ls8Pw18kq7X@jU>2L)gOGN$|4U*T9rEbO?a&ZyCGVoTt3e9K_b91L)jGtc#ia ztiHq#-2$$a<;*R5V9Ltfp#b`Mv7H^kB){454@)U?<^t+p8NO8nx*{qo{Q)U++yemA zxG7*hwOp(4@@XjYvqIFAR>t1fYc;C1hmZhfuIbPkZ5>6FyRJK=_YRHs0~D%0w?MO~ zb6a7Vrt}_c{xr~o)!Fl>!#tRlv1YEtPEe zF_Tj;+8Vc_)>3*|=4%?PaJ(-OnJpwVNBg0R>f8XUy5!p({rnw1|# zP`C8@*O9oR(s7-azs$HP*2~_%j@|;UWm1{j>A)0^@OJ?m6To&~{W9k|Wo6;}07h>S zx!Qb(JO^Xa(d`$%4lVDoVO%TAnaew+$6{~V$NG?iuYH-(Q#>{O0gS5%-O7IEk`KKN z{n$xC%1d8%)Rgwcc3d&KgTY29`9Jf>I{dkdRDFhj4IS@RhhBaZW6 zre!uOZfK@4QQ&&cDr=OjDBYAd3AWSfc#7!Umt75N=soEKg38WVSA!F3AOB|J=))5P zQ2(rOMw2quvQ?N9O+0cmT%%;KztBwo-%Uhu?3{qE|v4k9dmNKJZzQ$$;sWa;<)@by4|7z+h#T&(T z0#4Cr;;dISI4SP{Y}djm8Yj8Hf&gW1%OQK8s*yTq4?zem&(WNFH%R96&&pa?sP8yc zp|Q&=T8d4ljh~upH5T2omt|m1dm6<{*_xL*e}VaB3&jg;ImwKfvf{{gA5L>It9~yG zwS)r4BUh%7++?r4(5P0lk*sbjYbl2IIkqNPYCW~8HO^3P{GSezm95Mzpe|+fWapAf z2^znyMi&_QS$(T+OE9bpYzRj7JcU|W*^eg<(^r$nlrfa;-)s+HR$G6emDK5eTnkcX zy29EF^kF|u5ar6PaUYNdB0np{43zGS1T*bQBLbVbb%bW>rzg1XbxBnr20Z#dOGB*Q zdIP9GSEzE;qoZmy)Tf>yQ0WCyq*(RO%IqgJQv8>JlziVu1CXE9W1Xq6$hB8hV1?G( ze<84fH);{+%xxoteU^jm-quwWcFMest@Z!6jr}k4Bb{v^>zl-qOU6is_0P&|DztL; zKPjl<{xXe}y@o?$%Q*&WM|nRFOIaCV2Y>(9K$IJN(ym>rCf_0d!pv|gI>MWjGS)Hw z!Y?aAw+8s^Ej#6nf$duTl{W<)GdrOmLn z>>kqN;Gy^BfY_q0P3HW*+*#A>0*lK&0bct&^z!Y z94+~7o>okLR+gjCI^?AUgI{S`4Nl7F!PatrXW=-n4Vg!Z&KZIc3;93Hd2*iPAFGbQY`-6#LmjqRW?$!xk_0fV7Ea0 zUSX*#RY|t=&kC&~u)2S>MiRHRYUSi-g*YjmYqkgW8VkoNyzKTDu=H69%j5RRj+F8i zwI_gUIg-4TmJ}HISz*})tYNl+!mq2Xrj`PI-*paB)%6rWn`5BKD}71Uve#9>0^lVRu((7EN>>5{M)%zW zZ?SNy&QqZ0{e#5PS9n*EtI+z?trSVQ$UF-rnd>a{_Ig_g)hbw>@yhHo)brnN;W~%y zGUqacb_Ye1P8X7&>}a93zR-tOWm$&aoBv4h$UX16zOv^p^se_OiO24cCm{M~h4vAc zSKUc4YU+t<^0Pvez>Hv#fl~c@UT8*emy6YjHnG@1Qy<}x_-+4MJ^5K#dk*!44>(BG zmt)8Vml$|f5oWi+l=&Rn8}}eV>VP~2X2eS=68pA#6?GNrdmplJsxG}io*p)_I;{;q zV&QaVo*p%^j;gAj0`KU5v2d!lzR=w1F&~;$jM^Y8>oG!B__&2htu3h0~dNT5e)h*Rldu_@sr?xmLKshh`O{uDt4N>?sS+g6dE!eA>k7w0`3m z3#W5yY^4v)D#nhiv1ctj3#vnFY!$)c-)zzuAwMg$!ay5)&cf;38vCmc%_>Hn(F$`H zc-MR0!n2?{w8mDOSe@1@{>{Sa+!}kqhh`OHN7mSj7M=ywp*8jr!K(HRCDg`Vws5Mi zvCz5AS0q~U88uxyTTyxefA8N-94Av6x59QDc$-{fVp&F!87c72^$&`~KP;!UXD`3d z+R&>uQuQSmsIAv*v`#F;*G;Ti{K7wG7wVXw{Zs;Jx9WCe|QohT0-4 zY*~Tvf1QQn6kz813XR8aT4+`QX2(j|6U)8=@fO9Z(gs5<>unRqDZtFN73c@on^;!y zWkw3Df4)PJs|C?p2d}x-T zYU~P2Gvy2;yTNahiN|gNYK*542=cQsv`|@oY@#J!T-Ev6ikb_IpPLC9{~#>^(myNA zRbXEAiG^ctvCN7Us;^HySR-Z-2=cSCoQ2NteP*HQFZAj>ZAG00Mz_xiV)FH00;PXe zmbb%F#)88De8G__|FE#e&Yt7Yxs5NKba*~mOu+Te%E};A+Fx;O`MqQNXnSU)KpR2C zz5ynY+=ibSD=_Pe3@oEF%RVv$aJm>cd6I{Y#o5NdnO+r6sI_+$IG!(C>)Oelvk>C8 z6p?+MSA8|RD#VmIExUb~PYVsCp%{y3F z#a0TXQ7h{=LUXVkIgNZj5LGET#_OC+}lL+7))mS z42(egm}miW$%-1fhvFNls1x(?Pi;fZiX7T;|4j#ZLOi3~Uh06>5qPuRSE4q?Q>vd) zgvR!75hRc4bf~5FCRqB23#l&hv%;PPDBUPNp9lDR}f^OtX1 zh<3M@xh15$!LoaB`F*ITv?86-$Pmf!M<#SclXDGMdO+_8v zlAC6{>}Iyv(0K7ZA8u>h0bd~u%>nunR5rb7ZZ5@b)s<~vUF7>-wCYaaguGRUq~KNC zvxYDaO~tGwz3NujPGH39=f$+U*pBSe`+E_qE!WV9RbwG`=7?2mVs%ho7s_3oh1i)R z)&L8ub4RR!CfdJb#5&Bv{8x=wgM7H1K4Kl7irTp&))7A34jHjRZ#X~TsK+ Option<&'static [u8]> { let mut size = 0; let payload_ptr = unsafe { detours_sys::DetourFindPayloadEx(guid, &mut size) }; if payload_ptr != ptr::null_mut() { - Some(unsafe { - slice::from_raw_parts( - payload_ptr as *const _, - (size as usize) / mem::size_of::(), - ) - }) + Some(unsafe { slice::from_raw_parts(payload_ptr as *const _, size as usize) }) } else { None }