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