1#![cfg(windows)] 2extern crate libloading; 3use libloading::os::windows::*; 4use std::ffi::CStr; 5 6// The ordinal DLL contains exactly one function (other than DllMain, that is) with ordinal number 7// 1. This function has the sugnature `fn() -> *const c_char` and returns a string "bunny\0" (in 8// reference to WindowsBunny). 9// 10// Both x86_64 and x86 versions of the .dll are functionally the same. Ideally we would compile the 11// dlls with well known ordinals from our own testing helpers library, but rustc does not allow 12// specifying a custom .def file (https://github.com/rust-lang/rust/issues/35089) 13// 14// The DLLs were kindly compiled by WindowsBunny (aka. @retep998). 15 16#[cfg(target_arch="x86")] 17fn load_ordinal_lib() -> Library { 18 unsafe { 19 Library::new("tests/nagisa32.dll").expect("nagisa32.dll") 20 } 21} 22 23#[cfg(target_arch="x86_64")] 24fn load_ordinal_lib() -> Library { 25 unsafe { 26 Library::new("tests/nagisa64.dll").expect("nagisa64.dll") 27 } 28} 29 30#[cfg(any(target_arch="x86", target_arch="x86_64"))] 31#[test] 32fn test_ordinal() { 33 let lib = load_ordinal_lib(); 34 unsafe { 35 let windows: Symbol<unsafe fn() -> *const i8> = lib.get_ordinal(1).expect("function"); 36 assert_eq!(CStr::from_ptr(windows()).to_bytes(), b"bunny"); 37 } 38} 39 40#[cfg(any(target_arch="x86", target_arch="x86_64"))] 41#[test] 42fn test_ordinal_missing_fails() { 43 let lib = load_ordinal_lib(); 44 unsafe { 45 let r: Result<Symbol<unsafe fn() -> *const i8>, _> = lib.get_ordinal(2); 46 r.err().unwrap(); 47 let r: Result<Symbol<unsafe fn() -> *const i8>, _> = lib.get_ordinal(!0); 48 r.err().unwrap(); 49 } 50} 51 52#[test] 53fn test_new_kernel23() { 54 unsafe { 55 Library::new("kernel23").err().unwrap(); 56 } 57} 58 59#[test] 60fn test_new_kernel32_no_ext() { 61 unsafe { 62 Library::new("kernel32").unwrap(); 63 } 64} 65