From c869a0d6110fe703057ce0a3979e4f10c34038a7 Mon Sep 17 00:00:00 2001 From: Andrzej Janik Date: Thu, 3 Feb 2022 12:28:42 +0100 Subject: [PATCH] Add tests for injecting into CLR process --- zluda_inject/build.rs | 9 +++++ zluda_inject/tests/helpers/do_cuinit_main.rs | 6 ++-- .../tests/helpers/do_cuinit_main_clr.cs | 34 ++++++++++++++++++ .../tests/helpers/do_cuinit_main_clr.exe | Bin 0 -> 4608 bytes zluda_inject/tests/helpers/indirect_cuinit.rs | 6 ++-- zluda_inject/tests/inject.rs | 5 +++ 6 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 zluda_inject/tests/helpers/do_cuinit_main_clr.cs create mode 100644 zluda_inject/tests/helpers/do_cuinit_main_clr.exe diff --git a/zluda_inject/build.rs b/zluda_inject/build.rs index 743e708..1e425a7 100644 --- a/zluda_inject/build.rs +++ b/zluda_inject/build.rs @@ -50,6 +50,15 @@ fn main() -> Result<(), VarError> { .arg(full_file_path); assert!(rustc_cmd.status().unwrap().success()); } + std::fs::copy( + format!( + "{}{}do_cuinit_main_clr.exe", + helpers_dir_as_string, + path::MAIN_SEPARATOR + ), + format!("{}{}do_cuinit_main_clr.exe", out_dir, path::MAIN_SEPARATOR), + ) + .unwrap(); println!("cargo:rustc-env=HELPERS_OUT_DIR={}", &out_dir); Ok(()) } diff --git a/zluda_inject/tests/helpers/do_cuinit_main.rs b/zluda_inject/tests/helpers/do_cuinit_main.rs index 4a24752..ab3516d 100644 --- a/zluda_inject/tests/helpers/do_cuinit_main.rs +++ b/zluda_inject/tests/helpers/do_cuinit_main.rs @@ -17,7 +17,7 @@ fn main() { dll.push("do_cuinit.dll"); let dll_cstring = CString::new(dll.to_str().unwrap()).unwrap(); let nvcuda = unsafe { LoadLibraryA(dll_cstring.as_ptr()) }; - let cuInit = unsafe { GetProcAddress(nvcuda, b"do_cuinit\0".as_ptr()) }; - let cuInit = unsafe { mem::transmute::<_, unsafe extern "system" fn(u32) -> u32>(cuInit) }; - unsafe { cuInit(0) }; + let cu_init = unsafe { GetProcAddress(nvcuda, b"do_cuinit\0".as_ptr()) }; + let cu_init = unsafe { mem::transmute::<_, unsafe extern "system" fn(u32) -> u32>(cu_init) }; + unsafe { cu_init(0) }; } diff --git a/zluda_inject/tests/helpers/do_cuinit_main_clr.cs b/zluda_inject/tests/helpers/do_cuinit_main_clr.cs new file mode 100644 index 0000000..666c237 --- /dev/null +++ b/zluda_inject/tests/helpers/do_cuinit_main_clr.cs @@ -0,0 +1,34 @@ +using System; +using System.IO; +using System.Reflection; +using System.Runtime.InteropServices; + +namespace Zluda +{ + class Program + { + [UnmanagedFunctionPointer(CallingConvention.Winapi)] + private delegate int CuInit(int flags); + + static int Main(string[] args) + { + DirectoryInfo exeDirectory = Directory.GetParent(Assembly.GetEntryAssembly().Location); + string dllPath = Path.Combine(exeDirectory.ToString(), "do_cuinit.dll"); + IntPtr nvcuda = NativeMethods.LoadLibrary(dllPath); + if (nvcuda == IntPtr.Zero) + return 1; + IntPtr doCuinitPtr = NativeMethods.GetProcAddress(nvcuda, "do_cuinit"); + CuInit cuinit = (CuInit)Marshal.GetDelegateForFunctionPointer(doCuinitPtr, typeof(CuInit)); + return cuinit(0); + } + } + + static class NativeMethods + { + [DllImport("kernel32.dll")] + public static extern IntPtr LoadLibrary(string dllToLoad); + + [DllImport("kernel32.dll")] + public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName); + } +} \ No newline at end of file diff --git a/zluda_inject/tests/helpers/do_cuinit_main_clr.exe b/zluda_inject/tests/helpers/do_cuinit_main_clr.exe new file mode 100644 index 0000000000000000000000000000000000000000..b8e497548df827757fa72eff3987701293f7b812 GIT binary patch literal 4608 zcmeHKO>7&-6@I&-D2k30{WuQY*v*DY5amad6bZ0vNHS^tI5Z@SkYqJ*1Ix?hh}?R) zOV92yVvzSDH*daqGxLUCy7&rp5K#=@?b}4}p=HV{{-4=4%)Jj@>!o+PZ$9*% zws`ZQwTkTFpF2sb2!pIh3-hkm9G%Kn(BPyK7RO*L|%*ARD^ zANXQbY{2C@`s#P5M$G+lRh$t-p3pobbLJ9|3rgh zI$gyGjP0l4PGI#ABRPy^CX;awyP1@*)rPwv9qJm!*^A$kcmXR)4j%#=?CkG+vh)7I z_!FZEd7K@wDe<1}57FquSY2|s2P|N9FxDSC!r|j^r~dfkX??gCMtU3zT|IY3Q>%z_ zQlHF>WhTZZ#=phO=_Cidgd7dMfE=Lxl;zbx+HTorj~jqKiFWA1Dt!)_Q#o|@LVgZy z3{&1<{fy%k(K2DUcJ@B~a5n_{mo`C1q8tuF1y;4aSRVnO(wq5J+tiY|CAwdW+Bp4% zX7o6Hq4*p0rFJh}Li9NORIh1q`n8sX{7daY_`FNZUnTB;OxfCJx?hA zf2#hMl;=6cS5<^xK<3$_xueYWQAImU_n}XtZLN>`^+@ZW4!HdcSRR3;lL`ipe3hQl zo`HT-X+KGQhM74Td?kNwe4t<2rETe!syci}+0#Z8rVjd}HcKAyrHHf{3YsN=ZIkqU z;w)<9BeX_CN_N3@sw??r^y@UDY~3 z8f|OI+pt30wS$eSX}cSiBQs(P2)*bkQ^5=>l=B;|HETLf(X_6R)e@FW=~qmLt_bN0 zXX2?05=e#U@oHw7mJpT7BG_2;EQPF<{uQz52(=>O$S51Lo?914t>@C5En)LyBkyi{ zbWuo;bKFYQf+zQ7gAOi(G8};NZcqqhYtlK}EW4hMy!&(>aOz@7?X=%=XeKLzVVJbG zDrDWZ!~t`Zb0K%^(bi!R*mt;ZIwq>1DZzjnDY0^;k`%sA%f;_vW#mQ8Y?w#tDWBs6 zuLvJUg5bstk259m!P2}N$VSfhMYZTOh>z%^U6iJ5v@=CsZDamwX!7=|ga1GYbzp-m z3UL!%d;xA%33VHld+?x*$E;t^zw!6NwfwciAKm)RpXhap8Jd>pFi7i!(BH54@k3o* z14nyPsewK{fg3k44u{@O($LvSdT(#99#28gQ>i#QbN%yOqz^2m26BmazxV9=(aBF< zgmdC}Z;Z4Qk4S+Vx^^su*%FC_(J}B?VqoMLCQCrln$_!@TtwIOBj1*0?Y!sCZ&{+o zXJxG-z2|%leqE>lcqiDeN$)q`W>!CD*fYDO%!NI?*dxqGM=VbWG=0cb!(T z_vFwC_2&w@S4!Sy*u-{Zkcpl|E!TGZ=PzslR#tv# zYk1EXL76HTNo3%Qa4t9d`Sx+FR>oLs$DC9+3-I-DJ437|z`pH8+s4V5iB769IjqNr zXBF9TfWr8%<9>UF=x@kvi*8;2{nY8Ls${x}E1{N6r!TB6jGRmx zet>t*bUar~ryIggpPuPS_9UmwW$9ARz*}zf23+#((}E|V8rsOr%b<^ zsgI`(yk+*L@PqZ;^C6gF>;%h~_zegedobarCvdrVL#NYAja;qf;N|4opD}B-^k@_z zkf9&&gK?L5o=U56nA;atC^2VKM~@U&L*Nvpg0$;4-e=+8Wz>mQR0GtGgMwm(jCfJh zg=09(r_-h%{icv u32>(cuInit) }; - unsafe { cuInit(0) }; + let cu_init = unsafe { GetProcAddress(nvcuda, b"cuInit\0".as_ptr()) }; + let cu_init = unsafe { mem::transmute::<_, unsafe extern "system" fn(u32) -> u32>(cu_init) }; + unsafe { cu_init(0) }; } diff --git a/zluda_inject/tests/inject.rs b/zluda_inject/tests/inject.rs index d6430e0..15e5e04 100644 --- a/zluda_inject/tests/inject.rs +++ b/zluda_inject/tests/inject.rs @@ -15,6 +15,11 @@ fn do_cuinit() -> io::Result<()> { run_process_and_check_for_zluda_dump("do_cuinit_main") } +#[test] +fn do_cuinit_clr() -> io::Result<()> { + run_process_and_check_for_zluda_dump("do_cuinit_main_clr") +} + fn run_process_and_check_for_zluda_dump(name: &'static str) -> io::Result<()> { let zluda_with_exe = PathBuf::from(env!("CARGO_BIN_EXE_zluda_with")); let mut zluda_dump_dll = zluda_with_exe.parent().unwrap().to_path_buf();